pax_global_header00006660000000000000000000000064122634545070014522gustar00rootroot0000000000000052 comment=a15485874153336f416889c9cd31d620e89f1bd0 Subsurface-4.0.2/000077500000000000000000000000001226345450700136275ustar00rootroot00000000000000Subsurface-4.0.2/.tx/000077500000000000000000000000001226345450700143405ustar00rootroot00000000000000Subsurface-4.0.2/.tx/config000066400000000000000000000004011226345450700155230ustar00rootroot00000000000000[main] host = https://www.transifex.com [subsurface.subsurface4] file_filter = translations/subsurface_.ts source_file = translations/subsurface_source.ts source_lang = en type = TS [subsurface.terms] source_file = terms source_lang = en type = txt Subsurface-4.0.2/Documentation/000077500000000000000000000000001226345450700164405ustar00rootroot00000000000000Subsurface-4.0.2/Documentation/Makefile000066400000000000000000000023131226345450700200770ustar00rootroot00000000000000# # in order for "normal" developers not to have to install asciidoc (which # brings in a couple hundred MB of dependencies) we now include both the # user-manual.txt and a copy of the generated .html file in git # # in order to avoid unnecessary thrash with minor version differences, when # submitting patches to the user manual, only submit the changes to the .txt # file - the maintainer will recreate the .html.git file DOCNAME = user-manual DOCSOURCE = $(DOCNAME).txt HTMLDOC = $(DOCNAME).html ASCIIDOC = asciidoc A2X = a2x BROWSER = firefox THEME = compact_subsurface PWD = $(realpath .) all: doc $(addprefix $(DOCNAME).,pdf text) doc: $(OUT)$(HTMLDOC) $(OUT)$(DOCNAME).text: $(DOCSOURCE) $(A2X) -f text $< $(OUT)$(DOCNAME).pdf: $(DOCSOURCE) $(A2X) -f pdf $< $(OUT)$(HTMLDOC): $(DOCSOURCE) @echo "if asciidoc isn't found the html file included in the sources is copied" $(ASCIIDOC) -a toc -a toclevels=3 -a themedir=$(PWD) -a theme=$(THEME) -a stylesdir=$(PWD) \ -o $(HTMLDOC) $< || cp $(HTMLDOC).git $(HTMLDOC) # Alternatively:: $(OUT)$(DOCNAME).xhtml: $(DOCSOURCE) $(A2X) --icons -f xhtml $< show: $(HTMLDOC) $(BROWSER) $< clean: rm -f *~ docbook-xsl.css $(HTMLDOC) $(addprefix $(DOCNAME).,pdf text) Subsurface-4.0.2/Documentation/compact_subsurface.css000066400000000000000000000160611226345450700230260ustar00rootroot00000000000000/* * compact_subsurface.css, a special style sheet for Subsurface, * modified by Willem Ferguson and derived from: * compact.css, version 1.3 by Alex Efros * Licence: Public Domain * * Usage: asciidoc -a theme=compact_subsurface ... */ * { padding: 0; margin: 0; } img { border: 0; } /*** Layout ***/ body { margin: 10px 20px; } #header br { display: none; } #revnumber { display: block; } #toc { margin: 1em 0; } .toclevel2 { margin-left: 1em; } .toclevel3 { margin-left: 2em; } #footer { margin-top: 2em; } #preamble .sectionbody, h2, h3, h4, h5 { margin: 1em 0 0 0; } .admonitionblock, .listingblock, .sidebarblock, .exampleblock, .tableblock, .literalblock { margin: 1em 0; } .admonitionblock td.icon { padding-right: 0.5em; } .admonitionblock td.content { padding-left: 0.5em; } .listingblock .content { padding: 0.5em; } .sidebarblock > .content { padding: 0.5em; } .exampleblock > .content { padding: 0 0.5em; } .tableblock caption { padding: 0 0 0.5em 0; } .tableblock thead th, .tableblock tbody td, .tableblock tfoot td { padding: 0 0.5em; } .quoteblock { padding: 0 2.0em; } .paragraph { margin: 1em 0 0 0; } .sidebarblock .paragraph:first-child, .exampleblock .paragraph:first-child, .admonitionblock .paragraph:first-child { margin: 0; } .ulist, .olist, .dlist, .hdlist, .qlist { margin: 1em 0; } li .ulist, li .olist, li .dlist, li .hdlist, li .qlist, dd .ulist, dd .olist, dd .dlist, dd .hdlist, dd .qlist { margin: 0; } ul { margin-left: 1.5em; } ol { margin-left: 2em; } dd { margin-left: 3em; } td.hdlist1 { padding-right: 1em; } /*** Fonts ***/ body { font-family: Verdana, sans-serif; } #header { font-family: Arial, sans-serif; } #header h1 { font-family: Arial, sans-serif; } #footer { font-family: Georgia, serif; } #email { font-size: 0.85em; } #revnumber { font-size: 0.75em; } #toc { font-size: 0.9em; } #toctitle { font-weight: bold; } #footer { font-size: 0.8em; } h2, h3, h4, h5, .title { font-family: Arial, sans-serif; } h2 { font-size: 1.5em; } .sectionbody { font-size: 0.85em; } .sectionbody .sectionbody { font-size: inherit; } h3 { font-size: 159%; } /* 1.35em */ h4 { font-size: 141%; } /* 1.2em */ h5 { font-size: 118%; } /* 1em */ .title { font-size: 106%; /* 0.9em */ font-weight: bold; } tt, .monospaced { font-family: monospace; font-size: 106%; } /* 0.9em */ dt, td.hdlist1, .qlist em { font-family: Times New Roman, serif; font-size: 118%; /* 1em */ font-style: italic; } .tableblock tfoot td { font-weight: bold; } /*** Colors and Backgrounds ***/ h1 { color: #527bbd; border-bottom: 2px solid silver; } #footer { border-top: 2px solid silver; } h2 { color: #527bbd; border-bottom: 2px solid silver; } h3 { color: #5D7EAE; border-bottom: 2px solid silver; } h3 { display: inline-block; } h4,h5 { color: #5D7EAE; } .admonitionblock td.content { border-left: 2px solid silver; } .listingblock .content { background: #f4f4f4; border: 1px solid silver; border-left: 5px solid #e0e0e0; } .sidebarblock > .content { background: #ffffee; border: 1px solid silver; border-left: 5px solid #e0e0e0; } .exampleblock > .content { border-left: 2px solid silver; } .quoteblock { border-left: 5px solid #e0e0e0; } .tableblock table { border-collapse: collapse; border-width: 3px; border-color: #527bbd; } .tableblock table[frame=hsides] { border-style: solid none; } .tableblock table[frame=border] { border-style: solid; } .tableblock table[frame=void] { border-style: none; } .tableblock table[frame=vsides] { border-style: none solid; } .tableblock table[rules=all] tbody tr *, .tableblock table[rules=rows] tbody tr * { border-top: 1px solid #527bbd; } .tableblock table[rules=all] tr *, .tableblock table[rules=cols] tr * { border-left: 1px solid #527bbd; } .tableblock table tbody tr:first-child * { border-top: 1px solid white; /* none don't work here... %-[] */ } .tableblock table tr *:first-child { border-left: none; } .tableblock table[frame] thead tr *, .tableblock table[frame] thead tr * { border-top: 1px solid white; border-bottom: 2px solid #527bbd; } .tableblock table tr td p.table, .tableblock table tr td p.table * { border: 0px; } tt, .monospaced { color: navy; } li { color: #a0a0a0; } li > * { color: black; } span.aqua { color: aqua; } span.black { color: black; } span.blue { color: blue; } span.fuchsia { color: fuchsia; } span.gray { color: gray; } span.green { color: green; } span.lime { color: lime; } span.maroon { color: maroon; } span.navy { color: navy; } span.olive { color: olive; } span.purple { color: purple; } span.red { color: red; } span.silver { color: silver; } span.teal { color: teal; } span.white { color: white; } span.yellow { color: yellow; } span.aqua-background { background: aqua; } span.black-background { background: black; } span.blue-background { background: blue; } span.fuchsia-background { background: fuchsia; } span.gray-background { background: gray; } span.green-background { background: green; } span.lime-background { background: lime; } span.maroon-background { background: maroon; } span.navy-background { background: navy; } span.olive-background { background: olive; } span.purple-background { background: purple; } span.red-background { background: red; } span.silver-background { background: silver; } span.teal-background { background: teal; } span.white-background { background: white; } span.yellow-background { background: yellow; } span.big { font-size: 2em; } span.small { font-size: 0.6em; } span.underline { text-decoration: underline; } span.overline { text-decoration: overline; } span.line-through { text-decoration: line-through; } /*** Misc ***/ .admonitionblock td.icon { vertical-align: top; } .attribution { text-align: right; } ul { list-style-type: disc; } ol.arabic { list-style-type: decimal; } ol.loweralpha { list-style-type: lower-alpha; } ol.upperalpha { list-style-type: upper-alpha; } ol.lowerroman { list-style-type: lower-roman; } ol.upperroman { list-style-type: upper-roman; } .hdlist td { vertical-align: top; } Subsurface-4.0.2/Documentation/images/000077500000000000000000000000001226345450700177055ustar00rootroot00000000000000Subsurface-4.0.2/Documentation/images/AddDive1.jpg000066400000000000000000001436621226345450700220040ustar00rootroot00000000000000JFIFHHC    $ &%# #"(-90(*6+"#2D26;=@@@&0FKE>J9?@=C  =)#)==================================================  Z( I 3APb D}-lj'1V+!.V{vtc:myǏGϣ@Pq~@10|ߠOkh|ۿ0}?>gkj׭`y,`ޗtmՏ?S|c;eK|KXƶeotk>X5>N;޼*Cϭ`Ybz_\WNpjy'^@ΦQ[+fϥÿ`= Z9V=TdmN)kJtQZq3<8[3Ѷ&ffffffffbfffffffffxܞq#X*OOe{#3pfܞq"zOUᩋ~=sfja*G HdddddddddddddddddHdHdHdHdHdHdH"OJ#Wv3zOmg$yQ~rxv՘~4SQ?;,,,,- Bд- Bд- Bд- Bд- CO=LKh'j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3j3r.666666666666666660V+}hmhmhmhmhmhmhmhmh"S6ݣ<?g<=g)\|{~[򒵻URI"e7gP2r=Ȉ:fAOdnw=?)ʻ.1q\b.1q\Z±U1r.1q\b.1q\b.OctyFg<=g)쌌2222222222222222222=?|0yI\#dC%}bJVȦ2ZH0yv)Uks!rL`0yIP0y`<0y`<0y`<ѵ&?Wb"9TNbF{R7bPt8lhHt*d{w^3.?2kؾY$sby8ӑQnjڊ}q|Uئ^|w8Gsڟ0|iC|E3]኉.ӎȿ)]njvFbn~⩥!HppRvhU˧G q8ag2&F&Oﳂg!'48)4{_΂O8TKQ5m=j%hMA_bf/e'JZ:ֻrz,lEW&f^=/[G-s*\Ⱦ~-G}#iŞ'"sc0˧F@-Gm;UH?Ģģ1Mttq*!V $VB > 1LJ brfPW.*دcwj4Q>Ҳel_I9F:'MCRFHYD1GƩUmxL˴K%S/kd9,1۟DXQ[h_/kJhv)9*saTS썍)MskW1mj<pB4kDd91&sںw+䬘|͈$dO-,)4N iœ_bUX"tl8ܺXEdq&O8SSN88>Rp|4,,,v̨|*vBpo=$ZM*5'Iy(^l 4H2G,V&K#5 0KRԵ-K^?jFF\de¨Iy|APjrWxv/*]F$7Q1!0@A BCP`"2aq3Rr?n0Y96$#{;N{~;-fHif:c+uU43s13s1Uu6~-߻Mj. ClP6 ClP6 ClP6 ClP6 ClP6 ClP6 ClP6 ClP6 ClP_o4ϵ*&t:qڼM;?^#o.oU)úﺚzvTo-Wv({/u:zaӰ xylMM a=rB+pҧ"YY&BSۍGrW4_y][꟢rWwn iZ         ]Vx)53_s53_s53_s53_s53_s53_s53_s53_s53_s53_qq_N?!1_s53_s53_s53_s53_s53_s53_s53_s53_s5Uu7Obyd؞_<{盧'Әkj(Xc盧ȅ{/ny؞_<8_Qy؞_<{Oby^_<{Oby}tB.2/x.c^բ<]?M!z%z<=M]TO%z(ZUp[U+Tܹ_q\r [AAAA@AAAA/y<{>{O='}Ϫ[<{O='C1u<~^{姓A/?b/yzr;=tUNr"ɩ璽\ H鎥r*WAW^:Gk^w?y{w\I}?v78iN~4 KK~$I$I$I$t\ $I$ESE|-BX4 4kKG40FiZ3:62u8I&I$ttltE C!d2 C! C!d2 C!d2 C!d2 C!d2 C!d2 C!>TA-#H,e3j>x9/R*u BDk]u]Ī2lҫURP*m*w.n\ qtJ.]ʹddK?i4IIK.K.Y.Y"t"Њ KKK&IQrrrrrrrrrrrrrrrrrrrrrrrɶi4\{+/~J7_D}~oSZ/>ɿJ7bhn 'KOp!(KKL2XCt"AZ$Ai\ s.e즶؟/@|W.߄%\?!12A"3q 0@QaBP#4R`br$?Ro@:`Ӫaa WF-Hfbi$FKfףD#>4VGw4C 8<0QP 7*XCaݼFKgS뤓Nb ̇DYKxDM'mZÅ0'K~b=>&CFm.+lˊ,ˊ.+l}5555555kkkkkk.7\oqq}.7\oqqGqEYqEYqEYqEYqEYqEYqEYqEYqEYqEYqEYqEYqEYqEYCj.(.(.(.(.(.(.(.(.(.(.(.(.(.(!̠] % .(VU: Ꝕ A&ڋXBh%$" <` *t"0FF*@4DeW߇20i6b,%l L(N(:Ψ|z q%\kPN ˢAk}ā@Y(@1UqL{WRo7"ݴKa|s=:-(UQqCG' U~_WU~[n[n[oF/^hA+ q0ԳԳԳԳԳԳԦIat9,,,,,,,,,,,,,,,,,,,,," qco {S(AV BBX ʱXxb!^!ΪfhJC͸_(&DQ(sXpjC'O4NH4A;XD8%{6YHCwtӡ6S!B\џ4j!P8D-T"4a[1t[-T%5F8fc.͐0LCUZAO<cithGC☝˭@ :xEOKSԜVcuL:1n]ݾjh+.lmˆ.lmˆ.lmˆ.lmˆ.lmˆ.lmˆ.lmˆ.lmˆ.lmv-{ýa^P9P?&Ut` Q&Li\ϏCy"0v_]>v FQGA4w\ \! }aJ,^{K`>DP,%6~ '貟VSYOe?Ee+)YJz2~),e+)YJVR^|Sޔ`ݣc59 ioDgQUCX겟l[-l[-l[-l[-l[-l[-l[-lpZog1pCw_ulh&VԻ/^?kS~ka bB6mˆ.lmˆ.lmˆ.lmˆ.lmˆ.l at~ͣmˆ.lmˆ.lmˆ.lmˆ.lmD3=Q[n[n[n[n[n[n[n[n[nC1DBDaPGCw5H~1,賟Vbf+1YVbc+1YVbf+1YVbf?`|ؘ]!ĈKHJUF;H❝z/Tʑ*F78^8KK\Fa#{ߚ,,,,,,,,,,,,,,,QeQeʢʢʢʢʢʢʢʢʢʢʢʢʢʢʢʢ84"1QŻ!x{Q7t<ߚU=DSiP-*3xF3 (aʊQDkSӹT{ cޯ?~^b* Q~b?|"IaQ|<X\"1-Ǻ# >K5Ma;>( s A[ ^Ee5 /~j. 8b `KJb,qt2d]{T9Ϋj\DcΧ1p& ɬ%JU~̗>R.?51B0M`.da5ĸ&2+asi @b(wi.GUNjc="BTffmau]fYau]fYau]fYau]f 0Y$w5q!gD k榘QKDHi~dD:T?g1LJ;ߚ5EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEENŽGߚT߂sP4ѿxy c{z.t߂3YVbf+1YVbf+1YVbf+1YVbf+1YVb^ҏ??5/~;$杮u8ߵn nmKmÏk\1"}ޚw?N9ϋy&Q4S$B ۸CϟFqdp>j"f344 'lyO- )v5#츚-Ոm;,S4`4숅|; pӱ"H3 cA&:ᑄifTP>=dET~ s|<(-W;߂<ʁ[p;L 3DPx(6v];U+1YVbf+1YVbf+1YVbf+1YVbf+1YU{A۽gYugYugYugYugYugYugYugYugYufYugYugYugYufYugYufP;f.;=Aq P\vzg.;=Aq P\vzg.3}Aq P\f P\fហg/ PQ?P_lA~P\vz ]ia": Z[A/y{Ur\*jZV3ZVP%\U}\*Ck=0FһN8""*BJf~t!o&D3Sp`V[4A">HkHM60䰙xIA@NU=͞ch^K fÜXp( PYPYP* * *}PU !e ʂʂʁP*@T P*@T P*@T P*@T P*@T P* ĕ {y,$dO,>&NswwYH3C[fݎ(CTan!. % 0. 0.Z 8. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. D-5T*PVP9QʅPj@jBPBZ'MN*TrG!zk ABj1FhNE;(TGN'yp }X6E0p_D-Qk Ho^;yUS:GXu+T䶟e z㩑Ye6#(`uWdu,e.]YeYeRcdw?%iYeYe&:+:#:M}WM,,,,,,,,,,,'D-Sd°E=eOO;- 7\yKO#,Ӆ?l3u<r1f0v)H~uGDa u=2QڸϺ$ asf{‹Ý/nnY vc佳%I UJӠtjzhT!v>"*]0.=4ӧNGyͻ:OsHͬfI%6LctihiܶM?5؎Pz#Ԏ3a{ ׳9fq$6{w8FC0BV;}cD#3IQ{ӟr?5>@LsFmb T`TeH3CN****tQSG6% fG‰,?4lpƴN!41QSEEN******wb'{6!>RTAn,N4*kd k nc`dƅj=z\48Q4XJ {3<93 n׳g晈ʢ> 8Wd{S14P{Q r|`R 0[u C!.B~J*}@|zdj_P ^>4fqI?LAӐDlvn!c|ygz:tC9;,PT$=8NRL{B$ .J0$єG8aŬQݍhiw':+(a-ܤ|ua ^^)ӚbWƩ,f'$`1ltT@/-ňFF{9D 6dGv[9k$ 74:tMP-NFWK sKϊhxaT0nՠZ)thT*w>C9xEq/5quu!&Xr5S:5 n#`^s\G]D<̨xtTU^>ϣ_6h~j'${*!1QAaq@0 P?!-J%A8MhnMs~Unl2oSBYm$JW"B X~JJ hUJj~N%0#\ %y/B^ z/%^Kмy/B^ z/%^Kмy/B^ z/%^Kмy/B^ z/%^Kмy/B^ z/%^Kмy/B^ z/%^Kм%y/CzKG<$y#HG<$cdcd6- L<#"DQKTIpodˍL+/[F36B'2/Lw-"\3z:\Ɲlhm==b;#/ްZEop'#3{Xa[MhJR)JR)JR)JR)JR)JR)JR)JR)JR%N;?{Qy^vЭߪP5 Ҏ !87U;F6ru6} ^O.b y 81?adSy\{og]k{G)SWg劷FO{9Or?Q~G)S9Or?P: t1cA: L*yv{bGTF%Up#;#[^BdwGywGywGywGywGywC"UWGn.#.ħ9^^<<Q50oKtīMo v)m5Eӊ4ԓWqy8K: M URxƆO!=qn6qfFB#J4O@eY9I?'JdWzR}"jGQNĵbO+㜟aTE& |q6iq<%> Bbfk+aMEuA&>7Rr2^o.} k |N!:qbVC[SLUL._ԌnZe)C-m+.z7vCom2\.<1 cłq4zI m#&CpmpӁHQ2m7?CnŞvgivgivgivgivgiKR%EOjƸ;L3;L3;L3;L3;Lt#~m Ҳg:wN:?;vD'oNϣ>EvD:3ϣ>:3ϣ>'cN蝏;#n?qx>_9Yȑ2I3M81W@hIeFx0Pk| D .-. r 褟+\:9ͅ_0V=LO ~|9 )JR)JW?5Q$@)JR)JRЫc?'( l*o^دz >?qx>_ے///: ^R_y}_y}_y}_y}1R]z^NL|VSu^P UGuVNC_MWCŭ[8MXq Hf06LU6Y ^O-IA9Zߤn/wC յnЫ~#S^%T Ha:kNQ妊䛪f bQ%׆&w΍dƯ=i z+o8iɍ,6ΙGY#d?G΋:.t\sEVh|;i9(Dá lʸzQB/O5!5cPחv0ȍg&|ㅵEd5\xzUBo50~F%y(FFi_uF9\TtBR?>MhDBHD;c r!4*R"REV$Mm_1Bb>#IkW +fPJT6Ly[3=C?1{ֵwþ *_Q|?[MG:Lfzp<)K|ńu:E)JR)JR)JR)JRCu_<6qg>b9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9AH#E4 ~բ/Bfvh]bwػ.w}]bwػ.w}]bwػ.w}]bwػ.w}+km^/>PQ"܄'b#\1f,k /s2t!ЇBt!ЇBt!ЇBt!ЇBt!ЇBt!ЇBt!ЇBt!ЇBt!І\Gn/_VK|:_^~$ҋ5h4jcȀA LiQ`5@4+Xyb ~ÝY'<#<#1yGyGy؋Q>gyGyG#<#<#GyGyGSբ<&WR[JJ)3!h/$i5agMgN$@^#_f:^T=O_VK k\.Xk60^g7\s<'G)וw/(IuVoC\OjL5h4 ? drr._x>_u< }Z/M/#M+~-s[]uL*HZ?1oes쑂q/ 8/&?H5pX(Wbfu*^#ĥ( `-5z+OPUN蝇;vD>}'aN蝇;vD>}'aN蝇;vD>}'aN蝇;vD>}'aN蝇;'kg? $/YvdmI$J%R&rWz*E]Gz*E]諽wUފGz#ފWz*E]^/qE{^: E"o/GAh4t: GAh4=t: GAhY,޳/,*CnH+Ob̓)* CYP_B6^s9w5hsډ$_ɓ5lƳS5xZˏ ScmQQQz>/o;=Djk631#FcNhHV Ycr^7̃fY.>DZ,Wg87at)9(LCI娕(&xI^5z> iM1 qZ0hT+Wzr}1lk+r姮f5Mk5|52ylM1Eԋzɦތrh'p\ԇo^$|Sa{fŒ-ǹOaeҏV&CMj2uOqX ^qS 1ȜF zc"zK`=?6 6gZ|p̍*PAl=[TZQغ##SOYnp&0XTڎvGj;QڎvGj;QڎvGj;QڎvGj;QڎvGj;Qڎv D?wQfMЙ/)# EvxVen[t,ն.C<<ψ>ģ"F\!Hs9n nZ\k0^ gN"<4BWgQU: 9 F̻M&Z"NVƧ T㸼RhRJD5]E0.Gnڀ鈚3Up k^+F"ejOM@.Y yי NG[<<^= Uw2^PD$Q[ҋ`=v:8lk58LV欬 Ϩ/BtvovovovovovovovovovovF-ƞ?GbBֿ-4} ժ pJTv~F’ҼAC_CL b;}+LQ`;J?,?7F'*Es1kí&ufʋMd)\81k-1>j՛֚?E5-IsGb<ˎ0ai36sZe[%_씄-|M6lԱM?"[$.ƕ\n6?,RB`RT_Cjj(ݕ$fcB~ɠܮ(%j`7&D}6>v*;eSίR_}oVŦc}:a3LJnmμwՙA۫;̷08mӒ d%D6 XRgчx1N̡g7OUW?wwwwww&My1c)ư&p6S)Ɇ&O.gfe'mdY%Ю7:YnWŦsŬy3`*m7 Ӎګ:)sW|ruSZHN 9TK&.cz\_6K3CSBz uO/3'UNJyJ==oLRXqsc GyYg<[qĵԔNDIE9iШ|7]x N O1Jæ69IM\hS19s O! 4jh)CDFDނUYhsniӂ w?ºhd+ۃ7+ݙ\GGVtU*riD*TZL[u%< >&KU* "omqMOQIlZ!I!xp:!Ȏ=}_;} wW̏fG#ّd{2=̏fG#ّd{1'sQQ1Q^:W ֋8rjbppr"$ՃitK.pKTij?sbdm`5Y+!WOGF<2YAv1X՜5%L:'?4BKQRfRrCswzx[QkwS|ƪgʜi>30ΖS VqtN+3&v|xsN p#<;R6"c.k0;-K&.jcfj585G TS0cOLM//7 42N,5+:Uz ΃Z qׂM%4EE7)K%SY(wXۈ+,J AL:4ẒzeomD(9-T:5^ddt37^-Trڬj+1h`%bR\ #KfI6 U"\if98E;T_Wr,a0%K\se&Sp\V%y Y)o&bm3,9iiEIv΅ ۝*sX{]pZ[n-1Z5AE: k&/!̏!xǑO< "OB! uxS.t"&!P'S׎Ы֑O(ڌYG >2Y^ ³ZU|nFnFnFnFnFnFnFnFu|ďt$"p?Ĺ O߷b^ϾQjDeq^ 1F J2І{:1yW05۫X%eYMmFmmt"Mѥ8~&?swנ`LvS| ^߯mmmmm}Z+1!AQaq@ 0P`?Q,BUZǍt587"7OE2 r}1,S9D*íFƦ{ëtiЛOQX{z ^"%ƁX+OVK)?>|_*/|E<` ;gN˞2 mZc\o9`HN-y!,qJ;x5#Mr6@)>$%+U,wsԸaڵ輂3|غ}:d:v. ߐ,]N˞-2$rĎT,Z{s=ngm68fÃGS=ng3ۙ{s=ng3ۙ{s=ng3ۙɶO#7,(Ec:L*?qӫ; QD6ߚ| t#Ql;X3 $[ M06UD茌KF3;w%{XI}/,mx'R `l&Q6DIM&#!,f"h 8%dG"hAj2XsUz/); ~i4BV[UIWg!"){Sv Ec7&Uo]F2IPDDؒ-duS]XjmOn6v|RY_z&3iuHW.i&3FhO Z њ3Fh{-"r>җb#ߵ>&4 L[c-le2m[c-le2m[c-le2m[c-le2m[c-eunYz)OJ8Eo:'/jbuX~a鉕&ǧ-"1G*ݗm8$}vUO?\i/-R~Y!rnY{;O jЬqBOE.& 2ԺicuLӪçy>ه26?_ޟcܵ{O±uoob 䋋J. Bo 4yg}> MvT>\^͵R-;Z:dei%~\K s_oH vGᕚ5s-ci|ەJFvpP7c|z~-8."5t]+S*bKl{TK|m{4OHL%J:٢X%, `KX%, `KX%rX%, `KX%, `KX v٥8sOEW΍sQ:ٴiݙٛݙٛݙٛݙٛݙٛݙٛݙٛݙٛݙٛݙتۮ.mRUw@MDz~{}ٹy((~sԿDt*)˻.^^WJyy ,OeWg{Y^y-"_aӫrSBW :.z莝]=KGN˞8JEI6'E?brO/iWsf$ErO\{obtm&V/iʤpe^g%MN{4?$8Uno` ʌ5xԍWʺuv\T3TjYI% tJM8COȿș^YC|7-+sT??$Q(SJ%DQ D[BR%DQ(J!(J%D1R"4#D4M@4#KЮ$Za. #H4 H4 +i*#|wXXLl1]#R'T2{ 5xڋh6)wZ=Ij&x$I1frQ)A\B"ϵ! Se-MZ%FaC0&a L!LĆ$1! HbCĆ$1! HbCĆ$1! HbCĆ$1! HbCĆ$1! HbCĆ$1Nh]D4Gif Nh4xЎ)vnjR$)1L6!$iB$(׎:7! ӕpȂFQp k˔PAAAAAALuI#|d^C=n+"~48FQ*2+DB$ =gi󊾥\[@cSѩ4ГdA(?JXB! FS3 l"D%H꿃|޼prIA$$A7R D 14bDDR۴c&6$ EŶ9/UTп#PHhKDHFO+!1a@AQ 0Pq`?[OM!Ac*pxÅ=9Y TX'o?_9ɤGea,|m1B%"tY e5R;H`U㒉pzuBO>?, 6p?|,/D~ɲ4@~#b~弼x ŏ t4] CEt4] AE$d!TCEt4] CEt4] CEt4] CEt4] CEt4] CEОly)3L=φsMq)Mܰɏ_**CMc $󠺂rc`s ZkYR"m 4NpS+c1M0""""""" o$Y"""""""""""""""""""""""""""2~q*5۵Nߍ R,_s8v# .>a?^ ǤN1aEA9۱dly]T!B!B! B!B!B!>qې|;r!THi !0`<!B!B!LHB!B!B! ׵Pj A5Pj A5Pj A5Pj A5P1{~B!B!B!B!B!BC!y / ?4?8u~W1?Ŀ 򻘗㿥'5 7Rg !q`fW'~B!B!B!B!B!cl _< 5??d yB!B!B&$!B!B!C*[%x-i?ҨO3dؖ'u16|oy 4ƿd&m3Xݻ E5|q:,W7zy!B!B!LHB!B!BYdpu`\hbqշ]xɸ5W?]_N;!‰7b%\+j>ok+-^;Sdpqӄ/<ε뱝f;)4vG١2^d'~cR!B!B&$!B!B!5Kr}f/B!B!B!B!B!o9=145~-[•X$ɱ+M|){/]; 4SyPDr#G"9ȎDr#G"9ȎDr#ş1SK 6G"9ȎDr#G"9ȎDr#wwN w̟Gy߲}{~;x8߃Ue1ZG*K+g^p1G4d(yǻ|7웤3ܞ~ױ '~|7GyߖBřⰕ|cQE`#O tOw>z7G &R ̼|#KEd;o?[ݾAbc_~͆¿γOǰy$NQ'DA{-U2{-&"O%ő-;j86߲} 'Vv7qCuT=߲}羕?\|)>NK'{$D_G c 606D G_"ȮBq}((((3QEQE7f[Ihɺ=]OڵȎ1&0H2 e`Vd Zw'>CMFƜE6NaL1~&d,,}}-}CpwN%2ߺH7WNcR? >݇O10N}g& O18qAdn\ 3Q׿dڳ.Ϙ6T_]?>N418&m)ϰ#.@e#q!!>sXQskd7ĥ '9-ٱd6)JR)JR)JR{|EHHV[Vf%dE*^uԓ]Dj$k.FMu ]DS]D]M7SMmmr3Qj;[eoMU6Xj5,uk M7SMu0muTu4M7Q6)]M7SMu4M7SMu4M7SMu4M7SMu4M7SMu4M7SMu(ۚ^%EDâ32zlbcg <^lۦ'%$,۾ZK"b  =(xfr} XI 11bbĨY}}6  $4 .V * l'Ŏň8QSM6CDI$XDBH$jHEb*hJ6mamYYYYYX)%+++++++ Fqɲ ^Ϩf ٳdKj+!1AQaq@ 0P`?@TgZE@yHY,L,/" j"#}.0.A1^T2.JUIqEU1A4:7g )aoK˃\N=.(4gcm;WY3.16C&@Ql7-1iEf{Jὣ2Dk ]ϲY0r +B Ҋ۬zjQCujW&Rev+)UU g R] 6JRc./B+נU6MI`-V]5x(UZ"Pa:HFSQ΃:̗lN>gtu#b-df7o3y6u^mf)9,Cxf7Sa< x1cǁ!.j<<<<<<<<<<<<<<<<<<<<<<<<<<<<3pXmײy|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|y|*plJ%dmKW MWU-gcQer-[M:a0Fw}ȥ)C jK׷v]tTLe*͌Fi ho؈ htQ (aV)nJ .iiiiiiiiiih_xEVۜ:ޥ FJ^[i5*$Vn(ˑi3nE*GMX/P2ι=~@d~H0gX+@dЈ TPVJ2+Y=DNMYu]]]uuuuuuuuzCSopO/((((R쪮yyyyWElyyyyyy B|IQQU9YM3{ϿGN_w@D_h|+J Sbʜug]2u(ۡDbݓ5 qb$w5eM Ҫ-ۻi33nE f6jα)#*[@Xüft٭X.&/8K.֙t5u Y1tjQXuyncjѣפּ<|yy [W@d~֓_zýȘ!{|c99 D\(ĢXfx RWϼܸyx<@alݩafDr$nٺSKځdv 䬪,*`fy]z]P5ٽ`ErDݍP5ٽcB.v=6| 7]CCjzh `&B8ڗDJY_dorUm.bÔ j3McNxi8P3Y띞s}^Xs8Uz'/W=`A'r&%j5,Tu ŀhVQ}@@e﹜M,`4@vI'ktvI'ktvI'ktvI'ktv7I'ctv7I'ctv7I'ctv7I%a9>ҋ$ ] Y]ב_ZU5+@(\9쑂<"fmdE!ohggr'ewg4,=Z4rNHҀP` O`$R* ?{*GO--}7*ovYN#o9>G'\G{/ -s14:#.mW^^^^^^^ UЗgfZ"f5%%_*iWJZUү֕~ 0B41͝s}O>"Y@ n&ltUof`T`Ɋ"nnn (q ,AXUҭZʼnf8V`JsxP"sVn*V7pcX5ɬ5 WAvyyBż"m8( w8Ec鏮#ȈDT-߉3>g|4ig|4ig|4ig|4i"j!%_ z'Wqz'Wq^z'& N+8DN#8DN+8DDDEvyy9>;<p4aHv.@57dX.&.O/`KF hnnGj PŷNo#W~XCupR-J"X37ks}O>"`](MkYMDsw)VF"WLd[V8bla1HDDr&ah%6^i*VР  R+4ܿcthYWhDd.ـD,^ޜDXfH ]3V%DD) ̨@+ѭEo1FF@DƘv/Iؽ'bv/Iؽ'bS};_iNS};_iN`MD9>G'\Gg 1#baDpPUv22,½l+{B=&-”g'dPxp!%CG h=LZQz͔4z;"e.iKv5̟Mѡ6{W9;_LET EU*kR̺pXCeBCH%9b6YZʊ{;<}L}qD!Ca,c"AsOCtrHUqUwQX~*@D-ZiEi6 5YR-tKԈ!˧@*kz[X Md}iWeՔQ -aa@WqwGYg| <x4SƧO <x$IN(ܝs}O>"%@ u. 䢚`ZFp+5[{-o}eYn[}eYn[}eYn[e٪vyy{5}1vyh|CdQ|7bڒ;neE)FMSy)Jo%7MSy)Jo%7MSy)Jo%7MSy)Jo%7is}JJK]1 K^Ep4r}1vy% 5!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJZI=.>\ ku9>;G'\B-%̮M0~B(nUBEIp&aK,p#m띞s}O>Ѻ8 ô-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~ߧ-~F4g鏮!r''g鏮#ȟ~Kܝs}O>${)^*?Ƨ,ו\`ohQk d39h,YK &(&s!KUqM*"IfrY,ܖnK7%f*Y,ܖnK7%frY,ܗM KݪcrY,ܖnK7%fr-%frY,ܖnK7%m,ܖnK7%frY,ܞ? ;b TiX:<>ʑg쟆~Kܝs};9;"9sA%jpAFzx3[B^vUrWUm7ct04t(q@!g\R6'0 zX$ XҚ:wU~C&PTgq'q'q]'qݼ'qݼ'qݼ'q]'q]'q]'q'q'q'q'q'q'q'q'q'61c@/O;? 3;? 3;? 3;? 0xr򝟆v~gg᝟v~N}#u^[dH%ytYyH}(j\ `[D@-2#fr&tIi)hN0 D58X}"lGѿ!t9l Uθo-piZZ48T6 ;Ej $mo-[|m{ "P^o-[|m6KWZ[|mȽr @ܽ-Om񑽯hJ5Ս&QhJB"w']Nr%I,+?Խ'ı&{?O= W0Ccj~"Iݰר>"[++J=c7sh#YO4\?|&e _H;6MJ>/4S!c›S?r,en[e \܅@zsKen[en[e^km9n[en[/ vֿ-w2Vtz@A06 -w1:U@JFJط8ˌ D\s-w2̷s-w2̷s-w2̷s-w2̷s-[&|-oK$6 .sWOjX4B]v.sR)ifgEJQJ.{b(ut6ڸ-t8h*h ;./B+26EkIX Gz [B]HB$6 ( llRSx%҂hjh :%4j,JR `YG_`jUaz_ &2͒ ,7`+7`*R0+$B[Woe!ҥ. 2.% ŖBMs'!` ]D iD:zz% pp )`҅-]4`ƥ hp cnw 2D0 ]aWY0 `l@q=-A` "UTjnj `8AX>"mJ-zDoQ8›t쫬}֔Zeɂ^QH烙8 (5LUo#߶v .Z᤬n@v~'<x 3M+rm0Q-K)Jڀlke05/9HQX/ uoH []d٫!.<\#A8-jxi(E)-AEfn#@%s銆iDU/mm=TmqV+t54pX[2R g9juՃc".P0BgRKaڭ{^r|"`TQx6EB^كH30pw 2[nQ(:kleɻ )c:k.1mXUڭv!73b=y\KYkVQz4meӪi[1=E|xY#IM|iK^SX@b pٝeKXJʱ3bgAZ6oͪyƶ)j]* k!٦ͶU,mN;ӬN:;ӬN:;ӬN:;ӬN:;ӬN:;ӬN:;ӬN:;ӬN:;ӬN:;ӬN:;ӬNʚɺ\j%|>f>Ϣ-3r>e OO_5/Ab GA||~# `91~M6h_3%|ʕ|ƚtCj3?( sFM`xGG(?՞5u12ZEA5Vt`u#CP/~"5-MU\цfR8ҁߍts[mƎjӦQ6rs`fܭn.tW%2JbliR %b+A$U2QWx5[mkldR^E@F[3>?^h`(X w/)P2WsxVD-@HZҗ, ) u|1+Mݲ+)J9sy9*qvbwI&K Uۑޚjvi'xt5W) n%VXVvbwI'xtwI'xtwI'xtwI'xtwI'xtwI"%m1%ub-Ad9F#Rz-u݌+Vu"<. ܩ@ NrA-!9Ų-# VHgg*ch⠙VltC# M,v%UlH֦k]ctaeoVP_Xˣ}mvigtm1ϐXqu1r`M LXZ+5ZOQJ7A)2͋ҷ~`  HB Cd֌廽m]z ;7B <@:%LsvUcPDQ@5FNfz45"[ Z6r11mvlѸm*8/YzP L٤ҋXD8Gl1(tӬj/f"+="ȺiSվ*HSVZwnXPQL0n)ip^g8/Yz p^g8/Yz¤L aPYocQٶE@dEqlh#мohh*eBhw*oH{h \o8n(o?|QMo9OI[voZ38̊F4lU)@rdto {NJY*-DVSM2Tlgx\Z^Ft%%# vF|! .#9*|x2'LYz陷!7lLz‰ n9 EތA_MIQbxƹ (=qk[hs,Vbnc[:BeaqfPC|`n IZΐ@4Vq*`!AMijYl"WUm 5xPkMVYhR Subsurface-4.0.2/Documentation/images/AddDive2.jpg000066400000000000000000000454511226345450700220020ustar00rootroot00000000000000JFIFHHC    %!'&$!$#).;2),8,#$3F48=?BCB(1HMH@M;AB?C  ?*$*??????????????????????????????????????????????????T  8tày:fs_4"j^Uv1aR,3q^Hhy33r$T$һ8o^9(OyrE1JqGSA3kK9{x>Eۇ+ǽk?_|w58ι-2XZLf:_ՑUo? 6o>ԈP"*spt˯N5<߭R"O?xR?"LӔ:Tm@aU€bQ]o "$̺4Xl,ʻ3BbYFeS@(ppG*Ɉ,]DIgɭ%̷;>b1?L2_1莛PG#j%WaBb;YUH ,::figeR;QdAçJ5:iQ]li[38DIT9]:p.$ u'dL;Qt&p &0DI\PoYu'¤15&a|e@;Y 4Y"L+ִ_v "M)U8Q5=v$$W`QmVH6I%\ԣ`Dv""MI&ՠ "$ڴA$DV$jmZ "M@DIhH6I& 2.;)!"231P0 #@A4P~c˦6]1鍏LOGm(Jҁm(Jҁm(Jҁm(Jҁm(Jҁm(Ntӧ69ͧNm:siӛNtӧ69Λ%6hEдzQGTa[JQeVoa*3%unjg:U|{MkTZ?wMi")ةCJŢtZ+HDMXbn2L*Z%qS- <ƚico1S1S1S1S1S1S1S1S1S1S111111#^9棚j9棚j9棚j9棚j9棚j9棚j9棚j9棚j9棚j9Vu|hz+{S(&m1?3?uDTmmjGUIiKIj42R6ԍ!Қ3ƏcUoReZYi.^͌5b7y_M(VoCJ15$k$Lq U&nݱbiR47ln~_^.osf͛76nlٹsf͛76nlٹsf͛76nlٹsf͛76nlٹsf͛76n/G7ƗSVMd5hk)鴭UfmV5b*S"9k*Ubu=jvjn)Y!T/:XSmM>hӟ2"JNt֦ԦZ6MG*A- %EFatg//TFSbA0KL$Bf!RLR$BL1bFSpipiN 84ӃN 84ӃN X/=S^[/n+.Dro7ܛM&}ɾro7ܛM&}ɾro7ܛM&}ɾro7ܛM&}ɾro7ܛM&^2S%-deٗS&Xc Xb,; rrBCtr?Ng#&SRr˩IMx^ORrxo 3<ǃx.>i8_% PR()AJ PR()AJ PR()AJ PR()AJ PRiigs_^vq6k]1COkQ4KNQ~xk1 QA !1a02@P`p"Bq?/\^}8{Řlm<bء(mbء(mbء(mbء(mbء(mbء(mbء(mbء(mbء(mb\6 P44떾&+ս JGOW.bS#HG~ N(kl._;eώKw =/~812A!"3QPaq 0@BrR#Sb?(='ygY)ԡNC#)jTW>z8~ۛ"c%Lߩ)w% uEzL4%-!qj"ÅWl/PnBļ5C#wm-ǡG|IMKgAU>BGͿA4ZQjmZQj%$ _RK.K.K.K.K.K.K.K.K.K&)nu3Q#z7MF$ȡI9(_--~-s[-SsMKNKÍХT繩ss!p|;B9Eo7 MI#v+O6sȒ3ɞLg<&y3ɞI9c<&y3ɞLg/"%%%&ЯZ\Suܢ{-&QrQrQrQrQrQrQrQrQro![\\\\\\\\\D'i (e SDOQKæu-&$mDBjqIU.Į'>lRr.Eȹ"\r.Eȹ"\r.Eȹ"\r.Eȹ"\]ȄBEBl.} Bн.e̹2\˙s.e̹2\˙s.e̹2\˙s.e̹2\˙s.eݾBGf]h7J.I9rлĵoIQxĆSHO|)2Xc,e2Xc,e2Xc,e2Xc,e2Xc,fBEJ!"J!4_BZWDQp6ҒEDQEDQEDQ\( dPlQEDQEDQEDQEDQD'k.R,[}HjԱ*$?F '*znOv/KJm?.9CIbZv׫Q%MΤ}l$5!]йp]лwB t.]лwB   t.]лwB t.]лwB ܶ ?fx3 g<x3G (>g<x3 g<||x3 2%'܈H*KymMYԔUKe< R}IJ{PһNjdJTD$Q~)9P\n$jiﴥ"q? SWnJ=Ouv?2p(:GEq)'5ߒZP[=[=/Ң(`R7¾6N-ɯBNN-qy?<G eWd] R phPKh_t[gC-Z?1g(Rݎ]4]Ri!>tK5܈DZe!Fm(e(?֪%aMy}H"ssFIdqjh)Jw@Zt9֣mivFQ/&ss5%ūTSۺ/܌0` 0` 0`r!!Ki9iC[E&tBN[aSssNL2dɓ&L2dɓ&L2dɓ&L2dɓ&L3܈~Pr!*\\\\TRJ*TRJ*TRJ*TRJ*T^BvÉm/M@/S޽T Y*?&D? 0` 0` 0` 0`;r!CD?(}ȇ">C܈~PrRJ*TRJ*TRJ*TRJ*TRJ*Tr OWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWzW^zW*!1aAQqP 0@?!\u}lcc{9sl6m*Ơ6m9sl>3g69w~fnYf囖nYf囖nYfN'YNdE&hKϨHh5ȧJ5U|䉹N4?*!6 1D**etbvĜ69 ZC;>`Iݪɣ*0GhBjmD(.WLMZʞHBZ7nੑKB(IN7w IBg|iR jTB(7)y_RB]&j Mc jr4K#/kԕ$Sr/pJeFV(!"mQڹXW1245͍2y^ki! kPwlK5X I_q!p Ƴ) -9o4Ġd$TJ?IjQ<F#`0y<F!fEn}(9̎ds#G29̎ds#G29̎ds#G29̎ds#G29ʎTrȩtc:ti4I '*z 0!1$m*] ꮿ$-Ry BNFtČHU. VxO1#fӒ_"lY#LR&"*h/򓡱d2kXWpJqE-4Ii+ς3$RU(KԅG=1:SJ,]d\]D;t k,i'"w*K[}5[3Bf!&g>UUmT)N(EҝȞh̚cHV\th?܂%BTQt.nfJ]l⚹3v7,ٱ!҃ӣ@16 3hͣ63hͣ63hͣ63hͣ63hͣ63hͣ63hͣ63hͣ63hͣ62ӣ@MQ"%IéD ?B@@_h;E84s> 49( &kpѤSI2$BZk DMh84++]!͘WCڶƝ`! "%F9בh%ܵ~N"Qj "Qėu]tϵTH+YDVBM1D!9f5EtJ3jҪ"PS2O ]?FD i^d7bnQ!jh&UNwU 1kbó ں $:;'/Cy3 IS~pۘ.ybnmۉ.WfWjC<1s\<1s\mŲQݘiѠ5?B&_9o@Ե"q©'Yk&[j%U:)9uZJQ!4EB#rt BPɹZ:@ȭWIKs탕a%-[Qӣ@T#蓺];thS(%~R%>&[LRK$%!.i \٪{**'rLDocNٲl.O^ƽ{'/fD쟐~BO^ ?!{'/d쟐~BO^ ?!{'/d쟐~BO^ ?!{'/d쟐~BO^ ?!{ ];th G;th _I$I'JJJJJJ%DQ(JJ]+%wDe*Ɲ.K$aqgB5(8}9P̱t@&u8888888Ì8Ì8"ɐiѠ@N [i= ) R])l2BN+ -K#gx6W}M.lI"ZdbEi,FB3TLv,?.;q{$mS0Ib]00000000KV56g_:4J_D`fa{{d#!GI'tꉳNh03 ,###0==######S:4!:W^ȜUԧ K]2iAI!DUl09U 5+B'%2:D|eFjU Ht9V/:a%2;th=Dt+V˼b7Qܠ VG[.j1 7Bp,Qaryq('5UĞMw sJS v4 D(v~iFrO(t>[S"!x}v/W(r]) |+5WY0P-Vȏث6H.=tg4 y4ƞSЬmT掑EOBꃩ/TV HQڲ~[5CZ Vaj-Y0f՘Z Vaj-Y0000000-GcN̉ߡ+EF 4go)Vo{NFtVG]m1!ugFc~fKҊ֠4Lj*+i3v Y J mIҺ%ӥ[[F{C 4II$tƝQC٫$ZRZ‰'WcNI+*aتV4CQ$$' ᐜ2BpN !8d' ᐜ2BpN !8d' ᐜ2BpN !8d' ᐜ2BpN !8d' ᐜ2 cN{>iѠ/yG :4Udy2D2G$y2G$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrG$yrCcNGJQjVU JKɢI~iѠ<&*iѠ/yG :4/F@t4}ӣ@^:th _CN(Sl`6 ml`6 ml`7A lt7A nt7A4i,dB#cl|6>F#cl|6>F#cl|6>Fg?M-m͔/"˶mt'8H` I$7cmmmmm$IM$H[m}mfy,eP,I$I$J<$6EM} \mmmmǽi?I$I$I$I$I$om{bp6mmmn=mmmoI$I $I$I $Gm~mmlI-m1DmmsK-lImm!zH$I @$=If߉mmodhlmmۏ@> I$I$KG8'#Ѷmm Hmmmmm6mmmmzI$I$I$I$I$=YoGmmmmmǴI$I$I$I$II$I$I$I$I$z=@G#@@I$I$-!a1A Qq0P@p`?8^h; #NdXMy -6@nr֟9}C~-4 5}ê!">F(MdCpoWoO!pLoE;z)NފvSoE;z)NފvSoE;z)NފvSoE;ҝoE;ҝNފvS?IB|89bL0DA#/8eF_aRr{?x*>P $OiZ'tc3f 폲k )̓7c5< av@8۲ b!"Ff!0Ű%e B9bwD@$Urh;dDXK8BK)|AC/aV?cV?P"3cV?cV?b dOSTU6ü_qk LYgw*2[} 2  {#Tdʼ漧=9)yN{sS缧=9)yN{R deo-&DLpk8J p DAYv ni*,RKfķ`XBa$_4Tѭ0SVQ MBd"pJ(l` @d m8_"" xJ(Pԃab6LPK|!>g PϙpV0 alXGBݐ3XR?H 0 AQ6`@hi% ,nB]!RYFwIU\H^a[,tRH(#9|q h]p`"(_)¡! qMD(AZKQu%\V΀RY 5Y:DwaКffNf|Ab 4,U]`'aj0H_xB(}q2&aV 5%b`R  ^ C_ %qY'RqI'RqI'RqI'RqI'RVN8TSN8TSN8TT! 7H?h()Rͻ6ۿsnͻ6ۿsnͻ6ۿsnͻ6ۿsnͻ6ۿsnͻ6ۿsnͻ6ۿsn7oݿsnͻ7oݿsv6#$L5>z@@J$ 8j+P~  #H6F vYh`hz@# Y| j@$888ぇ")24?rb"*Y4n9@ |CB@!{ؠ(J3$Z@`rYqɅ?!%rmxH:> JCJrn Iq8 ! @! uuh+p"MBԶtT3J,%`v ؾAn`*(\N]Ep7x)H0M (888?"4 `щ3NJP/T ާK rRPP/L$)D#!9+a iJ3n G*?^78w8q@@`#Gb888I`g+4]wD20)NWm>cY~zz @'79 Nos~߄'79 Nos~߄'79 Nos~߄'79 Nos~߄'79 Nos~rI$eYw޲[ * QC 1"ĀE^l@Jd"˙mJt3q L!qf3c1fYyAp t8X!1cp"]JS@J88^hK 4&3c0vt\@0/4-2B#I@b1nxRɔ !T( ȗ1' N#±1s޲P$7]0; &pc0awJ7Lo\%kWN6R,:K ĚuD3a'CE ;T&!? f r G`4BTT@Cph: $W\$#$e`ɂ rƐ?Id=%/@\0&괔ބ/W-XGu/ FX( pH8WB/#fIxX7#J=;UHyo`TecX@H m_k5}`0$@Ǭ< Y_m_m+HY.32Id=$oeD.]"4gZK*CÕFZlkTu\vk$݊\ *D(w+QTY0){ K <Ú*RDuij-ʴS0 ;p#Dd 355rK o:<͎Vav"\7$d"Qdg2'5f4дIz^4פz_X)J"Ha %)S9Ls8> adЃ%RU(9Lr1c9p-;3%Γzz,IE`t@iB*5j=LM`zL!@J/A$MЛ*M=B!d"B!UΓzzE6PP l5 [EZ@Cx8$!B† ƾN98㳎;8㳎;8㳎;8㳎;8㳄8L38L38L3 oYAu!D"B!D"B!D"B!D"B!D" :M!6~_.tCI9Zk (%@ѯh᤿4 .\$Ip$$_KI~ip (BQ !  365vId= :T+Z)@鵬5hbޗ; PVʤLH8 P J JpP AD8Z$ /CYL@`R.0Id=3&Uus3  ;[X*[qTRJ*TRJ*TRJ*TRJJ$I{s޲۾?.tCH: b&c&c&c&c&c&c&b1f#b1>I4A4P{A5P{A5I9Nrs$.tC)!0JO>+x֢@tSur8Np?' 8O|C0Д%ql  fET> ?|N3qgFqgG>'8|N+q_K&H%㑀>h9L+(;*!L(3Es)#Y҆h S l,yTbNƠ1 U : 03=ljHgA870Gs%KzH( =fo>fo~fo~fo~fo~fofofoah30@\3ϙlwߙߙߙߙߙ1 u.C@k=q7:?.tC]M ఛSlO>>riϧ>sΧ>s;˅Az  >riϧ>siϧ>rϧ>sϧ;s$*+.tC-N I V2°c1vZf@DzBemƂ`4)Q1Aͫ@YD$ ]a-m/BQu]!-N(@(lVU\AU\{,9ҚQKZ%Γzz\(ۨ&RpX:LyHlp$H R]K I( V?j$PzUg$,0!nr)Ob@N5D/QD°$XJ   s޲g<"xC"P $P6$TYBm HFrh` l`YӊKtVuOӻQJ%!T%(2R)Q ; PV }hAsVR(eAQ7 C  %G{wXD(IPh*,ԁ spT Ѹ6046,Q@e'KPMnfv[Yݬkwk5nfv[Yݬkfkfkfka U\7 Yxj@CE _tXP3bW`QV\]a*Q(Ayu1Q r%A4B Q8bhT͉)c5A!H ҡ4cd2A)VbRKؤ>4f1,sl[4(ѣ K%oYA-C0.A(U- ejđKbj0 R$@@VM"\:s޲HI5`@S2Zqfkwn5t[kwMn5t[kwMn5t[kwMn5t[kwMn BqzM!;o7Y!޲g?zzNşM!;o7Y!޲g?zzNşM!;o7II>$|H#Gď>$|H#Gď>$|H#G>|(QG >|)&ԛRmII#D1d )5D((((((((((((((((((((((((_m^fyEm^fyEm7foo`mSubsurface-4.0.2/Documentation/images/AddDive3.jpg000066400000000000000000000506701226345450700220020ustar00rootroot00000000000000JFIFHHC    %!'&$!$#).;2),8,#$3F48=?BCB(1HMH@M;AB?C  ?*$*?????????????????????????????????????????????????? :T@-Nz&$jl$R&%ʳ)zV:`E9JI[lJ]yc3*x)]1ZjPVʵHҺb9+* $I EsG7'~/~l;( B0iH+suH8=z1[8|}L.851 ϝWxS.:=:oeex~$XXtrx}|+,ԐJB$],H, Kv9{s.@8νnfXbMeEII%K@QAs.rig C]50YI}sW:jv't6>t:|O@t:|Oӝ?Nt9Oӝ?Nt9Oӝ?Nt9Oӝ?Nt9OӚOF|>=^nQ_+JE.Eq3Սvۛ%7 DMB9-ve ͙cD5ATO%tR8WĎrD06b+  $\DCܑ5bjZܩ"mō ikE+ErYE[OG*T           J(PB (PBtsnd72 ̆Cs!nd72 ̆Cs!nd72 ̆Cs!nd72 ̆Cs!nd72 ̆Cs!nd72 ̆eWG]D͚4I946hl!4xիĩ܊r$ZYVri#ϪJci-ZޏsbB?bduWndNz}|X,sMoھPz(ָ ָTEj֡jR8т5ơkKDDOEۈDƢ򺘜ܺzn!3ATMDT/te0a)S L2e0a)S L2e0a)S L2e0a)S L2e0a)S L2e0a)S '1WSc_R*.A\OWPW""GWWTG+UU m4XHˇĪm 豽]k2>T̏Nw_(=nUT))ORR%))IJJRR}hGyGqkGyGyGyG(((ZJ8<}|_(}IDPqrrrw'''qC;;;NNNNNNNNNDM*bLlOr5UV7R_ dȪNcX$|kls#xHlVE$s#k7 ʍ#Xb=3FI=VEFRJ*TRJ*TRJ*TEPzȸ1!s.F`McRiƿBճ"GG3+!j$Ӫ69R%ڭm3_(}Ok^LQXՑkXcfD1{X; X/H,QO?|+ڋ(PB (PB (PB ;Q^~JbbA涭QQQQQQQQQQQQQQQQQQQQQQ5_-2R9|R|9|RXV_Q !D(BQ !D(BQ !D(BQ !D(BQ !D(BQ !Ds;loDdUJ¯)o|P_-2~K?_%Wnߟ/Ao|7Zu9|UNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNJ pqwqwqwqwqwqwqw'''''''''''''''''%9/Q"1A!02@ PpB`a?1xLegH/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b/b6[I~xx'iD.O<:2mO;'ITdHG7 &LFvdK+OOt}v>~Dt5YRfdddf5Y8M~Nr!rB'R.B.B6>FîLΰV+l m[`V+l m[`V+l m[`V+l m[`V+l m[`V+l mI9}qwϣ?tub#Md9C9C9C9C'?S>"I'Ոt+l m[`V+l m[`V+l~|Jz{PGO3wGo"+Q"A!102@P B`p?_գ r9*}_i馚Q>2 jM=4rUK ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0ӏF҉CGjJԾ/ WK_\Ծ43[Frn/ah:*Q\AUIy-*rUbWj|'W=Wמ:{zD_% D(ĢBQ |%-8ӋN)څZyiŧmV5uz"PrM&ܓnI$ےm6rM&ܓnI$ےm6rM&ܓnI$ےm6rM&ܓnI$ےm6rM&ܓnI$ےm6rM&ܓnI$ۓUȾ>:/_꞊y=U qn7qn7WP㧞ӟ ^IВBHM 4$BhI 4&*/⢜qA888'51!2A"3BQ@Paq0 #Rrb?R$ry<ܞnO7'yry<ܞg444444444444444444444-.KK䴹-.KK䴹-.KK䴹-.KK䴹-.O?C R12MY::*D)ROԶٯ$`TۈMn,I E(QQo*k,+ Et^4(iO9Rl9,a=)]y'.>hbViW,z!UN1QYRb3 k6ʷs1'**"t\oIʏ *gR.n y*w&FZƪ_wiRUj^w\3,K R^gr.˲.˲.˲.˲.˲.˲.˲.˲.˲끩\DkqƑk2CQk5/ȆrRؒ#e4kTj,)V!DOͥR8U5$NmeBUjZZֲbN*JO8CyV+?S/]{6JV$OR]UOCO˂?"_!w};i\I?df3EH)E/H eVw0T^ę\y^ۍ>JI~ `& (b_!SgG#g <6xlg <6xlg#g <6xlg <6xr<6xlxlg .JImݐ?a3Wo̫e]6݊ X;_VMlEJ/&ÔRbu+,[S/ߌb󩆚ka1qQ?m'"8[/>U:Fq?qY*6vb?Gj]X_]aO"jY40URyRNJ2޷"ܭ#+1ǺЊVjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfjfje^!wVifififiefYefYefYefififififififififififififTB0AU3:M9Wb貸ܭeU=Jѯv( jqb]Sr%+Wa5[t.w'%,Xbŋ,Xbŋ,Xbŋ,Xbŋ,X{ثa[jU΅pmWRXRD2/RU߯Cd(>JQSbT:=wb_ΆMZTFrڗ+?ǒ ^Թ5.MKRԹ5.MKRԹ5.MKRԹ'Jn?\Yŵ5%9J8KRԹ5.MKRԹ5.MKRԹ5.MKRԹ5.MKRԹ5.MK!w}=?_jb{,~B5~ _Wj5FQj5j.j5Ej5FQjDjyP"AW ݷf)Q7BJ]5cWXGgez?jQDhg+ Ҥ]US'=wVQk%)Ft0bЫn_I3ct#J+&i4MjwtTo/{*&}~FdiFdiFdiFdiFdiFw.R*B놱v0ϴ*?gfb!楔(rjT'Mg*rVJ.U\)Xk>1 ;9˵$sqf RMʙ'9W"}{U"7\9Jq9Swj!wa#к4 n+'?K҂隩 jxewa½;S$MӎuK2U1XQ ٨4k+wژ__fߓ~M7ߓ~M7ߓ~M7ߓ~M7ߓ~M7ߓ??%N_?v컺MEz wa2CD[ܯ9?F'>)JXʿAbI?s̻.˲.˲.˲.˲.˲.˲.˲.˲.˲.˲.˲.?x.Qw?x"5ໟsr˗.\r˗.\r˗.\r˗.\r˗.\r˗._ktllllllllllllllllllllllll\عr˗.\rg*!1aqAQ @P0?!PY1f,嘳)g,RG o!DBs9s9lt3(ZvYH6!NVaI%`TCS)iA7W"-Eڿ6ѸXV :8d*YH]䍋 f!R'a 2£T$L$HhV/н65CTM`C GF7\Cr5ur$O L!!uPg{{=PPMm(rhw MԷ&#RZȳQ !D5Bi:,JrϼuD@zDȇTO@FfBؒ lInY@S+JD8XLz:k';j5,?C999C9C9C9C9C9C9C9CzoAoAoAmG膕'={)R~kZֵkZֵkZֵkZֵkZֵkH ALޟX1eہ$U nz z`Kydx2<v =T\$i;۸֩dR&@e0p$!AJOx*p lP(*J z.NLz1!!OJv)2 $I$I$I$IxR%bmlHԲhTA.]F#e% $#=,PRNRޖueIĤb^mԪun$]N:\ZTd3P-jjDR '$J@0"kT3ȗ?L)_E.z6Q}@дJ{ Σ4j%@G)%}Cڊ     $zT݊ T䜡*ÏȚD&^ĒI$I$I$H$K}ĵa%^;I$I"#$I_E*؜V$GY(xd$I'KZYob',%a EeTBv61Pա{[L#Rt!t!.jF{BR}JB57J TVoWȪJ[“}:뢂zEqW.+!@Y TMyBojӫG,J%Y͙#c#lɃlI&ělI&ě-;ʍNw|6oY-+>OYffoYfJ>GNO_ j3z޳7p{̒҆z'kTb"FoЏ1dhkuG`3Hܒ]BIv!)9M!%%Q r[!{FNB=跡"UݕHP^ &_:'{==[ђS8ͭM.ᤍh/t*T5>$^޴nׂdGNt ?2ITMn0ΏzZՐz 2 ͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦͦĖvu,~K:‚LC1 C1 C1 C1 C1 C1 C1 C1 C1 C #=6""΋ =Ыd# *3CU3m9--:diw5+Dw1h sv Wbt}?,%Z!U>-q*ePNaus9s9j6IP H94ҳrSm*\Xv>s9s9sY5bKȂ     AAAAAADh/}+QޖcNvt?m?t7AQ|-md lt7A ntJܳޒ XaE%G=JA,뒩uNm*Q5$nܪ$%Q-|=r\QEV2{V{QJQ̎+u6؈j-ZD(#2m.QU آ~D+v&'bU7RNP<3L+N Yq$K (%j3rO?O?O?O?O?Oe֧,jU\t"Vzk~dvH«θ٢55vQFzSkťk <%&fMի~!8 IUL{a^B$(ܜn'zZՏ >r^BuT>bXxֺB^ \'d (KV38b|dHQTUa!.U-5Ƃe%BX?HY}BiӔ'rDsG>Ds!Y-[(!TK`$Kb=cVTY6ө1RmafafafafafafafafafafafB=Sf?pv=kWcCޖ5dC܄ܟtT0ZlD*1F#b1F#b1F#b1F#b1F#b1+#ގ!_ !ufJRBuU}ǽ,jr(~mmmmmmeu=P{ޯއ-j{҂pv=cWoCޚE]~{ѥ~{֯އ"|h{RRʄT'7 o|7 o|7 o|7 o8#28#287 o|[IEHhj5x ^Wj5x ^Wj5x ^Wj5x Kix4^ /Kk^ kx5ּׂPm0 $I'}U3A̞ vmm@q(v7zmmI&I&M$I$POmmmmmmP"(X.I$I$}myaermmەEg/ļ[MrI$I$4mmmmmmP@I$I$($H$$MI$Ko-ٿmK%IdZgg $IH)vH GrI$I$FFI$I&+mmmmmmmmmI$I$@I$I$I$A$I$I$HXmmmmmɇmm$ $I$I$I$I$OHI$DKmI$mAmH6mmw2m  $I$I$ $I$ $Ii46@@mFjmmlI0o,mmmm@$n7m$@.mmmmmnL ͶmmmmmkI$I$I$I$I$I$I$I$I$I$I$I$H5Ѷmmmmm1X6mmmmmCmI$I$I$I$I$@N N0$I$I%+!1aAQ0q @P`p?VS!ӂg. $k4veDKEσpメ۸%Qw5 Va_Ea,R*PT >XW4#"!g?ݾTH*TRJ*TRJ*TRJ*TRJ*TRJ*TRI.c[5lc[5lc[5lc[5lc[5lc[5lc[5lc[5lc[5lc[5lc[5lc[ִ𸫤ms ~ߋNPPev2*6'|k302 w&v\&}NZX܆[zo!RQ@D8DPVu&̲@Hb.gAX5WܪRq6ۮ$v]]\M b_2]K+ef0nKr7}Fv N] .F좹ϩ>IQ CHjOPЋ\!$I$I$I$I$I$boIRDzO1ڥ[~^yW@_ob}+gѩ^^ƈv~FjO?‰DC )78k،c}Wcduv:GWcu:}>+؉D.cC.ᷢF9| %+5[rW/ȏ юyx5ςQ^Co I[Z%jD"B!D"B#֢?ؚ蟓-YH)(cl~k(j;Eg\XY&4'Ɗu}<{zJ8\u.z| a;^?Vf3ci?.]7ktq-ct]xk:9 X5QOǿl ~T}Du}[YOg'?,!q1AQa @P0p`?VCfMF9R C[c:o\cM/221/!aR1MơQ)p*7FD Pi:.L 83|M ؞C obQ`2KDȰ]         AOp\. p\. p\. p\. p\. p\鮛RFiC/=@ȕ*K\Rw@l@zXVBJ&!T+\7wdgm Pk@{]jln-$Bt?PR@Ip4"6pͩ$hb; HhUZn _DEN$$V).3GT#{FR~0R7v(TPUJV 4uZ K4h(Q_xb Ψip 0I#}ưciS% :e4() &LB=TDˢ 70#6b,С,&KxHOŗ PJPB ᨈUPۅ44=*i($T_PD? @A.(QSs0=qQw F}KtkL}`L2z@6+:5k1cXƱc5 $\'qd4-Pm4mց{D%d+QoO I0dIqA&] '†@H_Lk1 D%$¡c52n`U ȁP N6S&. ?Qh" 50ѠmN KPSה{.#VQ#`M@@X{&-vIJdn "JTd i0'ˈ #>aD) h >㡖 hOQMTCPxO[aCBIG939s9s9s93g9sfn}0$5,j~&-m "D%4z """ @h#h#h#h#h#h#h#h#h#h#h#h#h#h!砣@L>D$`+'H #QXJFFFFFFFAD$7&*W=Vp ' Dm!0TsFxI 6666K@% fj.bjHLsp(63|YA/ZTC9K1v)ʦݱIXRC}pIR l$%jt5McE2aGEq#C0Dh=AdGڑcC(!U0 aC4Ѫ4ě5k;F#Px"$>KQpm9:ߒKb^B66;]ѵ}ѷ} ffnWo}[ tt)AmurĊ FU1)ctUA@B@8@Q \8*vLHD@Iִ@P i_-.1 cC{\èt7$!BNoU:`PkR 5&m]a( X b(aXHˤ|f+CN҈FIj7GQBB HԊF<D݁0[3h܊4b2m {A)L C$ KQ"} DBb"ls\ȣ`2 I5ԓaGY=ԇ?@PZfԒt "lZTV :8\r1Q k#RBy0P`؀>$ u_Hlϓ|'=>Oy{̿,QbX(E,Qb((*T9\x<@tR< "2u $>T)Z&@ u*H&Mq+Pl&ZeZeZeZeZeZeZeZeZeZej2Z #4r7>17o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7o7oQM`$1~???阭`UP|>g3ϙfy<ٞl6g3͙fy<|6g3͙fy<ٞl6g3͙Fy<ўh4g3Fy6{3g͞6{3gN@0΢'=  c !V )2DkZ0$G#z([Bba (UA d2*eK%) tJ(TH? 2-M%FE K(J~>릃EN&a@#H d``S ))a;F'O1CN?K?>P/y_Ɵ~}0ADa_#-g~GU0zY_Vߦb@)L*VVYZ%jJԕ+RVIZ%jJԕ+RVIZ%jJԟvVlZjũ+Rw'q;Nw+RVIZ%jHE d9T"("DQEDQEDQEDQEDQ%EQT5 KRԵ-KRԵ-KRԵ=OS=z")Subsurface-4.0.2/Documentation/images/BlueEditBar.jpg000066400000000000000000000134451226345450700225400ustar00rootroot00000000000000JFIFHHC    $ &%# #"(-90(*6+"#2D26;=@@@&0FKE>J9?@=C  =)#)==================================================1 \8 y~?ɛo̝k@2v=o> c,3[Ō\VFZf[r89<^ԈE|Q6N^Yk[ukyk5+'e9exm\Xf#[>ߋ߆C}-S=3|2t@=YwDY3:t|x"3!4@P0<١Cf 46hl١Cf 46hl١Cf 46hl١Cf 46hl١Cf 46hl١Cf 46hl١Cf gU?5~o#&6l ` 81cdɍf aCVڬidlt e QR_F=۵P@`} .VI_ky_PޅQ*{P(Ô"!lz_'y?.D*qQ H;]StB*bOwCłMPx߀[z ⁙Wb?9y?[*6SaC@;Jm)›Jd3'&NL92rdɓ'&NL92rdɓ'&NL92rdɓ'&NL92rdɓ'&NL92rdɓ'&NL92rdɓ'&NL92x˵+(Q!a12@A0Pq?uefgs;w3gs;w3gs;w3gs;w3gs;w3gs;w3gs;w:oz۱۱۱۱=tbnnnnn"ޟuO$Vb 6JrB̌ d-(LP~dҥ^ &%f>K&?$ 2<1J)#fg?x~q$q0GǷoD|~LM&q<ǃO=LG'q<ǃw 1Ƿn EchX,m6EchX,m6EchX,m6EchX,m6EchX,m6EchX,m6Echt'Q!12a @APq0?㉊Ʌ (aC P†0 (aC P†0 (aC P†0 (aC P†0 (aC P†0 (aC P†0 (aC Puhqxfu3LG2,Φu3HY8FiX-1Jv KD:虈"j]ޥzTW!z"J5CD% hZ I/2O~=؞qxYcbkB'E+׸-EmDOOB-)*S)1I}ZR$RcbkRJD}/Ѳ~$z̓Ԟw81f+0{0{0{0{#xt`````G7JIzv^/]ezv^/]ezv^/]ezv^/]ezv^/]ezv^/]ezv^/]Fq/2!31A"q@Qar0PBR?͡WU*x ^WU*x ^WU*x ^WU*x ^WU*x ^WU*x ^WU*x {O#uԟ)vuk>NԵi- 7ZG_e)t% ^ BlQ-3ZeZgu >#!'=z-GNwMO4nkDuu$n#QCO}[3(kDt;E'|'>HzZZ쵵練,p1Ҟt w^WfeC5L3n%j$x#ԡqulf]3)A] :\H=AowLQ BuiHئ醺#nZ>AvM. }6R,pvPO$އ}1!t Z 6QZjB$^ 7qˍ\o}e.7qˍ\o}e.7qˍ\o}e.7qˍ\o}e.7qˍ\o}e.7qˍ\o}e.7qˍ\oP?)a!1AQq@ 0P?!aww .E(p]‹Qw .E(p]‹Qw .E(p]‹Qw .E(p]‹Qw .E(p]‹Qw .E(p]‹Qw .E(0TGK j؞tpRix}Iefj I}/hsWe?a٭3t|ҁMƖv2aI]j-4/=j6q>$PWI"ٸp5Q#愋s[.(r1nJS8Z{Jdzu%ÇF8Oqf߰&蔶$heSs7diO J/>))MN ^7QX]|jAjke#}/ދII/b#߇Wu4ě柨)^#irM57~4(Dz-FqEZA:WF䟓G)2-θ}d9azz8=m(JyEĂ]E>s S"vu'oa-mz|i>}$xDOi>}OHH-%^{^{^{^{^{^{^{^{^{^{^{^{^{ (a1!AQq@P0?PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQBKa>y(|Pq2PC璇%GpE) ~2.MQ!77; oĊra: Ć65$bCH1f{h161Z,R/QkOi YJC'Ni5.>#im[?Fw 5qKJSi)GRӷ#ifZkt2Ũcy8—- Fv`1PjdZb? A)-ԒT%/ӮI>s#r$ւJK#0zB]nhmXcPu5ZS=h^qF.*sK`*W֪ɌxOS5NLbXoR]m$MްSj+o X3/_(Vʤa螯=`V6HQCv1Fo*Ng Y44D{hyIg1QkoB)JR)JRIح5K1\o%VgX2)MBHJNON/;V\UL[FMNKC $$K2+2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK!^ 0 N#>^}}?>Nc Г)sP`wPAskLuNB,AP'֛ܚ/S֑t GX˝kc32 8́P  1,\G+Z"*c@qX]!YKRQb˝Fsz&"KWy0DVJة$E3ZTLHPHnlzIS%LQk DFBMMa.R35,q #s`djTUHB HnlS2ubcy.KcHʥ5sz576($ @ 8́U\ *H& 76˿:fWrנ I9hMRk\RhXA@XH%{$8ח_K*0gRDx˝z}V3:i gMgpsq 5{8́R H q*Lc:;mI 8̀HF@#s`PyI[ h(R$FH̡bJVUA%@  $⬣Z^-"@2q25R,@TN3sPq7?)!2 01@"ABP#4je9!ϐs9|>C!ϐs9|>C!ϐs9|>C!ϐs9|>C!ϐs9|>CMуs3wB-dǏfLGw~O~8ZMz Tc6G؋HtMw;sw;s]5^8xE1!I?ZI3dM;( qզQ4ቸtQĤIOdS僆xlK!#,y$?&Klydjqw;+jcZjqrQ9!gT)E"HR)E"HR?[MW>MKxլS:YD~0M'JN>eYeYeYeYeƫYłR(QIbQܢՔQLS(((6WMW?u(<i -!twΫ\BiE;ߋՌI9(u^88֫V}O>Ϋ_'*nBݻ}W?v_kUݲ/qNVI_02imSw:~,qCqIu ֑EQEqGnIt)>"K翧U,-b5~jaشZ-EhZ-EhZ-EhZ-EhZ-EhZ5o'A 01PQ!@p2`?]A$`QUZlz o S Q:`EJ6(Dk-uw Gpw}ASẮamw*wrw>ԯzG&A1P0 @`ap!?q|BmM֘ACʯO_atp;6Fm!lΡ!`HH*P:e Q(6Z vCvx+Lw[#H012!Aq "0@QBPaRr?Fߓ6oUFLə&fٛ3fl͙3&f̙2fLə3&d̙2fLə3&fٛ3fl͙6fٛ3eܨlj{ۇú[nT:-RW|UϙS^V:P|>/o_ZPRE|U+|G]ܼ|v%ߓg6v2~σK~o>kCSԮiԵګWR^Mӫ*Zj*-&UԻ7m_KPT;~cVsCK6V{ řwyl|DXT^ާ C!d2 C!d2 C1f,ŘbY1f,ŘbH}xEC{/s%d̑2FH#$d2FH#$dDQ(J%DQ(Jgs>kC>:%M.SSߜjTiW-mZos^z_QgOצJRoЩR6MUewjQ5oWZNLJ&-.-mZor+^ϊڽ4ƝV\mJ.W;ԦjҵzdփK]jV(TSeڳWB }Ź}*z[fۿCoJe6z}|]Y1dvI$I$I$I$(}xzl7O׶Ūө[gm/~T/oKqC?^QAAAAAh}xٿ 76A+xړkPKҡm'߶K.w]TAn)}YVU~VMT2ys^x}C]G[iJnNŷOW&綇œ&d̟fwR]? ݌rAAAAmm/o%1,vݖW}\j8ًG>{1f,LvrfLə3&d̙2fLə3&d̙2fO_v2^mga-[bʞSV:m;H^*Н;4+U]MNWb>.}i1؏4׌\ޖmO '!j_~E7;>kCAy>U HJ[c*w%q_:׳b6$I$I]~,i]Tav/N}>f/j,Řb s 8!%DQ(J%DQ(J%DQ(J%DDQ(I$I$+}*!1AQa q@0P?!p(C`b4 Dg#)7qUUQ"""!Ě #/0hSEꞱq |!"0(&< -WacEh@PIUZF09RG8FYtqqqqqq ? uGj{bZCK^`45,8 q] l0n^`n6.j wb1F#b1F#b1F#8|qqqqqqqqqqliyJBvA?qJ:D`"K$-51a<3gFJSgV1mxS "uc&"4, ,O3 b&``:PH{GO<ԁo7}q\o7}q\o7cEhZ-Eha״zWɼ<ỠeJV7Ynuf7np&7)MnSrܦ7)MnSzxg@` ^wh\ 'օ(`@BK-m! @+}D1@R7-/ 9!*8{X@5zFr;Kh15Hvx {Pt4'RAfIF.ĺ* PJ@PL jUH|PhH%I 8IV#x1e#Q'"|N 7* @ ?ɭWQB. T]r&)IIIIIIII@py12ШCx7j_`՛ z>Z @jB9haװ APdT#2<-PR2Ar["]'Q>cG410Aɘ #|G>&>&>#>}>#|Gc>}>&lEu3z㱀oSce bzKcK;PQikEQQ !&8ǐ 35X#QA*pOVAM6$ؐh>O&ARI_<.zs/ HOw|LiWh"f1JJzߛ8(HX-` ?:-e?t9ԝIԁ'Q|LE>@$40C: JeUoYBB -t pq z'*C 74 L`*M !(.aYF1A439 NNB:ӭ-LZũXSqڎT V- (Pщ|!#AЩ Q8.g rFEͻc>f +{ʊ##0^sxjy0Rox&7Mox&7Mox&7Mo|w&7M'y4擼wNIi;+k/ $߶imI$oV]|$I$I$J7mmmmmmsO{ mmmmoYO*1'_u`e6I$I${HI$I$lIo'㔵=ݵI$I$7mmRm}6?6Mzo@%Ih/OmmmmmO+ !1Aa 0@QqP`p?]jO5*K^)p`;A+Mdjq(PcY?o)[tR5 $t,&5(15F3Ȋ@ "΂(L_͐7G(?ǖpg}t si&-k!KSWKʹc Lr0qguPc$ 9љΜ u3(xI$uI$I$I$I']:Nvp|lq{{(fI:k;IJ)k㰬vqY88鈕S8=U%G1:|^mb=k:&Ca"N:cAAAA M23`M *hUnCm{@',FD`:~ 7[d٘f:~1?~EdSǺ4'a,hZ#K#*!1aAQ 0Pq@`p?(B/^)JR)JR)JR)x1(Vɷa"fnQ*вǠxJu9 f_T){xNIٜ!B!B!B-a8\Q*9*~E2Qfo+G&Y}blA(B?w5YT.S}HeD%Ws)-.7KYA;<6\G$!͘F}᫂^phv7,hh8<59pEPNVE'ܷ&wh5-g߄,|ytl]~ak#S#*!1QAaq 0@P?ѕtolvJa~p!%[;)} Br2rux^%fv9NZr'-9NZs'19Nbs'#>> bzfPGWV]]y~R*bQ5VJaRc1-liKO eorix7cΝo:  b"@Fe\MձԕTTb[D]K$MnPB:CX;zSQ-Z;4Ae}HFZƯ%,|b]oPq0\GDH[#CjX+Qg&kzB2s7̃Uo1{>xj&䂼nȌGw9-i{98{98{98{98{98={0a8qy={0a8U Yx&wyhOM?=}J*TRJ*TRJ*TRJ*TRL( ~=~~z\-W'RpIgVqYgVqYg &p .p' 2p' 2p>ZhRzT)|Tg\WMP@Uߤynw[-[ynv[-ݖwe|||||廲nv[-ݖwenv[-w|廿w&_&srDGuy2:tJ`m Π-JR+e@HIX5LQ%1zT(w0z@Qzf+mz,鈰1B:ǯ-OVoUk!2;4#8`R]=O0:ܴd`ғ&f6+L8tp@%~3tʅXc 4[xPX;mB`'&M3^.i.WBk@gHX%;fAFžxc $F%5VN T@!hCWÈcPZMUX@+&]@x*:!hbf$lU YOzJNV{awi-Q4ϓ'>O%OsZmّQm~Wor?y#r?y#r?y#r?y#dtYY:?w4>[h]*1t6AAk.]J@YM%gj+ 3De{;Ke H/!,_1\#%A?6J~:J)>-m~~zT5EWջ$r=q1W޻մP` UyVDd;k ~3>3>3>3///c;9糞{9糞{9[Sd&ܖ{g~OCJᵖit5K\3O&s&NŹ]v(3#JINOjxjkTt3*ze*ճk?~OC qP>P+cZ{Hka“lU86dϐIR@(@bt%eС8?kڪܦjKu<t0Y2 z5,> +Ј#ne8G\CZPkM|d)U_X )Nb"K[Ҫ Gez|D5zffFŴ>&Z_ypr ^`!bGn kРu!0}+~i}L!%.69_ޝ =ϞAp<$' 8INp$' 8INp$SBz oIkV|7h鮅;Y}&Wt0Tbj[^;*aw}tu.-H\w3)`^V}p6kk2P ?ԅ.uo?eYlwZ`=8ypѧ\,Ypˇ.\ #V.WqanƢ"3[*T4La(T8Sc"<@xO~i}^DEJx+i!*T-VV:CCݩ?ܪ>D3JEb~1D*j w4?V '¿?ISj \b!c*bFj jmm^Ҹ^ҾiT1YoJ Dߤ@Qkn̚ J,)Ч`"6n/FE^]g4WDPw4>zZJw%y2<}LD& =&PT/B_GOruGw4>M]P\lt}U/q oSgpe/S#Y.sppg9*54as=̴]'& #-s ֮_w4>P%@a}h\K ~u2-6G햔KpTj7mP ,qdYz,*l.C EXRl(PVnXpծs-̅⽧^i^iZ?h5Z,>ZL)~PU^ ~5Kj~iG.Du/Y.Z)%i GFh]!ukujP=v|yGK/]et-~OM?=%5j:0RX +D\ r2}CWKnY_-|᲼_>#)W[b~&\t-t'rq'rq'rq'rq'rq'rq'pIǧ2pI'zqǧzqǧr (}?Y?Subsurface-4.0.2/Documentation/images/Ceilings.png000066400000000000000000001111001226345450700221420ustar00rootroot00000000000000PNG  IHDRvЧ pHYs  tIME )/!ktEXtCommentCreated with GIMPW IDATxuEƿsm`鮥IQ;;@EERAGF@s{]qTPy`,{33kBJ)qqqqqqqqqqq[U x)qk/84^ֈ_ӡC &P^=\\\\\\\\\\Dӧ{m֭1 !V?]Q7omcݹopq)>?ʶ-Bi/ "t^(|~"~#c܊pq/)wq911*pL8!csۖn/([ 'ccD@mեinT(Um&֠Q 5(?#Vb(cۿI J)Axf<<RJ!n0H7p)AfہIGA~~mgQp^5l yF 3u.м?om"seJ xG x1q7:!:K)@gwC8o-7<6Lso;%ۻG,9Jhiȸiݬ5m+ B(<^w5_)Bؿ>o5'pT8(8'^}+_v<2#E!\2s_O4P2HN 2/"16^ZM & ^uv.ymi]9V9NTrw]J$|N{:RybŅ2^Bl ySC8y$Fdj&!$=0Q['er؎DU10:{Ъ9yDxI?a^&Ҫ7M R!w߭UjG *-:@()NM4q$NH@aFmZܮ ^b!l%8Fb0ش3NB_0ѝ,^E6i!װ2Rua9*XvBv>$5 "uT;vDIAݔ﹂@mѮG|^şK`)5*s-fmX#QY T5?AN ^Y9pm{l k;ɄGf)Ebn`Ԅ kȶH65-i"QtM|?E#w\nKZpNl? kQR@8 A(|;y"Ϻ>T|Խjgs7Ɠչ7BecC&j^zuYrH5lʁCIUĽ4҇ ˃n 4c3'u%x$B 62gAюA2oggLs_2k| | =gӫ[Uf9aU7M3Ft'r4xP391eaI'^ڦ1ډ _^D6y]Q]r%,-N66&n HI$CTc1ʵxW1xcFqqm|GJt7 (8a9 %!HXp@*:~"ɨ@,T(Bƨ Q3A}S!4_r ^U'@rЋl#Jq8BQrš(*IIʑY1a4PTx+d1zxM+>?"\ưU'DSogY׋EUi "1*;\8i!Kf4D(f"T4BQ1! A?XO6).c#$% \THů)BzjxSO"[ҦN/H ~eCܭPs ©C^l"TrL& QF%{a{Sz!*=$y58F-ǎS\ cst&NQұYZBUͺ+3i5"Z:3;blѝzfU) hr@F5ST b?TMH&&znEhGXQ A+va"Tˈ3%ƺ~U(&b9hףeDŭ#U{o%k'TTlz]3 5=)T~"&b:YUtq>.YJI(m%.@RA:66,8&Cn}h^>Pu$YZOߏ*fb2R4>"&1R\V&ѨQVX ̢NVT+VLqH<MM"D"Qp z#H~?*ѸB)"bok$% +@0-~-$%Q2`ԛ(/ Z#ן}F8懅8,mfܘgHjIua'Fwx:#oSrpbߒb"\? YhT ~` hUe~m8.g<)/s-̇Ʋ|c*%9/ `2mu\{߷L}z> /J57r]ө93g*vM2ٸh >N5Sc.KnYntE9EAM`o_TMj֥V3vTh.@Q,V~O/H;'pFgզǚZ<8\fmSxU?cW๑\ 6Up@ c{Ql毶1_jvscotzG')TX, Jm%~Ef s+[>]ز^ՙlJʢJd vGC0d˜I$f`;y|$ꘄ y호.jNήDVT=yշHBtUp(@8za2{ f _@IōFСk@=>fo2 d|u;u҈0r |6xVRlK$v~~/')\aN၍x~x~ڐGFތy[ϣo-U1SnGm/r2Kg'Zc'pG.ee=3vuݩxsÑxOi(ӪTMXl9_w~pšR`Z:t-%?~a&G}{pix#!]ݣ,A=eviʝrn SwM~ hٳTD*<:EitRh5?%[vfӇ;]3%㣢*;V]-ry|دɬӏ^OQ0O㉯=ΓbD]IXm…1"Q Me(tZ 8uV>wO/ŹzL!O':ҙi^]TL^QϾLu= 5GdBy}^4'OO%3g᤹ϰ+F^҄8IqT۠bŊ,Z_ l~78V*9FΎ$V$R)|oMZB4>Vr 1!3V<ZOX?x$ґ'{W1 ^;92&m.+pؽ1`fq$0(nU@?pl=I4ˆkF-=P?!Qn,]ʴYѮUK> f5d`z|?kIBv~9LFڌۮ"mK3S{߶oJ-|N*ɼS6?ٱ`V 9ѬuTÖ(òSxGέ)Gr[Fr|xiNi6t#%sXVQƒU*u^~}&w?85Edї68jlH۠^ϛxs9o?7믤wf"K±m7 ưl鈣 V)q1 fTlU lG<HG:baΟ"MΤIL ǒ<RB_Ō cp\]pҒƭ)%UۜMbOpT}?΁?ccgg ư-*㔣8&~1QsLt:[xy&^O}玤[4hxyvPBNk^3#iI빝'@R HjΤ=;CFYx/ނ䀟Gصk7% =¥vyddo$??oRG﹉aW0kZ #) V/+ʌYy4m#'Q12EYj' rYpm,9tdZ iHo^#kBQ4J,HʝtxM ;`F}CᜋѫuQ{nbZw#/*瞍qs/{:.=;Ͼg֍<훉KO#EŚHZ:[R];gXj9ȑ!X2oi3lUTsY'J*қ4mY]  #^˼AJ7QaQnVVX۶P&}K^)DzӚ?Xsr|[WF'~ty+X.YAÆx?0shеcG~X>r ؊/0x;B[[de,:ZYAF.2)`ޖ0 TNExR{.6(v~XC[qQC/^D`NI䘦uH >Aq4cy0PLmzlxZ<{3{T-a`HX;zƙI; 0ػy|t1F4.bkog_pYoOز~fm&BUiO)jBw9(BA$[PDU5U~eT%bʣ9l9OERLm{T$ =yM1BMeZ93vG=f*G?c"pLc9c=ƿkcs܎c!bK ~1ٿsvݭz,]YqLSxnoΝX|%6n&rE!V~aZԲpj3Zzdb4 nKT̓~Sq0E<~`PiUTF*hRh*_x4䤘ӘS494L[nMjOIS)\oc#$IJנo#O:aq{QC;)R|S%(Hd|VJP>ZNPl9xĶomxe ڹ5Q#U_|?nl&6HTgwDVX6jF*'Y3ߠ ] {J IDATwPT^H +?bAro{+9ၕ$OFD*ʁtiNJٖ1Φv]\Dz^8Ͷצ0þ2bc}TxhXB1| prrW@RZ#ndmpK3y}$ny/Hdg+,Zedxl27~;UKc{F\ i~`yǤv~4qNnYSx|ny]W)Y9qgo}w܉Moaqv%۾$΢0ђ9ձD OFM9Ov dlsr+rl]Y!κݱ-ʏF08 %g[W\W%e ;1;f"5֪ҟQAH*wKZ0}:"J3&Ϗ }X53Ƹq7:#l<~O~ޡO<=D96-uc죣0"W +QU뫢HâiWQ?uBKǸ4h.CR\knW!an'=2y%{q_,F8 P#$E3{J5kFvp6*ie(4XLlqlqaLV1(Ec??8QFưfg ak褯qe0ђůԝ )PtFq bQbVb̳XA)b1bMZUN}>LňFJǴ1cRc}d9cbFanWޏgg}ξݭ+v,lj5#'0)1TξF4Sc}ڳ\-\Jft;6ALXz]ŵLym4H[5uZvɩ/R)҃ x~nΧR ޞ?Zj rbՐk@~O>BA3~DӼ Z{kd֔u#d<ϬMϪ;랩\У:kW-Zn+Uhl.3!&)%npWF=1 O?lSEHlߺkQԱ= .QÆּ ?C O:'<+dz&b@єw`2R"*14g Տ8qXqN`կrÏSb2'AZHHp9W-]E_Dmɡery2=R՛NUZg >bj9D Ad|G+X2FAU*6־uD=:SgbrQ6v܁ľ-r(x *ٴz+5˥ 7U>Wb)>6ȣBGĸ_E_rzֱMLK2QEU'nH.2c$$nq ^Yxr0 I+Ǿ!Ѵ"ȱ1L`iıd:#MFScX>z^?[-R*J` gbnZLq"j51I`Wń'pD)>M[ibX63qf:eXVBUmw9_!GV,uO\r@<~11CS0DKۤzaLvy4~ XP[M&M>h'^,wiڟu ']|_ ð9ɜ$>iXpvjaA֥ _+#{q0NԴ#B9SMԆcX z3'7I-1 ?!a&Xa$OjO3rh,#%+pw0=L䊱`& -hAƇꘘFFFDZ cYWqLb&"-˲4ƴ%]9J|۲,w" y+`ѢEmo#^¡NaU[J'o/Zó+6tVG_`wTCa>I>\M3Xj"̧&<<$κVZv!q.|1x;CL]G_܌}%|v< ̶ә9.j`dܻsRr%E%*߈m[C}BuB/EDWfmʩ-1l 4cb(ڍZ,WfMߵqJjFW#g 6ӬMV.+ЀMZѰmkq_Z&ԮD%lԡMeKV۲ a9kvXkne-DAV4p¬]=1@5"ï.`4Ⱦ8iUҼau)x:kCEZƭ,GՂ'$WB؅,Y6js 6gGλ0&qO E :nUSk J=rb[#a}^{ۦK5 3?@VIo`:6ċXZ" 6XƖ(j5iLU5q 6oMb5HuxŇUīS`َb䆋WO՘ ٱ("q_Q5Pt̬֔Zm?jm+%9vm\lBQK]UQUUgdRE{tLp+4F\J6qh%I[-5˧$VkUwN,bOa&i{=W\A21mx.O݋&%ΘOiDz)8M$rm ZI6YH Ւ}rOxBf{fҹQ' &Ԭ{{(6BUOlͻl芎DҺ~ B8nj,'/'' ePA\)ٱ;3{z]۱1XEs`- ?_ڕj3\5ߵF5j^[: պ'PV^˾ 886x1n_BQK_O;~exusvc&xHhG%N`B}\ ߓb9ˈi#zӑL>!z)XH<&3{Q3']M܌cBqtqR*^].'ٟDXs=x9;xq%qZL8)9{*G0H4rB4&Zm۳O*>d~*eT"GؕoO£yTg!3H$BH7V]\!kP*d@DzsXi랒ۨ쒅WE.vlFsnD L歙y|sTke3Xs=spu+q\"pbw, 8W,;qkE"w*$)؎I8~P.d醥uk_Ɔ]V<{ rH zjdfCՌjÊb6w<b8^NbyH6htiJʧc@ӑ8ijGKW1͉(BeՖߡ]tA\:2a淯еYW*c@>x$At B璙Vm(i..Ǻ Wu;7PBUtM$d̬jhF4eƈԭ\ G:x S?|ǮW˾{0-2H6iɩdfCS5*<{\E %g3tM <GOuqp|[;ޭz7C%[*1L~ L+Q(3{l: I8wo&ٟI'yTϲKߡ?Q#ĉ d4ǴlҒpϜHTJ"!"FͺȄ;&$ޛ{_Q/ IUƷoSNT6DJGc' ?aX!NbeVl\BMA-#pS7Jƪ1.!#9p/!(Re[h>_Z zx-o^g|4c sTQ#FDQ ~ہ9Pr mGٲ o oO4y%.sqq9?#%R:HzzƼ0݋a ;e( ͫ'Μwv0 EH)Q K&qGֺT>[9Ƒq@gWnWG͊ՑxuKwL@UTnyVN0nUsflTŧ S.qF82q~a$?Ǎo$ #ĴMHCJB7/Q=:a>yN:GH+/xI̚;[P..8ҦWֽ;R=<G!(Bb;ݚweywҺ^+jd֠~zTH+OUz>cO iS 99lؽA]H!T8rHKJ*{Hy~"ӊ!.Y# Bhj%"ܡnD Ɂ)BV~K$pA E1,́P k4dӞC b("ȼ58]?f$($#WqCeVXyi[hjk;ԴR$,eϢ ??t>3wV {TE~!$㼶56,YxjsK_~.h(m|/%\ulX-ׯDu u֣e^dضC*:|4|3$oQ$UQ|6 I]Wpw.ª7 }Ư^7mGG O.BR:_ؗIS!lblH-KY‚*(2ȾQ By? I-^"Ca5W^U#DNj7qي ȒnJ_a&YC_0?("xqFVw$9.t'6\*(#e)\p".J pJڔ$PQ_l!KSMX}xW\'U ˆwm䊕CƎϧ" B6nO 7nȅe8BdYF$LDUՓpʲb^Iݻo緸CȢ, EQJv]˲r*Z/'ϕ̋,˼ecgOB:UV}is'SO=i\'xMWQQ_c=@WW{رchK5xO@0⪫G-gʕ\ȲO?͛Q9%QC?=kmB!}C hZ8v=t|t#3zƼ^{嗭⛯!RCVd$Y)4SEfӯIƥ,ddAw IDATvSނ?蕹4%0QB4Iu7ͥw,7;^݁V!Մ:-d $Țoǰ M'4 dY&38k٘9ɧ4d2>$RcZ2DjjL@u,DE_ȏ ᏄpO`:_Lk[+/X=S7/yű\u]r4=[w煭igAkwױ̫hyN ?]vʗzumAa[Ց l>58C%0M,i)Tp)YVq\9y;@+>B>?X#7:34^w/nQק믌EԴ1$/rZtw& IYVob/|^d(`Y^ʖZ+㏑NJc`Y6L)6ٲȧ_ߺǟ~T.ˆw]AmseaI  wvu i[ӅW0tXM -BAqNB*F!B&HB*BD:5UΝ&VГYʢ's. 2f: bu,},J4#|غ %;;.(emF) 5}h/L`oD˺kerl(7 38m\/EJwyU +y9bYF"ΪҴ/=SCT4cR0 Gٿk?{x<={mokKׯ lX:$(Jz"^R$äid T-lbltt*E||HT5qbpDozB,HHOSHS%3$XAEHktܳ=MS(7uHO>O{[u5GdMԧצwF>F$hmkH4r (:'L 37xP=oAv.|,[MxcV߃|$<(k֬!*A #Sy'26JM0N`fv؆$$b0D!:_.;$-L(TG&3[l|هJ0XsZWH7{F +N0b+2"rw}Ya%U󡨊7!"'{!IȲD&ⵧ~Á01:ƒ.¥e(Jms-Ȋ$KS]$Yum7ݮ{d$rcIFvap"u-i"X_MSSS gvA}QC+ \ ,^ش!n%?4'&!ݼX$%W]Vl qc8^F1pX+Vٿs.pge_e clu] $噩dx۶ʹu`K>)Asէҽ#ھUWgЂdEfII'ػujO熕4$г7NM{(#aK[ҵLcQ6+6U'ZPB9K}~f`o/>u+uˏ<ͥ\¥@I3#a#3 ʒK00H@$ĒVMdCkcWV_8c3Mów[yi y xL3 N 䅀5 $ iF3I $ mx!. De BU(B Q&A@ï1Utfgs*d7=ٸu }QjY{ALcml2X31>AʎFHl&yPeUTTuh&5 48F 3r݉hG=Zez&]9Vg1:/LAbv!KqozE1R׳c͍.h' b۶HdiI\D|*Gv$T%1:X .Zwk׮aet]A&x{^5ǽ2b&[a9qG$U2-l;`w7+/EV,ı.&!=4Hbd'[N|2TR$_:vȎdedx =#ux˶ȧXC.FH[ JP;3x|2Ɏ214J4he֌zS476Jv,I\*XPUQ) dWP܀#I?x|:K`eTTk!hD>Z(|骿eLݞ~53t~.$L^$Bc1Vם%|wTr3"ZX աhi+$ۿO//j 3B`Y_d&jY77UNᚌuoW_gc/u,t$Iw3Ϣu˩kot'U8xݽhW** Iv,` zv 1qOr5WxYiy|W6-w0qhÌuF UA҅nMw?int]ǶcP,,3*ϿȞyzK-_H۲E-Yey'ڂ-xYw~Rd3YW.q }Riҙ *ښG0| \שIHSHeɎ$( X#A5_%P+NE^j6rv4IA)Ib:"3QYYIuM5%J+\o dUa`g7C{zQl`0mXh>P4BuC-Z0@e} ՍX7v1zXl%] X|9_`(aX։PC*~?3/{6Y߂R!It&͐dXa͝T5`e`J,YF 23B`MՋp5!FfظTVQ>Tw$'ݲI.{ E2J;s)$2z2%2ϛ*"h!1d-TB:K8A%TY! |TT!Ir1EH2bx I4B0# rI|J.!Ob Zty;OmYQHMг}X8B[g M /DkXVzwJ:?¸5V6NK-Shf@NLP8qL:7iGB3c#욪R*% tuT C^\3DsB37Ie4M㙧_Ni^嗮! #zow=$ ,dOmy]:DnO&ZZᑿ8{SH=B`s 3D!c|amuhahU;R$5$=uIhioT& m8o $AgT!&QQ[E{W'+ӱ|5 ŭ#݄])Eື_>7r坌JZ_ 渶z-ѭAHY'祧./\Kq&~ulꛯUIqz 5`UH&ȲP$\Xm# FV/D)}6}ẸGqLI>SYR}d>mXL j%Uu Tkr̎!$N)bd+F/G?8D+buаp}{^يֹ+q 8`^֧^q Mt]!y}}Kf?|y! o9@#QHV;/8Y92 ?ُJGA*a" !_O|&?z-Q|SmK'صk۷{0 (ԴԳ "XmѓpM 260@26:JAi[%$q&Ff2AGHR!,>USaT7k@)*M) Y"?($28Mf(#\l4q]t6R1 #VS Q5χXKDɒ=aDP)Q3q12y# EFDus=nзkVTUΑd4EVdEfo= ;",|[E pEb&f {6+F__Lo?z ) e6㰥˘{$ɫJȤ)ztw.& :L6:-.\ɮ=oY:.rd\}D"A&!Teb:\my4)I!'L:|x%\EpLpu+P_E2B_P#OR[U͊U+h[𞱬HPO{7ncoFb׮ڪbݞ1&#inK3HsNm&ϣ5֮[ukm[Y&J?/rH㢛f.7Ew\!-pEVH/3WӸt.ĻK.%ɒL$$S Pd*jFT5=1%jV3#6@ P>E:MV$O Nc-#ƸNz>a%Z/"T#T[Gqcz" (ng&ȍ:ّ$km}Rjn\ft{QUҘۖ/yuV.^{o[{ b} !doODnOj͒fl[]W]+ҵbikOfekYsWFGBloi"ӱ|(^yoՋVҲr!Z$YS h1|$IdRiGg4C_a1҉4  FP}*X?D*t(RN'=drQm"O## \XHɂQSDںAr,ζ_FUm5b:;xhhnᅤ5۲%l40M2s荗:&U?ݾFw=~d=G<&QȢ[Fqx^2~9;ZL@X LPr9C rbԹ|]UUMsW^~A~uyš"V]eؖhN(eYFTFz8pDqc+4tSXSG\\)QmN>E't28y3h\:G$2LTՇ,{ p! *X@0H0D yrvMOd0:z6QHt#_@ NTH}X?qP_Џh]K7еb)zAGRd|~>vnΠ˯+Ű,ԃ`fg9Iby LE'&β]Ms [3^fJ&gAK<4tѲ.űoyEQHʼn/0|xx`uRXmZ^b՜RcΚ,gOS93~ .cu]Ue[wƥW_A0О{mÇioi%ӵb)KEL۶uq-Bf]V| -83e\Gv}SI> *~U cNO0IWSdsџ[)j1 iWQMBϴ¹8foX}|&x"T7uʪj}Ӎ! ~o=X.ɚk/a.dN+v+"z&V[EH6I"5gϦ<=Ҹŭv6h*BPH,J$5ӢSu4R#'z&cg.ǝ7VF*zIB).o,S8? F:ϝw|6Ϯ_=ª pk2,*% !0t}f#oB+P2 p6U?BsWJ3 XH$ YF#d`'NƝ?xx8HdS@` )U9Ced{׳sK3(GgBTUEQdFGyWaLꋩj= ˼I^dl&b|`(\CX8)W, XG6,㧺'X͖A b Y^e'@@Pա ڢUA_rt9nrO"_>\mϽ>sC{}HOJ>{s;?/ ™=y3qݳvn!>+[Ȭy-6MZ;i[^~_Cub`[cn7lдVV\ƫ# н}//~,!RWIPeĻBH׷\D6n$ٯD˥W_|iZ)`j|9YW9$dq08E5MtV75&dH,ë=?%)Y9rI~G4&$G0tIR0U/=ݳpNE1q̶- <_=r3}o~C~^ܲ/dUTVyUɖ'.z\{ G/[212F&ŰLBUQjh[pݙझRK]<*>}ӳeV"f\յoSP_*kp4ڂNr:p9)qg iNyɼ86 I-H2 }ibUj*okpeԣ9S mT7S%\IIrJppIŕS IDAT'~ D VTCRΉT L.L&S-^YUfNB&̐KMgaDka'}hbibΔ|n! %݋p?#9_XO?@ǝ: s)"_T| =se3yt"T#ԆC0ʼn1"I{PUޙr]U/:o7˟Fu~a$aa ͋;kk$R+Eդ)\az\X]5ڪ)ov?ClsHL4$RSAmGja)[+휢N8X6UTs5wZZ:d9\#cQfuqzs+CU 3ѣ㌁8躎hyw*ۈBpO/%s_@E-DV#ߙRq X?MV)i,#fgc6cèJ=W۴lE h#!^nG0ȧ2Y2q2iŝؖ455_ -@cb6p]wO~1?@2 3c,¡mj[h^؆/yլ#[we7_[[:"L2L^܅*d)Lvl~ $R\ 0|KB/&^dxB.OC^Mvdm8MÂVZYA^w'?N`ŪoW3chճNg !{sO:TmcBsG;m@:|m<._HUC- ۩iRuHtj2r]tH$!ASk 4:B}]\ׅ|N?^ϙP H, O)5_3@N`W>QL A(1M3upL.8#qQvU ՑZ>'S*xasQ/lN5gW{*z6}(я, 7tz+Ctw`=/e8=+cP]_KMS] ;Q\RȂc8GY>$IM*5Xd/WZ8H|*܇1Tx;nk?\~}c+mLw'H u@9>Qhd't{`j+.X el&p '_ً[+bft2M0Pq]?5L1uI CҚd "'^XB7Hç?EUM%rLԌRfϔP#fH7E }jQ k ,Qr,:Kr~%I(zZ>I%PT8jֽ&9S.$+*Q+Zy~r"1[9_ݩb1֮[ǚky{Sdxx6oL9:qqļF)M2F0{ P]M#1sy4X8 VNnW\q%~|>5]7i[Ow*}5;65@!yyߎ&&,BS77l겢.W^q4 ucL٥\BKb=o&mTLV!o{+[B>?aZR3)Ij2E4Q $$TY9NX@;,G]r RYNP҄o6qƛuell6K.#ˑrH0>E#/`LcyLӤ|9 C8,KUz'4J"ǣmǣ OlIt} ui@!+sRBpm{'1̋ {"V.:#L|>NO'hZALsRm.SVb1b3~ lnw[2Ȳ61[ɕx68<8'*YyMzdUdH@˜\̼9engq8K,v''::cY3wq8(M(Jì/PwK@sE9>_H[(~ujKIY\=t(e|cϡihbl;};4<sA'i\A(oІWNŝ3E8HB̡grkvpP#j3\5k~~f,o$! 1oHV\טwe)l*鸶8v?NYYρ̞o+)#L'nxCD́/KY,U|r?it!t&(;ij*k,e%1?9p74hxٔ [{߅f90psx75\! b;C #n/NM)7OA}Nq˻ie}pJރvO0b9: $X4ʶԥ2́?w r@㙯CN&vߓgU"D1B?ۻe\8+}t5GIrij#9ʿ~Eѫ ]KNw98!F~r?ƣ,Sc!6lՎƁXwy (^vŞF ;l'[R9{\CaxC1ИȏG\3t']碔)4e)K K*%Hf?"׾ tn/"'iOzq[xe)lM u?u'xdž>NED U]tuxʃ6]{Y⻱^GW%+|Y-*N*@0/,e9?Z=8y3|GU3qtpu:Koqh1h+KYfw$j9PװbA`,UV8ΜZGwcpzY=-$j*6Oa{2 !j.r.6E?w縮rBIL)iZ{l+`[Z1|cV#9 qq#hv`cXsp"̏ت\dVѵwBUjJM\pQ?YS) l޼͛7366Tp8LEEmmm_\r)_|ys>" % piq?y/h a-8b!?F֢ v]{Zgr;_r뭷;^N9ɶ,Ү',BB(:[Qf~} Ur"Cws\_rI3Ge=-'x 1v~ĪH!oC4FZ-}mJ`^:mI Qroi|[$J3DD"AOO=|;?+#=K`>6.Wž oxe.?xʶv:C iQo-^(RYO/VG?q{{Ipr<$^| n}Sd7eOO{`\w;wXPxw͟:x?1lmm>eE*Z+[*鼟Of5 #濁*e b~/?É\ ׆p%,\RqGw뜏=?Si/}鯸o/~ne9H_<„ͮ!ܭw6Zy\#Oey'v{{9|pyr-D\/㬿?~'/?ȡ̉ro3q]t:Çx'x;;?Bw:yꭍ@'dOO2f8TN"ev9lr~'{?o=ooͦM[ؿ-[Ǟr˭wsݟΤZM?zN_ON~ȷNW+kəd;V۱wWߜ ??~S+xd"HftWuw.|`i ]p]u ~F؋Yl9z_׶/5XE5Ϸ{>v)mkX@eL e?]Φl7F;n޵<U-f*%,v̵kM>m;>2P~Mw4V` ζC_В}?A>wx9 0F{.]ȃ;iLɓ0 =7+I sio_76m'>q4l*ӟe,뗄9 6.fkn+|tzѕ|0~–͗qo`HB9V(8~s#cts{禁w!_WNԧ6q5זQ7!8)ĉDD]kVrm_$oBQ^FFx>wg?pe\~Mϙsy NE@J@&8t O>7}~Jǵ l)@<!M;$L}o'>L>|؋TTi>jkk+W#FGGw/iVVRzYG\˾}}KܵnL@qUH*;Ȩ<"Z+K?>qwG}}=Es'_O15Ku=O "D:-Ȩ 3 f,Z0b ђAP[ueeF?UjUzSK9q*2捈/n{]Ď2{jK BTaF;jn#L!+wa;#Fxx/ZO]PN6:Q0}Bgbѣ,)Q6CR1Z]_x,o5510q0xytCLabk,'VDg,~ޤI}K>krG?[uѱ0L(IHXְv i陷{16r>~қ_* 窂`؀%)M;1ˌU3e,MWTF&sԷ8R/nePzUh6 !p?hV"̡y%,تiGWYSQ23I?`ww9>9TC۷7M`w"Y\{ tOމe{$ %##v 8]Izs +nn›op|cr\:6F ͘ʌ;Ve,,|l-#Ub 0,u;痄5m%*x[2pJIAt|8U$\gIիW7hZW daQs:m wŅkȡݜo-0 XKȶq l8a'XkmG)//gӦ<̞} nv&OTf*6!mN2^+6Φg i 'Wc1lxR zEyGмdddhvcJz̴4̔N{dLLv؊ΛNԉYPX ÿ~O17MN]Zf5㼼|.ug̸(^s7ک:RRv $!zMgR? D]6n?\o:["D?_0Շ:TsͷPFbT"6rv*L< KcϱO6dx*JŊKH9HzI[?*8JGt늒eО:33yǒL&p-6r'Ly*0|oMugZ7oLi2g6pUׂ0X$rcuI59|}p'h$*dz18u2;"S)QIiSL׿~Lw֍a i dfbFiR&SÏg݆WK!=L`Wj匠mrj?d=EZ;uy[YL>YÃIz- sYlm|  /UwA;{غuKu̙$-r-ϝ;?m[)-ݣ+j'ܩtRifcCy'Y4yIBq0&t=ǜ/+>Ɵ?Wl`Ӧw|ѣZ?2ݏBʀI]" ɨ,./wSn1]e(M^)(H@^iNm})++Y[[]´[\<èh~u=E4Dk ym?sOO0Ams4iJ +3g`}nlR9\FLbUW*\f8h}> ?ݻ?knᇗqEY~-_-:b5 FڪBaS8ifI[F$vp8F|y#{ThIkjiQiDZv<ޥ5vdr-TDQ6Bgo>3޶m^|qEg7OIIŅIII (ަ^|1q( u"j̔f ,BIZېB()aCqȜ>G +P(СØ?!/ Kȑu8v/҈ *RIխ+mU BUV۞B)$[*g|:&ϗZX@<i݀Zrʖ(p!)ӏ _7(++S^^ڵoBRTb[*iŅZ9:a #khwŬYWŏ?^{Z0}~2:&v.|Q=3" h)#=] MnIq&&߱cGOUG]z~ҪGE=njXl`9-avݻiTm"!?D5f ~'D/"= 7'rZO]PĮ܋?gx)5x 93KY2i䄺ׯOЇ0=(c3IqؤnCH=z ֵnR7i#'tO?koذGPPp~;n G;L/;G*[mQF'чZ(Fl(xB=T6+u}RG_@aa!b;o&LjͫKcTߴ&z}W^G6K5r8yo/FHZ}ɻnDɠFY1Z |W{g}ݹ3e&?z ߝ6X7!HG%?gة땗oFɝ0Lx2i$ xW]u222:DUW] qA (j/DMYSu۪0pmmI 4`q=RJ.sv]#i䩧`ƌq_*z(Lʪ`3 MCXkjOJ+7oނ.9sr^{-ND( H<迳n]sp\iUޔ.6ձ;)%˖=lŊ\2W\1iӾƅ!;;Ljkk9v(_X~IAua Hw8ե>0<)9N l^~%,+?8 &z^Kwd4i*EE>ZVW^y v&Iu@Ț3cni;)8G)ECC=ǎg-<̓|:c\d:cN_0V7ӌEea<8k֬b͚UNQ.}H T#)5{0|؄\gj>sMqy oDze?ygMQ7[AZ{~a8եĂht'rZ!E׬YW?]aU/{RફaKx~CmmM-)…`^F݋ Ƃ5?Z)h=}vt#7= S@ƪQw ;;[¼y7"Ŧn3i,𾬞۱͓n`0]w֭[شmvFY1*++%--Hff3vx&MرCDa]=rļU!p Ai;^CX)7xNcu#F`ڴK9 mD"QFma2e:SLo罔k<ε q B Mў@ w~ߺ Bxp/gSiwUzSm7TǗR OkmUEèh,\[t:' zEI2-PT/ڀ?vi)V5O&gi=Մzf!L0Ss-i_V7/v*ZWZ;qwv"-e pjXi-zԝ20q-u0AjxҮ@5V BUK@lF_CDS멞t3}mXf3ެ( |o ^ˠux"d'}|lgdx-aۖFarwOZ2P#э=SqaHt:]p62thGZO5i[JdQEF-/ggפ2 ANePz|uI3)ˑ0-3r]!qR!DJw@I|e@0^nÇ{_Z$>?q{ ֖Aǭ!1SM0x- ]a32Pn`Bxp_6 7~$j+lݺDizq˵Jd1KiX^rZX v6++JtG62N0xRNCCCCCC#)RSSs )㧆Y͛73~q/tmFoA^CCCCCCCCCC송E &u:n0NIENDB`Subsurface-4.0.2/Documentation/images/Companion.jpg000066400000000000000000000656151226345450700223470ustar00rootroot00000000000000JFIFHHCreated with GIMPC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+ #C<XaQ'gύ鱪 Hp)Tc7=O4;8\9@yO^D )Ity'굴AO>j叩*|'CgjS=3#XL@A$q9#1=_3 R&[˞7mSL;<]gJTA$ƶP>{x򵝜:hQ.Br : gu{|is&֘ޙAN`]^>W.\~'|߭v<:g^-RŖf`hlrMl|tz:P(hP,t B 2$ H9ʖ*PfhX@$1$IsPTb JAS$:L,t` KX,X$ 4*IrƠ&FI" dP2,hl &fYn X % $FE ACML=pT $PȐ: dXȱ: K5:@BhXM@qs'P ʖP:p槦t#pfA5=c3s` Lʗ .65 %,J,(sqK A -0 !13@"#24`PAp'N95)溉Uܺw.u]˪]Wr껗Uܺw.u]˪wlVK%^[D..JУ-KOQ]vwWVқKo^ۮui=躈^뫸-[zsRI{˪]Wr껗Uܺw.u]˪]Wr껗Uܺw...[y<^e^VЖyl{"~kRUI7%qI\RW%qI\RW%qI\RW%[ =ˣscq^Kg3=ǭFوn:;WNwӸt+q];WNwӸ%$y. ~Ƽ`=ՠ+ga\Vk!-ekZᖸekZᖸekZᖸei!mmn~]AV[Oͬ^ӵkYm}JGǺ>s~귐Ik*bSN?Y"+MTJ0_ku֛CEiaTn hFrο Zc$O5 ^ހ.XBPuLI$/ܹ>頎?kq{dhc[5L`Wb#VT E~7?x<dMd3Y>)[>V*^W_g{ld&k&k5dH_gԎR:G]Hu#uԎR:G]Hu#uԎR:G]H-u⮼u׊W^:]xu⮼U׎W^*]xu㮼U׊^*@`xdHHu#uԎR:G]Hu#uԎR:G]Hu#uԎҍWp)X [ KM>bHRDZA[7KVw͐+"ZF}lfyiUr3 T.c#ApysYGǂAF'|ܸ%('MG;^oKpB!oj7%J|dvXcnƚ"Wr7Jf r*Գ#FM]q.QqI&wXn )fNC%rZMeRGWF1D"_sJ!w"4IEhDȬ9vffd'x*9&$O>32<<ݯEb xn*AdbÌ~iT'hw"qE+uƔR7Q4f8"~X-hoEM~0f!tNUZnF~Y]7Ώlh3+gQ'b#\9w1βKbDf^&+{F”hIE(G |0$I$S%|D|s" [eQkMb)qٖN_~y>XtSm+eOf~?jj.h]FRIH$HF36_k"jڶjڶjڶjڶEo f~Wl;Yi0k+RZq8RAIp4n`g,贰Dh,. GI#$qQ qF}NdG$LxKJ٩&HdWRT41;$-qvF~F%vN um1"ku}?~?(Q012@P A!a?gO)yr7v=cv=cv=cv=cv=cv=cv=cv=cs6Z͗cs6\͗c؋>drWNWx"JjbrQ㿡<4}OgOi hۇf؜HBpu؜#ɂ     Z[4VEl[4VEl[4VEl[4VEl[4VEl[4Vs      'rJ Ĩ9WR$gVȜ\)$k=RcF~_(Q1@02P !Aa?9ԶM=j55TOՔEץU#aRy:W5PkjbZ~ Oi-?Z~ Oi-?j|H-?s5t5VRN2?~XwG/i9hi3;~?IT\8gӯKAjrkTƱG/iX.t$I$I$I$I$I${H%n[V앻%n[V앻%n[V앻%n[V앻%n[V앻%nrI$I$I$I$I$Iy¯t?d o%rEW_C!1A"2Q 03aq4@#BrR`b$PsSp?+O,l@ր`>4VV)l>͗ez/Wez/Wez/Wez/Wez/Wez/Wez/TcO)bV~ً?b;eV);V_晱q f7Gic_ I|ϏVK.)wsmS9eځlߊm>OpC7i1s:&7ͦ4*j7y_Y_Y_Y_Y_Y_Y_Y_?9\혣,?kűYSV.GL1X$' I'e嶩ӼsZbN5ųm][Vջun][Vջun][Vջun][V' rXN/vϚa8& wOoziJ``GL.u~k]_W溿5u~k]_W5Rx0fִr;DGz 4WUAaӟCL}OiQ:Vտuo][Vտuo][Vտuo][VտmGcS岆Ɲa_ml&-ͷmNp~~Q[ST` ,Gb J;?g8VQ$i6-[cyrs黣ܷ ䷜џ>}0W淢$-g6F*gњϠ'8Os*>VUjZVUjZVUtP+p- p- p- p- p- p-ZVUjZVUjZVU5EW!D z3NkhN9Q5Lߤ4>[\: 7f)M&E@Wmֺi4k sMnWpVU."fCbtF*=r%Kmt2mg3э$&L-45Sɘ!$Ba`eڪbI0C @$Is&_Wi\&r1K %wJf*@wIg@ Kp8(sRqʳPg4CI=54Jql&Є ^ *#+h4_BdШxٸ0sG*٦;y7 +qE ̵I2AIٍx!$؝fH 864glAT|j^ 90eH"MɃ,-Kgv8@7UUCFpQg.$\+`e QT8샮;QM&-t]h9QWu)L=gܠ~.^dǹo^/0W9er;B&?ΊXf`4;՞4l8MLʡ= OіL i$p4 ?DE. aeftccES]l Ђ#KDaQc&UHN[O4YlV&- "SNrj:h9<쇊3BpAA'88Oa:O&a3f#`if`.QiȢH6˱4˶cH^Ā:@*0Z~J]o|s$g]1;-G5NoE&:@Ai9*oe/[OiLaZ20ܯQIԩnlz #E*n"ZwT:\NJeN@6Eоٙk*z vIFLobs4X:I&3=^k5]?3[7a {{Nfmĭ8bOB +&8: qGNDݪf#خMiiv|tY( V'bRȖLk'"6Le yt6¤ibCpt#ب%3hm淂pu5MYۑ]5;q1YhdbC{t궸rH2Ģ 4آMcIϡiuMS* fMxp}USzM= ٢7nԍlU1BuJ.,S/NcZ*ٺ֏6n'Ny&M㝖+$15> 8~)`ZPh:BgaӚQsM3YQpM۳cN Aꌾ]$ ؉$X AC-is }irU*llɾ^6 d=`JDt؄}IREjʚ#INnX3{%3Uk*+lĪ4THO O +gObaieyo*юCJ6[SMĻ) RF,:贠jv\8 ZZbq)/hoe_554=m3jܝbXUA2G IsXtsi"J0-&a6'W A;f#Cy>D5VFK k@= $q04Az9H(aU(?T r߼cȠq9xx'9ϪZ SOH J*%4~ƇTvTNtn橍'b-2@)J{B|MGza@- +!1AQaq0 @`P?!f{@F`(&3xsT:1Y3);RE_%Q (72H[|g1D OCA`u"vi"{ýaCy> %p9 ƀ cI'~'Ͻͽͽͽͽͽͽͽͽͽͽͽͽͽͽ[-#kx;kyn̠n,C^`RDF?|B!!d_Inx;49!5" ~Sw?sw?*ސ3Ve yP`]A  |y߼_@YSh[t"Cx\1DY@ɋOM)/@@8" ;WN|N,/$P (`&Q#B؆HrAۀ:G.݀C+ ä$C `jZw:B }jޤH3!|!| "X`*G,]EءED\}l , 1-Yֈ>Cozr'wD uSp~kc%vnMF/P]Q((|G9v:l"mh(z~4LQ-:pVxY`D.lw1fXK34TQ (}[<>0 x_b$ .IPC(;%##$ʄO_m+ m1g8t}ӏqN>8t}ӏqN>8t}is#nĀCz>8t}ӏqN>8t}ӏqN>8t} p}lmN h:>9$՛%Am #qH7tQ0): #=>!.gm wH9nTgXqa{qP V0DbF 5 =`SazDQ0jWQPRD =aaX_BbAϸQh2'2X׼PCmM-A.^,CѐߪLep-ɐdrl:`ہ n%@cn@&d 2W#i|B"MYf j]Fbv`@8tW@$?3u6HT_͂0BaY3 ]:J HT,f0f  4Sy.DAMIpt"+*NHZk2 /J/XCq0XCM?pn*+ lM`86q2q DKgh],i\aGC) YR$qb}BY 22,c ()<`z$19am$ G e\7[BH2%cʼ6@HJ/CfcN0$ ,Dͨ*BdPu~ @ ̻vZCmq$Kb,,fF;D]aL9ˀ MPC p@Qm-T G#QA(}8CsuK{L}^ngPp7,H9 Z98_;0Fh4O)$hB_s`Qۈ)ƠHP6߯((((/P2gsh D6m!Ch D6m!Ch D 9fh$6'8,#C k!%ԵF9f-0: H~Kg$xL%A[46;ͣk_HDИg"s? A(5=M؝|]7b+YœS M ^]00rbo\$GXJlh"iO1K<abe8 X mFRݪDh^Ea>%DbDA)3im`(@dF[tºn*R, -Tp*SPT|i_h <7?`kV0 fo>Q}T_E;-B LL C R.A YOҊYA"P/d*m p!|1c> |1c> |1c.\r˗.\r˗.\r&H FEtTFMO !Py7yÑ4J; mE8[Ěv0ජS1JF֜a4g]Cʼ7Q35)rV,~E3 VP"8Ho+oZY vdYv`ܮl7ܓ}NRΞ!!bH%;oJd=AS&*d ^e!/35 aP1 C'ѓ Fs<: A WJd$Q< !`EI{8 Osᐁ.% Ҙɀ6"w `WGJL,ttP 1Q9334`l0 _#!`8 ]F_ @$ '#,EPB%'c9͓Jy$KZo&nm\.lD0T>ɋ&.L\1rbɋ&.L\1rbɋ&.L\EQEQEQEQEQE.b.b.b.b.b.b.b.b.b.b.gX,C Z%vEiEtC @=(4ƤQb<)}M:>'5, #x. հ:*S0Q^!:#mhF6ѶmmhF6Ѷmυ`$V/?qH.L$C->\tѰ9mO%켷YA c#Ne>" rݟ& ߈%Y%OXΛ[D{ACSM0k | k<'tĥkDD> e:] x_h3sa`c ` g~K&,T }QEF!2-8 1'iȇߪ"rB+D5c:x@0 P c:zC0+iȘ|.(bEp=$6RqqqqqüqfM iߋ`23 @Be>PFy<@|*M<9QiE# ( n8-1,߱ u#$D-<栅ĖDy߇DPdVm( b DPGYY'[ !Q$^Ƽ Lr7X Bp`~N(P-CAaӀ*E( $vmڇN ($ 5@2SDzxBlydܩlk H#8 }|LnIrC".h `ECv.kzc Q!"@.B* X0: 6%2vBr7'^o 4?좴'#Pb!"Ɉ@* ӼP( (PcTE`i?~~Y,~{$ : bAҼ_I0tzh& .p1"`pcI(j?if؊=ab4%9s`ELly( d?CH JC( DjO#H AR(|}]H lg H6GI@C C .,)Ht 85 2U0ZA#Mx (€>m-wcx D.8"t^#+AXGEc oC$@b:t@-/%تgG07 G)7> BmT+A=(m-8*P ?*mo^J+FzhK"(Zt ͠? A),[uCBFԂ:<8|Dƈ"*HH'd$~ Hs q #88S!  q2muBeOX"0E[zXCOye ,؏: IuaO/ u aElQ3N{Ç +%P JlTKR3Ob,X2Pu !=7cqF7cqF7cqF7cqF7cqF7#8888?B`RG,Ah @*}%RewcF8^"J`&?>a_bO$:HD0սi-^F ha<6 P%'ph4*O3!  ^(LXhP$}-Ub0E4z1^`qNIfc83-FЙ=R KI4qψ:EQEQEQEQCZÄ HK @aP,X,z&i áGO@ z TJpd^ j"O즒5 ܩFP()J( xw7P!4HqԲw4!W`d }` jT٢Q̱5 8$nL+e̵UvtGpA|A< H8وIqWP![H-'H``&CIi0!ӭX#Zωc.[b &g $I$ $Hx $I$I&H mmAI$I$}tm-tIIk Y,I,Ipom;] y&ǚmdwz٭]sd\bI"K %dvpI$I$I@I$I$I8{mmm@  I$I@I HHI  @I$I$II$I$II$I$H A$I$I$ H@HIHA@  $,$ HI$HAI$I @HI  @H  $H H HI @ I$@A II$@ $@$ $@ $I$I$I$I@I$I$I$ $H$I$$ HI$I @ $ @ @AI$HII$I$I$ $I$I$ $I$  @$H @I$ @ I$HI$H $I$@@ $I$I$ A$I$III$I @@ $HAI$@ $I$ $I$I&1 a!0P@AQq?E<j,xJ ;YQQWm5xmel"kpX***ۑ}]v~&v-2~a卙": B "olz]_M%Ema-j%z ʾ>Ν?< ISv5FZ~`d:ݤ!EO^,lKR~N.7˵z[.Ҕ)ZҗI #i5 NrƑAAAAA]1)8Cq!8Cq!8C$      M#~iIʾE/ BπBVDE^i 'KU(1 a!0APQ@qр?=VZjիVZ"aiƮ5=]p;GkF"j#M=pSE35`wA =snFq@eE(DzlQF 4b Bp+S5lWz烈iPZ|4G`g} 6-ET5"px;VZjիVZiՙTGK2̃:A5 kl,@ĈFGx-lm'd*6ub|1<}3n'1 hY&ipvlퟀ}~>?glퟀ}~>Ԧq~^H(TP:P&XEKx8P C@t\"Gz mAʟ<q]pq}InG?8⯓!"9l? ?|'~~O? ?|'~Fz/4`LELl+@󀞠O?f|f6}\ |zfą '8v T?VJ>x˩A D/{?g_lkퟍ}~5ƾ?g_lkퟍ}j 7R DNnpCD4 Uӹ t,B_.GisZfc`P}ȗW?5HEd+nOGNO@,?D! NN8)Cm@6; E>!8"TK )~s~/T) b'ꀁev>su|BSZk1o[g[, vj LJ~-Pu #J5{qu}Dh߶ QUpazCD7H"Sf9J|X}O9b <?)}{#>~ß9~ß9~ß9~ß9~ß9>!L9~~?SsN~?Ss9O<0h&3q>~ß9~ß9~ß9~ß9~ß9~Üv H!N|6["C;y퀨 T x*fӻD< <KA+y wvT:-&, *ˢTCG7zP ^S<# >:ٯ'qJX:1[ ó; ]/lB~صZRkaIѫ2zGq.]CXY\"̻ +,J򦚺;dr6 u6jN[x';}Jk_ `:l1cۄR "q54J#M4 09@i0 aIUUUUUWm@@@ w "@0"]0#yCfkqH '#B63v2T,s[7`o\;V %AMg ;4" 9-9+^>_@2!T*̐CXS._H&Lp@<sX(@#&WJQ/&%y\RGGxy]. XKRk8 :jwwwwwwwwwwwwwwwwwwwxx.\r˗.\r˗.\ 9Bd-qpy#ϾG|>}}Gw#ϻyr<}܏>Gw#ϻyr<}܏>Gw#ϻ mrQm A.şۜ 8Pi$7<؊vI0]";SZzӇ"K̾3BjbX%?R? ʌ 'rdH#=L#9s5:>Zn~~LCU=L=HFֺ`ȉ kX Oɝ ;WZ 锖Zs5L"0MqU ")8V:S A hS QE]i9ȒөvWW;hFDDF3F20mA˞pLi0%Dqyd)*.j"!=vfD" /OKIT@ u+  "BͲ;לb I4t H.`ۻ %NX)"Q]S%BCW瓪NںQog)eӧ2LQXNs4}~1?EQyP࠯jwYr2RxJELH]*6 9p(M^ƭlAb*VD,nN8x0Ǔr Yl,L$ \>sJ*3x1pT9D/?Kѥ瞍=~%pbVD2w묂WEjT1kqEꃯkSX C!cc/EhFFkn/Q[ִ ҺQ$,N:e[j*]A:q0YՕ/ETeEyK?|p}Aar"͝BozP.4:{ ZNiz%bdCɑd  02!"b]w9&Sg=D}G1lL2dɓ!" U +ωƿ1(>'Jj'2dɓ&OqIv2kUȑP j JD(R۱Q ſ,#cPOPb:;1:+DGw#ϻyr<}܏>Gw#ϻyr<}܏>Gw=}%w}2]LWw+ew}2]LWw+ew}2]LWwLe.)` K޷9@mjAu\B uNGrJ*8.SFD\k͙nQS_ qxpxU *g/`gyZ(T5+dט[L8MSp4^+Z*,/]u<]]|>ٗ; 3< 3< 3< 3< tB;LOSX6 Ь:C8L;w 8.@,@4g5 +:0dIlu#F9GS [v]z& =lwmox @P,7ys\HqEtkWCyMZv|IE]怶8Tҫ\;B9xBA"BU(3dhR=c_>p5r(2ǭ~J:R;e֓R9k @DU|LQUWzFUuw<|@"c ybQ|-ޔqGSy7Gpp Xn@ՇeH T*Fɑ>6N/Q(4nWh!6EK1jN]'/AC C'1DK~[bK=4][9.ă` "⡴ SyQxA8tw WeKy$^cXs>-愂aQo< xkQ(lx fGd~Gd~Gd~Gd~Gd~G~S鞧=OzL>}3gS鞧=OzL>}3gS鞧=OzL)'ϳ㳅#w2̧s)w2̧s)w2̧s)w2AoL2dɓ&L2dɓ&kkSkktyl c"޽A%iuo ,>.}Ǭ;q B4t?|zs!x!"Bw鏍LXdx*/Iwg1T{"xD 9Bxp)" h.@ڠ"cP7EۣFDB[\AL i ˃!w|HCZ?(\ZV +ibtU4bPB7,C^tiN̐lj~ $P.:2(r{'lJvE6,T]H)][q$Bc e;A.-%i7*ug 1MC8/ddbry`VLaY mXlO37VӛÎ3F14ޢnM:kԭJ$Spw cq*G2Nw%)*QL DPP i䷜W4/I>ǻy#4 X: `&}jmx^}D#?ZG|a8(^`J Cx0ku( /S( d2LU~(u:h4@>$]G`bry = z=>%jbO9yn(bE3`짣:rS*ecuj !OK{a5~f_|$k ( À>Hf]̞nB]sJL557c˞m7?$ xb>xTfw&kDSё{G{G{G{GJh:mCx6U^ս{G{G{G{G{G'''''''''''''''''''''G+EL=TX)M.FrI cB1%~QQ;=( |8"6-" yrݏؙNOZ;?{fj`+%Νʨ%PFQPH뮰]1 A>XT E:lb B1INf]4Ҁ0 QGh8wKs$~/1Zt: $04HzCiE0H*x|x;GAQu8T\X!+x-}E%֎&lM0Eث:;휨@J~^0Ġ4  (`0Գo|]A  6MKD/`utr<9}>Gg#ϳyr<<9}}}}}}؊0Y9ߨfjkA%K:5r:UU_{!<;^(8C @*ʪX"h=]38/l$A&mj:ΐFk eP y#l=Ohhq&RoKCNtɈ_.UpAMs I#èśؑ(E/N~?}g~?}g~?yH|?C힇=zl>}gC힇=zl>}gC힇=_S#a^hVP;*LP .[#x;cq$Bh[wSsrq s”TQ<l))Rĉ/xǦm!u:G+QH*q8wӧ(w=1&wluVȅض')dӦJl[zSߗ,.$*TSW+uU tdש:([axE郎D wta(J#naeJ]^]p;_ԁV]m[vjR @pd=1ׯH:t:fy8N:),A'wKGw#w}܎ﻑr;Gww#w}܎ﻑr;Gwqβu  lAsg 7 uj5[zYaQd:/g6$fA桻blVYg镲1 ,+ FnJRnP(]|cg@QԇR"^eP$xT5AQEU LðukB EZ '8Sz(MLBtxzMbMp*9@N*uA@]XןKDqaC( 7c;lJts`T*ȉl N<(z)!c;UXF"4tATU(),D,Bث[`p_{` DF6)O=P`iw=7;|d)#։ph;}\vi;p>D`K^~wA4|URV,@1Խ>BL65O+oħӿSubsurface-4.0.2/Documentation/images/CompletedDiveInfo.jpg000066400000000000000000000454011226345450700237530ustar00rootroot00000000000000JFIFHHC  "* "2,441,0/7>OC7:K;/0E^FKRTYYY5Bah`VgOWYUC((U909UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUT E RAHtU*,u9b*aHPL*^9⤛V M*A% b"(^(@RV6LMec:HWAx 5\ *"isR P$ZDR1 ĚIJ,ʢ&̣2 U)eȺV]*b) +Fdb+r /] R"V]sˮZ&qk6\UMK0,feHRH )) RP!HHP@3zx魠MfAx@D(T`$T"H"(dMN%,^\ WLZXK{((v1I].u"E@B&PH"$X  ̬V@  @$!@.fAiK2[B.u.YisE"ZH$JBH4De@H+XZZ04Ddh@,g2*Z& +H\-UP")Y51ֻSE300ٌ6l"/@MEI54BTdb%I@3 Szm(jbr13ʺV C c2"R-!gg#TbŊJ+Fp=KRtn.V)<AI]N(_75I߾>tEŔE"HR)FHR)E"HRR)E"HR)RY8) B:F/O=JTJQ555SSSSRMMMMMMMMMMMMMMEF/LQkM\kB7=cԲ%8g%3s,rT');M&ye9۔o,-eol[-el[-ڶ[-el[-b#dw"R|JyY)8| 1zIEWE&%$%',cyskY8YR- IBYZt>dh\1R䏪1z3H֘#' 0FmCCHEQqpuZjQRk6F#dl6F#dl6FF/IeJJir_$oxr"9P/IBhXZpR8j#(!%Gz#Dh4FMQY*;=Q4F#Dh4F#Dh4B#D%JOc_Fk-+P?|EȖ9;xd#>vvvvvvvvv[;-?gggggggggggggggggggggb#F%˾IwKn[Gfb붭g#+ΚZAdXF8"6WF/O𴤵`!jСª752Q(njF0؏%9)DY"$8Z-EhZ-EhZ-EhZ-EhZ-_Db-W_mmgя&>;G{FZu5?B1z5fT<1o$q(8uRP[)|*1zQEQEQEQEQEQEQEQEQEQB+NN3rMbi5'-\)ny9Ög.]qI[1e\K[dɮy9iɱ 䒓&:INP$i3l)ID')LB1zRq}KTi(F+5G \FkH*F##H֑x(8HڊPSZDPN)GbomAjk_־!k_־!!!!!!!((A01P`p !a@BQ?:;X!L xASK!F4 'xc~8%JWBogI8S*̸٩䯦hp i^hF1|Fc8_(A !01P`@aQp?xvG~^H\:ɮa~ϭJbZ2Mpp8^ v@/ٓ2\]쭬fdMcxTEP,ERN0S)1A r/'VƉKvGt?71!A2"Qaq P0@BRr#3?ݩ9~e?rOܧS)Ο,gG:>YΏt|,gG:>Ys:>Yt|,gOt?'Ot?'Ot?'Ot7wZ4\ӁKXSkڒGV<;"v6GӜrwtvB&8ɍ2ymlN|E7qЗiJiKUI<,+D'R| ڼ2W,QBMўe|BZ3bթ,jNEKɝ>LG,q-XN'N}I\ /ǙU N*3[S91y,ݍEH1?38颉QޘFxlmZaT яSR48qhDb̔)gK^fT}d?QZ3ϗ.jIyJT!8QVX4--w|Ti~iģroSzxM!:CGy~v_|VQ7]kR)_"HR)E"HE"HR)E"e"HR)E"KBXQF"?d=M^gS:Φu3Φuu3LΦu3LgS:Φu3LgS:Φu3LgS:Χڍp=+yzLn|kjyZau8vZVELQuK0NJzPijjpygN$ή(4i&ss/WT|clѧv;5mV^^'ӃUهf;ZeVԐҜcKػ(+K㷂o!pppppppqڍKtAK^g˂1JN!)fM-N$zuchΙvd'f}vg'fJe2LS)e2LS)e2LS)e2LS)Q,bґY7Gz(ҔNKIgj!7~ 2N.Oi& BU؆m#o6'ݔZ6g\Ef0|ծ|QKFׯm$bGtO6݆ķFqʰBehZ-EhZ-Ehv!xAԲu7 6>~uy<#w\xǩ;InPgsL7bdҸK?Cz%N?sr[Js9|}}}}}}}}esFeRįӽscNW.cDCGr!1M#DbR̦>ݵkF+*?,/,,,kFfi>8]\_x+k"6>5 nܥdYi3^y0N=u^=Oi\{ò )y6mzs=~Mp`(((((Bq(qQk^F .V1#h k4RQ$uph_ӣ_h)4NYPܱ:3π+oNFCҫį;D BNΙ\Y5X8fե$ cGzΦڿ5wFw~Hkcsϩn6|W&cLiM)Sp//FpqSLeSJ\[L[ԍ3MBqF ~Gy, 66i2PsdiI";Td-)#n1F #f&H)`C#j;?RaI:snڧġ7n=+ Tӧ؝} $ƕCҙ (:Q J) _BFRI c kkkkkkkkkk,,,,,,,,,/YeYeYeYeYeYeYeYeYeYe*!1QAaqP 0@?!`-n)JRC@!B!@t!ny97ʘ ` -p $Nކ`1k[$7Tz]qAxcg 69ְ\ʹ{RݸE` K}eI\0ʠ[G L,AK!?UA(RU^:b>(?~ӆ' U#O ]I ̰5q6F|"Y{RS7Bo/-~A$G<81y#q.#q. `8Jjl4G<8y#qcqcGq.#x<\Gw(['AFޡ-0V `I"PUZ?ZD BcE !]U?t&{c@ʽ)[ 88+! a`2,!w,uh2LO#*fYO'a+D b:0cdDG3;sw9s;w9sw90 KD66R `Rk{F[@=S_xX1"C; IjwD0eR@^eP.{V&o%`{#Ѥ` 4/ (mMڕ@5zA@DR.W@N!k@?(b!6i'?W {ShRmU PmmUp~X@T=~u:M:*QMbX"o X=)HZc,!P4 "h6:Ze~@1- 1kq @iE6''#oS@/:3@a;[O Tb QH Hәl&әm9Nfәm9Nfәm9Nfәm9Nfәm9Nfәm9Nfәm9Nfәm9Nfә R[!q* 15{4v{eOߢ0޾{8YMH :f1H?P{?B1Mfl=88888888888888888888888888888888 oS蜃@,(2j+N[ 6~#?|F|FÈ#g>~#g6~#g?#G6F??|GKzDbH&m̍vYw$P[dsP5+EA* A<%&4j> !V!AAl"A=Q3Ds-Et`S #5%xjЈH@[a^$exNpTW*JjJ"V:=L`lH$?0ȬXE `4-:B!IKY ` )Q(F%=?c-~1( %iMaQB} JjVMj1 Sꈡ#CbKRo'pUB!OR+B@BZA&DW*@B ++4  T4Z `:#pPN Dkk0%m"H{5?c-~)/ :h0B4/eOߥ_GeOߥ?c-~-oSzEo_~[+z#2ާ[?~޿VGeOߢX&W)\rW)\rW)\rW)\rW)\rW)\rW)\rW)\rW)\rW)\r!,~*V+bXV+b\rW)\rW)\rbXV+rW)\rW( A&[wmmr&~`v'0SjI$Im8&|1ϦM\v2I.p0)@` d8I4@C$mO!HGQmmmm" A$&H$"jIgdz-h@M!$ A$DmmɴI$I$ 4Se\ $LHe$I$FO+mqmmܑ 0I$I$I$LY&L mom[mmm5>@ ( 6!,0h[>܍g6R5Lma$I$I$I$A&s@I$I$I$I 8 BI$I$I$I$ @ ,it6\ibY{ A)DI$I$I$I$DI$I$I$I$A"I$I$I$I$I I$I$I$I$I$HI$I$I$I$H$I$I$I$I$I$i$I$I$I$I$ 4I$I$I$I$II$I$I$I$I$M$I$I$I$I$A&I$I$I$I$I @ , !1AQaq 0@P`?,3觟A)Ț z:u &`t;Ub9HmuE#ϛIb3w5IrhNƵԲQ (NV^N%vbGHݨdzr߲+Ѿ˴*׹{%!Ӽ?gXsl&E#wLucngǒU#ψ!OBUO&luIO1-;ӈЌ>"{}HdeS·]Ag+Dz;RdtL]56cN'2b6MdJl~Z aR J 8.3TDa!^y8j^jF9D&Q\M֮YBe:ׁBHWv?>p_(x0WXV^Nk"#ʺ,jȈvaȚ5AMnb;$V9uR4u-sBrx:؜~~db+ݣ2A}]mJ @[dgf~K9ʙV%hy+B=dUWH?-kW(oR8?r;Sru2={ܭ`+_BGbu)EU/wV\'1}nWC K6Ec4f$t^ΨnWȾN"P:;kwmR<I/W+!1AaPQq 0@`?nk U-XUaUӱY)q˩4o>h0 JzlF/۹z˗iyBn\lTٙrk>C/DZ0c)ƚq`ƭ>BR=vb{u]$FxSx\Imύ35jƶr"!V5qW^bUI4oM$LJ$U "E_)r1YĚXTn5c>d|*yK;wT(i"// ʼRGF(r4 7)!B߁V-/Jϲ1s_bW\U!>]6?9ޝ LV_݋O!W\jDUƟߎx[ M$Z%QU1gR8UUɤE` 2qu`0Ul*>lF;(c@XlT"GQdn\Fɲ[X'/1ѴR*Kzӡ:ۧuEEaǖF)滊.::>:yE>mP>{ϰ>\HXs.qc%x&-Lu5D{v| {wܙwCi)fDVuci%iZeuH@cRƼr57eWZkI(^9pJrȕVFkBEԚNtpeϠքC10)֢>%7ؼ A8H/x.MdT7.vGnA"[\&)܈g:1r9"T2$&g ȇ} .w:h,rd޹RJk&5,`ôR7ZGD { ]Br_RD8Ek{3Wct"99~ ϡˢ_9}װнbe¤7q.VltǕ_*k>z1Lk^c:uַZkuַZkuֿ*!1aAQq񑱁 P@0?9dv lOi={LaXN 3go6~[Ϳoo6~[ąo6~[Ϳoxo<}鞵9soo6~[} %N|Y?yOfm>fm>fm>fm>fm>fdAMMMMMMMMMMMMMMMMM ~ُ_o0[\v#Pj[i>s԰zEZk:PhoV4o eU1Z-M5%RgM%U%`=!QRf&30Fv*PrKhBgcY%$794`.BOQ+2xYaL WJqXdV .(YB4 ujL)5l(EI k'̴~\! `KsYNu~SugW7_2&eP*w}ee.z zpqQ@-D]ET]e`7ߔ~S}M(^A7nV+@d4H ?U X/ c&+7(o)! 7CE#d\1"@4*:b( VEhMn DUVB\JphAx aA2@eGPHYy;Jm0HVs%;{Bt*.W,SH6e7Vл˦j~V TRY`Foq+'H*\%wY8BLe3WxbpJf)8Zɷ}-Lx ^Ayb9e9sb )F1\ |TV&-/m2⦂q#0oasae&`V+֦l3J 8]/*SbS KX"f LP3aKVJRS.˗.\qd݃klhd`]-iwj 5_.Mu_rOtqU (گMzAְ잕^#H3p>=6zYgUN9Z\Q=FzI'OL8V'Q=FzI'OL ns Z[\dx.Zʎ.QL̞1nD3F_9 (q#A%@CEMi- 3>8\ZD|Mo14q \7Zah9^= (оD`]0%<6HWraƎ:<}Ozxޞ><}ӆc9?ns튽J@f Xy!o+\F( :" ha8eSVu!lFxC4 eR2?˗/~ V)8V a!aZ(qkx)ѢB1#ž7/.\r~}϶ @x~4.,@E:ERP˄ A?М UM"SѩM-ه̠P L)aEc:uAyGx;,sD\e N d8J >'}ϸ 9M$T40<"ZP6Vnٕ9(9)88,8.z߸}04>g}϶x8se*]\7V.5|qM7|qM7|qM7|qM7|qM7|qM7|qM7|qM7|+:͜lu/fXmgy86^:͗/Ylu'}07e6^:ĹUcIhW9h :i"--^ Vܿ ?Qe9m̸g(a: IrPU9dq#4>g~nKD#4>g~ne&5Cx=_١g}϶kuf,7One&>٭ >5CxfWvh|2tli]O=vp IDATxw|Eǟݽ^rKBKR)«R,P}Q^TD^7)AzM(%!ޖKBQCBp|3<k֬mۺuRybDM@@@@9h4T?>ZyyP3rK7nk]\9W\>OS>'yw싧O$^Ll^ .%\$"66wj(H͟*f'K?gûh~ſƴnq)}O#TgF$ƨY@@@I>Н+kS`ƨY@@@.FsEW`WKG$HjQ1 7t'ԐԉfB&Kx'֘!1jͲz\?\|符sm͘jCɰc9̳sUUq'(1ƀ;6OUP]WhT*ņ|ӖK/* 2l_(C{:lyᒓ%6a 79#Njd!͕h!ߔo v65T8-y۪H7&C}ub+!6 }Y!¯TiGi+mV]{NZsІ8Fؔ2!\Q=!Zҝ݉ʫKx6wjԯ=ɥ(K/]c@y,_\>rqbo R}0J}isE!E#;>P1_oOXӪ'HQpcGYMt1ک2R*s+3o>UHuʁ5mWwǞ clS5c P`#\ m=6V@b S .2֊>b?JeW:4Wy.I%U+$KJSsɑ-cz* I;W_.'3Zc*2'mŚfh0.E@ڼ9.lKTFs+ִby >IvX:$VW𲹲2˜ĀӎeͻYͼI@-anSE "s.X~c=P~K1t:ݖW_*bOLxl\'4xR $B@d]u +Ui&dv.roo*.ԕTRH60fafcVe4IVpHX-ٌh0 vj%)kfISBW X!Je%`~,yX^ G# >α.J# &#bv ) HfN̥9s rH(~$C( o/L5!p@kִZkT |U\S(L@7Jt{@DY 3\:xaY୦cs; ȧ9`ӾN;3M;+DҲ>/v99!A|:s;OUZ)xBn'ŴEWV šmD (J#'^,V&]d1Abu">Zv \[0F`3} e@I'! ^z7 Q]\R2>\9t-{χJVo` @]kى,\!QM| eqzG:J9HZΓN ʺcL sttfNߴlb*c1D1^?+cGt,ȁ~!\t.^Ev QfEFJ0fld&hh#Cf#uD׻)rw)bO/Zx}{ms%&ZDXVj1r%rf50VF"%˷ɇJKk6bjܷ^t+51n~tl3v^Ng/Rvq+ڟK]9.1Yl2dJEq4[Ctϓ:Lz&bd~T/@JVZMfAo42 1rEtI!@lRXkliy="(+bۆKMP ^-vE)KN b4,m T1h2eeeF DдF[qi,hb P-E+EҶܕxB9*ϫPSiv/EIod2XOQiFg R;:{02Vdp[3!TQɀD,MլiOd2OK5w='/L xX" 2IʹhVPo|g124IfX!&9m12V,Z!&(\n1 y9^>DllC`1αUvT|i*ob˜aUd%] 1SnUiF F%ewg/Y{R*!?.XRY饭gN2͇]y 1ƔXnnmLJ"IB@@ي~*;Tb:vp&DCzweW;ԏ&Z*%tQ"66Vqt!шVa)/JyNm۾wfδ쐀@r5҂}fXJHLQb k5gg5u /JշOz4hDRm`qߡC\1ujZCuZ @ATC+W |hQc1[DF:I<v.]dI& ruZ "H y8(YfٳT&7vJ"nkgc<" 3va{ xy^$EGGݻ2lĈJ1!CEMVIEg֭Mp1z>t < Ua\ 'Ԑ4s'D"ta۶mCʤ R(9'v3:Vi\ImaG$xBvSI¦y[cGJmvH@a@W,c0h|J O q1+Ugb4W%Is&#8U]/_|;=zz[Z@$LLJ}YhϪOU4Pu,c6^82''GZ7mڴKtY*-mWhR3p+}eCjr`v~.)WeX,vVByam$0ߗl-M2kƝN@Ҭ˓FS؜;Τ@okrӔ>來&4f'vz \_ՄKNKbR$" IޅgzLvoW8Hj))TNLAdfRSSm,kqV-[VOoN&~ʡyFK{0;cO `mIDy6غpC)k~RRfSv:H/V%w= K<9au)r{`\-ۉ XF˪ aL^@QTqqS^yI&-ɓ'i(Hr6y4$l;o2ߤ 7KGj_?.5*"LozeOҢy3;EʦhN롞".$K%\+عI@Y:d'w%raJ{Y4-cMy^e) H0P'LLxfPR51!;;{Сz~'O3gH$ܩmVX,H$O&Sx'K3zR?J&[UԆG{PO%~)yzV,'`ojNQvNb^_F# nK=b'HS@An#"'Tؖ5jTE͞=7ܲuK>>c~~UvY N}\kuȊDq]qҹ1*6e&H=Oviy4y m6<Ƥ3 +6#F0~Է~{ڴi}]BbbW{{\Ҕ8GҲzOp9n+Y%}A^b.8t{qk:X, K\twG,?6LrL?9 iRrJNvmZ-!zM9ccDIv޿,u׆r(t屼]rOVҖN̦].CUA*ژڴfCA*#mt[ӵo U7^˼DӸε/OFBԮȖǭL בe)EVl6F}nm- WwǞ WnLNP:4+,|7};ɛ9H"OzqHM#Z wf36>>ƍ;I eӗ?|d傝5#T I_#`І:N5.X*FjVױ^#S9NS~>xqIb3"(.@V=Tx[{y\\ˋy BKJ9u%- G?jY8a*6Vk[ ۹'O9lQҾ4Akj5˗?v|ڵS([rG,X?4pc}gnoW##R6p7k&u="\w?cVgheHHmsW-, X<3Jr?m+-p6!ۼv/7i2W/&:`ƂPD~iJ'K-G b]׏Z0?m.N!c;k3*+ qLP1F8D.N!mkr/@c})Fڵc/oB׋1hߤri5CHH@ IDATFcQv͖V 3#TDܠG\: vR;mE_]3Z<4d*cT%|`)H79ŵƘKd2jT*ֵkLt AJB,12&d,)#ǀ{;ޘ{c01tnG[@Dt;4K=(ׅ~17.71)ovԼUv.ø/~ў %Whg|9 ܔ.zM#Z Q|yԴ_-V6i5837fT9={F?2S^=.F?e%u&U;k]/Yq9Z4  *I\-  -+LP!¶tB]`LH"H[w1` {s0Ҩ\tU֤3yu qүL $JRyW%Iei&ńI?X v@d5™W j.z 7I~1mnu yFe*Ȓ"u+)׊nx4WLvfc#.AjBfLajDD=K(Z|nݟGh #B؞yٿQq0B6•qxT-ulDTSyXAo+• ra]yg{2!9J:O?$T-{P?"kPJqB!o*/pGS}gOŞaI28D6 ؇R*V*a ʚbk,uP*66u+ jc(#5 @D$C{a0k޷{E1b,R](s*mO)Сt>})s]:o!N❺* #[\rD1sfaar9dc$bӆոVOLH,k%r,hL_Ӯ1 ShKWH"%a],p>Dbe o׍TBk\T)sIg +Ҝ^b11Ֆ-B0[Riw~6|! aֱԍݽޘ$.*{] 8hc T4"UXʋϊJL-ZAV@@np-YD)D9%HXف6\E? OF$ '[@qaBH\~\]@7EiDRo 4.0\ǶbA!>k+([@qQm8„v1e 4.*{?BXEE4l6ʍQGۓ * Nݵ|1M@U =F^K]k'BD5 :\KpAgF$ ([@q0G"! ,P/`Ӝpn`EO@#Zŭ[X2Li)Zɭ4Rd/oX,ԸsNa^VZ{hlV;p)ӈ)3>$Cs.̀.FE4sK6p &LDM_|v-Ss. }CH\lcRڰ7[ ؚ}r/[o6I:yJ?Ӌ8O;xm\GxPɛE{ 5WjP:3oҨ_,?ueLR?2ʱIMwa 7.*CJ<5OfͿzh˺/LsGՏڹSj]\[!ߘ,>y2kd`@5_G,%0=du^,5zUs{fKƝ҆Fy#3ׯw1%Oϊ쭵+lD/v!ҫ˿aj &y`f Ɨ&# ) \qz #I8Ҍo}G$0 "Ӿy஝ٳ{@}]*)wG8f̫s/O/-8b֘~]:v:U( 6Rmo%{ o Wi¶Eٽd8bȠ>>~ΏxM+LcıIѳw{=7MbPg(I)zTᦫ>/Ϳܺ"/Q5{<}#Dخkf~d?7ỳZHDh:km~/ prK7m)vw~-~OG}xyRW|[& ȼd}ze-1}Lu}Cr~ö]O8wL- o o?}W.X0#\ ~S{(;wqnԌ-ێ]I8{[sD ^3޾bV)tR7利\~=ܑ')\!/Jr/XybF Y-eZXC9O;rj?<\h$ :7OF= hvz0%9)7hlfף(|{u[}ZPnklê7Bb`Hɉrk{bjv#׬#g"|ܧWo<|v RM=_1:nOlR禽ޜ6,JMH|x}okOG9ZӇ+-{۾ؐ}2$q 3up1#aB+P6oA[Vo߻XN=%Um97m "ίYȐ-36nx-Nz*EƄجKw^#D`ȩ-"o6RpA~b'9:ڱ>Db%uo".O#>m@Vti?|GeA+k 9Oeg!V UO+ތZ b؃!:ux۾T &j|G݅RBHۏG)%$n'8HXЧKL=!6ko-G/fKA~3Y чW4)ĖfM6We _/<[J.XH CŠmɏ=EP}o煊~'K z!NMc_uw:lOgl־^(]įWom]TL'{a,֞ۉgYtQ. opٙ^/1lyGBpgJ#ܟ.?^n5[Zۅ߷YM&oU״x϶2ޒ{/"5ꆧnM\k~@Eʇ%6Wp#߿rzMrmw\-K1u(,֔0ggkDױ T-;вi/qX>5{ne.>yAO"66vШnDRvdTˆV$ |r5%Qh?VѮj # `FH@@@@@!!C0B `mه-|)~/ۖF &t5 Wxfuչ˪׍1SUIɉeY^o6Z˳ _zvf- Z@#`YV&b=g4:U\4b.FP}K3 KDㇵqy pL%8{~ h&/>zɖe Xw辡v$frO]1n)bm-l>-YJiq<8ḁy8j_Ԍ)__m[/{}3pkI#6IiEf Rs>yA~uӲZTؐ'^CW@@PɛE{ 5WjP:3oҨ_,?ueLR?2ʱIMwa 7.*CJ<5OfͿzh˺/LsGՏڹSj]\[!ߘ,>y2kd`@ Fy0ppV6mRH4;e_0+:6aǒ H\"ZEke, lHvP j0738MjO\I=ؿeesNiC\`.XBAYMږ/r]93fow  6Rmo%{ o֖W e !:9ˡV¤;F=A @Ht=ks$vu"GncbX"{?OM刴=os{.Fh OChZ r7?(s-M|nZX;g언du9Ru rtR~M5>J]-}kSV q᷅ 4sq9Ś56=nG-FDxxPPꍇ/؎A3I >V雭XܴכӆE Om/V 0v0z%v!st/Y$a}N 5f$ݖXh Q*R9h{5ck֩u?J}>(+9 noDHk?aЏ?mؿnk]#zo]s& 2>oLn)5k4˲4MҢF*O8ǽd$ p5ʫj;;;B!QXX(* L !Cx,b߯*WOH@@@@@!!C0B `  4h0#$P{6lRZ Z97J|8%Lgy5Y7rA+kQ,E;ܟkҹZ7[= 2g%(uz``w};-FX\ΰ-hJL&H$qտ +&4 ÃJN wdz{a&}ӱyq^UmOo6fޏ\CX5;Mŏ8ERbfo'܉R/Ѐv_-_|aelzZ}(BSO y̰yw,n=l Tʩ*g.˛o>}+ {u֔ëW8>)!RUk4­y' R ORaBŗ6-[{zHoϙ \۹n;r*slH`m(0GݗLivdȤ_jwJXCpGwlΡ,4rb-M3aWM'{幻1K@ů'=xizӷ;izI۱pY"3=qڸ-7Q@ 2=:)!vȂ4Pp۹qE@e[op'IIS_kfƯ۴ʾoWvǕ!?hÕ_>}3}57;Ϳmu1~ؘ|!e}V7f+ lXlqռl%'Ggֱi5ja /z:o&Bd߯wϚٻbɁɹ]_p䷛4RXDDa|CޒSwH!sT㢚X|bg?H!qך@!C{֦A^ݫn5+{2..n{C=kx (EkU]Wr3!>yFK{0;cO `m ='(;ǤLRbR @[:y عITd xZΞYJ֡P{'?9˶VOo=e 8$@`9w%x-4}LWg{œ|.Fm{c@P>>y2kd`@~;i9XW 4o>Eq:\nΒ}JM$Ctj /c)]PdG *i5p-vQlچWɖ3l&(~1#@,ܕ@e^ 9&@Ӌˇxj.2Ooo;ּP iѼ͢ue~v4PO>xnG,dL+Snzݻ?ޤG O.z}`]FfNjW~/-Ka(I:1)"P:~UyJ(1F5zWP^P^c3!d`*1#J@#`kTjȼ[KyB۴k0z%Tߵbo7ƌ5z̨W>S\37nք2>sN֤)?D]TWi3_5z̨c_[BXLLP!]o7^ͷV>+ IDAT!j`s"lX1P›Y.j0J;ZnY6< ndW@ROX\Ep0VǐEϺ ZzfCscQy_2gǏ~s__{'^X׻r3?_ 8 _xW(0kOæښoo(ƯO0!"R9,CB$!/Ft%nnOc]vLJD@9qѻFwECc ^lR*XB2 4kkImIw9sx 37;PY\T7*'Db 0pŷjYGca\HyKJ>x?3d.e䎪Zqui(y`a U^_`WU;ɦE7 ҆~3[[嶕~|lr&فzTPxCArݣ ͓oK\ /ᶾ≞θ|SS&wS}ۓPg(I)MSUv-!ylΔSL 61TSsShj'QƗ\.6㰷͟R~n2xhڣ q)F=ɗ)K-!j[6K :V"|$c[{!/j#ɮ5~XZ1ڙ}(hyKdI69[@j([1nO)?ҳS'o_ wXj˚o7b¸M;>K)hbi\.@B{{{g{/ AA;6EAAP*;}vٽNog={jХ9ŊNlP6"!KKUiw(h)oSe:F' ؖJ߹9խcw w9C }_M@SԀἎJ_-Zp^Y*?Fb:k$$&Z'€ o[#p|v(&0i⤴,ZmÁٶb}pyi֥=f5C5~` _sZ4}DteF] ¶nęӞb [e5?BQj.2q(X/;{|ء'0ai]뎼Y7|=/I0YcQKm֎{۫G'Fr9T@[uQB) AUىwj{Ɣ֊H #sSt?tF{0)50y?NG} xN\ d;4wM5Vݦ0\ ;F8wqhBH|\z+QMv۞wiI6vߧ/ 3#oz(#BBXX_ թպw6>{-`=ݨUuW2YUyD}7\p}cy6on(rѸ nxwg6|⌫pQ=` ? *Wn\LK;p(x^L*:읺y,z|n+"ͻuG p;.Yz&>U0OynW3i1p!( ǎE)HH4[8WZ #!ip?D8H'DBBBB҂N  IA:!tB$$$$$-HHHHHZ *ǫj-<O" օܺ6-%RQQQD"Qdg?EA<4/u7&E,ڕ{)DBBk!I_ny2DW}VR|k$7k@ٷ$$$e//\ɬ$P_ ʸpwE ׯ%~x7c}؎rWyȀs4uBO)DSN}meI> 2OHa98/zYSeBfsܔv5)),:̉4't0{fOhLë% |T jY>B:zZ )gѾߨ]H;K}&NgzQx]MV@Tg \"M]NI6:,{]O ݵZ{Mvohd:񬺏ަAu4!^: >„%--aDuft[fiKlBGZ{荙V!}"2xZ["&xsrbPCr!H ظ+oҊq!GhiɮׯsMj -JnW.xY2S؛'2+qbш/Ft?߱\ׂUP0x MΗ߁4/oҍCTĝ9dZނS㍦֪V0$p{F6Ɩ'V.~0K (ԦwUŕؐ;ef kgal4`]`vlZw`mȷ@4QUtPd$yq)"*'&Jd ݮ6c^Vr2owǼvrOύMZ;Z4BErR)%z۷?}+I /)3loeiiDll ʵiD UdͼCq#Bٓ{ٛt3؟6AB/ mRc0SN Ҳgxg'i\]05x6(gD?c z,[Q~{G@Tco !H۹,<+:Qj뉅UAqgЪ/mۭ,9H _{k,$*n08?1'?t -dnž+1px#nT\eg: V*$l-2qie15G{_IWv!&l,:Y?+ί7(ii|SVBiiye@I$mxTKSsb7E=a;jĬjBWMGӪ[_GZͶP(jµO *ph$$8@^t]gHsee7^k6{'. + "A9V9oƕm=]1`癞{{4;,_HcYySeQsǵ[SoQs.  B9@ fgG!o{uQ (>?l%xmM_frwZ)}) 5BA)@ȾTvc߈~ߙUչmO2c5*B[ -%L:Cվ8*H{h hV @Ut RSq/j3\>ZVvM 7!P'&9z7BqcQ2e{DMpJ>p-a@TD9L/zrbմ#GVؘe+ %\%aB:БUH@1#9s[XP fqŇZv+>vr12SF Y+vҦQ:1^JحtTԫkpi!p9uݝ݈@ۗqVPo(u&M0a֊?>3Ѡ_}yMM\JҊZhpiqRHeP_s]}c}Ƕ@0:JǮ gTBx*TŲrzywQuPt{nxTkS DZ#̌}3?Չߦc p234Pe4^T5aLm3eȊNy Ԙ,0Dwу[L^  L-C%(H4?ݷ"9.0a8q?NF r<ݪS.1Ƣ^tUwUˉթRX.N*%7=9-;p ƾ IEe;xaBн|\V7tDke(9u:L}bEڲ&U +{Xg`4\<eLBU`I s+qcJ_;g=vc ӓ4Zi=y"~zr wxLkd=\| .sWn [FNy]kγJ0%#+G1TӼ52 wI1ikGw4D6nرw|sZ4}DteF]Uq$$‡p @Țm_9R SX/eeBLAB3p2wBNK&˅2aebWUՓOVi]y<}uF+:0ҼfdIh V`< /H=nSӰ'!! Q\8;PLDˊ*;W{w\LrAֹAQEL] JoRAcQe 1!hHw] Y=%qW#"_8x(CץcsU3˶Rɟ@&I$C8Ʈ%&sx#,f3L2?¼Z;('Ts/ qQ3} m&ta.<*"Wf~D9){69DJRo.~.;!sf~@$$$$'%!!!!i1H'DBBBBbNŠ$''i k ADaد15t:F#hs(,,/`#gne6AZd6oTDv=zreͰ[Ҫ __/zܟZ/yqŗ?+oތk,]$AէyM\F}iń~00-dϩƲTgD Ikwqщ߹rĩ'Ls,*{j4!.N}<^4u'nJZuJ{ANД45T? /|pv0sr Cؔ lL/}rd_ʘž^ ah~sZV{kd:$sJr%˷_mxnDa@{uWnVE~{WKBG@:^μ,xV=FOE@Vaϲn`(Ao\xiD> 2OHa98/cyOY@s R*c1p^ښ☭F(9B#3^H.`ʦ' yaRCO^IK8. []c ʄ%BPCw1iQ{[Eo>|?%X5_޳B!mqq50 /.s=,ʩٹM>EWM ;K}&Ngɪqe7WO ;v<翺if%05{߆Sw(5{{F;u1^nzTsڗu2\MS \v%5`h5iU$]=yJԻrZ& uQṗzy(_Q >qû6xR[z#EթfLX4)df{쏢*º~ά\ꌻފ-;󑕄/y5!2i}G>=%YW>L:X=C7/pa'6#7!H9yG9R%k8q)>PES'_^>NlS* V%$dMdr~ǚ&Z7-^e&%N\kn -~e;1*S y2uND I]n)R)(JT(pڊk,ujWS*Zy$5p4ϋO/ ~?AڌzQ_wmzO [7GϪ pA6')/aڷ0cq'@DϺy-vv@+}IԽ<'h|% \\U~ t9**SliB.bٺhш;eS kA &>n޲9 B.F.LR ei[߄Ԉ$Z#[dӡgF蕼xn=ŀ/;8kOX B `t  hsmg{3ƠZyV Mh1x6Vtb  "m/w7g rJlc Ijꤪv*K_} ,iS}7r0BAhF@14b7NHQڰnZUtj˱}'/pU<ѸAb2~dO1E5F86=wbK]Lbjm7̆L\bIvA@cӤ ~^jᷱ 3V^ D |^w\ުVT\8@ONy̞Izwx z1yhʎS]N5 Z)qsgA' >Mnߺ6/9QutbmVhgIl%s :+#Mv} FAi)xy6jΓgϟ. \g 5dQAO97(wz#3Xgl@Z]q \r&pȠe&t530Ғm .>Yi@^LB| `ڝj>y^c7=x&H,U A*JkG9MŲ([5ï$V$Qd3;DP]ïʚ#DEjLuJ}P35k$foUqrՠVzz~1RTaJt"7MUM'FڍgOT9J2D.so2;edđ1%1?惦:<_Q;A(I~ġ%<~Ҽ͋P(lyI# M˥fyRN0*<`G.aaW.C;hTAC[ VG7Ӆ[ŭ;г<˾yҐC&m{T!)mO̎CX4 TDuG-w2:_^ذ7 5Q=*Ǣ0GMO h@Q`Vjb>ƸU%bH˲1u-Wȣ|_&E 9N\NX]nH)1^mo9h} 8T{Н~ v2Q' WoitD꤅ :+ms7eH7 &,*XaZr%,^i2.[a颼\Y~@k] n![Te\B1V}%(tPMO=LOΞJeuXҮUyyM)3J{n pt$tA%~!2LKpJCB? o=#{zXYl$zk?N1-ℨm:N]ݱZQTxΌCgG\E:ABy͡mˡr\LSݨUƙڡWÒz։=7fC?37[0Y>GCb̵.}fu1ǖxrmh L :w=%ԅ{T t ~҆\8G)jZTũ]fkR ,T<i;ک6,$Pk 3ʜ zW'> pرusk5N}/&Ÿ&ԸZ5F?8Ec~./h}4M*bB^DiJ0,FMYsyKp\8x-V]lPT^Od3Dh=^=ۯFQt2H@gept(amdm @g~ڑ]ԩic%zr=gj`ryyhM(ه*\,Y i{|;TU6gBێ \{ڋ7\n1:#`7^06[DNՉyLD;EXV9rXqss|2]AG/.[a6!H9}ϓ)EqKSxz8qqguk|N̯TUVxgBn3OhˣEZ su=~s,h䳛ȑrm=MuR/ؿz|ni<~>EvӪwiI[/ dZȣ%Q^ U Zs0&X#oW?$˒=8 .'}y߳" vO,81AVG"L1r-]31  9Yi#. :ЋSxvSQ"+:slv'{ȨCR,|؉T^?l`F!(*wS *`_($''efsB?HZH'0ɺ(e&}]%i1͹BT6Rhvc9/ccPMH(CxY+=Nr`~I-9!r 3IN"dLZHsCvx~;2~Id_ܖ@?Hiwq#'( G}s@?L-? ê-ſ?1KBBBB/tB$$$$$-HHHHHZ "!!!!i1PZZZݿARVV&ZZ 95H$:aد['D! IA:xiܕ/J5Qp{υw<9%Y 2, g6 /Kx/w tB:gaaU˪3b̪0ج W@zr9ZQ]*ʓ4<>oH#!!C:!&=$8A*5i~I֍G54znf_Ҏy Ii]cޏlH&Lv;WGPKJ H~ iVȂ1ˮ51nWŸ!H WAȊ3;-1nf;\sqxh7 d䆀A-^Y7ni)͹g{LU?{ሏ?T_'Xx:!yx{o$!['}C#8g}T6 sW}>ͬ}qp>X 0{x$k/~4>Np85&zt *mru]Ug!>^ ),=e,2(WV䓨~{wxc뢊ʛv@w=|ڱ9υq\+S0L̝E5ɤ g_r8z*GYsI4 ~!!*_+,{[)LTsl,k=xiL qpjC?!Nzb3=2h{.QWAaRuTa >h<ּ&!  ~?hZUEAik 78WWJ0CEPyuVV,EWOJ CMIiTgIƙEl;x\i56 :1VJvvěW؋u榎bDqƍ 7LeD0՞1}5UN 9: `>&v澻]]rJ5&$k/I--A`k*3}[ż(Ee>IuW? Sf9uݰv`rg mP~6pJ65d `NTA]V@& (9b|h}7^ɾb):czg5JEo?#w*1.ctdNo=rL Yb!\Z:֑CI#=>7^Kejq^x " zD_m&Ӷң y8gYڄ˭W!fx98}+9v7s;<[ENU6~[׶C~c!J#6O5ÅKiTg*MJ4%,I\n%Cs qaJdDuvj \[5ڧ 8!iizf5^8U8|>hZ-$Z#>5"L._f?yW좎3spQ?bBj1`t 3"&p=zbȮkSZ"I3&y8si]-: DU;\Z|$$%5gl̮;:HMm?9Dg6?clYo>^>!X\;#({wG8gƾsx3KV<ݨlߣ"kSjac03J3N:*훿fn,2dՅyUmzY+I>|fbUgU'!.N}lMi^Â(<Վ|{oK {Ӱ Cht׹j@425 @kЊΜZ@UA_;يQ{ STC&%@ӥ.L-tzUٽ8Ah3}ytc@*TJߊ}]UW 1#@HR9ц PPDZuPw",V6 Y;KgE BSwlW-e֖ B0n: LMC4(s7cRa9gc E!J_)^_>/'M_Y_t5ev )փ,S,J=obrndP DnP R۴'UԬ4 /& e=q?\g{5*gTBx*э*j˯u]ɫv~{z cq$ *z?P㌛o`tCQ0:2)GPZK0Yu+|[72{2MTkZ !<&yW("))Pqޓ+pBX],$p~rdtUg8?+YcDuƃwR* k[We6=Lͭs={/ۼ܋Ix2U·4nw8.!EQR9 0%2mδ[2ԭgq 17n,S5B\{ރJFS;60իō#9n]xPe Jw{WS@9&IR>UjzڛUPb ̊E[iIdXFe*)ZKt6J "ݵ1`bj8|;9.iF$ͪg t᫗oz^`,53gmsZ4}DteF]U~ =~^q*Zu Lu(ĉ/y*fI[&$¶a>;rvF\ٹE|7;Ś "o=nBS>8,:ˣ ޞu7YA?-MiY J%([ͨ1 *S%J GX+$[7&Z;6LPPrb{B31juJ0H¦ o4s+GBĩoaZ{ {i=iդCM Qzn뷏7u777???(,,i UkϗH$,K =O IDAT9Fs˖dzUAwoc1bl6ջhRBQ[U5ЂV#0/5ݭ]'ºmBYY[~[ID ,U"Ƶ={%~  ,3^)~qC"4 ӂC.GN䏀¶4(vֆWA~%!!!!i1H'DBBBBbN  IA%%%80(!!7SHHQQQ^^Nh_Ng1൐  IA:!/z)#~҂'$ MȐ2H'DB)O_狾7c~MHr^}\d$ٗVL+O#H4Doyz(oC)ihk]EHn!Q/ݯ֯/~thf`NHRyctή]y;W zs`t.5tvuui|„];իW^,o$ʆ{vԩb^M<{I U%]6}P{ONߵScׇ}(uֆU,ɍQHK?J?pᲉ=%8b#¦UqVzZ-vDV+y$^!oϻl}nr1k^pmٔ B k3jDkD[GG sl^fN .p]̋w^df\ڒ~'ڻ]-YƏ:p(ӆ2K+ \sE 1CmWTH5/wH}}al 3fA *nslQ6'"g^sy!Y2*8w*Y1uJcdk^pk㩢61B3dmORw[.E$婠q슠6{8r:Um<&iIÎUAb]~VV 9GcLɻQk#YK.T^ wVA1..+ykn9yq7S4UTQ%8<:SdIǾ8ثbM\׺hAss 5遚SQ`Oy;\BP:hҧU~y÷R+\5F $oO6/pv1a}O?dyg4n& (&d21jwm݂p)[df/=:?9ywȋBPm3t@#CCUzn=2W'z[$nTA}wS[Y]ڵĝt]ռݴ|d;F/u:[l5K1J4xÌ\Y~{neJǖLC:@Fcr7_[ueֵi_aGb(<_5/Ǡ٣T~>*ŬrU0|zFUk>QESY #ɦФd]E^D mmkmHS؋c_JT}{^F4Som~SWS ֪/yA]zNB` T'^tE0R;s宮OT&.KP &?6Nuqɥ柹.7P4]pTFuZŞI2g~A7*}A˪s^$WgEuNRvM5\7O_]7`39x~u BTuGGJT{-=Cۻx7ϙ33c0v R"D!%ڴhߴ)^BE+6)+* Ø $u_ Gi{y9>};}EjhfCC~f}֟@eQRt]Su";I ,;$d2P<(d9ܫm#!.0ǭnG9G)Ὸ-h"C;}6LWϟ,rYΦ0֙1$|/۫v2HB¤uvضf)]i$QymY%xm|r;CI6}9Zu7G(0_cʊ˵.sTEJF.J %YÄGU,|ktTِ*@nƩ8JA3:iT׶du'A(@">,Af1vۚ;xn 8a;W/_9Ӵv Ԝ.5Ah\6_n2ˁ\àS&ݺh]}+{˛8&$//(ㄋ1;/ \<Ԝ74[dݱ$ ` PW$V"6?g:+x d_6GNnwk 1iUsDɝ]Q(zҨ˫NJ  s"J0"?~Uhj筇7e;O3)Nݻ~£o{j%nr^ c'+V 5=TMj4kjD'>6N FZ!Jxƒ"gUd` UFV.|J}Y2quYVrS}g)#Wn'$~ulA~qIO+xmTV*<=r!/zu!\~Zđ{||} Bua'= Șze \QSe^,ʊ㏨흍l1 CұR{VtS)~'!rB.UR,51 ?Ϭ r1ĭȋDJes;~yK郏X.nFTTuu $d%2ۨd>MLIKJ 6^L5`d$=,$Z0$`v\qdEG&H><,0EQʩ=moYpa~i5{_3S E.MHLAЮ71swlJ+5)ݎSZz.\jAK&Sor#7/q2QWzt uc}䙷l6 onO >r:zqkB(͏ZlRJ\M9ݹc7n! QR#&~At=僜M9@ace_K<g K4:t.#V~qJ_*wT~..^g-*/oikO]Uj\5׸֟O_=GP~UAa`ibvpm_$(Z_$'ieZ$kOVStWTUY&!ysdffeiLgҏCGzbFZA")L40hi-F%f vcM'Xmvճ}vIhZ=~[Wkkv";`d k9맴fRf fR$S#?qൄiQHNYs7'66޼y*ojFV{L&366.//H{mg6-:9!GQDWO$cY7 d9g,fٖV4 D#^@@ײz 򜶟J—(C Um)u[u @Qґqe1̝]ѧ q:& ģ R9u=5[e?6,~SqҏO:,O }Zvܤ}"oei7l>o274Eq0h_^'C&j.c1ۯzɵ[d8SX5')8f)N={)Q]5*'_{ ?7DI4`jP{fx~Y@IPłA3 ݭIƿtivKtcܥD^hBA 6s(wpθ7#ױ{~ʧ&+-˼Έ MFlL^v% M:Sbi5-! Nw>Hy@~b1a'O}}Sxriň<'6hQu#ON~A}l?N FǢ_;X0w[۶3{nJ3~8?'Kh6 ;nьzTq@O.,[qb9!͹uvپړo++% a@Rlm L2֌ ;GLp"2OEe/זM{4߼'ok﯄/2jqs6%+} &=yR79TfUT\]+,wG=9SM  Qo XTr4yl鳕en=@{̥DqPW~!S58qͣo٬jl?H}Y<]r6ɬW+&ȿHQxv¡[7֯_g!e4T-n;xޓ|K=Q1C:hJߟZ?#HkŵFzZSͷΣu beE- a}_]0)*tmӢaK&S !++ [vjo(@ӣW.ә<ܼz[a#No :0>˺ + ˀiԦu{'C*٦c{[KsK#eł}Ee&ͼB{Ƅ^&41[S,䓐W_|wي~FzzrrVѦO{ehskl'J]}1UO=sbmRbNXdBR/8p5@3;&x4=:qeٛ'f 45ZHÒnԴ?_F:hû"( WQvPn,'jTнvZVt@s9Jbu0 P~O qTLԧ^#(IPtm&jx _W{_tZŧruuV_cHNB w2]{ӡ$#GaK >)۩5h3XY=_|;vcvNTd޺au Zp FNm.)I.4pI뎾`@/hiMڕ؞Tf%ѩf"YO~5O{W-d[l_q9&zȅƵk-F?$X% {v:hHZ΃Oa2b]MOaHW j\k( _WJn?)ΫXp`_cA{ Fl0wBuyNlL8&"RӠ<<^1{6l_lE\:ɚ AzDsuU,Ͽ}:"Iu欷B R dP]߾vn\O:S?7D=yqݨ gt1%i2qϞmOaĭSC7x^ۚQZuG/Kеl=jQSɈڵNǏ_IS/}̗`LCA3QBoB-Fp-!AjC-&NKADePBAT%!ADePBAT%!ADermQ8T*IDAT EPpgV940L:NR踦rxs5t`AAIAQAAIAQAAI7%4SA!g p7'{"zU+hX*9#L& غSKD *3kfӡw_7+ʲDɝMF[uj2E=3Bnc 9m/ ߇0ݯ`EW?;䎐(Nz$B~?/_qop`?s5 EEq97Ζ. >}p#j]gO9w ˠ(&hfQ)~ 2~كǯ>X-: ۻZɽmKw]f D/ N0E=;j랤9"`L;AOiNx/-;3:u/2 D|C\@v?V՛F6f_Mp`nUEa=G>K޲QVl!̺):t9ֳiՍm1;GWOA{w YL61Emi*Pjȕo%||vu7Osp3C]gWly5qL<'uB;QgvÆY\Qh\Q:__>br"Si$r^vMQt(=rݐ^]L{8uc/t#cX Q?B^ W p!1p9r_[Y(#{,K.pSRT(ea$!GBI#JS(n=i.A b;c9UHm;iNg8Vڱ1hgoY2{>gc=Im,Ƽ1 ۶}մ > 1Gk,/Ok/?V ia\36:2ekzSZyz*PQ ZN_BiAT%fOQ(^&E &@4n9,_+BҰh }YiT 7%xNgWq ׵wYfqο۽.NO;O۠Eb1PBBI#Ԝ.ՁѸl g2 nu{*>o}u%CQ,z=*v%i8NذՋ1_4mů.Z5ɑD *TJ$8\ ʳ^P_fJAL rZ{Bd$Qyje,}xd󩇗 .~N {1>.gMqrf[s.u"Q*@ NHz̘0kB \zdV]ʹ.<޹: Q[ z8W/ e/=ieNP~\{X|>vJ-* !Ҵ$aձz(b~N[VgUʔ4e'$8.Yyk$#E1ţ)2ݍ(r~ӡMC;__9rCh>JBR?w&.WXts<@vvVj\/Snv߼QԀM*{P뱩0 ǘUJbKĞ{ղ:J޽xVF3޾ZlK3Z&/1Oo$\yuƤڍ-A?fy#e݄M趨_Kzum:l @ ybLݤq0~tց6]-;-m@Ai 3:uХ`@\Kjww6= ofw2|y#Gul؁Eu8s4*!"tG 8SmLkںb1[kla7xΜ"a>>>T*+'+//H{mg飯HDWO$5| UOIj NeI횬7oss@t`AAIAQtO?~Qd@BAT |>x<G74Pd2%T Ba LF) d  JB ʠ$  JB ʠ$ L#%!B~!dԘ-U\m@Æ 6rƁ7څ2p$?l#|Hܻx,>"~NZݘ /L;}82;4`=  !dD컊AO?vN]^^LT{͑'O<=!Ƞڶ܃gvxh]T!0x=6>1O~#ћsޝ/װ;k3NR[Wk52Ǜ1}>u@^pY#G[|&K"y4[^KAuz%6v=:! [tvG`7)DR&e/זM{4߼נP pLʄ!J,<9wRh<>62gr@ʄb πdg QF:l2(ܹr`%ʟZO =v׺ <C-jALء-Hjy~xV]lY=gCc!FJr0j8 qzd>+,L9 5У`\~'' +{4٧!ἮWt|-y.7 aQ鋲05KߠU ! )*-6SOLUe?[g,; / qz%q:7_culmnRW5kQ꡽ng G>ۣr溴Ew@Ѳ>y.<[sN[R^!]F}_ކO5E;ޑ4ex7 /t9v*%3T kXyHyR9Mgԁ6,y졣gC{̄v8!=' @Ѱ p oP%;n;:n|]<8PS,K8R{ehsú3[w\|?[c,;vڃg.u$sN[gCZyZB5[gUɰS8SOwT{u puݺ X<ʒGfnxCmکEsW{rP\/`i6f$ ?j |g2p>\2Hs^Iemi-8zYWx]6hʂ}Ww~[=<,Կn)>yF\B<)XWwRӾMK35 k-ѶўA3ҳG,k6Mؤjv;]ĤpIU Qvm̨`w;AOg;:@+[^>˭d/en塇J٤Y1^[AJQ*j, ,ё)DDjtmӾYoׅ,u8ȸaf*optI_y vVԺˈ_y_*#:=f.1lđ 4lRMsݣ1:π"|~82[:d:.(A.HϮ9VSX_9{ tJ:gS^\(hw4Z=\8Mvttz>իV;OlWDԿv̔#Qk!e)ʗ#2 8bLK5S#@l 8rEu$ lZuY G'fo}!b{.׎G'&0} d/QIm( D\S#:)M50Njp_^" מq -4Ըj3Z"/#/3ru5/1,5sgh|E7uo[71}傏vlZ2i֒IF @IٓߍpvK'ZRl záUs@;gc|Fi 3:c/-,^vx\x` =!m=˲R/}̗`LCA3-A~ODD4JQjϬ*(ȵwTuDsz"(X,f0hfզss@t`AAIAQAD"H,V,4Pq8\.i4ZAz=!2 57qD"dxXER) =JBL&YTTTbD" Ċ ?) FT*2 <ġ$H*q'45JJe=(@䟪ȫCIqtgCIT'! 2$ ?DugC5a3X"IENDB`Subsurface-4.0.2/Documentation/images/CylinderDataEntry1.jpg000066400000000000000000000151301226345450700240550ustar00rootroot00000000000000JFIFHHC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQY.  +JDi|O=#gUOd?OcXledmtu?E :@26dm#h@26dm4UPyk=R_Da:Hk9Zيw4^8ly)@ʑeYfc@+sTKK)aFe"Υ^bs%U$s[ 8'gR]FSP LeL Lev|}@ jE,ՑPB;"@942$T" L -|S} QjtpTxYY<ÓS޲*E@*P8TK HE@H HE@(gZM3?* 1"0!2A3P#@`Q8˥'J"L0[uG9)&)LJ_Kl{VJ*FL6cZD#BjK&<>LzԩRJ*TRM*TR*TRM}TRJ4TRJ*TRM*TR4hѣF_GC$̏בۗ4r1%X<*O3RHnqK#HGӆⱫ.CƛJJz%'UTRJZU*TRJ*T%RJ*T}J*TRVJ*TRJ*EmTRJthѣF90Ƚy.UE=s_tdeQ2'y(_*<HTcݏv?~׮|y1^<o0 e{ϾxGcLx䙓8O,#RœQ+> ~;c'>?wcoH4#H4#H4#H4#H4#H4#H4#H4#H4#H4#H4#H4#H4#H4#H45 A1@`PQap?ѧv"G^ ]ESzt/"A !01`@Pap?2"F>P4hwQӸ􊜙V*1I01!2A "Qaq0PBR#3@`b?Sv?~ݥlI}N<;;HɯAboLCfo ~K{/Wd~k~=ݺLӋяTaAz[/m:Tz}_fL_hL-el[-el[-el[-el[-el[-el[-el[-eYeYe?c#Ôs~.2In܈q1&/um0Sfpv}p:q QEgEU>} u :5ڧʼ,UP9נP~9?4.H,x@0HPYq''\TMH^O!   T:\lz^"P ^aP^$' AQu@Q4L7 U{i&"Zˍ),U(8<9o|eG@2 5`GQ8G+s ej.Z0H,8-I `k0~ X.  u3W7cDnR4SѠ!^AUJ 7 nac!jzXD5ը\ˆY* gRnTR"}Rj"a#!b +!Q Hvq( |G|G|C0\iii s|G|G|G3iiii@vH4H4H4H4a> #> #> #h4H4H4Hf> #> #> $ĉ$H"p> ;3h wYrht9'D-Ƽ, `"!: R9&J*!}%HI,~~w|Gۤ?:~Ѧh6|Y2J,D?Rº*YJ^9*Cq'|wϞqU1- jX ߀lcD< $qFBǸ% (oK.a2Si , v|T@^('DGx B bBh5Rh5:/ 1;_ Nv𝯄`M@yNv𝯄|'kP=^S𝯄|'k;_ FW|'k;_ Nv𝯄U0}𝯄|'k;_ Nvu;_ Nv𝯄d]DyNv𝯄|'kQ=^S𝯄|'k;_ AN8p?#}˗.\Xy?ditraVV+TSΝ-6C ۩ˋ'.7h` BǦ+U. M2"cG_HHMx6E)=5uP)Ju =xV'nUN%D\wPAQ1Ke)yюJFZEEf\ WBh4#q5z#&Tj 짼U k,FKrk qZ l)2* I_xTE,^}u /7,@*}Cǥ٬0"#%ŗ˖y i]Q~FCbX%Yc?Q 2<~#өpRPQv.a>,&*.1!Ujl;_ 3-2i96)*}VkDfOpr˃.GN\9pr˃# n9pr˃.ON\9pr?˃.\9?#89pr˃+Um3g3BHJNON/;V\UL[FMNKC $$K2+2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKT. xҹZrsRқJ>f}X@V4Hj*XTpRc:ԃ3P jJbK,TIc8hA57ԁΤt,Ud]줴;YQs2YIs0\Kև\AV,so-@ I@6ir+Z+jbP Ũ/@jDe3@@ BAr@#P24$ @̬rWIn8,헊="jS7yͮ\ǓHڹu.HdjF3@k;9E*SeyǪ3.HdjF3@Ƶ V)#: @A A $$̤o@*! 201A3CP"#BT3ϵ|Fc#F5"g#i;Q͏Zjn BYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeYeK&HFdz^ϝvoM{_}ylr܍k\ۧ#r4EE*EE>}IQ;ұʰkOzFF*)Ƽ<^${U"wQ]Z2dWEzVjfGBỦ>I[tn/ɓ&Lu)rKej+̙2dɒdɓ&LY2dɓ&L&LVdɓ&K[ɓ&L((6b 算TBu۱]OwG#J܋OǶOui'_mKǻ5_mw/+G9Lj*J~BZ?sڥ˺]x|~=x/o?&B޳Q\:fԉtQw=ǹ~s}%((V"GqG54͢(iEQEm((6EQF((iEQEׯgv%A `12Q0PaBp?% ~kLx=F(bRX7e$ԇrd^Ǐ<\]o%A 1`!Qa02@Pp?2m߀E7.ȿx"_ŋdMG?9 pmX<&hEڰ/SӴpv4iN}01A!2q "Q0a@BPbR#?>h~#0 J'Prt5Oo?wJ8tZ\ q9uiФEJvҞ'2$_q(mM- y+N|||||||||||||||||||||||||||||||||2~;?q9#~=2+qOd{\;>$M#bn[sw#ǣ&?}4n8 i)9ާ *%:Bn=Ԩ$S^)NsثOi i7jS7S94tމv$C)镾H{ "t.'KEjvD;DRKRs'ODG)VHe9ܥ)c888tpppqŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜYŜXM#~[Jм~}sݥf'5/s[+/!Ҧ:;- b()OI^%ɣxSIi\a({:~r2;~ߎ5 OtbrA|Im=ڏo d=w'No'OMIzSD8tt-19z^ՕeYVUf(r'(r'(r%YVtoNT/T*ʲ.UeYVUeYr*ʲ*ʲYVUeYr*ʲ.UeYVUD^O*!1qAQ a0@P?!PfbՌbITeNUR '5)( mA\ST]QJywQ$[ Fe@\fKNWkH%֢R$ɖ" ad2ӂPA%=U,eg_c C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C B=#PmB='i9BZ?wƟRre{}3<3m00O$H A A$H$I$I$I$9$_ԐH)xI$ $I$I$I$ $ADI$I$I$I$II$I';m $IĒI$HI$I$I$I$I$I$,!1AQaq 0@P`p?%FhEЉdfB% '}$I "0+!1AQ aPq0@`p?BUQcvFБ20 ϢR .ծ:(/LgoqFXdسJdwgd \@_}\0VPt$]P)2UE&GS7dfWETv$Y80~!BxFy23;'r Stg7Q/fHhЮu(,8=w2GFF^.ĂNH8 Щ$9'5#g!&(w-!yCoڠ”Sp?brsmΩ:ꀂ(!1AQaq 0P?' @Xth1jIV@Ƃy!ΘH3B9s  =QH%<:llׁ5 f_"8388EhycAP1rJ6(PYR8hf@*r #3`SZoγ8 .n:Jn:Jn:Jn:Jn:Jn:Jy6i))))))))kttttttɳ㤦㤦㤦㤦㤦㤦HZ.㤦㤦㤦㤦HZY6pttttttCf````` a`ua.\r˗P' 3.\ْ\Z˗/gE@b]90,x.f.c-Lf/ 0-]&4[W_D,⩪Ƶs?KY y6If\Rrᷬ#pj\_%V/(IWP땋]hˎǡx" ok* 1,*qsyIu`{:tr*b_Iv˫/'&g_E-n?p V"炍~&u.|-"qWM2SEz[p+0ϦzVbΚrBXUQ WBڲ?i"5׋*~*n/'5+ϰ0B/YNt _EyJP޺zCL?ٟv '30,D)1CVU+雷ی ¢sĒ Bnn+_>$PhZPiKBQPQY1×k 1cc='<|}W.y9sJрwOXz}'<|}{ Oy>O3}r^Oy>O^[Ǜy>Oy>!߾y>Oy>'/y>Oy>J)=|Cz3>g8!ze%z .X-_|B0 }ud( f)3 Ul_GGѪ"S0هxqr5OO|j{O|߯?~Xx  })CkK]c`^(nl|T<ȓ2}"*-)PE͇R7هӋ+Zd[mc$!uCU (E- Q;$ W9egZ DqU:~O|j{O|߯?UQa~ֆk5:qUp4y9h(G1fvMKuL7X1)N}π~ Ow_qU ]E"ugvA1MDmؿە 2q+cc8'Cdo Dy CT`Sd*F%bX!"lKı,BE!ؖ%bXB5,Kı,Kȫı,Kı,Kؖ%bX%Kı,K%bX%;.77蝧Ĵq@M=PD]蝮ĆjXB8ncVn5߉'?$Ă J"Uh{E0cQHݣzw=W˗.\=rˇ.\p[˗.\E˗.\r.\r˗.\: !A p0`!1BQ?!yQFul9ӌȻcc+ t{#A 01Qap!BP`?r q陊G(Z0;V/imSg3>BI8kSm31!A"Q a02q@P`bBS?MR: COJ"貔h/RN5oRrzs?G|tuՉ=ߓ6|eMoDqY˭)jFŔ^}By9 ix//fة߿9>ʔeUɏuNg^I藋fd%r%McܝLr3߬1?&f^Eeus]w5s]w5s]w5s]w5s]w5s]w5s]w5s]w5s]w5qs]w5s]w5s]w5qs]w5s]wu=zJqAO^1GNLb3 *]|}GjOk]7"eĎmdC%N+`å ojq=_Lt\ڧ'#U(h]G~/UTz)RztWubŊbe ?ۢM^ N>Z051b_'qUv8kd{J cj:xꜣ%wJӹt]Et\YEt]Eřt]Et\YEt]Et\..yEt]E..]Et]C]i2h?jzEEt]FUxMWbu3d׵k<{a;z bNsSQ8 TM,&jUMv孆,%_bVzRL 6W9xJ%=S8UKxL6W9xWQR7]T݆?{zTR/WTJ_u0ȯȾ>z.|ɘ>OLbL~n'3+>k3he,%7% Qv Q0UtTL0@MpǡDb|}DC"ISR KC0eQ BXcܳQHbIwQ&,&؟}}.DYe"z=] I5n맥Lh{g VE_ˢ^b-.)9k%ip[_z-t18.PulF$+Ia 5PƢ Ww=YϨE׽Sk (H;ɛFp,@0T=RMH |/@YF'99ҋw85'99F[ '99Nr4N g99Nrs0Prs'99@'99NrH'99Nrs2D99Nrs ˷0[!sS/_9K./EH!R,z_?& 20*fAc=h._ˢ<$0@;"e H Pk#HDKuCA(`|,ݯKtGueS ͅ.c:[ %ր }@big>+/XD>n01vQUvCEGQ6TF%*i M'iZ⾧=/0d`L:>!!CxNȱp}PO3zIfCTTLhJ3OKt@zD?PH*TM %,a3IҌҠ]V s 2].P*hOt& "KA-2L TBiyNsО n(QqFI~qF7"H?7n(QAD QqF7QqF7n(*7n(QqF∰ "ŵk-B8GQqF q f ? 6mmmmmmmma mmmmmmmbImmmmmmmm}$i$I$I$I$I$I$I'mۉ$I:I@be$dL`*Y&mmIm0i7S! m6mI$I$I$I$I$I$I$( F $B$@{#   H@)O $*$H #,!A 1Qaq`p0@P?h?Q$p(̍{P :.]}Lt~fY\*JWӠoM.-9Kg'Y/n^Lr&מ t~i :NRYFU甃ϧI̧?:(nm7e.])+)w:># k 0 btphkGg*y`98m =מ |Ouw{.{~ *$0 V` GV-TCE׼tRWᆣ ~ɇ"F߸%@Ff._x}bx ]]mo>Mu׷! Wc@׹u4|_w )e,:a5qQbuqCRj\5=+! 1AQaq@Pp`?%EG PH`&&1b`zLˣm~C⠢'*O UB/q`G!"C FLxvU^peBb9v>w(q`< Ǭtg T'/ЄH>yXl ֞ \|˽CaI l O=ϸ)i\f ѫֳmtVȫʖՂTTf0T&UX#+ H+KWȫQ< X(˂& os\~b 55߬LqN:\Bd su)=>^C7K<_'yI5"BGxИB*A}hN|k-^ *:a=;%`9y!|_<7ӎÞK*:(\TPY).AKJ8(?*!1aAQq 0P`?KuVp#\xhz1/ r*+[?8%D2 $k;n$F:+ h2Fyc''K^&H.\r p RRF.g6GJ+eTٶqQ؁uh~e ]%ʁAirЊR~eˋԻr(rlx_lrd:J4l^W&!yh>R5GN7\3A7 [Uuuuhv+Q f[]YlY(Ti˧pDf 8Zh`ܢ4cyؐIzf)Us2 /(QU#Tqzp[ٙᐲ&Mr Nj[m%W< p/$K)P8RFrCj~84 \_D 2qˌ7.˼AOt<7.˼72SO,.˼7. GS3˼7.˼7ÉZٿow]yow]x7.˼7.ow]yow]H!7.˼7̀>sblM6&؛GLXijEmmF )\Jtҧ@w.bY* /O!TEoR7!XBH5#VcyUU2`]Jt7+%tsi܈`LKrkY" 0PYcMCZR/ \NW:5T6Ȓ Jk@kY:9ř2:ǕUS&,@Mh z!X17`RѶStrxFNbfLN4LbbBfn-3S$Yzms-zjitk¯4dcSV`Vx82VkxShn6´^7T:5,O0&4,w>\.w(Ʀc('MOԧMR7:/zQ /H`Om',-4{o9di& M.NYw.9+σgs H_䵚c (2/Sp!\Sa@+'G" 8IѢr}:龙32~MeXZ(T2+W*өN_@9Zl1笶\Q)Vi68Y3C"g/2B"6`KkQv3b8 SjM\PdVUC9M/ҥ) -8􊾄0JBw6wʟ҂הLK6yJp3ш6/B 9aIFa[ (B[\!*OVnUh8}J +[*/ԧMN,Gp2_,XaxxrplzUm#4ke\3N{Gn/_IB.8u)A?|NdSubsurface-4.0.2/Documentation/images/DiveProfile1.jpg000066400000000000000000000333111226345450700227010ustar00rootroot00000000000000JFIFHHC     "" $(4,$&1'-=-157:::#+?D?8C49:7C 7%%77777777777777777777777777777777777777777777777777z @BYܔ2ӝ I@ikε~$4{zBPf\=N-\5$}P 7q:,^:u0 V$9\uXMtbd I@j(A}{f=[Ԓ Q.z:s\cPoRJ'{u#/wz7K(z%NY__2=[ԒTzoFo*t9`V$xw@: s(CսI(]z^?m5x|}LBP=[Ԓ0`?9߻fe@PoRJ'|~ CսI( OK9;<=Y((z%ΒP`8+ݓ* ;ϦP I@dy`=[ԒɄ( I@e0V$CCCռ8Li豄( I@.L!@PoRJ&(z%P=[ԒɄ( I@dV$2a zP0CսI(瀠(z%sKzKJ&*LZP6-WrɄ( @dQ3&I+W=4Mn˓Pz뚂gb V 3X)a@\)5t%F{cOFss% geԔ5&#u3*kmRδvR*Jk7{=68sϢu1Р#'y{81f[@hy-uk6DIDlQ4k>~v5]6iyet{MQuԒN=gk|yZΡ,@;[.y%fvSJWd\Ω^馹ў'DnZFX0s]ۮ˲Y(=[̙˄):]TTO+14P !02"3@$ACa[a[avamamamamamamamamamamamamamamamamamamamamamamamamamamamab|o[|n+v8uխYR~,o[*V_5-b?OTe&ӕ?7-]g?7>Lo[ꏧJ5[J346IPV]BLo[$OW|wRmKck/1ao/,aҭjqp*Rao/rJSC($6D_>7-oHfsqaogC|Ȓ4Ehivhivhivhivh7˧hivhivhivhivRL_c|J 6tX0qao|ֲ*6n81> B +1ao|߽{ ~7-o[0[ƇyKWq SdL%1Ŗ'-K[$qNd***** UlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlUlbUP_0- ȃM҃I4Q (--$r7 Ku9m9 fD3#5-3L(ėW7,ՙ1qJRL9N21 pMKؗRFlJ9,?J@H(rPY[)4R(eu402G)4rPA(48EDaMQ42#e'11110sŞ97QP!012@Aq" 3`a#BCp?D#VwUOM lno5pn]Lmz- lF=zD ɟUپ[2I͆C#Ya? -y7oAQ?~x/$ .͔ݏ?O.2uQ7?\^jVÇ8pÇ8pÇ8pÇ8p-*Jī*Jī*Jī*Jī*J˰YbUؕv%]WbUؕv%]WbUؕv%]WbUؕv*’iQ1' I9oڸ0R[翞{JB,"B,"B,#]P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P>"4I Effai2t817 FQNܝEג@G3a\'7.I$ˈI17 Re>m3||}##JHH]xC)/ؾ!-"' mJu&]Fn JOcpf$qH 工jAGD@hߘ:{lG=+P !012@AQ"Baq?s{as!y=0;!B!B!B!B!B!CG~{{[軨{_ zCXf#y/ۆ{~ _N/7xxng9?xk[bS'غ|=vOCsB!B!B!B! 7!߄ ]s>u?#s~7NofbJ)ꠔ]a_DzBmCh9zLlӉ8]D'4q?jc>XZ=&7Qn:&z?T=_؂S*72A!Pq "130Qa@rRBb#?<QPJBu(N ԙ :'RPJBu(N ԡ:'RPJBu(N ԡ:'RPJBu(N ԡ:'RPJBu(N ԡ:'RPJBu(N ԡ:'RPJBu(N ԡ:'RPJBu(Ncgp{<`!yB9l1sccՋO r;Vd~g?ykN~g`G=3He\cOmkdL 6xzdn4&,2سp `v`"? wsmaMx9ώ|s?f>9ώ|s>9ώ|s>9ώ|s>9ώ|s>9ώ|s>9ώ|s>9ώ|siGEqu~wn]_VW& h00\|vL)JR)JR)JR)JR)JR)Q1y'sžmjn];2%`?YJR)JR)JR)JR)JR)JRS/vfEԘ)JR)JR)JR)JR)JR)g7D63y~NYu,>@I:G_ aśRU)JR)JR)JR)JR)K2ˌS*Srԡ[L"_Z^NYu)JR)JR)JR)JR)E*;/>qՃ3-KF%F~}\u¼d)JR)JR)JR)JR)Jd9ً7Z.0LjeԴ)JR)JR)JR)JR(+9;1fE %E)JR)JR)JR)JR)JRe9;1fEЂӅ;*ЃDf|~S)JR)JR)JR)JR/53P2x_aMUrśDd(\q+<TR)JR)JR)JR)JRw}݅i(;,O4mxY;1fE_)JR)JR)JR)JR)O%vb֋ȑ$,3'Rk'noUV'f,h 'm`L^8S8S8S8S8S8S8S$feJ6˷Y;1fE"dn\5+XgY;1fE2vb֋ϼdśFhSOCn]^}'f,h RJMp}eqNYt('aRAI}=7Z.>雭WxSun]^};0N!''08!B!B!B!B!B!B!@dx-=r̓Θj(pBiiWϼ" v-^d+Eئxd$I%I5&ԚRjMI5&ԚRjMI5&ԚRjMI5&ԚRjMI5&ԚRjMI5&ԚRjMIZݿu \ TB?;"Kdk=$EӚ mSYpd7im.FFW5 め.Vf\cq?e^z?tr͸4Fo(K\:2b֋njN Dy|/+{ZXb64B;H&MQ;1fEG_`ȪRV⤧ufWJK0R rxkj XvBИPa\6e;2 xd!1lh>c]L( b]\cDg'K_:|^K8be]rb1dtp;|?tlP徿"r`rCE@U=G$Շw!&f.Ia>qU!=r=&`+ &,V㘒o<"6%ĺa,/)qJ*{, A&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'B.2o2ey-[̷o2ey-[̷Wy-[̷o2ey-[̷o2b|2q[@dBf?$3/G!@ؠLq'Kڷp, |;r(ގr9A+ӯX *fffff$:)))))))))))))))))))))))))))))))))))))))))))))))))))))),X$8>R.Is{# ͆|7.(X1}H_2(>a]bsH7t7W b*Pq`@H6(ڿG #h%lA~ !ɼ (M_A@L:]fd(l:4򟀍]?ګpC9?_EpK!`[F n=0nOrf:)yx:j&@X XUp]0wzo@.:ZBڠaAho#&C lEN7@ŁZɓcӀjQ]2nf]sԞ a {`ܣaCw8*1!a 0APq@Q?n)G0)JR)JR)JR)JR)JR)JR)JRqf\Yk`eĚ{ޫ Eˁ.}5!B!B!B!B!B!jd!B!B!B!B!B1)ˋ'k{ ѐ!B!B!B!B!l~כFjB!B!B!B!BSQ=$oNOVKu>n\HƼ#Є!B!B!B!B! {>!B!B!B!BEiq$boٞ02m_%Qt`ߩS~N#_L1 䵟'&(Fh|dr_3\0uStIre @\#dE=Wȩ$zZ?!~d} ME^^ 6$D'SEDiD4iR*ϸę"!t =D:`=Uh׶ h4ޥcQ_eXJdU m bX(!:}#5(^Kw ptl k5*!a1QqAP 0@?KH!o999Zk1s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]5s]3R dP# ʿiH *܉,e4QD|>c|3>g|Ϙ1>c|3>g|Ϙ1>c|3>g|Ϙ1>c|3>g|Ϙ1>c|3>g|Ϙ1>c|ˆ)(O*ٯ_@ qqqqqqqqqq,*p~ P`*6BU,@T5MST5MST5MST5MST5MST5MST5MST5MST5MSTCk%JtpA8b+1 `4 F"b@95T2GPbŋ,Xbŋ,Xbŋ,Xbŋ,Xbŋ0N6,FlΥ2,دA(*T TՉD֘łDTT/ P0_9vPqO0+(t2+ TTag&lS2 dP,X-Wɡ@%:{} W H/(9%CJZEȠ \(6W^#1.II`5* P< :xJ*9o!7 @??w-GNHf|ĤD4~a@&s4b 4AH>@?>` 4Cr#P Θ8888888888@OAG0j` O(u,BP#^4OZֵkZֵёn(ЛC=:bLd00ֵkZֵhRA/!Aj :?@HF"dWYRPFMI I3zv 4A~ PD8@2 2 Uc@bB1 tHTf6j % $Pz2.Wh~C_t0C o߈0C o߈0C o߈0H $A3)QBI| V0؄D"I (Vpd0܀8C ouh~7I 4Awo: 'V=Zzhm008?էOV=ZziէOV=ZziէOV=ZziէOV=ZziէOV=ZziէOV=ZziէOV=Zzp'ŀPe k'3@o+Aq,cr~A",@?VhYb?$AH+$(b l `$"P5xo({ţ f>{{;!*CrB Ȏ-MS?5 ^@"DD34NMLLN 6$- #4GAio K|-()N!io K|--Z[ഷio K|--Z[ഷio K|--Z[ഷio K|--Z[ഷio K|--Z[ഷio K|--Z[ഷio K|-z T48ASubsurface-4.0.2/Documentation/images/DiveProfile2.jpg000066400000000000000000000350621226345450700227070ustar00rootroot00000000000000JFIFHHC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222|  7y5xQ#笍r*n#\c>z Fkoq%9`M3< TWfTK18][2 @EZFd5TUnL#\EZFd5TUnL#\EZFd5TUnL#\EZFMe3=dkH={35TUnL#\EZFd5TUnL#\EZFd5TUnL#\EZFd5TUn&i{EZF8N;0u TUnTLMH[o>ii+s:_u r-wZ2QViQ]9NA:@GYrty>*j7+˚Q˿./|Y#笍rQnf6=5N$9-#sW=);؟׭b6q4VwثHE9T.zǛ]rר8\uH׾dJV+ 3P@A01!"24#D11Q* Db TA1Q* Db TA1Q* Db TA1Q* Db TA1Q* Db TA1Q#b TA1Q* Db TA1Q* DbFn;Ż[eŻ[eŻ[eŻH$"M /RWB#mjM ܔUt0VslS} O?fټso;?fټqDŠdv8QD &fټso;?fټso;Q rf8IFL#R#>[ ~ ܕǭmIN7GQ 6XvFcLd|2 ЗzvUuC;BY#7Zۆ ؕ8ۘ5yبeg66,P 0@!12A"Qa3B`?$I$I$I$I$I$I$I$I$I$I$I$I$I$I$Iofk{4;[١"s         h D/md<ϵzydyCGk#>LǮvN'uѯU]=ld]u䬞hy=<=wا%a*١pUӦCb !p}؛VCa}{4=zP=>Ix'Z=<(V u#RGB \Jcccccccccccccccccq n!YYYYYYYYYYYYX'Ă    J6?!hvCoflf,fk{4;[١hvCIfut{SBSr$:"'${{/I}r~gTcb9$L6I6*'%$Hyd-]1ͭ'*8123 !@PQaqr"0AB#b?seٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfCffV]YveeٕfV]YveeٕfV]YveeٕfV]YveeٕfV]QUc5oxbulcc61رmXU$:>۔u Wj'<?;uщUipXR:;u}l:m]̐ 288w#=X[^ܣDbF~Ɏ1awNܔ\|DV7/hQҴCq%k`?c6<:tg܀aiB9ccOmvuOc^<:`U]vu&w aPcCzxR1"sUzcpюqM B5n"5*XtF H8;(6+Z)p2Zz8 \,>wx6<>yJkx&Fp$ЍZ6<4KC\&#%88r>4"nk<6<T.JP# eAԇK9Ow0E;2k]z'6&~>"o i •Lm\>Z 2h|rEu lo̯)3+L2̯)3+L2̯)3+L2̯)3+L2̡cO笁}jJVUl><`M=Մ "[{pM^jłulx,w[{ǂulx,w[{ǂulx,w[{ǂ@s` "*{;s7lx,t\io){9oxXoxXoxXoxX >1빛6<: EA + dgN]oM^YՌ=6A`G?)t'a A֛ c4k&W-jPɐQGF,| Jo}^* |EHH[=҂<ֵ;E& 0X,|JR)JR)JR)JR)JR|:e)J)s}}e}]:<|/O\\y?_WzWCE)JR)JR)JR)JR)OPr-q|yqwcJR)JR)JR)JR)JQ*HV^+sj%[mѕt5*Cj5<CR״Is>/d3Gr)$~.?w_Wyf04_.û+,(oR)JR)JR)JR)JR "btǽ_Ҕ)JR)JR)JR)JRTZS_WsiG~tG=ŘzgEO󒔥)JR)JR)JR)JR3!}߄_WqTs#v$chepudhG4)JR)JR)JR)JRL?>_2ه2)JR)JR)JR)JRc91l\Wvu%aJ!\%!U47rHZT2)JR)JR)JR)JRL:Awn %)JR)JR)JR)JR!?eq+,ݞ)WY(U_ ٗ dF82U3&DY5)JR)JR)JR)JRGv}<5q##i0lރ s[-)/סg]*2ʨqҾ"""""""""""""""J1Ŀ ^帄J(3OWTM{9'h9?iH'Zoi{Vo@[h$D "]^uULMWeo⣀5]|7q+,K y._2~| 7q+,q+b#Ɍ0,y< S\n>e}]ƭ8wCRJ/o%WY/ۏ_Wyf\n>e}]rAwo%WY/ۏ_Wyf\n>e}]ehVhVhVhVhVhGZZZZZZVhVhVhVhVhVh,Э Э Э Э Э# ;Xظ:aJYt/5^awI>f#I~ķҰD 9sOFGsBRHk1񭷷X>*f2c9pյ:(͆* ghU.aoq7s~Lɴ1pMM l_te}^VWaK˩QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQI $I$I$I$I$I$I$I$_$I$I$I$I$I'I$I$$I$I$I$I$IFڒI$I$I$I(m6mmrY$I$I/BI$I$I$I$O$$I$I$I$I%I$I$y$I$I$I$I$IF- H,g>WD"VP/dkocy'\ȧN=a":pF3&R_o@ o$I0@/ x6@Fhv셲zomxx"o z-A`E] ҎaLb^@PkI3:5J#KNzpb&#@Hm+K{ 6A܀|:H񖩱h:NN8s? rB(>Oy5Uq"!f^9Jnj&y@\'UD", OcdG- `'7r7Ip!b8Myax{FGvNIp' p' p' p' Fa:#)g@[L,r,"r'H"rU0d;GʙS;*geL쩝3vTʙS;*geL쩝3vD숭RS;*geL쩝3vTʙS;*geL쩝$9L}A7@xȪuPn A7UTuPn A7UTuP'7 UZCy00@3\?D8GHI~#܁Ԩ H "105GHI~#$q$?D7/ּ32K{}vZQt&>9 6orj 8l$M\Ǜbur aziAqqv&?[> H & NsFptBb  eίD$=WBpvTIVtAŬ{D0~{lI _y_WG2[CiYI6|QBS ",ڀ$?Jl>"xD2clq`{|㍀9@*7+1! aq0@APQ`?n9`W2W^/Kx< /lf{v]Wz ޣ--=]DDDeK̶Gm,Ր!B!B!B!BM-2%m,_hcS~fjU[K!B!B!B!Bv>^]Tݯ+ =Z_)/c&x[K7O{mG62ح75~4&ӛ/ We3, Y Ə"1_bSO@} y?i`!B!B!B!BWSiXz~__V]Y*=nl;<!B!B!B!B oam,v>L!B!B!B!Bz{.f+2Xi!B!B!B!A>txF[K=$p!B!B!B!BW5`M<ӱek&ʊy/D0!B!BKD`t=N1 9]s7fuޮ3zoW\뙽]s7fuޮ3zoW\Wl5翸kfuޮ3zoW\뙽]s7fuޮ3zSFMCCzǙqgqgqgqga#p_Ktx<׮鶽~5ɺ5^ Ǣ#-ExF[K=m,z.+2X\Wez.+2wz]_BǢ#-ExF[K=m,z.+2X\We踯i-B!B!B!B!BkB!BlSb&/YYow|t]Yl5DKJꊤ_=9=ܫN>N-7wzp7uǹ<. VWw ߻,u)Px˱.bUm`$~we)wetN;=*:ֽ38a0߂4pGc.#"֏M]c- {.EjN?q,tYlE+E iHغ~;ȱ/*!1AQaq P0@? q=';sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sg;sa5YYYYYYYYY>~cf12rcL21Ƽe*ZPX#>(⏊>(⏊>(⏊>(⏊>(⏊>(⏊>(⏊>(⏊>(U<\|QG|RY36A`z~`$ S!c} ;}5{ 7@Sezy/ (__ 3h H,@t1qqqqqqqq> r YL 8 k9}HJPMS !A )Aw ,$~e1vZ&~`i0R4ZR7MÀ|-$ 90DR"!e2 6최>Q:G-F#b1F#b1F#b1F#b1G2 dYő @""0FrpC$,V6RoBݖO188888888?T.ߏZcWaD̔~i:TSuN:TSuN:TSuN:TSuN:}dn7|= { Hb>f ZcCP,U"ٰ3|%'g@,fHIc%;:s tL YSJ,KPe`$ovE$![еF`B-L=u/Sk9}] xZP؀$NK84%D).Yc>qSPqqqqqqqqܚlB@ 6BK|"H4Ԉeb최> D|e1vAʷ  UjXgs+{88888888oƒ_Բ3k9}]VqqqqqqqqP`~F{-g57 x`80m"~>!AU`ϰ!?J1bfX 47@Uk5]>QX SWȤF!Ji艀X/T,B7Hݴwv4P*JkȱV'/r_y9}/r_yg!CJ (Lhf 9}/r_y9}/$UцЅaIe`RX_4TQ^K f $UUu7|_/|_/vúk+m2)ec pJ!ZH{ \EE>9ʅDjUbdW[ imJ ֵy E`+* mnQTsxgsxgsxgsxgsxgs/xgs "7DX=Yc>"T D;H Z5dna ZcM{-g1{-g1{-g1{-g1{-g1{-g1PeK ɚɚ 'IZc!t@. IԄb:65zP7 x 7|gVVebrߵ@Wk9} hBt(>QCg*D-m3dRÚc9Te0 BAa $݀ â t>o$)J"/֚TH}caWD0 VXV Ra Ge1d.Q@i XVO\[R!P gQt2C\|bx* $4<-$:B "\-7E(e]0HACK최?B VH#0b+&=a -9iJF`j@V9!D(9üwZEd[&HQ>[ڀT| 5Uye7*HcT& AC0%L`L}{F!8 3Yc#kO_!/08rB!B@:U`T,%E" @%iͥ GyRg[}9 bMzÀID,?$˜NZ-e>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; j#8Υƥ_#$}V3ZtŌ'@ vP̵mGל3](s8xGfZ%- ]K鵿>!#=0YG+E,vY02 ZΞth;q˾_>QX:HxY<߼󿬀+Ř~o7y'GK^1;h+ח672V#9Yb+-KX,;yz9+E>[}NYG϶ן96==7 yWkbrykar< 5d'o&02@ 3!1"#՛0_]>3ak~Eb&꡾4bR1f3X,UB  M"iHD&4M"iHD&umSWb*Ȥ2O>ҷTPnZJNü}8y,*5Vȫ]ݴog'.OQ[2֩H )O> zR?}?r+F3Ğl8_ 8cw63ZXl_"p qiޥ:cO?,rMmhD&6MmhD&6Mmhq /q111111111_Q/}(Cw5M^1!1@Aa 23"0BQRqb?g7Q{6]g72YH2MZз1}%nbJ$WE^z*TjA-xv*******]!o~! K,K+te,@DtM3wZ/ 15Y:~"uLu=~:#/!r,Q$Q^~̅-;bn6>Ac\v@ h u51d旔욄i#(1@A !20QqBa?ֺXJԻVd3C4>iaaT2:0 0 0 0 0ݏًtػԤ$}زe.K!%ub-ݵEqnR,} 2쏈%"Yq-n'J"n/.J>k)Vv&?61!2"0Aq @Qa#3B4RS?jq>`nm8KvP-sZ8k7#pW !aK1YVbv~k |Uw5WsPK+ᾫ3g,YԳ?fRK3g,YԳ?fR:c{ 'W+# y1Bo- EYUצ#n;"_đxyo]qqPpcqԡۻɾ|HGe3\w.曮3=MulAuЫ+Suc}\atG. qޤ fQ|k] Z;=SX *xmx IW#s|JppR$D cv#o y+1eU}՜| m->0ۦZF]䭯<7\VF1sր@2?Q[ ۔ZGm!\v%U%xNBU T*PBU T*PBU 'awPNc{F;hx>tZ>uf+0!;Z )!a1AQ@q 0?!cgEx7jμHȗFA:]ZCExDlb!Dzp' p' p' p{LB:B~9&1}Pe93}P`:#A_ iBFI%{P @HHІĘSc'!N)e:]벝vSuN)e:]벝vSuN)e:]& :xC } q}Ng"$H!`>s?sѱܓ$pw&xx|c$| P390&|omTE|$dPF!.B $6'@8(X82?% x.}DNun&NjjjjjjjjjjNeʖ(vAPTAPTAPTAPTAPT|зoߍ|D~5C~4"ɒ{#Q80Od ? I$ImommI$I$I&$CI$I7Am6 mٵ$mmͲI!MPmm#m{ mjI%dD|6olڒJf#۱A Z ;{ %GCC ^ΣF,$N>1d` >VA*@; )q<+n'{_IgD@ Â'&aMD?޷ #h;@C; t>64| Fb>k47&Y `,._=K)!10Aq @Qa?۳h+xhK7*rg)raQ* T5MST5D @ŋ,Xbŋ,Xs5!^{[XB;'S`P(C!.9`~4|#qo'=Fx#!YpNe`v@>l Gp^ׂT#e,C?wpM$>~aQ|kب, b>J8S bs0fvgr^Eϱ 0!Ezypx/{x^h@.Q+U7my,d$#b1F#b1F#bGӯ.opK?`~s}O"<)!1aAQq0@ ?r˗.?Kܗ.\pXs`#RNj`?F˗.\/r\r@˗.\rteSIjld8<[\,# 5rҧ2ٓQC>Tw{ܹr˗*exe̋L5Hj̩h t5 `f+XEWO.\p[\^˗.\yΞcDX8MH+V>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;w 0nlzq( S @j6`PJT=PcKn8 @dQߣ 5 VՁ( *nu{v`J& ޽9@,<]P0W15uP0qoɞMf ڰ%3Ow>|`+jks2@'[~XVՁ(tWs 5 zmPSt ڰ%Xt@P0`J& @dVՁ( ڰ%[V3X @SVՁ(D+mXɀP0`J& @dVՁ( ڰ%[]q($hpŮVI_&.!Ӿsq%&@0mk@$`J< Ri4$4#[S} N$[V5jxu;17e `Ӥ\ܮ:5a. %zq=Z7˖j+\4c+Mlߞ3},j, @j}gTR(I[ώá7ⶬ @k夜 D]~QK&B'm|{y\e LiNhd'm|$ҟqkDC4>k}SJ]MJ5P\A `;vpfnO>o{&m|.#"O7M'm|iۤ?N}Ϋ^ߣvm|vy䓷Olpїk}9_[/-^wO40($K%ĉbD"X,H$K%ĉbD"X)#ɡbe H$K%ĉbD"X,H$K%*8]O>k%Xvbmy^v}םqgmy^v} ˘qx8F.f}םqgmy^v}םqgrv~]w>Oy.]wSf0w 4>$H RJ_i}ˢ-?ArEH&D(LDLnL]|'mSD.ߡiLL\[D.ܘ:?f11)U/Qy# ź3A:80 qrem/i{1pgh')_B2X)z7ln7Q,aB!y @6:'fHbq.>us *ૂ "{ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *ૂ *g2!1Pa02@AQR"3q ?M90v~gDxQ#L cCTXyv KrVzjny<'~ 9(- Y襑=1#n>Gy >:a} كJO!豏GC!UT(<[p}?Z!e"+r#s֟T֏-yֳ!E漺+ =USHiAN2~.NpeiZh6V eiZh6V eiZh6V eiZh6V eiZh6V eiZh6V eiZh6V ei?z9$gծ~q07;* }¨x7;fuFQTowUFnWcF!ڪ Ј2 bLp"cL*cL*cVAM7 n3p$(<76USBG zKTF4WSEu4WSEu4WSEu4WSEu4WSEu4WSEu4WSEu4WSEt]M]M]M]M]M]M]M]?kkkk#||||'StO?Er]:MO~/r#dP >P|4ۻC`َ-Q7dF Ml &8 a '`XG䛻7r::w:TdbdY71!3P "0BQ2@Aaqr#Rb??WA]tMiWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tWA]tk*:⎳=|`~(3:O'cO'$u'{#E[S]Hɿ$uȑm8s# wV($-uGa=J f˴p&J-c#{:`Gv ~VHDR }- BFXah[#:>!.&9t;>lc;0j -CdYODAcHul䎹 OA0L8rq0Ƞ y#wϬ<&H==m#cb9 ;c(zXtHͩGý-Z<HHb2[>b_ :R )[c$kÚ-qu..ԸR\]Kqu..ԸR\]It~Ri\fEL+qu..ԸR\]Kqu..ԈڴsAF[ >$|K /tv0`1{$qDzG{$q 0JWkgrGRbIlVFc9#d=8H#d=0awW/j#\}N#\}r_>Gڤ,E1>vҒ6[hCiLEsXZ@MM>"1Tw$m)Av5uGYrN)t۱`,,nX\|~B6DALcsP@"`Y#݇+)y4 2hl/rXUmmKS(7gGwn}#1IĦ,L6YHUUUUU6UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUb*!1APQa 0q@?!L334&|gsz|w>Ggsz|Z^O|t5Vb2a)JR)JR)JR)JR)JR0jv'|/G?m g+p|KV:틹Iܛ1s~w>P)JR)JR)JR)JR)JI)GAߓ2; ְ?>rVcuINZ} Q;1cVF<3:Zޝυž.D՗TZՇcɲcTHt99OX;V&zw> rc'sz)JR)JR)JR)JR)J/ɟ; 9Cn*˞eT!ɩsVrC]D/*?ÆC'ܯ `6v>?\ڗЄy i\G 2U'j\~Rw>)JR)JR)JR)JR? IDY(`ԓ'szO&<.cر \t6-J )JR)JR)JR)JREcL/ ЮU3#TV' y h1ƃ h1ƃ h1ƃ h1ƃZ&lcե5_VmM8Ѡƃ h1ƃ h1ƃ h0lV*`; P5E_q[9#Wlb`MFI[w>υso[w>υVdWυso[w>[K K*Kꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨꎨ̜y.\rvٶù&%N \}Ʋbc1wUFYUq1ܯM_cFr!OۘMb\OrmLW}1̞|/1Omlm8'N07Hx3<ϑ]XNwԩ-G],JM<69-fđ4\l6=gH6UQVFc[b+:"W\KֈmL3υjZmNBDSC*Sj̇KjSȕh[D#·^onl?Tbʯ) 3I1 t7jH@UQow>JZ4$i!&i#IHF4$i#IHF4$i#IHF4$i#IHF4$i#IHF4$i#IHF4$i#IHF4] ݶmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmkI$I$I$I$I$Kmmm`mmoRI$I$I$I$I$mkZmmmmmܖm]mmmmom߮mm$I$I$I$I$mmm$I$I$I$I mmm[mmryI$I$I$I%Z:mmvkV$I$I$I$I mmk]mm]$I$I$I$I.mmA$I$I$I$Immmmmm$I$I$I$HNmmmնmmmnomm]DI$I$I$IkmmmfSI$I$#$I$[mmk]mmKmmmm]mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm6mmmmmmmvmmmmmmk]mmmmmm]mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmvmmmmmmmj-mmmmmmfI%nMmmTmkm^]ӭmm5m[mNmmmmmHhL=mmmmmv{;kOGmmmmmmmmmmmmmm+!1APQa0@q ?By}w5%s_=zݏzXhX|ٷ =j#R4c;e;޺G|]P*߻N1,t 5 ,UbgHT2j0[zt{K=66QXwt4o< 0HI6ض#G{Uv| wsRZ;90Pn8LgJ/fNRX{K `)5Ɠ@ - H[Lt Rl*4hLc ֣4J:휂c[d׾06;y!عè6' pPT8|*y{8`DDnaSAXcGEKM[LX{S sMe +(VPYBe +(VPYBSX re +(VPYBe *Q9FouǍj&/LR0e/_LՊfq0=2̫*ʿ3Y?2̫*ʿ2$KKZ86j[\9cxґ)eh_b޲P <0&I}[O qVKE4*_ 7uVsm^F <$gF>^1Yϵ6  ih RosNfIJFm[#G>0rvE,8Mm'GEXEP1DkԚR>#0ٻѩV7@(cDDb{_bЌ |Zmz|r[ӸWc*1! PQa0A@q?llYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYX[`k% [`k% ^B!B!B!B!B!B2J;u6\_kyinKLE)|yaգ{Є۩ͮKtz䭶7u~z2CUDKkJ\~m/ qŀm/ !B!B!B!B;m/帛ix4O 7#-!B!B!B!B '>"4~"~F[K z!B!B!B!B z"2بZTϥF[Oԭ\d9:SsNsu9Χ9:SsNsu8h'z9Χ9:SsNsu9Χ9:S4Jѭ:~7u{m-F[K|#-ioeEDO{|-E2[m-F[K|#-vܮ/nq{w+۹\^ĈB!B!B!B!B!B!Wq{w+۹\^Ws!e8?#IkK؏^1aNFO2D ˋamlYhڭ>S\oǫO\pM7o.Se|v2JA.%("jnuj:jFL.Xz*2NG.]U$ozkvHLaxQPӃV<$LdshWT'I8(C>x]52222222222222222222222222222222222222222222222222222221*!1Aaq QP0@?1{cy;h{cy;lw={cy;lw={cy;lw={cy;lw={cy;lw={cy;lw={cy;lw nt0zOJ19dCgw'D/ZHOjjjjjjjjjj! -A:x V }.D5h8888888888 Hl`<@>hO'yx )RnqqqqqqqqqrY7t jO/oGyxBt锃9y C0UWI(0+88888888@L$# NN$@Ni&?BRѱ6 (jiB/:O\DSR`Ԗ*jMHPAta%<@r33"/!R&7Xb@jED A(X$G @[<8`W,~z;Γ tPV:A@!p @QB`@v|qqqqqqqq$H%!oGyx u d Ihh':O1?ȷ<@O <%I:~5}5cІ2)oGyx6888888880?ÉU&䆇ϠjމĒ_:O1܁)bNMJ)̠!HI2#@Oы**T"" RK0q&F↶Jz&bſގo8NJH,̸2aU?N F5dp:@H$@B!B P7@Xsn50`2I-#!B HqMcxRIEO巣<@O F欆( &@!GXKK8I:|ŽI:|ŽI:|ŽI:|ŽI:|ŽI(<C%JȥB( 6w'k訑 FUX>bގ>bގ>bގ>bގ>bގ>bގ>bގmjRtxR `hBA!  JD BA! @BA! BAX! BA! ,i xbňpM( 034ԋ6j"I`8Z2-&q hq<xY.$R@ 5V+.@ $HרT&t:*y(PCo@yA ."F ~I}Q@$$4);z;Γ\ŌFjC W2y~ ̨!f+]/(!:X X.rHPWl?XBE0mT >pHBCTMh~8D(0##,хD35 -e.yn z;Γ*S*$XwHHbIgĈ(."Z·#XrH:u%DbI1hcX< Id(بu_8yPPA 2VRF=%I r; bJ> !\ 9BiF !@DQ#YGcphҮʻÌxg#‹wR> dT@ 1) ^2EH]G,M̱ztq\\=}`*Xyh͒3^*Id@\HAuYDI7 PX^1=9 +12 !3"0@PAB#4-+b$=W+S.=\5\NikWUn&ǡ5cc68lxzlyǛly 6RnifP7EG w;[Q5+aȦ3 FL`4 0iL`4?Q2$W$#h Vd\5whHR     N۝MBqq;)iۣ~JW5sOWf)M)X`|w8mFrG*TGӨi}^+ʈņ`勔Cgr b^ڪVӏ BH_.5䨎ZKf_U7$Cq!8Cq!8Cq!SZ :І4! hA.x+wAIAAAAA{{(n=J/| nx+wJZvߒ%-عr1SrrCxJ;VBOOp3[O!*TSb\9Mɯ~6B勱D:*ZvߓddddJdJdFFJdJdJdJdJdJd}>ȃ[#!N(RӷFJ\Kq.%ĸ\Kq.%ĸ\Kq.%ĸ\Kq.%ĸ\Kq.%DY.x+w]rNI9'$䜓rNI9'$䜓rNI9'$䜓rNI9'$䜓rNI9%:RӷF~ 3K>_y$I$I$I$I=_RI$I$I$I$J?*7Ĩ`         :\ VUv#Ujƺfnj#®)k>̛G"rSF#rETBNn+$#ܭr<}MEXA֚}-j*)[OJurOxSڶRa*Zvߓ7<}C6ͦm3iL(J)P% BP%:)iۣ~OiFAvi('{eۘnf;S~Hw<}"o>I$Fkc1Z>=͹fؒ8RӷFII +^ڔ$woVG5} "=)Cu5i+Mgq{Q2k|>*SZlz9\ӌ*%J֦kkEѿ"  :A&&&&"{<}EІ4! hA}I!HR RHQif$A Zvc8s78s78s78s78s78s78s78s78s78s787o7yo7yo7yo7yo7y%qO!B!B!B!B!B!B!B!B!B!B?-Q 1A!2@P`0p"Ra?{$ }$׻Ȼt>y/KWG<x%qTLn(2(2(2(2(2(2xfdjMRɪFTjMRɪY5K&d,TjMRɪY5K&d,TO K(!*ES="0x4߁>; :$h}_SC&Ez8UV X*U`UV X*U`UV X*U`n^zE^zCuu^~Wm fݛvmٷfݛvmٷfݛvmٷfݛvmٷfݛvmٷfݛvmٷfݛvmٷfݛvmٷfݛvmٷfݓup=W$~8J22]Kv.%d a2]Kv.%d a2\kҕ5Za2]Kv.%d a2]Kv.%d aMQ~P㩞y<(PB ~/%Dz(P򒪠(]>'Ē/H"/H"*QA!1 @P`02apq?* W{9/y84p~oz^:y"9b/tRȏI$I$I$I$I$IQj-D"B-EZQj-EZQj)7K$I,Q98?(~MVs)?#kpڂ!ǧ4Cd=Cd=Cd=Cd=Cd=Cd=@4hƌhƌhƌhJ?9.ApsoWMjwEyPD"R~sS5n{UʴYV*eZ,EhUʴYV*eZ,EhUȬ*eZ,F:cF:cF:u1cQF:u 9/pp?9F??s[SO^rI)_9t_WD?=hyЙю1cO512!3Aq "Q@a0BPR#br?Їj$7 3^l7,|+Xs_<(8XNYH<ɸԚejOשtZũ|ZE'ZEtZEj]R.R.R3qj]j]j]j]j]j]j]j]j]j]jMDd 7S8(/\9HxfqAR_$0Jg 9UY8!SɋTx%!8_,oJD !g7OIF%ujyHqp.#JK EQ/o 7rs"PE(ЄQpY}2 BXtN5 )B"j|]_#XG<(dClNJX'yP(Hf+aȅ8$ӆj) ,0,*$gUg8.,q3R9{H^^^^^^^^^^^^^^^^^^^Iw(8|Np(Sq~q>,q>'+g+9\O9o()(PrTr(f^Xņ̊'jJhJYk7!O*usO)g3$*"(WP×f<-z/bKpK6ytpMPքjXIJRRgR_ԧY}3rp𼣜TC nY ΪR_Qai%,3NEܚY&CG>bxI E Fd/_v<'nskK Ô3 ?~_{н^/z_~B{н^{/e콒*\˙V\˙s.dqy`GM4:hUhtЪ$UeYVUeYVUeYVUeYVUeYVUe_^X;J*TRJ*TRJ*TBdMC<ԞHSLI''so([ؒqW"oz J;U!A(xܥ) 8d僿m 2mZK"D2'g_#aM`$aTQy ik9#rӜNi&dB*G%9(vLJrS59G}59NjsS%9)NJrS%9iDvy4r ,-ن!6}Vt1;lKn G+MF@_IW;TS|FCzXZb7=%$FdX'!LĖA,#C(c8\eim:GI̳t` oN2dO;V' `B ja$I$I$I$I$I.' Y4RI\2cgq.;xíqж[i W_ći+:s\P0ԩCLJZIͥDA6&R1OR@*  YI$I$I$I$I>мLVH^f DFDWݘߋ6\lfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfgfLPڦAaN;ƺzTog(?   O XFb3f#1E`~EADƮVJ¸TZJu4`עM`U"ThF.لQeS6JhI3᫂*%~vkZֵkXjLPǔtYJJ [/n&zƅ)} %N,"%/,B,B,B,B,B,B,B,B,B,$P$]'2MeࡔuSPQS>j(q!,jY4NUz2(|M K ȇM®}03SA6S-ub4"`yGoP.됍1)Cu}6X.A uKȉ,i5XqZ4dME5kaRj l4WHI)7fesBk=: `JՍJ;l?b> yYm)ޣ8YP,Ad`~_٥4foApÆ0kAf0 8Dp#G8&̓, =zB}*TMք%u vP,+%WJ _+%WJ _+Xhd_E~n?_M,ވKpDlf6ٶͶmmlf6ٶͶo}f7پo^'LUmL|b2]Z!.xTCu]IqJc|gyÍs6o%aio+X_wxLL4hdu!Юb RPBxF_5'JS~5(.LAVV0,Ŀ>jd] ߩ;'̗3e,f6Y.d,f6Y͖le,f6XvHK"RD#\:(n$VBM, ٕ+b+b+b+b+b+b+b+b+b+bs34 f3Afh34 f3Afh34 f3Afh34 f3Afh34 f3AOM$J+DJ+DJ+DJ+DJ+DJ+DJ+DJ+DJ+DL0?cm< O$܉L܄j)k `~Eq3A2$Y'Ol={d'Ol={d'Ol={d'Ol={d'Ol2bQ=)g39fs3'19NbsijS8ƝyX6o19N@r 9@r G"ra͋Vj*s 8iipo9B!uL/~ K%%%!Jᘚ,DDҩ:5bnª EnkzH f[r>\^'6>zHFF QRà)T:rI]20EAup#  eBVfӰz>I[}zh*Jf)b]n$&kt XؔV*9=DWS>Z]8h%`K?c{O} ='О t5C] t5OI'ОB{O} /!BMLSS)j& ?LSS)je52L.T'n$FsS*.g?C /| ~J@LijdKGVcD>OyW;JIJq!uAxhZD'vawfI%},3IAA*$9ήJ[bBU뎴'[2$|l~tV"WOXvK•c-b a+m*AϸUx ŵcX~VQ3ܔs-?ibJ*>kUѴ{>WC_1yPneDP1C)PtˆSCJ+Qҋ݃'A SDbuZ%s%n(szvLI _P_P_P5};sj|>Z-Dk3U B/B/B$<: 7/x7/)_0/qC_D_D~r۸&-!}'OUn/dͿ\HUFӪmmmmm8V!XbV!XbV!XbV!XbV!XbV!XbV!XbV!XbV!XbV!Xb3)AAAAAAAAAAAAAAAAAAAAJ /I&mMmI$ZM5[eI$mmRU[i$I$I%:Ux*$I$I$1mmmm@Ӷmm`m$I$I$Fmmmmmm9b-m,o;.$di l{1;mI$ImJ`#mmmmmm$I$mmmmmmm>m$ mmo?mmmmm`#I$I$I$I$KmmmmmI$I$$I$Ixmmom>I%I$M-m.mmmmm}8mmo;Tmmmm`#6mcmmmmmmb&mm$65?Hmo`kImi@Md!ݶm?ۀ;mm`#i mm} I$I$I$I$I$I$I$I$I$I$H?,!a1AQ @Pq0p`?ƌDؼ.    <"F2ګ:#Κ|ܐAAAA%{Şs-, , bض-bض-b R$Il[űl[ߏmlӞ.|G3š3oN-v1o~bסX:z lN|'hm8XM5|MA`^vx z2%Fp,-Te<0<)Fp+G&ym%tDS&,>DwS П VLnpȺbk׀NTv@RBBDHjCRԆ5! HjCRԆ5! HjCRԆ5! e1(I^I$mR\TnPסI+%dY,K%Ѱ*#Q [%t0wy#G18[UDœZt+ӏs%:wAs9qGx%O_ҭ뙒_%I燎bU7"Q(J%Dķ .eU2 UIl!6"\INC$+fq_~ix*IwߦI[4$bؚȼe0p89/M$l5nKI Zf +CJ!dmqu{|GBjxȨ>sIB*!1aAQq 0@P?H+)q2,D4S2B8PxG3 l b!S@ńJqB29*1\ *]_)u)Rǡ# 1R 'C~V'҉Dtg ,)@M! Mڀ$u(Nqʢ!>aG*g XNGpB08 Hs4Q:B !Ft8d+fělI&ělI&ělI&ě  Ljf4X$`pPm07WnT~* G6,B聅LS9X-]]"<<0"Tst  .a򀂀\PdFa|)al)al)al)al( pf@+ p6HB!2GC}#.1UPR lf"QCPHC T&˓,D0 |jA0΅ ֊EbBQIYh8G@&c12A`!hoWUh[E,d\*~zbI!(@4:ֱ05% dYD2`94, z IXhnZ}O@> IqEw0K~ @;0#Ak*6?p@WA4_pAG0 L _ª+jT²ɋ"`o3` ~Ԕ\7t=5)<l./"CI`9 i ?،6 #')Q` !t ByA~"ȋEwΑpr@(Ǭҝ4i;M!iHvC34gi;Mh@v+]4WiMiMvo!(I$NdàZ@Bm &%H&~:1E#'y'\,( فӬ`t0:u:fNYӬ`t0:u:fNYӬ bVPT0Dߑ#~F7bEmH˽>te""q< 2ȽxxxxxxxxxxxxxxxxxxxxxxxMFC#_O`.40uld'[!: NBuld'[!: NBuld'[!:TKwΑU,"d`t3|% 2\V/CrXB L?ceƾHZ>,`'E\)uQ9P5(PMn&}>ᬙZZ:Z?_OLBZQ$XG @1MRT&0p(7ƩAwLz$"j~FqPT` OqU@be训b@v~,WXc_H˽>t~"ўf3N@vtSfM1y&;$ܓcrLnI1&7$ܓc2LfI1&A5( OS9тP![ŀ pG xA =q*d h(+D##<ήc<ήc<ήc<ήc<ήc<ήb.nb.nb.nb.nbus\%d}#.1y%b?7o?3y~f7o?3y~f7o?3y~f7o?3y~f7o?3y"_OM|M|M|M|M|M|M|M|M|M|M|M|M|M|M|M|M|M|M|F*,}#.1mx08TK? 5 I(D "@pВhQyJ*8IwOeޟ:F1Aу(! -0FI2L`d#$&0FI2L`d#$&0FI2L`d#$&0FI2L`d#$&0FI2L`*_|> hE/}4Oi{MYjVv՝5gi;MY8`e LxR%`;>'9;MYjGv;ݦ4iM=iOv{ݦ4iGb-ʦ}#.1٩*A<dq(}(/[?")ca)yBho2F_,`@" _8TC !+|aS80 y6  &wΑ- #1,"Iz \h`#&0Q(-W>sM U@R#4tq24gDIiF\_ݤ*Xbb[qh050WTTuM 5 1Aln"QB `bɼ!E!@5P#"h9JUʰ"JP<%8D{)T#9 q (e &.1/eޟ:F0 "ω>/,ϋ>', ldždxfGdxfGdxfGdB-Tt >/,ϋ>/, ,K?` 6DdM6Dl@Xc2@SeM6TSeM>  flʛ*lʟJϤeޟ:F09ƢDh=T,uZAXP$z,"8Z\s?% 9 @v6瀄/$S< 8$F p}:Y"$H%qBY)*pU((:\hxBA8,rK?"Q)Pr#t^?H7i@?t . <1y6\*P APrCH`t8 r  FBa9pP!uX ύg2O#h(1зLq\ƬHH V\ I%Ѻvע8a HwڙICB@)!Á}Zk L iNwJ"U  Du5N\I%Am, %W>s^( CD ,Ug `Рt]z/I:h.0`QUG$I( NQ ĔB!jW G*Y|AMEz(5a`J!16hub@4wyhGwT4ܐP=Oj'e'B'T+QeeRdJ"XY M*:T|V@c:(}FH'd!4 .pHZHtȏw@*QWGs^eJ37QIKÖzޏ&ms*@XY{eQŔ/(R UadQde-윭1VNZؼ%vKm5Y|tJ|Ifwx ( ˍO'zg;}>*5ԩbL,]Q.UfXؖVZ%[QYVW-FX٪\%JZb)o,"=FHlt'R@Pv"p#)\#ԩbL=sK&=F/Nnϗ>(1HZy|}>o0#j$`=J($y0@<ԩby0@<ԩby0 VhI@yRH㕴%3\4@} ;(GZe XvR-) )4,"DUMXB:+Pȏw@瞥H\tȏw@瞥H\tȏw@J9\$Ӏp9]R-1UϨX}.@']9 D @H&DD{ %[d@*(j!AMM9kuQ*@Ǹ{y얳v:ٝKX}< WWQ5\,:c1mʳږO"=" ZH"@!R8@^rGLGRyz3cs)DWH)-@*$Hp#`4yRceAi 2J@t."1 !24@P#3$0B5As mD6m!6Chm 6fٛ3fl͙6fٛ3fl͙6Chm D6mD)7'#\ɾgllllllllllllllllllllllllllllllllllllllllll'xgIFs*.&r9FrX,Zyy8dU[HX)7Ӿ8UqI-M*,g#*RqO$rHFB;ZORyj(FfDͻ`K"gSD!Vδ#+0yM#c7ҹ^U_e?/r1[_w \ MreuZ,̩j Rgg 6XV29Y5tU-6ȏjDmDig%_ã}k2/6 6=r&2=meV-ѵ Tvr]U5dXuM_P1jkvMGD[wETvN?| cl9$Q.ơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơơP3Ư1Sjc51Lf3Sjc51Lf3Sjc51Lf3Sjc51Lf3Sjc51Lf3SE SoS9Zriӕ+NV9Zriӕ+NV9Zriӕ+NV9Z6FUQ f6ͦm3i=ʱj Ցu.ԺR]Ku.ԺR]Ku.ԺR]Kuo{{/D`{UG"Hɗ'1^Vۑ9$r2ə¬N5_u:n#EBUNωv׳(xɭF5=H$ʴ{N bA:;8ײau|i dI&Zk¬JxyOo.?(eW,>.܌_h>oSu0q))))))))))({yfYiyv]h֣RN5_bŋ,Xbŋ,Xbŋ,XoC=vıbŋ,Xbŋ,Xbk,Xbŋ,Xbŋ,XiV'ovse P P P P P P P P P P P P P P P P P P P P$D?|RN7#)]v~J;x|Dƽ1111111111111111111,bXıbŋ,Xc ;x|){,Xbŋ,Xbŋ,Xbŋ,Xbŋ,XbŋxI;~N5_>oՉƫW'z oՉƫW'z bbbbY/bż,[>bv'i\dJdJ$LDz1Bb(7=1C1C}ǢqdaUuˍQLe*\xceɟ e{WkUƫ˗:*?َUe_rFRHUy9$˟+ Z++k}Ǣ22:ncѸ22=5_٩wX"15K3$S!Xj hܯy8 KԺQ-Ժ{GfrDR]E'z!;xޟ=::::::::::#K^ύhqƇhqƇhqƇhqƇhqƇhqƇhqƇhqƇhqƇhqƇhqP.!1Aa 02@QPB`pCq?΢Rr4ϑyc`ٜ[X"$yC~%Z#E{,1cLKCN CNٲHٲ5"J.?ѪN)8ⓊN)8ⓊN)8ⓊN)8ⓊN)8ⓊN)8ⓊNdJJJJ`}zT&B(E P X]p)\9E55}z\XuEMD$XđJj5!R׭y:\\Ȥq`(^Hq&t :x'OO>O>O>lM6lO>++qB++V?2+)YGuvETmMxu\Nyb*RiM&RiI~'+ c"Hӥ{-\N= M>rᇸa]iYvR ) !APa1@0Q2B`C?^nEzXu,utx>xWvE-Z&;U:}7Y<:;TTZY %A^{DD4MD4MD4MD4MD4MD4M wID$ID%HXoiGSJe 1 ՞=z,YgMtwi*+W9\rq+W9\rq+W9\rq%%%%%%%-ܛ0pq5tF 'F\TTah*£0(wB{at&b@<Hl>qk',TAGGX6KGٶehltQTȢ0C"B)+:0 Fт=] &߿U*hUTV֙~Q}HַEU kcTFh ()c8s+lNn堀궢?$FBqcBu$f ^ڻl#Fǀd|WvGL|nv F?疴1sZhrDWy̪V#I, lhǢrDbg̈tcM|dA7"Ёx5e7:2*כl85cZfB.a1$XU1MߌKOEIbtX_btX-'E+,WX_bE#,GX\5;+;+P P&zTΪgU3LuS:TΪgU3gU=VzYgU=vuS:Yg]ܭYYgU=VzYgU=VzY0GU=VzYgU=VzYgU=TqCR R AH) R AH) R AH) R AH) R AH)f]MH %ڧUGo,VqC_ku$P[]c8lu3]BItDbITo4EZCk*Q@CfqC̷f8lb MݛTj ʴRRV;QZb-{;DY Uj6QEMs E;Uq٘2B?``,;t][BϯujG5V00ֹ+Pk(؍iȡtYa&5cbl rV 570 7P,3DmȪd^qs]c8lu3]AL2T+)2~}ٕ2TʙS*!gc8 S:TΪgU㪙Lu9Y_Uk=T6ggg'c&fahoRC_E=ժOABsQΪ'-E19)T& 7c) ,T^ѰLxuT+BG$^[Sc8} mOgh"J[ BwҰ"lp#MgpHsǁ !{oM%7 {YШڠYQBAjh/ %輿 :/`YUiF,d Dd85hVU@x(wUèW\:sU +P!]?qtE8;x$"ٕ+Q*0Ehq\wEqtWOE lu3L WݪUjU}ګ_vWݪUjU}ګ_vWݪUjU}ګ_vWݪUjU}ګ_vWݪUjU}ګ_vWݪUk5fYk5fYk5fYk5fYk5fYk5*!1QqAa P0@?!K(paz-y,w{=Ŏ䅯$/y!{ HZF7<$ny#sHF7<$ny#sHF$/y!k HZX,;/y,w xSB|SYeqgA:Y ?u.ظbl\mq.6ظbl_m}/ؾbl\mq.6ظbl]mw,"|VӲ5K)_C܍peC#*bQ؈Ě:aEUcJ5ZTm%UHS` 0DƪFDiơiIMkNNJR$)FH~CwB%Ǧܓئ $I$I$I$I$#f2cEDc3O Dq K%:-CSŒn7*c940pPy<~rIz\jIyiR#CVfKt2Jh"&#i QFl!ph̓(5FI$I$I$I$I$!ds\V P;__&fF(]NJm$`ri*jHi23 Udf88kY"c@>DG534XTP@K Ӏ1(0ļ&-4,i-Ho\"XE?)cב$I$I$I$I$aj;oQx#U㊺t29G,Jr4҂&&k%W~HI\u~,B)T\2#3#s׀\SNnAVCƥh3Bi0(mZ5Ȓ†Lp?9>c8fi&4 lI$I$I$I$Ih78I"a2F}r59\rùaܰXw,;rùaܰX,{=rùaܱXw,{rùaܰXw,;rùaܰXw,;rø%rb~.n_E{h^/mE{h^/mE{h^/m/؆Zޠ%9F쾯mnX-`,ܰ[ rnX-`,ܰ[ rnX-`,ܰ[ rndɬ%&jj,;E *RFhHd(@[ɘx!V(]ęFc"I2#&0ňD@6a>;bN 9dEH𒚳b $Xc̒L# Pؑ8 q@PR'*}+ɎYJHBB* N3O]a"0eX`A0j$*0&'Cn*r! QsNGJi,pDEF'#m )8F6т*ix/:q&.M "_ +*m) W\dED8^ R֘"oiNibGYEI),fYCLI>OU$TT\1"4hD@TKRp.II$I$I'}? $bpߋE[M4`W ߆Z($Fp̫fsA U0˨G U%Aiœ\ISu% 5q6W1,Ҥp""'2P)$#l-IKF&SGHLʎrc0W(ˌ R*UhP!xdF?o #O Cf +P4 B*ǀf„M,Lfvm C"5.)&Y| }"w.5xo#\Ê4{|v <}e&K=akZl-6 ]akZ-v }ao{5dz[l@8%[ag].{ SFsOxCFD\,e.]r˖\#\5u]CWP5u ]Bg!P}A$>NY!dsϮG>VOhWP5u ]CWP5u ]CWP5u ]CWP5u ]CWP<3$ ]CWP5u ]CWP5u ]CWP5u ]CWP5u ]CWPmW O9]Ǧ=1LzcǦ=1LzcǦ=1LzcǦ=1LzcǦ=1LzbP ʓ_^ड़߱ub%`igX*!/oЦ_^Ƨ#FjFjFjFjFjFjFjFjFjFiѭѭѭѭѩC O9 R9555555#b9###############################.Oa>;o;?}vv <U Aybm9pdSA8é*tDE6s O*BIpF)Na 0I'5VI .dIQL!SƲas%.8$2?HVLuja&t$$\N/A1-TU!hfrmD-)ϐX/OUUBjU  f4x! 1U,}vÞ#84JEXZCp*[pV7͵F6IKufTU2ԥ/&mbqLUK8hqC )*GQZs L?RJL9MA2;?}vv <o׺x(K-Aj PZ1 PZ +x͚ bRjf:q PZOyIђY8=s=sw"'Ϲ{縪)3=KL5ZbSm'MN/H'0L4=FQa c KL%$S`>Dcv17m5C*eXЙ$0;*HJe[ N$ 0Ǻ)#S.LB,W n9Z@:Dr';S=:.\> '}<o>&;$#,Z$॒~ D=?bY Hp`Q?,o!udM/Z<^~hT1 lrJ7`q8 xgy^\ G`*`C. r'#"e?qeG藙aUœƅX1/ rXߟ73Ї>p@J< Qi8`DECC&hJS2cz0CcEa0x л>&Drꒆra>Sx\Nk:-A72qeXx?%@+#>D%UA,7nLȊDJ25LZ7:< Ǻ{==XQ-|v ޼,ɝ F!HR!HR!HR!HR!HR!HR!HR!HR!HR!HR!HR6`}:\KLLLLLLLLLLLLLLLLLLLLL  ]6mmKbiv}~z(x[6mm$ey.~mm:xdI$I$|Ka4[ti!mmmpA^nmmf@mmm"޶mmmm$mmmmܑ^FI$I$I$MgagE-o上Kz5kI$rI$Ou_+y̧5lUbOU9 !FvD+F$,~8Y e*4[ \]^__ja/T؊@ϑ%7:IA΃ e;AsX*-9JeuY9#9>Z$E>y,PDۖC섣ġ~Ԭ̎2;Cÿ$0 ;Cÿ$0 ;Cÿ$0 ;CR8|GH>u!Τ0yԆ:Q%#303 0cKp~zp;)k^mnH_֭j n\'q6u" ˹&vBJ:'m$۪]ɻѪœ+F_]2# FaEt4U$Фǖ?_*:%HHn\'A;]BpD(4,BAOsl2(ORe Ks\$6f~*ᴥC_[I4vq慊(PzKn*Q@!xWI$nBO}"HI@}v_?RcעOA*!Q1Aa Pq0@?VdYY%eeefJ̕2VVWdɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&L2dɓ&|Yũ8fqx7hFD2fwsfrokA:axm;>y\'VY3jYq . eK_[Z .s娲Rk6rzބ5E\nb hpL6c*\oktl75=ܗC: 0lW ڑo84/ޖV%t6CiReqod{bi {[_;j6Mw)E]0IpiEiJR1D" ?d-FÇ{vܛ6c+g[oTe}FnGaM淤67_;Kby5J7: tnI~Ku5ivՕm nJN:1b#u4kmj2oGhWӷ6z,u%Z$GMѺ8^^jzVEjZVEjZVEjZVEjZV|sG!C)8pnID?R?1k_ퟝ>3g-q?jg#kߝQ?R?Q?R?1n { m5=mYy^ܟ N^ bz|{x'qNq+ {]g\93/}7ZFZO{~z[[>鯅kpQ 9|͚ě asVj_OԏOԏO~G4IsnN8Ӵqs<ܦG#jiY We_נ= ^]O:\mv BQZF?m{ )-Twjo]D{9c}zwO &&oU[ FˁE}gbG)JR)JR)JR)JR)JRbJR)JR)JR)JR)JR)JQ*!1AQaq @P0?^Y:JXVkը݈ 68lp!Cd 46hCn |6?<Ǜ|6mKf 46Hl!Cc <:)J#_Rt0 !2UXZ%{Si}qfu?|u?|xutxppp9jppp<=<=<=$=$>E>GGOPZA Ĕ+4FNR(Y];z>UKWݎDQY>RHZ^w):(r5fk P!^RԬXZRӬ蠬g8 X ȥg\x+]*4 %wFNJ']Z= - ~]eɡ0r-#}:gUjǬ~j,FDKh2MBtd]+Х6*k{g`A,ӣ0N +cyxE6"է5\ƹ9jYԬ0C ŅnćNzB3x5-zE WٛG"II(8WzCI$ݣDBH:p׼;؆ᇂQ2^eeHKz$ eJ=|8q| 4VӋ ;E}"ZY@\NG@ː;, kLKj 'taЗ]GSE+GBU,?84d>P[ -dOtDBTjhxiD{.1,kE沕Cz#Ax˘T9v:}Ѧsz44ndE SR%MzQQQrW X4}Dp7wb'BM9!q xp`p0^L0=% < i91,V_U&9)mMWW_FX2n59F{\a7 | ڎ ?Ua8>F4ޚ sYY8 j,t Y(zXu̫(l%W >f27T(C[Gf*c1*(`(]5Fcy*v?YTr|. –}ts w^yN;wNjiS:'xN?>;jeoڝ;w)SyN;w)SyN;w]ѻN6z5!}Qmmm}}jf}𜾵 x Syyyyyyk0<<<<<<<4I]v4vcV ICn t6mۡCn t6mۡCn t6m۠ HC5$x<5:~熿r~W6;IB‹oHZX]!PUXzzً?,QˌHLUdɆ|G=~Jj+jE:}G+Sß*Q-P@\;}4Z@EP0Q&T*tr=M:R1< x?8$B1H1Ergh[<jP-P:Xb7ړ r5RW* ˯<_4/d)rUlpXկ8)$Vu4gY-igCŘȱj؋IC'zu Z)-Z(\JT)ɕaD9fM(Ro-g`PU%hfǍDEYk]3C`A-{ˊ29b55f&ڂ!! (R!S VKY sGU-2 IL2ZQXH@ꋾ*) c·@ Yi@kAeuLch{x_CkF'v/0Fkd-nja(! %ٝxT6 k8[T@2(yL!0֌~e}Y[98UVff"پ0_UB&Xg(EѩUVXr4eXcVpy2:,8'᭪ʣjp% sYuB &0-^&Lې/KSFRLCU+00EzV9i.Wl[fB ꛔPKljCװ`ց R[CP 3r l>(9Ȝ3a9pLGA ˛Tg:.M&}SݧO;wHr;w/D!-PfTĤ{8}HaT֕~Ohx|iVPC<<);=|y_W+{=eN.nF`E3k/CVCUkuV1µmB5lUMH-u.Tia.g7OhJ`MƙⰍDY5^)$A@ o5|goCƓҝ:*U֚2Q,[io\gH @hӆ X4j?6/JlqFk`_uyS\70+!֥,3ѡIx_Cg%6t2&LF O :fy?dՓ|pܔE_d- :J@\BӯT:j S^kX1G'-`ǡ/L'w`ȰGParb+q[*xZC+5ɒad`*w@XG_֗);}4R]NN0syJR_~8ՠwRxSyw Ivz\K!kS/k39maL[F_WS#Zŧ'^%!? +4 -QŘ44}e9LE#^|'y} ̔j,DWC&-ڰ),M =* 33ZAE˗y:EHGB|L,fe˥CS7~'hjVI/4z8uk˕2e5*mz (g)eZ=(l5|goKߴE*XqBhv wp` Tܗh{r'3)^#@s*ՏS8Rzf`&4ST#!-"E P9ؑnj1ry_r0'0VW IDATxwUǟSn+,# Dn4jԘ&1FMDcĚXbbEQT EQ:K[rΙy?ιe{K{<3gw55@DDR A(f"RB!,!eYB!BJa%"AG51Pι(pEQTUU((3ιjBX%L4M˲,rH"AG;&"_4 ڂhiaa'BIHQEu],MJ) :P8;{~ o^5r=w*vXCp0 Cv(..m븫&^٬ӯ? aI:'&9e4# Nn~G[6C,$Mޕh6u7vN*Jע:JܞwUl-^y%Wߒ_HJ'1+&Y vtz.Ŷl* B-=++cA" #|>xlÆσ`[[ni# M4ZZx/-##@D% ti"0洹 1`38x3 @SSu?:33#---=ݯZ,Nl㨡iZS*#"43?3f%4%;dP8lqCa- dnHP(iYB,4RiP %}3 -jRU5` - YYi~kkkccӦMvu5EQݫ= ah}-|z€a+o6GVQZ"!ƖTi>S;Fp8l="['0<{q~J¶&c`/6챏4MEӦM+(ȷgRBA]w}ǡuEUVS:?STry-Bhe^sXyҷ(0iA?'`[_-E[}Kŗ=Bnjrֺ* VYͻoen`e)mq8NBL8&JiOAlla}FX2`YBQ3.fHqƀg̘1gλe)ʁde z˝(ٺgۆ 1Sq2!zchk:.̃/9iTfk\5g}*CiAc4AY!rN{woSBۺmAt{F²,<%XqJ>NI֬w)jfUQ@JiSO=s`YiSLvmA9%MJrʱ3ufb4i!Wߣ0۟W@Rfghƺ ̝`K0hHLQ\?& hmk i_CӼ>[#`ZCLCVhBmA_E|rhlLGvOɨ"u4 8}%PWnDlS'A$BHDTS?,<ЗjFmkJ%-3 S}@ -L>4M[\R\SS⁲y_WwIWް߾1κ+oxa`>`֕WM|xm2hc?ޱp7s{~w 0|sO/]D" __]wR/լ[ߧ^Yܨ3`LeOuj ȷd!jd|eg?$fwv4S&TpݭZ_vX=JeOK>8Ya>(Ťe;{?~% HPAM77K 4|ʵ7SZ}'M 9Je'!ZF@\Ґ<HShF ( k- {j2$Vm2D$Jj[ ]0OOJ)K'2`R27mgtzs}3_3OeKH)J})@)|>aQ7' G@zQNHb'.Oxj1u+.rc6ie~¦3neg]0W||788_|iHe-ʜTi{MoΚ{_;rnkBiS4❿VO5_F/{ w^?gذl4xykڔ_GEm8:@!>5{gwCN l WN5=ݧB8.Ȍi8❇YIg}5jZn.tŞ9HF|-YM#!Mp l7(ƄOe'&z`Ҵ%W"2lڡ."Pcj%Ph% %tu.0H+,ݾ}瞛W>_1 VԂ1*?nעtְn}Tdr|54 |{_32-vә3k z}\"X$#ԾIC?/|uN5͟Afp NzA&OCٮi>mB+Ud(NH0!#^đ1ZaN̺][tɤ-[wPƐ 8o y*P(0M0Ѯ`8fP>Sn" ԗ@ݡ -ɣ=,oqyҙ80$4En8g %U,Y@펊O\ԅۤLDۆG^A<񝼘ÐsecKAJaJanh >Ɵ]4s_5iػ0W9ojj@Z ^L,a jjjwfFCm,o?a̟MjU>k|fEMV ;?Z^ww?ڄS@_U. O^KJ4L/zf/\jgnp<\3(:^?q R5ay^' bԘe􉮚-h}^k^\U}>G9CŋveR555u;^8'_ۥ4yɿ?pT6$N{gġ%V:闱j6YcUA]V^hR]K|y+.hUTU7i=j„q'8qĉ'L7nXôm@]m]'bh]Gwݽsk3P4ϷJ -oELÝϯKwڲj&5{evB4݇_EQlp5I@.=ZI ,tw[]Uzwo& \7]k0BA&r=^Y S` =kM`lz*X]tmR=Y%MUd9c=qI6솆{P׵$@QT)dۂt4e WfbOZ4 D0$bEE?)%"0͛WX0B"r(c 窮hf\'VQíaLVC0ma u{TpkX -Cv+B4##pEuy4 +h0we5Y̰6@`\S}n(BAӰz "DiU!q2e5ˑm\ӿ1 90gCoDCy]6';: ZgVFb~"eRڑ}q&`#J9U!@fc1D^u dcEd X7Q52nrlj"S6 z RH&%"HP[;h F2(Vh @LJAi.i`ADiT8c $Cޢ-) v5&%{/NF-~?H+HQHѝxǦ&qLUMےv  nvga5Umk((S_4;ŎMCq|m Qv+*h㿿[}~O#.zCWvu'>},PBk>jwhGLz晓$LQd@x2+8SnwPQ!ǧ+WDRA8-"HDonן1itBe r]{,lڻ|`A0_yz``f#ƍC Ȇ6DD8DgK4AJaJ}@ h=QY,GUaS(6bbjŻ4;3/ZRgN+5udC?dQ_oDup kRnOݯ6h\vQ Mm|a[|Dܥ?ys0\ -XlrdV6wv׮1Q@` 3j! {Otu/MϜyĊt;۾Nſ=ZqN D)!؎D}h;ր-VZ4n2wB:3*piolX**X!m|!:)PcILKXWlSkkB ejϜ=U < mAJ{yt9:bD*XA#N{EW^~[9oo>rowm \p돏όvO-7mh)x|AeΆ(  n0[[ PT¹xTmmn}ܬNywOdִ?+AR8$D@)>s`Ko}Qey۾=wFd( Ȝ@F,W|` -?1A-Jzز-V[昻hWvӷ7g-Ȃ(A8qaKNN'C_C'݅PJ DD 3%ZW39GVAKD)Q 3XX^nyg[7ƣ(T7̭g12Җ'%J)R !K )4m$GDxm(>ϯW: H\{ZkDLJp'Q2RX}w93?{?(>HiX;9u\5&o_BY6dy|Y?x?~ټg2SvmXj 5w?ݢǧwL_C0 )@ ڝN@5#EC[hiugIcOH7k֚.~7#V/&@yO׾ʭ.ֽ #UQvu&$UqgtEvy^+kh d}=b0vFOҚ߭,ug1kuA"`e߅ sB1;3qW<`(}_sj f|!3OMA+3==+8f[n3A{ J7[[簯% rs~>6c3]i?ϮnxJ϶%)}]/S5U"x|SSiIT%<޴?ޛsƗ(kj_bK r3=FED~s{u4_&Cwq3^*҆( H@@1R0{cg:󄂁}]<ӿӶđ@.}GoBHP[UW: IDAT|?/50P]9=+|(: ]8QX֭M~Ht3h/99ƀ1%;U;f8w쪭rss2*( Q$NpMmg$ ԝ#\[֙R̒8_'R"WcH1A |], @ w&H_j?Df$uaY,"K$i"A\evV"Ӆ;l-*YdL \=;l/caa!Pؓebȸc4zz82l*I( z,q{60=Ofb*{ "oab2]ak3JB8c ёs4ʺ`l~oy/[yZـZ#QpGYeʯcE8j:H̶XpoeOtƏFeJg aDjb-znIm*?]ӽlzr@—u?Į^:cPUUsW?Lwn/$n/)wlP GղoL_1^GNduE&_rMg ~$Tӽɮ^!w NƋLD019}ԉ_ûd2K@)e2Aa8uĩG̦cPm uK ?AD D A1H b&Afb_͞` `fCqH`izs MWu?--#3;/ a47޹O~9ݻNʚ{玺}eeQ $@^733kpIMK7 \|'3+;S6)Ş; TUkQUh}m'oog\j`AG hkK%?ѴEo t[yAGUQJTJ'HѸ^t80<5gU-u;6O"oدKNPE"e4DHsǜG}wm֮~~5wF~{-k>S}J "qP0S NAUU d´TC"քpWI߿|ؑϸcs?aY)sy7ld㲗߭~Ѭn@$EHtnNAUUҲ@HxKx@<^; >Ky>8kW>?Li!AX"o$?H ŗ@}yCADFy=4ʛ\pFMfi'3b6Rv#DU 5yy+At 5{@ؼrw[?ߎ+cCUo*eqv!c<-*q\1 SZeS Z7ԢO{՟}SKcD=_XOI;][|7cH??|Lt~xXi.&"G7"Z~h<ҫO,6~rI*^|.|P3QJ3n8 ^id,bҔjH%k?u~]_Y@رjW5IqxPS9۪>K6ԅaSv}辏zV?}ϟk6<_ce4Aa"Mٕ9'\qe~l޹q3gAđ&M4vH;;o  WP~_~o?~ < ~}=kk.{ <~ȕ?k9sv ξq/=U} }[s=W I!M2s/QoBAr +;[aP4k&efhm ꙇ{Qe~[{Ou*@Bb7#JRDpO~੿^xf8yT;"jzQYyy=1{l_e _)-/OO % IM=` T o|"G"0d;K|0?r?!g<Ǝ&˹^8䝔i-2pIp@ lpᮜ~u:كLa&M,xwހKN+P\OȽoʳ>颫~tz?'||xԫ.[y`5]ċ]9= bssgu*RBo{NLЮGQbҘP:՝#Qڷ%9y'7FpG$,B$ùPJH] D"#-:md;J蠓W#R? Wr]\<%7~g)#C):No0k\ٮ>WH;,N]g`Dģ D'"ZI G"pd2w̱)Q?oAN 0L^zGM Y2>I$a*i2ЍRjg&ỏ>pNl }uo<鹇vl$?#EFCc #["Ge^Rt'F=d'UNNHD.,9Ii\ٲთ^zkїM0ѐqӿsܜWrSDpYR躊ޥ9ѿ=OfEDGNe 1X[OSuWmn)zDE s G0Hi:~_XL*ӇM%Ϻ\-TyպFo7u4y1?L%75Mj-Q} ͌`ޱ_`Md zZbѰ5瑇\eOvin=>04(eW-θ*ڱj(BڪT˷/ؾUZB{K50DÚOmm :fxYB"JV۶o.cgM2-}k~mӇgX#_&F tD6 Qrqɓ]2~=TpZz?}MO7^}Fڏxť[w7~;"m3]805'?’<)lKmsaFÔѶRٸ䯷uKsg}NWW H 7uSKooT'-vH~"J[ߢ٠ gVnߩ.+w +s3@qom0}ؤq٪hSjFi#;kV-y fN*ԆsK3᫝F j =ѼU1?93tNR{%W43%~{h~<9+Cn?_Z\__ퟝ[\3A)~&jGV_W}3Ѹ8a1ףtrq%7պ3J)9gFNxWAp"wKɷ>\u/>Z1~ܧU9ntƎ,W^8lqe#-Ǿ~'yD/QdNs7%B4VmlWNLdJs^PT@~aA&{oކ{N.fܢ@Aa;՛c#\.\Rc~O32]ϋ)`Ay`Avk)𾪽^%rCy%o|e#]a5oIux^΋+`ͷ|oBZD=IyeļqMYN,JDzݔHKxK|صz7fi-F)dv8ƍe:!Hg9$nlq@tRhog/s7mmHгնb̝_k ,+훾j:5jfcҧ7@/2"9:w~ɕ(m-y_sVlin'dAx@(φ@])e>(7l(Nn$ZwQn?8a%q XHWNNvQ+7OwȾN`h#}J9?EģM>dmbۯ,mܲqHvH>H$f ZwṮD`M #lAtF,:M t,NKQb纽}:66]Ϭ|ѕS |χ%)82aҙ1'AҮ|DNHx3>yQ=ŗ *U5PPR͵;Tbκ;,:ٔ1!hnQ3eI!u:C i=bΈGE@nZzSЬ|%"2PSk,/'D no?wFB"p_l㎽i{!5_)( Pyz98T/,cAʓ7ۮe[51Y+],DƄ.1z5]%Y0Ɩ#Êc [>QHp+)َ&h,mF&>+q i_[J)p)mР'̓ϗ.Z5avU cӇ3 a*`,AD;mD۠8ǹD6 Y1.g֪p^"@p59^l޶fuhܰz,5-sFMSau%}* *Q?Z2GY-YvGs"Sc:d(,{||s7gMU{6ooU+Vg/~3yF3❠r+%3p%|كƖxFm?_ |hNethyʵ+OA?zm[^w|(12jc RJrO)h{畷ǂ YeCG2(̲qR@ @; Ͽ_?4@I8gGO\̙^yEc‹_3;&Hܽ>%͟?I8}O>Ӟ4#msd}Rl>OxY)8O!`>1(ƫf"Ĥ>ټzE'DN30w/zcpIe`Zrіq,CjafiIf˨QE=-MH/,]GJnR#8~T%k1}u:M 2ddƨR" ThK !,HϮq}O (H1KV7WxԀe1{^ 1EVGMB+Knjj z=c>xD2+; "p g_Ϩm:s\!&nw'y8VU%TDcY\o~kF/Ӈ~ްDE/IENDB`Subsurface-4.0.2/Documentation/images/Downloading_GPS_2.png000066400000000000000000000560331226345450700236210ustar00rootroot00000000000000PNG  IHDRhsBITOtEXtSoftwaregnome-screenshot> IDATxw|ǟr%˥^HBB"+UAEAP@􎀂| MtQ* I -\ݙrIE7׽3;i(??X1HcI*  ߇)e /:,,cL$I$Q($I$ c,T"),0,˲,˰,q2,˱,0asB}4$$ (bJRB1Y9yx'`e$L FId4,$R$LB1L\.dc1e2enh2jh FavY( b2PrR("dFih0z^o?n x{{',SE*'*9V6!TA(*6kKGed3DJJ6 `O~*\A+?l4f"Z E؄g! kE UZb{W"JrR߬Qazל\KZIf#^Jh (45zRS*JRr9Cd4z`juMqrr,k Bdg 񙽽JRTv BT2ǏL&^oZn艎` ByyZmVU*;RT*d2$I(&`vR(ʿV-x7kDɷzN+7vFB0gZC T8FC1 `XA1 CyB GGZvp7Gr% ${kqy̥DjFj(,$͔BXlvLɂէJ$)~c-Hm~@&nJQEc4£kXn=F$j)Q"DI4(-[٢E3e79AA-Rf|, (+9.QC}&MaҴτ/"RލI@WfD+n$D 60AM>Q( u+Q4O _~8MXxGI'`+fxⴅ윴':\?&`#Dls4IVE6m^FY.۟D  ,I~ :1D;dޣ]wj(gƒJ% ,T*Tz)Ԓ$$Ivvv ̰a'ȕJ͢Xz7wП_:e\϶}סK .^ ^>'uPVsFL'rnN,ѩj7G6"ԍfTY#Yƫ4js3{DE9n{uz.MXYh+cTv /}@n_@`i+f8m{`0/&oO^hzV;h~n?$|IOḯ3f[3Q(({.50bG9j[l'.נz ##Y1!!hDdl:,~MZz}p39r.Gft_#(@QGp5<$K ʾu;T.*cEfF#E?m.9C!֥'nS1I*)XIX)#ImxվF 0^y,S;36V`  e9b~)>~z3ѠyV۰AVDt:C)62!F )̹0[WuF`&R#3G S7 #B1L>Yhшz<Rv,ʨ =J58Rbqک 984kBٝzE7nf|ML*Pi)2RxXPЏn};}YDz,*}۷^֩8GXfg"`+JŲ˫IVz&z-HEibbðK;9on i^'?Mn֙ Fe0y%( B(JeGy TdFɧl0j[CGԷG`^H:%C@|t=C8 Yn s.@*M>*|`"aP1F63J'>2xxtǎ_N. iR@^sWA/Mzu9999vN*(us3dDwa68{Mfؗÿຍ ܽW^A̛FN0'ГSOH]YdJ}(SF/c2On;vD]Ofm/H Y1dU31%M 5G|N''1G3V`9W,ٟLd["mJYd(祬X(^c!HL ץY$J9OB0D0 ȱx@qclĘuՍSN- b:]L^=|B9%`cw,>, `yv\zT)Ms&oKbe ēߏ@sɄ˿v2qeB| coCS0 Wyxy2 k+!$;;+?/W˾5!qZ0yk d>ɼjt5G'g# qNvd $IB=e* %(V߅*糼cl0SS<(>xpjt Yi}󺧧U}zrlHh[ORh^#>ZbiHqA epH؝72]\\+kUN!KBThePYY~/K?e ZU\^[0ƴ[M`2_=_,Eb9ʈ1t%`Kx(t;2T. 묏T)b$,!06 -fy3(B@XX:sh3:+0Vb(I! Xl;w[2)BNl^f&0y!;)ʋðl}IqvNB0f)r =uVzt!G9l2A BҎ[:,ZQtQWy-)ҬO;vQ_mC6k׮~ؿf`Ծtx;1VP퉝F0J՛oY|0ޤݣV'VZ\QנqvbUR]k\7bs :IoiѲ\ hQ}\9O1o ;+WnMM/4d,4o[}7Qm3kcSjʳ{oڟS@۵8cπ.s_[,oK;y4 N;ۜVanfA[}џ `ת ^58SnXsZx.|߈6Ul*ιq<y-EKoƝ-͜>]-NЫÙ?,olo6%ԖU%jݚjgi-yj9'2B?w؁?w^|!Āyhw#=x}Zſ0_}b-H5hђ^8Ҋ+RzpH#uR^h,urm)aM`wFMPoO%-㇮l1;qB񋃵(,aǬ)6IM}|A_w͟7z$ngiKc~l;~8&8omޟ9 y58spk/F57'T@#z-Oʇ>F׵t.[xĩ9?.UԦ浻OFtieGme nJJbj /7g;s1׵+~!)uϤhʠଃM%[f`Sߨ3bJWU9n.6i}Z{r֜!ZMpz+=8u5ǒ0x ! _~?*nk>(ƚr۵ϸr7/ysmz.|IM\F׏⺪F^kۙRE3Y&J9m\JQt_[ӑ37t( ,fhJ%"ȋn}${׮|2̝K8nS-E=@tw.p':'kS$vM=ـ-su0&F`PET6˰3zZGMp54NwzeHF~-]xj瞅Ğ9[!#8>v5}꒵e~Y%-⓹M]\CժP@l柿#<pgMA-+np؈Zn!9ZNaopeفT+?m.21L9lS.ǿ3n3/[%60W{˯~>9zL]ƻm!E?F۵3ϴ_keTbRت *3%nbuǎsWs,<YFj6n9#.\> @~_bۙѴ{>|qE+>үۺ@LTʩ3]|vVm>< Rn8Uv5ZЫ ez85>蓶JD˪#ܫ$(RE~*huZ:)C5H釿WϧN^̟?"5d̄ >VYŚlY IDATuٽ[0<8OzdH7OV蚺C~  '^(YxoG@¾)!@"=Tdžsk6독KxٯO$6n"ֹN\h V'&JQaaœ'&&v//7Sj->eoGwnRϏi,{'XR^Z= +]=Bj_;&ƌ08iz~lh= TӬ:a*"bvR5ZVO wƽ'˦|{t4)Cߝ93&-zHղ'cd2 oIeF]>֣iڋgQϾ<G'*fWhS^KC9ڏӧ;emq0+A{phE0!"@YŹhps<ƣBw?m9dp#/^8)x#cv;JQѽz[wqgᯯ&W~Mp_o!9"d!𗟍Y!;G^<-۴i},:0% =B]J ?7U)}6tn)wOm[1]}b[[{:wt[xwӴYU4ôtX .֭d2ʔg{c G>lǭ>zֽةʞe®b+Yc;p`ǘqn̾ Dy<z+Y1#j+:}V^v鴠_5;QH9O\~@lŧaR%8y&e|<X @lsTwL}.Ztj^[a#:1m\Z;Yij+\b2+fΎ]7yB\K)?  Sj{<_p<ƅhv$KWc,bXʿ=z1Uh_8aOu3]j b\vS۝¤en>jU `MIɝD-\OV[ J1v>_.K $A$aCڭFph" *7 0`kKE UxgbXǸӺ|8˅-J_p9hdvn^ 9|_w;sg*p^ }gɺj5w4ߌ2ƍ}W&4/- OpH"jTwK2r޻t,;bnJ8;VAa_"kz(s V2i8m^ jHN/N^j;¯ ܸ/Adoz߳:n5Ũk$ȱh46f+Ms6w.{,EB`.3"p0.X̋ "p`ΊR%_q5}kgm00)a”,/bs!",rYt]mQ_+@.VF O7ý~I4;A\O1 /n7ob{>LVlO+]Ƹ\z ҢYN!Y3Jm~2@ nn5K"ߝr|M#Ff9S֯=J4>pyղw,NġA;$Q>fvG{UÃ}"% ƃo-'{9/E9ӱ1_+' oýWvUx?[oѮ'ޝzF&H 6[ $a.}`ڌkOp懃."3e?y5ƀ =Z|cA xȁp ޕxh$wz w# Ut߉]#OȍpVU1CXHgޯΜ?,ns~ Wyئ 1 ΕK)7xV>Xνkl?{ֆoex[UPGw$>붭j Z7EOڹKnS%]8G /'Cì:0:UgÇ=z-><Ӯ+C&tv˂zLwϊ+tzѢ)H Y Bv:j0 ߿vU9v>EhH j\:VsȽPc@soc̸6ٱuGKn^,bj5p۴u?a,DT19!ĹNb{-Oon4:1\7rS sr߽y?\$ԉɻDy!@$/y&Ϋyy__?ewsT(w8t^m^p؝|wWC6a եFXD}[* Wm:rV= wF3VHc[_'7r5X4m~M< c#"ʕvpe{@VaZR `ƐҦuV/raN {[5hJ\4ۺYjċ3{ufwc%(Vo xꢽ9w-ݣZҭ`PgWlڳpV`~ukbonijp! 0e+x*(>RA6777;;H6++Aꕈ(o_ e I?jQ0YYtolC (.5;<)ghcb,~޳y6OM/Opuuqvvrrh4{{a ByX`&` 2+#ySqx =)TrSR&tPNr(ZƉ̲Y> G "}ĘA p)SR+l*,e"eƧ훣P^dx{޾yVzcB@b!,u-R,n\W٫]gBD&I*X#e~`0\pjtu[]а<}1cAd EcbV,>8~$Pm#|sZ:5?XbR4s$P_ uUxCk{zz/CϋgYW1,=ꟂcV%#^z%#FUssE o(n'uX1,V L"ym!{xxV?Z-q4lçP(5 BT b b b b$)#=-;+S 7P(!ŗV^3d<^8:{2R(WLdKMN  rvq}*IO29ϵP()9;Sr#S*Y9Y޾~//P(Q?5%YT::9W.8dw^dc#Bp镚qjl=˽Y) % TʝV[ܕqj7feLP(/;NDs(jOZqD݆U"K Byip,WW< !XY"G*R(BP%7rAf}$ U ! +AX\) 5DAtB *5QCJP(/e+=X3[_ңt++Bx^gBa]?j$I U8>۶4NRϛP(0j Psb) Uy'g(ҫQiI8'gWA0z$IbO Je2Žץʿ`KDAy^qdYOX{š/A?^I B/ $L&0^ Byy=> Byq>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>R(u>k[,yx!}e.eKCZ 2mHLw/]LOuI.]J` g&iZ π'ߐB Bw߸̝L#ը5U;Qk7! O7\_;[qyTI?ɯJZVX|G߶ ԽGlr= o^W\tPϞ%'ſH-5(N?x緣1d8Wg?Sks)I~ojk@oSw3Znb$FeG[O[ V ~y;z?8iHya el9raߏ_|UGD#5ovۉ+"ʘ Smnd:6}?7n i=ʍ}|g+!ݲc): wh'{e3^~ߙyXQ͞u]Z3ĔrbmGo=X`.lت|0\lWo9t52j]nj[=(d۱fiFPsۆ{VBҫS?ROlXlxȷǎy˟dS^C[yG8uXwY8-3+5 k-tYDzLcCHޅU=n7'` $IRrG^myܓݴVM[tک#c ]qx^u7q3#<`ܫIVn*0$]~DztGL#8;G6[瀙KUoc QE ( Q#$V3\3kg}[G/<VJ̿zS _ҹ9sV͍3íSu\X5^޴`ޣDF;$=9G6Llg90 :Iyxn}d=[ 7k~;IV*c _ _i9aSN:UBp8|y絹5<@3E Nm?YP2U\rFN߻nOCca{fʜe!߻lYR/1xĂ 1fLu!!OmhΞ=5- 5RZ?D;S>@&蕛Q֐G~~3>nZ 2$vΩ: @Fl9h\ja< ؜lm4!n>b6v-<w,wfK}=ky9V/?kWs\JAJwo5\I`b{:>41z YSV|F8W4hmΈR%[&p4eI^Zr6UTv_n?&۴n^ώ}U؊oFLۢuV ]xBcǫTt0Qk$wh-mwM}ٞعhɻ ûS[뇯7X@k'X㹋yps~]oA _lfEH.ٌĺṭ9~XeIsUϻ(#1ofB]!+:$Yvʺ'*v!6KM!IDAT^<ϮozMuį{voo1>=T)/6\~1Q. [@Sh韘yQץ}\D`hs ^$"0*W{~a& c݇͞7<̾Y/XZH;t>mVioaxx qb89;r]L[TGMrmW%8;!)]ՓQ32p6˩Ϻܢm֡#R/ʑrPO1ޮvfcv8uG@2תo7wVLJy37׈ ?-?(Exjd8?(s ӝ߶ۑLY!gv6MiJ yV?o=ݘ^ۨgl={֬N 5IoHt y;031 k:k*I?)7 h7pJb [8?Na 3O[~qm݇g 6o.?X=2ğ:/~POoYU駷n4+ɬ r٣]_{ruwRZۨC~ڷiH)akk髽c5t IyM UƫxC49*I_xzḦ́]:Ʊֵ;v/>adtpֈ3ufCkU/i>-7c9i~Qw\0 OC{G(@xƆP3K\l"-۴MP(_߽h4*\BPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPCBPU4q+]>!!ī5͡<7\Q_ 8ɅaP1i<Gq=2cAB )H;wӒn $=zdU %*Prüba2` }jJrR?[ y^*i.q(w@c@b@@\mkãZ̙G$ P |EV-ګmz[m֋[[jkFA**o!7 y{3'$3RݿO̙sg>[UD_COlh@ȳ[Sѣ-5xz̈U;ҁޞ-UAK>޺#}pcSE2жMs@!jFDD(GQ""" dcg޾99-=r4/v sNb1*_XwhFANPD̄B0h, *6. 00`D@w03Sж#ᶳS$nk B0_RKD "pJ׽(D 2Ք1ȩ"~$IH9UKpLlH~< I""hyj$"PP G%KSDՔ1ȩ" SX@ȈJE*I޷UJ Nt9TkV77z8р 6<{~VS;n/[ذNMw[lsA"/ڲ%3!KpbZh)yeF,]"Jݵ{l8`/ :$F޻vw4F"/𨻈JD L~< lsetޘ靶wޝ+y>OյY%;i^mǟ~:!r+.vuU9țny4|rY?r~dfū;P4 uf~MC2ϯMxjqy?{c k`^>('^VL+o\U[տ}M 8`uOMt8l2i9v,㟄A")~DrPDLRE"No(L u{kn,^yC>f{ k}@G?3!+O]{[vE$<=y@f``zl" H=h]G'.6_12K_k/D7ɟy탃-?|EhOf Dl\̽gLX_޳,Mg/mk_/[ӇU %OgP,ȥ GuMK+gOwUY;\x5wz`]W[Yh񏬂ǿ5* _|Wxl_ᶢLK֭?oYz`DՏ?@ 9Cn ?prBr*,sIEȏ`ׯo=YJm5(oCSʆv퉯fYGHƹ>vld`` D 2%rX b"Ce"|ݹUh 1Q Wgi?bb??r i#z^0BŨol{^E܅~{qBöܐgwAٛV>{Gmx zhgw=52 s͟8 1NEF?wW2%ka߻qlsE,]IU"US%N%$DRkf #(jKQ~L_3@AwNvlw'Z6;gaGدQfbǡ!kwӶ945OGvtFU .Ǡ(:HUs2ټY#OW6~F(vޘ7l:6<52+N\S%"W^ԟ8r$X*wv^[ :πAtݹғ>lJ_]`CRBaKP;XYt1LmC?8s-6~MaEY09i$!\Iꌊ㮲^NƣcuRB~'M? )$3)@WaARiTV]I*?2jZ}S%`pVLp"uH\u/j.{݂7^z%R:OeH=5?xSKocÐU[EוŦG-T\-f˲ے7Q-Z+NՏ?hK;27ԴnЪL5@`I4eMKDo~~6ȏg l})`v%;z2aXF#C.&bڂy`Qc=>*"w!tOePaDUЀHFs Ĥf1t9#x7Nб/r79ɑ^n>uzElhshq6d`)IsESOr}GEWLLvqxa D=!y`F%C߼tbv+mm+Z~v8ꎈŽk5TNsڷ k y X%NEO d}8SU"DL]*TBzuaqs|9=7tJz[paᔩ,gLxܒ!.8F''Wͬu/1H`̑H̟9? Bp'4,5mǗf#9*{Լxy9UCZY椛253|yɋy)7%qQE$S5n}~U1ul'pэ#2O, F3GbO7> `V՜Y[wx 2l=V:As|/za wՅWw,2mߪ?WMêW]=/.~L,'i:Ky~R3iC&I2I)J}11]^X:6]zט/ s-[˿^`g ֪9<}ԧwb\P܉馚;D#iSfj=9_U?@.av_.q?@Eq sٷOH[>?H+II/lD:w)pFD(2[Tg iTL;U]1;͐{^*[T!Ttќ{/i?35 vot$!@=q^z5t}uLJtNi@Ni Lۈ@l9P+hbbnT։IvCavپghl6['7LaY&I~#YӺYfDu+nXFZ /R9=Dz_+sr 㜗э';ѥ1NO⠻ 4Ft/QѠ!cBq|ܵՒK[(\ijmW׼{M;iQ>(bB ͏s5j'۷\vsSġNm=- quANI.dBT2nR'60'Q -.z;S` rJ0s~4000 :Gas70008ᙙP [+o```/e)2Te|m]|>%PQG˲|ssm۶,QE𣁁2S*RKPyg```p "CE>!gٶ믾t;i```p WNG,˲|Nߦ'[ZZڤ9bU\bE%Odh,R1W8.jj#вV(vr&IRhsU x"a TA%  33`Сp@*\RxǴxgXJ I8A/tJ+Y T'X5; <'JOff͕ZDҠyG#3IRM lOd$E,R,EA`TJ$csV* h99 :e೥yxָeu0*TГK56X+JRqϩlK:W69z{-/MsB5="LcMC9GM1새H,TR"CA5.@K*\TUI.ATbJluAI* {@2::#0K umgB4b ,{8 NcέXO cxeް*zY'At&Qi[0*sejY$TR ,2(I%AbŀKRxx$ @@R&nuAXDE\<:闎ΉyltY5̬E+:WYԷ t-Odh,gXS ݵ&tY԰x:t'|us'IAt9#::P=qvDK UHL) %t1 I'IpfAbė==A  @$ H`R8x箓4^\RQgZy(AH0uYl,4^+-줣T,duBJA%KAR$,̩b $`<g+4 !"$12#APB3E"9D9ST!ֹSrNU:֙)!֙J"ɽ2UNg Vܒl lnIol_ΪuS1j@NPӛ,8[*V˟ ի[-:lV[-el ty0}",x0rǬ&mKol^u C|[;2x}Lho nrɍ ěn)9218q&aň⍺J.c臤-nQ[ fOeZg[+VZkeZZ K`I8DOU33[-eh_elYk[VZy\͙9S1Zsܣ|O#1 Kjթ2]ao6lef$Y œʭZ#չFɝZ#չnQ[l֭Zjկ f}Yѯf"VE'+toj77}e3-BY4)8AXi2x@qB\~-ixo=Ť ˕@x}Hho5/xNI1 ^Vn9'lYAQd'rB/p0I)G+X!,l80˒=ggqIt7^t~G{I H Ovw(8㓏YIq M<DϤHy8@%b!}p'ߦoihέZiZVWVVZkIrG9QIoTέZjVZh_jիV_ :]n͖ԶLvlZjիVZjիVZjjjիVxWo7:l |f&M;D>DrH 5u9 $q/,)h&BMOא)${9>Epoǧ/^4F\R $chfb'aRJ&eZ{RRćG.8߈u9Pp3*UֽSuJ*TRo^T*e-잙{*[=3XW[J\9cyq8\XyqʩRzeeI{RJ*^0F;PɰCl) ;gw۔ZcyOrfFRH8cFs <y HOH#+747^t~68G09 #?#ГDZ[e*. qt3yq<3D~bXw n i$, fmRIRaHckJ*TR@18%fN *TRzTR-J*T;IR^ʕ'^{/e콕2JL. [.>CˋVv.-c)YRze콬YRze콓*TRK»~hހE(drr M2܅42%!1Ǽ 3qo67m7vR ;l2LBPӝ/ z?I"发j@N9B\`-t~^Dg;?C4Dðq0v):0iGq';ߦoi3W2Z-U Яe+⽕ r!'F'Y(1\Z^{*^̇jիYڴZomVl[-ej bq`r\l#&X0(NKegV[-VZk»~ig.W47(!6B".H^CBdNOVLQ8,03gs~Bg"rR r)1DNxo/BȨHRi(̡&9c_]_+(c840KDP:QN =t2c n6+q=LR+\Cz3F̸kiF\biH [1mC [<[Eh3hɅ7ә/ o*ZU-U*TRRjZVUjZVUjTTZVUjZ^0FJBҞ~ensE;) W JbqrF<no&G  = _!2gܜ?_Nwx58"(W}X'ݙoy-mfmo? f]+VPS L! 82hdDž#xc!,x 6Vb ON mZjov16l[-el[-eI3F2M,`@r͐1&;-el[-el[+^0OCдŤaJ3|9JShĉܧqG$`g![O.O;הKO=NW&zr`b\^M۝ݝ@B KZ}gaEDPIÑ4do/cr7R% NCNA7ӗ/ o*UUJԩWJTRHɣiMv1@jqJ*_J*NRJ*^0F1% QI/0 DܧZw#ԚT>2e8XCB3rG$Ϥ$f_"dj%%@Qg?_v3{L.ѽ  UU)gxg]8u6BB2XBCc1X$,F#,kxf\AUQU9#\ ݝʄ9;@!1A"2Q aqr3Bs#04@PRbc$C?Cٰ,S`UKu+{UU?T_Q~*UU5UUT5lUUj_UU/)gUr.UYHXGVP_Q~.MUu/Q*UU]Eu/_CnN~).>93uaK$?yrY.O5-pg), tT\Hjğ/5y|^kpsR^ދ࿌S~\5p?Ec4gtO(Fñ4R㪁 7B ɂw(ߴ{sT06* 3" @nj4@iz`6bBA(r_gNathg=)ICFDh;EH'4vfV=c`mMDG5|%R!Eӂr%9wE.oߚ` fS( ۣOr%vprNűD 6n̔saqۚ3vTOvd_*xXzLW2J;\m@0[ g$ꨱ4txjJ{[<=$S99",G40EA>)r'?{'w=0PE¥BoNq_ T=HE]+T#9KvN12 f@>Ţ^H>T{ߚ*SݹU)oCK"yt 'z̡i1JiÑQ :;/guBN [Q׹^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzW^淥{ޕkzWX L_m_ T=c (=,G0sr ߳Ԏ2)sC >"½=K|n'RMi&]w_b@QcC{J=bmڵZ|־k_5kZ|־k_5kZ|־k_5kZ|־k_5kZ|ӾaWU/R5EkF2 h'8;\y'&Zkpb UP۽4lq\!RmJg7O?=4/ڴ'T Kϵ6`L.w @ aj6‡[Gg4QCBޑc_sHDNfrV? cK:]ο;;m_ T? wgwq9.dvDdrT(7\JIQ(_+#'%.;Ew;jJ@NwA9tNqj\*t3MnlVETw sHICI/d*\CNM)77 YLS&L@$ڮô1iiFO  ^;anν0;bg xo'h{?Ew;jJ7NG=SfEG4֓#hQx9 R.' BS#/b+e3cKԴbtsO T Z̜?7s˅Yׄ8DR= 1K˚D*L}#BR8sBF:LCNM)7;Tc)-: : eL> Wp8n؆›b!ñ0XmnC~# ظfP-n[kh;t"ˋgTG|m*~-3d1k& Nd##VI1J٬XfVoھxzND<܂&0ܓ;8p_QE3>FqzJdW6 aTOt*e=1F;\*m=vV1N bŝM_ݙMAO[p v+ V 万Nȓ:vK?|S){ 9ljIKt}vVX-BuWpXJQ,ԕ=7R|J*S~ /YgPӦK~X"=fTsx td%B=@wvھxz=Ꮲr.FtR s©I'Lbe;?QO%6I 3fv aT;TXr!Gvj7ӱp nvӵ2<D wGmfy^mK_TýAe4C -R8V}B3@Vw=92JfkdXIrP9˳m74`WFɠ& UZ;NN\HX n O.&`:puǒVGf}D ̠>1jJѲ8~;b+$K~,&ilx4` +I6R N%%F$+9MdF?sz?(ׇssrCcõ(52X0>/leoIQ7G{$6|ö^3؎qA=2?arSI~˺1 1m0|n.U*qݑdxl>C>)٦S"Tf7؋bz3 혾ҚCě_^x0sHFLK(' Q-+ JdD}lJqZȷ|Ccvs @2J" nh9%UsT&n)K`ScZmomD>0*zG (b1^C-,6d##=Y*Zrnr.+ bd'4`MeZ`"\ϲӚqPCkq{"qPaH%@"bQh#߲\ѾHWU/St{D3+~y`˱h;U=$߱8='qL1;x#DL)țl5/|:m1Qk'u쇴b3"ح&Sk*xL\Iq&ɍ-$SK֌EV0|][GeozsF3TH]T ذC mPzШSs"͹*HhM%2XTh1 ,&+pJ . 0lBhGdn]i >1jJ?tdJݾ F1QGryY o#~#*./mm_ T=Ii6jho=y 8w|R*Y?ab5ۂ;1j)+KN=<GÊђcs-1`ʎk:#qɡ-Ʊqcpz ⱛ&#QSKmi)B )܋mťStھx~u1}!HK ްy,MO% Kw8D 6C##=iW1xYŴj~:G`w$dE=܆7`v(i'Io-JQ7s Jp|%R$XIn\ 1ܷu[y&>׶Wt~" ~'@rkMܠ-'=N@O-ii'2Bq 5KZdU g2=^\rέP7n$yhFpӂˠ&LX\w!?[枫0$0GPil]:%ْ2GuJfJs-*f!}`qFltodE((A7B,QY060śpNxgZ6yB_!NOz2Q>IC9  ph ICg81jJ.Xӗ=cR& m*Y@=nLP Th6 \0Ôu&S'E#BtE)|m*WQٮZJD Qtdf,Q}c%1bs$(t״AhNsvJNFa!L+:;+|{cKFy)pM+7Cu H(=1# tm3n6aޕϚQ9tKw[S*n:ХLRDŽg' =+@;Lirpr?NJg ӷ8 o4&4ھxzEe(2W "#5Tdf0S^I't2p׶D'8̻$Ra=-KXtW ï#=yn4أHر;.ct`5bw &vK-AP'9ŷ)R! Ջ#4V8vh72;g]&tdĬ p:X)3{7wRKyk _Geoz,Be!L1$Ä &A?>?3.1hP$OUnwb{cA2'U_q5N&5*Qo&s٬!?xᶥ6WU/TMSyV&9-UL$Aڅص=+L0ǂӞKںF9S^l].6ji9DJ;u_Y6+=uvVݠXB/wXNz4mXo?z|%RKc$J~Ά싈69)CtXMh-bq&䜔/НT,X&`ʼn`h]ٹ:v$) W˨wnmm?D-ce=di\Cz??)İ.I 6d10b쟼*@(w;jJ*wX䯉Y[ey_;ҢSz<ZsOqshJH.w A|]v3ԼRG3<;+|PuYfrS6Qbߓw;jxWKޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+++ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ+ޢ*`vTFqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWEqWE[)!1AQaq P0?!a-.ʈF;઴B6 I߄mџ іaG'y]) O1P '&m,+, !@p.bd۟@ k8Yd@X*bPXbt Ca\wW>>##qs'TAHc m&$W ($o@(fÄ@m x9-C GG#D pN&@7_>E N !p eB6J%]`% D}P.@?_tE33Hq'&}2@ 9 h/ 2iGA(VYG䁱C\{fd7Y5{fY@?0 @w9!DCXP0dJp#M!r}:$;N?}62UE`WCt!r̞C`mO%*CQTiV#2/S-9֯0H?ND`Twpʌ5tpB>7rpߜ#m;|>JӸC& P5/mzpRw"YsL^2Fۉfƌ{_F#@w Ř<;VEb?35n2&/1y^bf 5o?]yq9#D3vZIN7IŀB p3" @Jdx1 -w¢¶._AhR?d9,kWX RXL%bh9\OsMDXz9e> ֔n;*XS3و` zCx!7XbٷPo_erW&MCm:pxAꁰi螉鞉螉x*<|KTORiboG% `zrz'CxNz l(@1Ǐ;W4 ͔ >ipyb2n1C Lgx8h(&R40}dž8ԒEHLus!!z'Cr3[x1C9DL!5m'LeKO 68zjbaaUEq:[[FҜ} NB!B!B!B!B!Byb:~Ӵ"5Mo oxC|҃qm[2`@uG  , &Fnb~<`iA]DPJt^3# SnPG*}A5#J`dEd7DSpΓ:̵+=gYu|zγ"mNE]!$0M lRи`@;M:x`5:N:G}jDAK`u!#l;Ÿqx FS!P@k#Y#Q ;Ol 'Cd>&a 'O&+K:>%T&*3$"0{(kXb$Fd17 |1 TJ`]i`eC| 3p4jɮgke3>* 0 $K~xZ_m0qsy:2B[PPHDR.`,FbOL$2n2 :psywvywyw{N` 8"T(e7;j3v@3p?-gyǼ5;йwy+WZ` 1*)(ʂ pDf(&6MmhD&6MmhD&6MmhD&6MmhD& o붟?o&X"GEdZXpJV`(/Q[Eځf:~:` ( Pt H s_ $(?0 ƿ`[(c#R|[6pa\O%"ėy"E  , apHj%_eYw2 |@i2H , %և&@ \4Dռb4'o불LugYYMbiu'YugXuSXAqnxE?Q؃FaJ3m:γ5:ubD)ugY;W(4`j@P(; I:"L3.6 1mox6񷍼mox6񷍼mox6񷍼mox6񷍼m6CBn`z@ lL6%dv-ä܀ T g?9s;%e7rrQI."V7m.BYpSd(bv tOq/:tNк `rK'{V!7X!z\߃][ fPAP堆)*K":m e,#'#RF]#p= 54vrlHT$OO +|Mwce37붍NX6i6񷍼moxr fڌ`/'dopb'h -lcx>񷏼mxѸ>Wޯ D&Ѕhw  0)Ef P0D1$q634Yp&ÙhX2 Al16q*C-yGÚ~~!I qPH@Mp`8p{^ 6p $!N &]榊aY bmhD&6Mv @`Y#K&L`0y?*@K FրΟDܜjfywL=c E+FsYݢP^г3iГJB 1- >x,phBA0fɈD% aL%2ѨhWI}ߋqkzkcɅ &d@PtM :J@&߁9f@+{CSV a@Zb6\upa%V0ےeu>x[ 9G(=1Kc1K9&c B`<. #WtňWrϐ{ sM i#:NX7$ tCË+v:NH" \-y:|L+*V>a#fXP^1"XhN!$Hvt'I3W" F`BhPJtfd21 !gJ̠JA9 nXQP9[W@w1a`@q* n2C 5%DJGq"m# @9Ӄ!梮Hѷmox Ͻm>.7P;\;P/&,Y%TW{˄kȀhFJ!A lGbaoVX%/|5 @,\Ȼ^ ؗhK`x 2En&I6*0Mpd3X 3[CD/f?lLP0WYmu6;@C$cvrFd*)aa(4',֞Цl-1 VŏyAZƆ-J1ij,g4_DA_-!I, Dž~g%i *}]o h|ÐHB]-c?~hcӀǏY4/isUmxӴG b_0ơY0T6-LAP ?X[]ʏ4xIƍxǂG֯2V, NF!N;Q `=EC @\wL.&i$Ʒ c]IKjXB hjHh8y;;&RJ,NL,zr ,:4^g)XHk؇]hk`mn%}3"^&lkd|!k߃B KT!d7 c AF/c/\ؓgm8NdcMɲ>҈&}Ykf@kP@ _vǧǏ4#=D4lqѢ1FFpT=N%xŀaf3K! &9Ț̴<T5TPMf#FVu֬Q&M O-iH2;Ns/J VX#7&`tpmmbJnBbŋ,v#Na73 a- @ Daet0^bՎE.nCd8 JBX}闷199ax_ZJP[!ޣoh8cuEH.H `u D/?/Q#}5@}:ý`@RЀcm߂L$zL5|B]5@` XzgꄌDڝa*,a|J 8fU(n19*!cЀlQCD`G̓/"ttBP_CAvB\7 nW"@YRf 0p8D y`eMЙ:wo부bcN1 ;#{D'118u]Jc%"WcY:3r`z91 BQ D,HHAz$Hx bŋ?J* Dž @E9 G!bBrS*|y$N^f1ȋKDYS.<&2̼39{!?:٠04^pv!q@C5 &IB C<&C$"ѶѬ}g@yG>}hѠ}Z(N?0J>04=pX,!4cJd<- 6Ѷ}%4mhB,hѣFC~$XaHɚ/8(91n y5ֳxQ)) ('_,g-b5ȕghPhfӸ"(93:x84pdvbdkfŋ,X7O P@x-PIhST`y5SM ~VU+x_A i\YVV^'5Hg^|a@䐖9\X9Q;$E]'Vz4Jl_(A$!2v_?ֹh~ (,hmFX@s[[h3~'ɑEvDě"@-ǀ4^cG#̰}B6 x9[80D6Em"Xvce(r;'Q@J  7!}>& ' "~AHܥBEi?w3<m zx ox)a=eázjn{F@q`0 LOLB fÉ(b&e aσeAEx1m|aTC0-E5 6q6(-QL0Pt|@7Zv`+Z+ZDv0 c! J#GhdžI*3;Ӵ 39.;N;NӴ;@9vivfviw5ivgiviwy||I#0,$c7H~sE@DAvD /MK7EXPDP;XB Pj%ӷ>e8T?#Xh(DyPARl @AFv dP@eqT4 D4j" Ilhd9|7ps 4GQLEbٚ D,z= `XQFFٕBង015t "Om gox@2u DJX{ Br|%fXĀ@'kV:DhO1Mؘ4V.1& f Y_,!BT/h98J&UC-U'CXJ`a!oH">*fV# x&7گO 1:N:N:N:C3'hHl@G# !D-12P0d.t'It'ItF'It'Iuy|\S3\1 Esm$BS`AD P4H"(@eQ2rh "p@x蕓@t21/a<,ߒδ!1ÏXS X|@6UC\_mZS%M?W6"Cz.p0fCL?0Q㩎 L= B-:s?12 2!~@7 %LA߼GִVWYR}Jf:pm4{F"Kcgt T4H j,%?F>c#q&66N0Gh` Uv Z@X5X/M LHXZ \ W2{1@*t^chi. u@[OHX+ Dv0@a JV+ Gh;Dv=xqgiZ wywywxk*d+z”]t$dD:}'aWn[hءVs;;;;sy||2 Y`4ºDPzp!AB(!AF VcRmS!xS7 rg-Q蠺 :"X LD *#7`,&0Z&':!ǯ%aM>1s '0JGẻ0eI"D@d7!P16j.$rS8HD^c@@prI6pE\A?_(b @ k\Xq1ANA #7o}TzN:ƐP(N:γ:N:Lq VM Ll&T4!f:ΰs:NOYt'Itgo鶟( jfPYjSS(B! % fN 4Ed`0$(VnA <@l2D3 X@C,BHz*:wy0p3IA `aO^ Uq ! TqxHn}ц@WD* Fg4ܺ6HbA(x% H q08y"_1M?:6D"#%P3a@Pl4,U%b k4_1'U=$P$-G! qK`k4c"b5wz 3:z#LMH Gu9m:Ko>%CA^  t!-94Lp6 =a&d`CxZT#@Bj  CwnJd$ ) .K&֊L=!bETK7O C!^p3'Wp'YHBم (abQ/8w YdC䘀rʕ,|pc&xv\UD?HDm$mB3j;ZIeZ̤ /ׁBЃ0$H I9YmV$XPE/1"EU`}mf v>P&Xte- Lq ċ,X=bĉ$H7O{(hC+b ئWpȥ>(aP@^pwROilI P٤QtPFjUltxbQP|aDu:rBr0 D.)L,u=M]"BliI4zLʉM_m8> a a @{\5Vo#+dB󉈲š$Ya#ywcIP (=Á 7 h F<CB J(-MdbH;*. `1@ p܁L`@ I$I$A $IA$m$h @AH$IW@$|9$s@\I $ I @H   $ I$ bA@ H?AI3 P@$AX@   EI$ $I$H$@#Mұ  #$0$I$IA$II$I$" @i  #,-nа5!h`D`$ W@ A$AH@P@ $$#$@2$] IB A @ ! H$ I$H$IA  BI$ lQG@H 䂵I c`@@ @ A $A&HHI$$@h I\ހ$ X^ I@ ,  $$H$ I$A@$$ !0H.@ I6H$@I $ @@#vH |$[eAT   $@$ @I$I$I$I$IA I$ (`H$FH@ E`@$E% $I$ $@ $@ I&^ $|EI)/0 @$H l H AI$ *DHɄ'@P@P@`@ @ M$IJ4 AA" $HI4H4 @  A$H$I$ II$@ I$I$I$II$, !1AQ0a @qP`p?*)?&v Bf% D $HT> dH12,ib'=q$=$֑3\zID?m! H uRE7_ &Qm8T syJ SRd@$% KPLP"BpAS !jUUUUUUUMv4;wd9QGY2:?s?t%-t'ϸ.0yYuYuøTs} BgFs !^{VgEHջO:ɗՓ༘3M=bό{W&=g͇'q`TO"EWGhayv7&(^~Θ3$WOd-M=}7G>1X|$.74nczxg҃c- =܂MU~~l#aNGfdCü~,r 4;Ȩ*7" O_vzv*1ޜ*WqXW)"#%p3ӛ ŅC|xUI0M<Ǒ)s?Oٰ~qa߫91ͼX28"lnW>XGqMw4;ϸSf`߭j!dj,>dU0:2!VM~1g5B{١־:*NgNK>nU0fwdد{W;H, ͘\>cTZL/1(&wgZD:Lߖ[:Jm~R=7,Z*+;q7B͇E .'Չ&cT*b (1T-Y_,f}}1td}`wƊ%NW!7|".\9E9o3W̘(K+ip%:u=wFVMfȯ+.l+[sotmuёл؇B6. :wO Zamz~tHTtRX"[\sQVcT;7Z^DM~"Uo C {'##uq|w3diss=f.*fdjuZN:D]Ksa] ȗOZ 6chIz4^t:MIIIA3W2%46F3&vY=n2auǁ:jowgK{s0dtReI3DFbGA ZD&ϰ&$j^V9'G2,_ɷUhG8v߾ >,!1A0Qa @qP`p?@>d?:>.٪cU>įF>fhW߳O58}tbש>ώ>Q>Q/" <>VT !}>eש!}>ƫSod?CdMXbuԓ׀|Dou%gj A$sT hrފDLhPqK2jI$dc:2I$KWZK0w8Tةt5ְq ѫ x DiOP εv8iG7?৷;&f6OrY"J)+ˣ"zFлlVZp T1mu5rȲAʗ5%yUT3شly}M'n T=j3)Fe&M}+GVe$Rv"سOM25SMepD3:E5cyw"{\Ƽ #&az6ŝpȲ}]v8 cv!(_*4 GUWOV~ί%Sf6Ld@sUc:&iHp|. {Lҿ3++u]lurb%`j=ڃ#BOc-q#Wךm*1چX+T޳ֿ]`瑍JRߟ52:&qg1TdJsrg:a vסRqY#wcPV,^?CיqaB܊ <=G#UR5 &@&Iл)CYEI"¾(#ZݫYN+FMyꂶsEߎE3%ةعbԙ47LPj0p36] gefkŕ!Zn]>YYk>⩵*lu\vA-U1æ\Zе%rhER"mnxqɚ->dy c\'4~g:}r,*|+3>=IrULnP\xb&!O?o*HmfRnRyiDR^_ۘOus'>jϺ2ߍUګMMq\w$WQNfc~Xt*uADz"OgbȮmH>D`ZZǁ~=Z"a\*9X+I3`X*oD%If7 E%.#zE`ypb Y޼EDرIJSpl̑modT*!1AQaq P0@?V0an[ D ?#д*Ra!*CiU|v4֝05lVd.ԥ6hs&ZүU/0Xizo3:\1R]T%ܽaDz|SR 8XaYUǘlg0XVk +['dK5=-<ݐP E25Eb8K.ߒvO?'d]DkE:x&iUo' Q}wO`.&9ͻDPsUhH,]z 6(J^vI5 iiZ$zjX΂ϻ3^"ʫ*ξ4/>O#mgzS@k< SE@5Sa % gKj*#{vy H_?:2nr",[#`~rWRW]Z@eĨ!34fLXGe\ozB/+Կ{_#h9!9GcQ 6Cր Dv& 4t \MYtb4ucV tiKCKr_*@p{KyU[V[>z`TEs]xކ6 Q)Av=gi/DǴ'Vs;$W -*2Ӱ bdY+)*˚(Υ>h&0l x űBEͶzh[??LQӂ"yj,b!y^Z'*tm\[ʝ/Q,K5.|#bZ޽%}UgɈj 9,j dQhx ,~Q0AX[/|H:-9+44jMK-P?BjU#UPsy ͨ\Ppߤ4"-4(p[b\jUF לaG L\ ٦"TXnQ L8m qgB15e3L:z֜-'xfRycEM6ElibF7:KnXg$G<4e/Z/Anz`%."6*byb6EB@Ų]q8Ϝ~?s|/>q8Ϝ~?s|?|>S'|>q8Ϝ'>q8Ϝ~?s/}O>g~0-f8uxU*bnVkU4!+wUx]\! 8WR}4j`kAJ5y:)I.0xf.YD JHvSzN'MG$Em6k:~@(=d5^".i};qkF: Si7/kǐ1D% S|cj odi(&s?)"-JDLIڙ LmV*k .0ù}>8 ;/k0bK /L Mg_#-vĦ.p}MϦ&]VN9Qead'=%P%m-`{N:-((8m[Kt`eN,J U ,Om1a1юR]<h=96U kFfӟYǟ+"\y4V[/ glu (A n?e7ם>|L.\i=4eo,io-/u2VMnD_d!ەusl r*5wVJV\|V27m/l CbLj[eyoo[-{}彾yoo[-{}彾yoo[-{}彾yoo[-{}彾x3>vhc}_#[6&" dX1" .-mSuF VЏ[W\qu~Y4ݺ-|t}`-'7oո01u~eJT&ORLje;q,f\ ~D`k ֥BJjފړ'`U=QyT:֡@U `V&?>JWSh,6JDxlUU>U>(>U>U Q_2ˏ"_KI/%n2I1)@oNT*F=bpiN.)uewFe¡Y^OyZFƙf"n[4;v.IO xSž<)O xSž<)O xSž<)O xSž<)O xWO>g~*hu^&xJ$WN.yҀֵ/"}m '`VF˴UwCd1=Ckiƒyp6 4UqghvT@/M9o7Q0 g"aqLD RTmxF5P2]SJ^ l‰XbdW%ƍUwv8YĆ38eb26p,AP#"~2gG,7n掠 dyjX(lUH깪P3݋Y}>V{,W8ƀѫF\S\2+mFX#hG@+t^&(R"[UvhD9_ޯGSJ՟=] } 9 ٫+?r]7g/Y_Lh1ܽ! ήOn0.L(iL~ū% SV#pr4./+eJnlͧ=iLh=iJUD дx!غ^A+bu#U#-P\n"mIx}sȭ*Nռx TwCV&Դ( ^<\va/i7>Ȱ+_9nu:"Hi\so6gטĒ*t-Fnj>ľ*W{K,-)-_iE*]>|h*8mxOh)=„>h#I{E Cp=<in{L8lƏ-xq-Ipz-cwqq8Tu4#xT.h_ !@ 6pwң()=8'=<h3e]Ox'=_nS  A3 4Ko\'˫tRZ c .wׇE졸eZc jc`NfsoJ &  4gK EXRĖKM8PBj T[oeBQ]x^kmH0qHM^Yid.4W> C-t)uJ,gcpCP*"+zA[^n1d4w3c2w/JSWXBxyNmLtVظvJtDDZ"(r\ K1S!öSiNӊ?< ^%\0*= 9UO)Sigi/&IWpBAuսВ㥍߹w V96GVLp1Z>hg?kp&lK4"n۩ⰵ~JQ29.4V1JaC=-tjh08 fz}Y,-75xTA|8"jRlP6ycrouIV͆~5JaWЃIc8h]@PP(!|kblF]]_U%ܼ|9!edhxXD} ik9;Ҡ7t1 m^O5S}_j).5/v͛TwcOб?es*i 9Q B:c\Ru_ O˗.\>-?J5w٫-S]锱jhD~T-ÎpaՕvC  \ALZÍE {)1x Ic`I1ӞWm0rm"" *SKY D ;aX tu_M(=-ôKr+2Nzqw$}?±V5< Te GFY*/{.fy~čIy)J$UDvR$;4yLWVl}J6_ ɹX Z6zfΟHEzΆutӇq0lKiNUO1 VwQDONzsӞY$3<3 ኀ+G1Hߣ*I}2UH,3$v,)tzV-`G'0$ Mu-|rc ,3!T{#9V=*e1"Az;ű76Rw.>ܱ>D9JJU9W_D-=^8xemJYqdު,Jx`3V'?h)ξ`rE[1rHၶ}|i=M_W c#I21UY[c눜;f U)L]ʍV`v 3`oidBa yn"i58+kKxpX˳nZBBh@bZo 1&fj)Zr . 1 NX$BV4<\[^EDe.~t2pmnգ-NT ԶʍB.]}} 3嵧4+/j}fq;V n 6 ;8kxtb~'|Ox|Y+P+$\O-;@O I"ʋJԹ%̍qE2[8jJ ;̃JL>o0[( LD#m)c F^`m4$s ŕDZ=7K#\m<PUDhveoiMA[&.+l8Oʅ,8^=_iOWz.hSr'}^}v}=_iRqo*V؅,BNt*g$u8ZL{NF` ^3qRN\F`:Bkkj9g.@qYl 'H֩b!%:f"e9Vj^CڴXz+t,)-TQt-CHXFz%)U@DA 0%mFU6Tn[mVo!jM@V7 *&@U.F3t/ݝ3y :al5)K}-=  @KBBݛV9? s+Po:? P.WlUMp^e .XJ ?:/"@U"cr \> :>; |;c^^<40 0e4e~Rɰ*`BA/Õ'[;B bQKsKfqODUr}OeWgW1S]oSȬ)~ɀR0ĤM7ds]\˶nA32{qmuuGP)K=Au@Ф8N5sH@< _Q`.g. NbtʼnLm x#?RxOyM~|Nۙ=k..N~L NxOy=}.{> >ztA0z Bq@NLҕ\Y3#;[KuH?*5zmz#@:bG-zlx2p M9nM5܈f*b!5X+ 8'Lr] +O#Z?) R'x{f:e{(CQz29jV Fgwyy}w`nzl@xpsE]֦(RցxBW/:x+S/Ѓ= " \޾J- b R ZF4.W(ֹݫKs+@2WQ,hSUv}E0#GY |9ٕX¸K]ޜ=mbhiTo(KJ9@l לB)<77$"c1Kk"궳7?9*<؍&lVģ scFѠXs|~R,VqYAzdCW+X.Bisn彺-Dɷ+MUuz Z}z 2 \oYs* *ZZ1 oḜaMj/ValՌ{x% * g>`-qIL'25Jg&>$ϼ->5\=&G(eM a Kԗ[. +m,j5 zo`*Bk>iTԕyu j殃'B;uSe. ( v9 73'gYV9;# ڏ䃩ݡ s<}~Bp,D4(ޏb^l{喏|/\X~ӭ6q=NS)NZR3xoHc!KC1^ gwm}\DJ5C-Y 2MBw<^[:*U!/iWYY啧}eD4g+ ȪAQr:{ \ Î񙯨lүCDc#T[P ]_W%ׯRbTK3 -[gdC0ZAvV6{-5oZ+Hd>vV^`bV u9w"xqjOG](2 ZvasrM`gXhZZs,=ļT'>{OGz>}GSOs#rvbqы9"Ѡ`oF0­TWo=eQ^KZjȃ/+qVS@l/-39fT,sU`@ Ԁ1Tb)ke]5[js(?0^x3~t9lpp^q&ƀ0Qb:bMm荃ٛ&/>Ռnm& ǟhk mFR`l)=' 's) bs ,cPT ïy_ݐ_: .-8^ZH() :Ü2xQU ױY >CV]Ţq u7{pVp˭ajQ3q澵MV-~H#uѼg1#/5tJ]MnKCEZKp #KYS@tfa[żNsLW'IyŔfդ{*PvjU"X˥JsD!Cfml@ߖ1 & QܡweTՓ̺a5` ">O=b?$@Yo7FTHMvsFCяL)V0,pևc!2"BhS"yAkAs`˫Ê=#&gfyg7lSOjMEb4 m[w%T~#Φ1XV{E,tjQKTj@V2_˭{w.%&|̠ڕTQ]YBD] ϚaV)JGFu S8j$hLS"FoyP'$e*(m5ǘ%@#pYLկJXa77o4(?t$O0K,mr!׉ttS%v q4O/JܩL0XEyXS\~A@;1%>C/!K5eLp+&L|t9iIS z x 8ΥcWV!Yr6+PU)ojP\3zlJr)+.ÖʜЭy93x?!# V0a7qc+2*5/|[A`mKWP#j@&.MJXGƷ~YA s_Zث =M0F*07[P4%mg> PZ@TRvg<( L~al\}U 4:"y~jctLPؘF f#رYWàPEZhu0*AX@4""+Ja.ÊX5a+5gCXc\j9QDudž5FRk1<8bnq şԞ9\J0 /,+bdjfV*5<)O xSIPKKDL ?_.Bjr2肀T>jkיF+ZDNVHuuM X6BR;(j=H,q69¡.=(+;(\9AfYc̸i"`pR?OR Bt&PY8kϥr,S`l:8='E t/jT;EpMl* 7C.3V*k j_M;!@by+b迼k(JM~k>˱XFȃT)å+.[IӡcQ-Q\,4pѣR Կ*m&\^[ {*hX*Ʋﺄ^l{k>|hL{O3yQVn('"]+؍aZ9.RV>~2P`.b,ej#+pcpkerP+%[6I=ЀwwH5#Ԛ ^n Rl]#;5Pd&cus׋qsWL![^c'p)}Őc;yKpXukػXi"Wyg=i_},_\nԬCè4Tk@+5!ClTRpHBgG_PҥT~IH_}FO>g~5p|Rd +ao)@܏iBE]xePZbϢf'",pU_1 LlݭZl\2P◈"Ur[wpA1S?FZB-7`.yN:Ssv1`_t:vO7껵6W{cMnRKm;:! |s,ޛ9cE?)*hWJ Dym\ߌ5,օ~'|O*YkO `Enݲ1hmf=+Nb6#Je^/1fkʽESUQKW}Bd7wmbeg".w鈅=]V|ƆZGS@XĦᷟ,Q国BJ `cv߫G@čkyF.׀[0cVl3{Ce`g1 mW __xHx4gx^Y'ksݞUY[[WM,]a^]8x!|)\(0N/SOs l0 j{M}!B8BW7Es&xZ7N׈ k䗕5mGSl+/>ӛ3W7b#6S47JN@cVCN|Sc3#:m22z(1rhˊym ܆_|J0@5-O~]}0 7.G$W%=/$? _5ݐS~_K; 0 Qe V[|s](jPW¥},͸4/d.Jm|V edUt|qr+_a,gD+ņ. $ՕŽg5h-Rg ^8Bl'T=ls fŭmZcXt(~  (G[ssWќb 6D*g>gÀ_2CE-g_>|hVrSg{m[O3g=T}:OOJWQz @ZUԲmJDV z􃁈iFB]SeuS\t+ E\0)Z12^E_OOGzU=R}:J_KI/%# nzThqZJcpxk!@.W%^.[f}؄R&/6b;ĺEUQU>6+b2ܴR,;Z8VOp A[¿c )y3lc1u"z)R7Eh¬LsR4,–`7ңQJytjġpEgZ?%J*TO.,K mNFW\Փ@pfy&cFƣa  ryTkv6wZxjFW`'wJ/ a&{EY &yw̰2;!U0c%Opfkڥ*VIWҔ8 vQlE(l(G&oJ3^Yni(ͭOd&'U~`T@C4TCP-krʑC ) XPȴƖ-Bb$/v3MO# DKXHA;p mD*(8GhhVRpw!֪?K~6x  X^x>Y 51{ejnMFjT>wgB9#w7D Ad1]o]qx 1UTbY'< F5?Q iNҷ 0rԦ{D5V+SiXSB D/SWPhN?sEJ~WEJv+M++USiNҝ;JvP@:5|OSW%2DM\Ģ hr@ ũӋq݈Mkjx[*+wtkH]PpV\`m5*tb6EFuPoeq.P":( e[/-YtWJ|U4DZY* X Z`rJ4b(Mh-u&-}w el2ˎ"{ " E7pX,˺Xi,ҕm3_#FˌҀQ7׈@ȕ+;Ǔ) ɋ}/f K41v|5 [cu"y>CkS9|_[|gs)SOv̕hjǔDNEO>?ZEҚFgAKD0e,ȃuHo[xfǤEͼl3`c0 π3=KAa`m{XlB?# +.hϜGIlUO,y*nӧ JzgكSNpGB}䧩iC0bOݧ5}RG .VdX6`t)@3n2֌.@]*-ε3@PT+%Bd5TN+^aŭT/ h , ;iU!RyJ(Ҳj_WYhk˦nm:6zh7R#yV9Ysǜ^( up-oT-j*&|0@EA~Ң@s.7jF4){5 ]&ܠPBrJ*|Ox@pAǘqHK*yjvS4 fU *<}6T@vAU 2NNzGC͑ 쫸ELt "oЯO< @a &@XoU:c#PC!@EMR/}F`SZK tVvjRҵP譪5ZJQ|+/ B^ѮxknFF2„j.aJuSͬAfg&M0M^xgx`S:%|/SWR7{K#q\k* #}g?ieTYXlEA}֢#hx8 TO0O4c9^=qѪ=]&R󏨗IKJhLb'yJE)ݹn~ʇӲ{ MSnJ( @rS K\Rl. 6n>L(P PC~J|>UMܘ)P@韍'5*ɇVZԤfl[X>j] uاƦ(y7ǭ)RnYWaqliBS cz"0Tݘ:qtzQŋ.Su2{HYTr#0}P읧S(:=,G+MqܣILjQNX7CC֡\nٴm'+T-*zE& W4Xᝍf zǼ_hμO.V=@XwO؀aUj%)Juva C*{jؕMQįBag_xRkk kuW:dnz~Ozf]Oz~)y:=h z\_gɿs߹o|3߹o7>Yϓ~ɿs߹o7|2 kk^df"|rɿs߹oi.gɿs߹o7|)ߙo7|>M&JveMK@^|>Eʿ/|>E"ϑ~ȿs_/|>E"ϑ~ȿs_|zϑ~ȿs_/|>E>Y"ϑ~ȿs_3|>E"ϑ~Y/|>E"ϑ~ >W*Subsurface-4.0.2/Documentation/images/ImportFromDC1.jpg000066400000000000000000000276631226345450700230130ustar00rootroot00000000000000JFIFHHC   '0"$'92<;8276?GZL?CUD67NkOU]`efe=KownbvZceaC..aA7Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa5, <OV9Y՝gdA$̒%ŋ PFir曜tD2,X " ˖*fhXB (f]1P<5yLdMmV&"4yYcV ڀ/1J%γPf@4"<. PTС$,P:˙)&3T2.XγB MDIjγPfb H ba@`$FxȱZLY<yYβҥl<':] : O¿xtU#!3X ,/q3,2K1&T 6['x1Ʌ)GOsw,e2Xiosw;2Xc,eO¿Bm %I;mv=f_XKbD͍1c[?WO¿F6Ŧ-1iLZbŦ-1iLZbŦ-1iLZbŦ-2m?OR3GHޟFA.!_%(&K.HoKf&6 Ml`&6 Ml`&2OF6Tk31Ͷfr5lfV,楞&7#xxe8 a!`- @ 0f=WO Y*\ԌւbPdsqR -њ\mb)p`-`Zk-f"`&`/5? T^1LZNVmM&m& [!xA3H4@uz ;&-BƝKF@ФDPGWO?i03.Pq2[d5``W55Y|4ܮ:hV`o%>ģEKS}mf,>~m23#22\̌̌Sܴ=xtOKM"3>?WfB\OLϦ\L?~64cM64cM64cM64cM64cM64cM64cM64cM64cM-y&Q1P @!0A`a?~9;>,=y: K%a+ XJV%a+ XJV%a+ XJV%a+ X?ϳsRJ*TRJ*TRJ*TRQK("(":>?x2Q(J%"Q5$!10@P A`a?J&2 rQO,,,,,,dž1 c͆1c1cFm&m&m&m&3Þ!BHR)11!12AQa"0Pq @RbrႱ?sB.CBvVČk %TpbP:\f.7qbskȦ$uXXa #tKӞbI ^$kw5/xyS1YLDy qrbj7wĴ97RERɼB°(n&'Q*ȩg&'[*xS!'oz V?Ec%hhJZIKLI1M G'C{XS/"^$#y,{R|5UZq"WeK+ŇbљSO*&bKɽb"TU{Xp<6+`O6L+( ւ<mcr˗.\r˗._m˗.\r˗.\rXF7;\;Q+m hVoX+'0Wީ)dWV?EcV=eL{# 8orĵª4G݊~anI1oeS;LˋGčF?8n[Il]%t[Il]%t[Il]%t[Il]%t[Ikc)m~DZQ0'̺©T"ib;HBĐ ~J*L|\|?>]6B~Ja&`{Cvoi$A-b8J棠xjW K^ū1rXPKexTݬyl5vjjk%V?Ecاb%Q>I6URyIg< >|>;PYnWQBy H&L\Ի2Q"\DWWSz{'x--i\2R?%P]Ťȸb$̌Ȋ~JcضY?r'Bt+2C(%J}v/)F(>dOܕM'Q/1X䭢Bo?iRDrӑcܹ4444.謧*!1AQaq0P@ ?!n'Y:MAMQMQMQMQMQMQMQMQMQMQMQMQMAMAMNV@qV*˩MGc C`kPV+hF'-BF kV…Qz˩\ iD}2 +ЗJ;BP*´03;(P12lPfx*̽鍌&bhÚH\ >2Ú($*i +,X\!R(Ihr`G(E]@j@ -YX`j prH98EG $TU:NuSTU:NuSTU:NuSTU:NuSTU:&eeXvE2ʪ 2 %GA$10r<*xR^ g[. aM̰X"@Y]ЖA~// XHQ CBvrɋ zABN*$LiHY9BP Neˤ`aAa}~2111111111111111𙈙>a ݑDIw q B& a,1NF% =5H *Pt{2ϑsP`d ,wD@~Zqq5²EyW,84X4b]xqqHFКUQtED]tED~?@O'ݴ2Y= ]tED]tED~?@O'H3~=~210s~k ! HA`@Xc̿|P Qa$"k m Jkztg|F\`R* ,9ԆP *@FX[޲S_}~2ee/odffffffffffff`y6eepYWkPH0 YTߨ"gxd24"A#p\a©B{Bc:g#dz/ N紏 NYx܌%z~l*+N;N;N;N;D&P.q;"9%ƲQD? T =~ }ٗy%@@CXڄa0#(UJ64Rg\c"W ab TM Pg n!ڝ' ];A+x L_Q%s~)f$^zC!zt0oҠD3T'Am 7[`چ`yz™ e4@!'~/5+(S90jP@5bU@WWW[CEEUl^و +0R0WH$`sX(R- hC LE=a J8{2SIV"L(BPrR2 ~/+' ѼUƎ23.A'i~u [`3w^Vب"Zݔ X2w̿عϳ/ ZP6%EWa#' 9$0/a>+#J)D4( Z!.)t&%ծ7 *`ٗ@)c/OPEU MaA,"4``Y JHTeV1IP"NFp(Ch|{2aCBSdz/Ea-5d-餺"XAfC AOvRVX5jR C"̤ #j2f  j5bSD>=~AТ#/k kXPhCSKh1 H/…-.M aص? T*A:BxBUX 1y@l @{(B*B @O6Edz/"jfjfkfjfA7Mbk]bkMy13<ט̿?8 )C8\>89Z98 ,/g\xe=c=aM<8$XJ3Kyr$l-of]"MqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqMqA8 $mmmI-6kv+-^vDYNw&oQ$I$I$I$I$I$I$I$I$HI$I$I$I$I$IEI$9gI$F$I I$I$I$I$HI$I$ $I$R $FI$I$I $m$MoI$I$I$I$1$I$I$/$I$I I$I$I$I$HI$I$I$I$ 9v@ $H $$8 I$I$ `aI$I  $I$I$I$H> I$~y'8$I$$I$I$I$ hA9I$8Ï$I"$I$I$I$Ibp$ h1CtrI$I$I$I$I&$I$J@`I$I$FV0@ I$I$O#oL&(I$I$I$I$*!A1Qa@ 0P`q?@PHhMPM'i3"ZDdze^)S:sǙ-,qe gS:Φu3LgS:Φu3LgS:Φu3LgS:eřt)yar ?/T:r #d\zQ)\zQ=W(̮Q^EHT/$R1Tþ_i}c߆:`~xx<%4 [{~ Ȥ~ƾclEdfg0W ,pwF &h)24!PP( bua-K_=]JC<&KQTh.3Ok:pKQ0V*:<[NGh΍/W姖Zyi姖Zyi姖Zyi姖ZXP-hZyi姖Zyi姖Zyi姖Zyi姖}WhAԁ5m @ 5C~0S">˗.\r|^ C[[ zCOt{MpV+5 M&v!OR\r˗.\1nҟW:=CIl/ExF,F>HXu@x2m%xfIud~9 U֗&PD8±ACd-!-QAi#*T\%c^+%XM**&ߎ:4&Z3W9_~3蝑;"vD'dKŅTE rg+rgtN蝑;"vD'dAo&aUW^:4Od! z#Odc@m\~mhM7La6 *jKzT؄*i5E d昶kNVǚ3?(Y\058 %QWWH-^euYA"nMgelҗXHd ߼4ji5ݚv\4 EgٵJ#YF΍/W)!/v '`N;v '`N;v '`N;v _"QF-hYxH)hXFK#H:0Rd h&e u~gOh]|`[v f.X4'4; P~++0¿C 8.YIfcn2ٓFNA4g8;k\Ϛc3*S`f܊ 8MX:?+7TB9u`^8̤1^= Kkb1yfmZՎːH%4U7QPc1vGlIV-DRע!RmJZx.;!@wV]4quSuyѿJأɝnָ:7Y+_sɧO&mLFLi w_ό/y$[Lcn2*S=uyѿpEkkNNN4jnל(@Jq!)jյc\)?qO6UoZ MCY=z@.O/)QQk4 :[[[[[[[r˗.\}Rp{{{{zZ?Subsurface-4.0.2/Documentation/images/ImportFromDC2.jpg000066400000000000000000000245621226345450700230070ustar00rootroot00000000000000JFIFHHC   !'#))'#&%,1?5,.;/%&6J7;ACFGF*4MRLDR?EFCC   C-&-CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC \=|bw,Iysft-RZ P.PU?GGyRE`Z[Y ]]*`\IVA'T*X rVэ]=5ֲΈY)gcPpMA50 & ıEZ PR sjHr3&DT\Ekg\ѭ@$9ʑfrf`XЀI Ibd+RLAҦzLK1$^* j`VhȱA,flPIPXj$JX (jdH&)QVP *$̊ ,PJ %TŪr劚^(Z"@I**c@區IX!Z<=qƘ͢(Li:_=XR@b+b`/cdӞumo=N(aP Y) YzvmK֧pۮ,z|@ 1b'|yl@:c\$DeY@P ¿+!30 "2A4@#1PI6$=;yչOE2i9}ϥaFhTsU*PAvK3 *+D\N6eKMzZvbQ-mCKK$R7k=Y$'}Z}T       :tKDv$\9z".IGJܒ\\"!zykq m6b[6K7DYDHm[۳vO~*\kqK~.AGtb/H{Ep@ QtK%,,-#aZݭ--RK Faaaahͬ-x1a^f4i1cLƙQLWRyyfL:\Qbζf|r-*W+R~6AGGRk!CL 2d4h# Wa1/T_4,Z*tjjjjjj 1_KI$I$I$E{G>s&Ȇ+|*SJ!!!!!!!!!!!!!!!!!!NiAAAt~2Vk;gsL~:Qpƣ51G j8cQpƣ51G j8cQp棇59aCjsPÚ@|e)Q !1@A02`ap?)R%JQ[NE駯DDJ=ξTQb]=s'qy^^_Z'}=mU-R-R-R-QR<]'\+ytB,Y,Dl.NJ=W* T,n ౸,n ౸,n ౸,n Y؊e,n ѽSnڽlE~YCr7+r7+r`ܮ ܮ ܮ ˰n\n\n]r`ܸ}EI$I$I$I$dI$I$I?%A !10@`a"?3<޽]/~E8Ei[PM5:KWꪛ$zVۈup]qKħd'4YYU&ܘjML\6Tt++q> -?Yv]Wq/zwmoE^ø|~;*S,٩U1WSKY؇RMm)+%5ZIU6Ij+*xKUFJW &?WA Tcgo(0.{ӯb.D;1\f&&&;T_C:t8qи?Q~>!S0A35Em(J}?}&9l'Qdq8N'q~ (>O>O>O>I:3 #`0F#aD.GsNj?3 C;.OԆq8Hwgzކ~~~~~wgzކwgzކwgzކwgzކgfzҪc)!1AQaq0 @P?!19  d*a3mo 0Us `PS ;VY"`PKHJ"  TGg0< Z(FHC8ԢNC9~:qq k@)%CZ.e;&]2cC ELzZY(Ax(HA{8"b؝L.1  8p0SD8&3,eZ& 3(o[$Q«iPE=K,:La(-_lcX '2HƬ pPG!_'O7n3q` 0g#=Fz3gQ*3{~Q=G(ߔ{~Q=G)j4# T5G(@ц'I:INt$'I:IMuZSpԞ?7ou،&5dk#YF5dk $ܘbŋ,Xbŀ)PQi5Mn_j"w5qw5淜ss;3; 3;L3;3;/"HO MQG&m(K-W p$}mmmm66m mm~{mvߏl;ݶm?%m;mm×{mmmmmm}t~mm~xumommmmǻmmߍmmm+mmIxmma[mm6k$I$-oI$I$mmmmm@M$*!Aa10Q @Pq`? .^¬7q)pM'Լm2CU4$άX/ Vא-v"C=9?r?J !(j|&qR0 r^P#<58&s:zWRM&uAHCOOq )n+~K8IJ~Ip-xǤWc% <.9SUԊGXPƣܩ i *9шf}ĺhDռȔSߺ{Krؿ {NX _~݅9KZ8_> f3c1ݧ6`"'0]A/$[@;$ShT+aS)e2e dblM16F&#dblM16F&ȭB$&&TKdbl 9HAAAA.g:m5 /_8S_|4 xkMVMʌT[H54GE$_#thN'RxHYqco%: |*g*pe{j)bYZBbTՏq iO#"fϫ[p#&\5C`V$"DY=v 6QZ:3X˺eˉ/ZZk|br/>i3-ymU3-!fl'[RS4YlR&=X0`嵂9OOOOOOOOOOOOK,0<+mơփ듍ԬjF 4\\^^^^^^\++ˆAB8!tTϻ0!Zݾr:uͼ%.53cdH\:AĹr˗.\C)"\Xa LY-<"g*L5.6dV3˗.\b=Lmը#Vmٹsnnfͻ76Vm۹p%@Z52f`w[ٷsfͻW6l۹sn͛ƮhL+=eqxF>&xb95C T[Q7\40|5:v%$KUQw(|20`y]5Q k(PXCFfS@ Qt j W8U p`*z^Ł$pyt}6eᘪ E_\1@ q0& z=gLiYW:eQ)Z3E~WH^:h~u-ʇld7Β続)J`1XvdBJ, Οو"Z@*jbz'݄+ȔSJ~O)%?DSJ~O)%?DSJ~O)%?D lKdbd=3o*5\ሦ+`tל :lTז" Hd*]*gX.LTi ==q_/{OTf\j  @ ɠlҜ{D^P5֓p.ESxSp!i/{Eˇ/y-W yǔ'%~'}٪:ot7o|3gM|Λ7:ot7o|3gM|Λ7:ot7o|3gM|Λ7:ot7'[sK'R}*@`ODnK\L[K`3ˉwʪ/VtMbZP M>p+@-LlAZC PPѡ @_5@@XpfqԯhK, ?-)d15wTxE6.Y_d%@x C!Lk. ߫SZ KĿ/KĿ#vQiMl>a}6h+Iٞ?’6!qĖ{g &Ķ$ֳJkMSHB6cV묯 b8˃ܛ(  #b[Yr2Lrk\Whzau\ݡ7gE5Z qV`Zr;WZfbW /.x(RJ*TRJe$+OlufPEjX\Ο:>|Ώ :_/M^G+WY^{eyuWY^{eyuWY^{eyuu5F D"-eyuH\35F@8@ د>YDư (|ˉKztR'eqykMo *ߧIn3sWwJ:Σ:3Σ:3Σ:0G|ucV}}$4ctf6iMlk_o6iMle/}6_iMmm}6h.Y=/JSubsurface-4.0.2/Documentation/images/InfoBox2.jpg000066400000000000000000001202031226345450700220330ustar00rootroot00000000000000JFIFHHC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Y g=#Y;F&&f (N+fk@: X6 TySD\fa4q\;ksZӮhEY/Bx]6zm/bS%k$$V f nf Ҕ)N|)73Y% TNUz0H@ka"E;J̽ kH *'.ii azo[l,-@*j@VÏWW_(HA\\E[9t鈀(hy\ k\mi]QS\(zΕ+s1ǞuSW(z>Qgտ8QQעz'DtjioeYw|rV]qsY7"#8I Vb@5y+h89ˎϵN>{_0\p0ӯ8QQעz&5;f3]r;e@03{O=V]?^P&y[D˷cgV[`QQעz'aidY՛zu6.v9%1cηuD5y+h. #O,rv;>z9kx?^9w޸8fpz-+kh- (hy\ k7r'Efjp^O \wem&y[F:aYI@fTk8ߴIRӰ; j :ZW/BxSnn%Qbb\nOK pQT \t@@u<^&HyfNk;17[5M^h&@$c1#@$ (hy\$ I@$rZ\;H4QmQ H$[Õ~IQQעzH$ Hxs4@@5y+hI@$WLN1$MDG^@ H H$ 4l5M^h&@$I" IQQעzH$ HQIQT9Yq @ @ @ @(hy\f,fj &@QMD5E^hݔՅ@QMD5j *ZW/A/;}b$ H@@@5yiQ &j @QSW_MD5@Q &6`0 045A!23"#1@B$CP`^/Zs/ֿZkֿZkieקO^=i1 5(c^=zzקO^=zzV4t4SGeK*iJʢDlX)V U`YtH)YR.>ϳ"Y1Q-(?g#7fy Y1buHwL3֎?UzlV%/Uz Xzk#CS*9*TTrROgvԔe<*vbTdT`zi k\W2̮es+\01X]읅4 !MIQ,>%̲S1m}/|hFxjyJ94~aAu yǍ۶Y}U0*b30㍱o"E/xH2;]!#ɦ1#% eq;v/*icq: DHEb)!y/M㍩۶Y}U\26Ae4`u4b"8ڝeVkt ٞm}Bv5c"jaqʰFaeL.Er)~Ir-Nݲ3,FBW+ݕm}1g48d&u!>lu29f܊o_>8ڝeۓ&>7+catDh8~,?DeÛȦ7b6nem6'lt.|qf;o xK# "Slrd>2=#{_ˇcatDVr)sfᑥ7Rܘ>8ڝeۓ/dKʺɃ㍱o"EPB73 3f?.,C.]ur`㍩۶Y}2bP/&Oq7]" &f,Hl?0r'WQ6YC\Ert34Ǐ6ne;ܯxSѴ;_KKcatDF gv85!ϞO# dLs%7ݶR>*~>8ڝeۓ)>K0dH*Mwͅxlt.|bBH%e#=+Q7Wt-8xS}.WGq,ܙUSB4+e\}6A1ap8Zl{6<Ûj 9;iۍ;]OSlrePnwExT '#~TeyoÏ6AABBD k*6e<P Xce}^0&&ؙZeە,` `c2,Ll'\ω&Xbe&Xbeܳf)3C7: DHJ0w ,%|Yg~c# |>E<T@ 1хHX6mXڱ,A cMUUUIU(5Y6o LQ(E f 'j!EMlgAw#x(Q:~﷬D߅ Y}L,%aA{9jzO{ӹ5yt;Lu=/j;I !1uRu=/j;EP8 S9w է+64#[7OelXoI%G^K9OuDI$ʕ*z|-7Yw" 2N@(Qֳqد 賐GuʬQcz{:|@qG;YճK0lLtjK@'T<@dD@4"zr0KMt%F=_:2Yh~y^Pa%`E+rT%IRT?( C&*P!RPܩTRJ'IRQ .+uP^ulZs:l+;X./OKo?ф{Yj;&NH #G\)IK U `JTor8qg 8 us| @Gd:Q9Y~Ai,sH@,΃{T6våL9G#7#j!5;Y֋J*n&5Z 4Hf'L܇(x3l/˄h-i]GPl/4 gkp&FBޖ /0&8sI8FBދm[># ܾ1J  F(<;k)4# ܾ)JS2u7l#@hΖ+\i4ףRFcCoWҽ??Ha Fu8O;&ӼƦs?SFa7e*Tjٲ.h4 pǂS9BȦSyF3 +<-~K 5aEtGkwe 8hBTzh ݝÛԁ65n AV4 f wz .ش2*31/4 6[?r5MpܟBi0Og^O0#Un(Z۱{ &g{<-I"o7"RܪkP<Bѹ[]瀉Yp:Lk J .ķ:f?-P?U@h- FC uiMyݔrd ķ(V G6Qh`Kz@a6v { O*eFӠ4 t3]3N-:U?7wmIYgrq *U ,RM>>c$cݍPE FI8M"IC:tkw\+ٚgDLj鈌AL&8h ziO?0]?0M`t\>6a5F0G~=GMq٥{M. 犎qn'1t׵[i7h ?1(nH7?>7Qyڹ~FM@a6Vn`j meG]sN:}>A܊HʦV?&Q4 =x(O}׉R |tIMpkQ* voɷ}fMh =WU͍ Q &gEC5q=MJ*UnT%q5Qd=tLo)]6Sh420 &tr(Rl5ljG3PӶѨ%p3ϯ* >v8Ms?ݔyLXӸB,#@?S?1]"`sQ ,iaNdR\&dٴd/qUi0u ]0BYZGC:`ܩ= LS% [ۢʮs\ U'^`'@Tِv:,DPZʹ%1}tF_6q=`so.n%#@ޥt*;/, ; #Da60KA\vaR`\F7wCA s uPF n?8 s}4`O aӌxlG!PJE\-wi &ێL]'4p ̟l4OክNͅɎ%Rn*jXFT¨ۇyRJ*TYRJ@Uuˇ2Jo3Se.ʟֈ"Xwjmʒ>~T+~),0p2$'{n*1qBYp)k eR>vذ :sNC@oQM\L<:__vt}e˲}Ja(fp};:Z1om'̕S`}N*8A6|@y}uqt]W@ D^+}JϥvotCZԹQhU*&Nu0nϤ*] Hm+:p8r7M9tf}=8;Gn^NC@2bVw,&|kQJyk* ^5~5~O/E@e3ޕU\kyM;*şB2&Ԝ.6'D.jAŻ"g@Tu)$T 86>k9z-1|#o*aS\[Lobc"}eԄMDi '}P!/V`\9A|;)By|E64 j 'AeO@04@!1 "04AQq23ar@Bs#bRP$`c?^ۿ ,cwU:$k3k3k3k3k3k3k3k3k3KzwK#`ޗVjz_ZK]5k/#tò竺gLVҦ'DQ7XggL]5k/wծޗVjz_ZK]5k/wծޗWgL$ڙ50E3Y3:pv**ӟVn1(~N(A56-M1SorBeSZ>eSZ>eSZ>eSP+>a_ݻ&;=!9}ت^ppϰC(EKL6zݱ9v>7!wQ&M.=u>a8li~Xl6蘕T8\* 0b h (aFM\]U8z> FI !=P7^eEM9evޭl Wp95riuT$#UÆ $!mpOyHJ9&SV7D4~I.&M.RYw賔|@yqGQ;Z0ALn~87nMkOlHj r$q -7IƎi2j#Y$hgnE΅kg@ꧪ&ϰCBv>a8ǩl1?5tgݵ8,u D qS|ѳəP!wbˠWA|ZVZn Ѝ㠫HL_?&а\GW |t4`zXlnj V& l4#D6M.&;Lhh>(. ] =ݳxnuʔUl0W81%V@ӵaOYЍ|/Uɥ9S\ҿ>a8ǩ{;`ȘFHγ-Mp8eF]\]n) 70?}QMm$fQOڵ^fqFSEZ6'p 4:ϰCϰCa8Ǫk詙i9*gHL_CsfZb- vZF|>)qdd 恻jOUɥ 0уi*ÄD] G?H0?}Q)C OJڴ݄+Dv l@W#.uiwAW&[#41dS-MJ :vQ;oS 44`x>y쩮k>`+VsC1U]B.t{W,DOͶU v0So6b4?FI)3?&$5OnnѷEBYT:v.]AvvpDJbXJ4vV+bXQ2j_]p%ُ*[tAh ݸϰCa+Ӽ:4ɛ30D`^k-ZrͽtyInEveZsma_BB 4",Fe:+lQTIFpN 2 -)w &t4LnH3Q < /`w.> 46_ Q;#wN&%:4g7 ܃whOh>(lٛH{.v7g,.tAMO`NtJؒ7)6f:ϣ0[fdbln7K$BoKH!Z^/ɍ8#ϰC!|2\7M#ϰCbO 2d^'>pjhj׊iu-vI툰t|@S%?V)Vдs[x$ھ'=k /8EůTɥ\ոs)I {` IP,џ0?}M1Z1PhMۆD *4Lݎ*]KofXa>aVJib76cK 0'H|@yE#*F turizsZx:m$ڝ zf͙7ꅰ^6"ɖh{> v 54g4a W& ʳ& >ah#xh9uri4`ovoK3ϰW<Hɦ֦Ӹk4is YK-f8Z.p\k4is YK-f8Z.p\k4is YK-f8Z.p\k4is YK-f8Z.p\k4ish\pU6'-b8Z.p\k)sR XK-b8Z.p\k)sR XK-b8Z.p\k)sR XK-b8Z.p\k)sR XK-b8Z.p\k¨Vcc*!1 AQaq0@`?!N+oݣDy. a(ޏ#z=,1`@?a2(=(P:@`F l@4 8~~~jf,;݊ʲ )giƪ #hN!k qZO????bD#GH' {mQՒYX%Mܣ9CCx!IE ̂%63Pk(3DH%8AEup A%!!!]GraZZh*š!,JZcr(Be8@AUUD)@BEX u,; 5 g篂BYꂫP$fh 5o$&Wq^Bh  @orJ%.p )J[Fr4?')9OJ~N[ri?" : Fۮa5+7P@Qϰ~mԜ/{hؘِ5/ȴ  CN3BVC)]Pa܇zJzJzJzJ{J{J{J{J{JRTϊ(ziMJai *= PO/ d`#m `<=NHL -? Pg! 3Ej>O&PJ׼0nS~@lT=5X G.'EUPt4Սh*3k> 6DHfie76wv2o̠Ltymt۟F-{Cݡ ., ڇxhj* u*(8XB45k"lTZ(Bi /-AFp`qh{0X`72H +V!l%#UP|>4 y|[C3q Bfx_+`<{~ ܦXoY اnfQ&4g @V@$4BzBgXtɛwv6z`720煃1`y`;yK"39XMBu:(hl OhfxM5ɮΉmqh{`72ycE85)觖{C y𮻻}Z[AU"%.oc4 |[C3oIc èL6ô=e Poe|$v*i_JrX=n\f f( *$T:uZ/X @d~@()bpL5ioKl{C3oi+Bꅚԟywv ?qWJ-( ev] %7ҟXkABH!˅,AN6:΁t@ 8 4r&dB*~u!BszǴ3<&  ,~@3`<pas \7Ԁ"s58c$/P_-Ks2X=nR^| X4S51&/V~q_?F$v$PR 1'i{X\TL<[C3od.B 6ô="4yD-E^|^,_po7.U08hJ5YQzr UU*_(Z3<'Zs`<ᓁ8"\Ψcy`;yp 7@+e@*lԋSΕT!~ ,Z؄Jƫ 6"NFֿH9Zc];#!IAE`+D ,×@!=":Dt:Dt=ο j:>cIP2UVAEi@ &H@ İ)8-o6Fg +FsssRsssaYJW_h;P9,"KNL@}\!¡w9޼ @-4j5ED?*d>Fe˭ԹUUaVrƆ%hm lAaso (cSφXbr6<{~ ܸ]S]`rhεji>B"z)C!S)-2`x6gC 6 0s 9A7S@#򳑁n nPCX2*3_r*AG(fGhBk*}x3<& y`̓h;;Cn<`2Wq^K/瓶,_po7.AzK#ALrYVT,t4yWRMsh+Ɯ 6 0s}\T#^0(ce'{C.0$fH'ŐE{Po:aՀ!*[cv|6 6ô= π̎ 'xa6Hi^|]X ?u7vr.&/Մ:16M~Gj/DS)`hz] b,mn_ȢaW 3PHͱ< jX߈:$@&/Ymqh{DЁ 9a,]P:G+c g:%J:fU6 ?łh$F ܾ,_po7.MR#@DY $⩈whӵHճ] @\J}0F`QB=pd!"KkyUH$ ѥBN:wj5oľ*4-2h\mqh{C@Ԅ_ sYRE͠:gJpً(8 yn@],_po7.shdBano ViYQlZtEz}8[fxj !^`̓h;;C^ zUk:@ 9D(LY@qMLPJ9Z-y`;yp2&D$yp Ӵ(JHg~aJBY #]!9z Y*;`7oo>p +83`<. dsOu5П㐠0߀9t*N XcI(4 r|{C%P&w mj0ƴ|T IYPCϴa*yV-Dcut@P+ n%Qs,L K%Z&G8wc[fxM$*iFT련2vY<CbF 0+Xg%9)~Ti `%9)NJrSZTu)%lD1}D"rMK(k=Nn\@?GҌb$"B '\4q?f2@@ q)4 "pQ.2" i8`V/Hk#!Cwz ! r$X7D5bHѣ"sdἦ>QSa瀩?')9O~B?') [HMhJڢD4 #]~@,h "D4i!CHT'?%Py hD7 e_po7.@$n$4~Qꡯh*Y5 : M<2n:AO $ZR!0P 9h(GqUGԳ3oŇ(AxO9@6VBEY@7莑":DtV#\ v kyB|DGPC2":E#:/T/ Vyׂ:9@**`ܐ֑HE=6ș!"Jj5Yp 5w(A~i#(JV$%`ij3xqH:vEEEAqlL*l%ѝc:u gXΰ#P`yAG taʐS/O7TG3"㏋AT1c:u3gYu7 ! M^<5ED(:BN#9𠬉;CLE%/`#J "T0!RE8K .VPA3a`9wvv|$`hD|*SD{CTf\F(rUh RHY]ܲ,:Ґ bg9K5y@rH !cZCAuon@ˑ~0< Rd0fx<5,= ,` 4 6}NEPAXKn!>QUV6Ϝʵ)2HEQB/ /S>g@@Y6QP[qr@ {9|23`<UlHaA!4H2*S֊Jj7l x"d>|,_po) !Aҋm\B TGp?sUB)+n:4U >t!ҡFU958Ik3<&.?twvt oNDmJ5ADHr9KIZU u7 FR#KDw>hD:1'r:rEʊ2 (q A-HQr, B(S 2% @& Aa ! [sܡeܧ;sܡ #8H4}+'EP=s7'i3n!S8|Cag$JA]i2*!> $N@P$hPy(#TRК@*zSq:-H5u +??)"E [B#8QYVU V:T@*y}B^{QLp B`0jMbkD@V(&rWZWoVn FaЏF@4'!ͤL$6Ӳx]B @;QXȎb\{ ,_X0[Pb׬F!}-.K @RlDZF傕!Q]EhdP%ȂDs H@BEZe1ClAaM0!A xku7 ?Xtħp\*r3`<.o|hŨ ԍe:չd\a78gc_l ]rLFV+3 >9 mqh{a7l>xA7Eu7 ?Xv 6BP9R +߲& =ο\%%QyQE"(ET1EEPQPEQR( 2fr9.3gXIqc:u#:uQc:uαc:K$uc:uu{~ < D `?Xva6 0Io03z7gyo3ѼF =o3Ѽo3ѼFwz7`g =ogyF=o3ѼCwz7e\D Q@f(8(`(Q@f(,QE(QE@@k El $ܒI$J"$,MumTflim HLI)%`stAw",JIw=R5K,IdݖOm OE$ @7m.mmOƀ[HOE[i!MN$K-ըvޒ((Y%@H$J$mIII RT A$km l CmI$IRHNmmmQi#7RI$$I!sI,I,I%@H~'xmڒW6m mYl@HmPbm$=Hek޲JKbٶi"fem RJ&II$xQHywp0K\YAi m3M]R!i  ]m(I$%[x ZnsK%e[pW[l0KdmׁEmm׽նk@H҂"lm%}~mR'$ H'm im_zH moDM O}HdwIN/[iw3Jd1^fמ)0&Z6[ mєvhmmh}Hm}Qoioommmm @mnm}}m[[oom mmmߍm}H{nnmm?V--۵[e|nmm/ +!1A0@Qaq Pp?)u,e 4j6 ѷ)@F5M;jwRw͂(s2s"z|T Zl/sKe` Y;&o]̱ueG+{>u7h11wxNҾf~sGk}ۀ/DCJfO}3lsC4SxW(/gGp{(5%c[˺C ~ᙝ#d[xDHTW{=ė^P0a T8:C-\kivl7=xG5;8~&v,#L"fxɎg82.f= \XwXL^=Ƭ jqc ~Zxbn!mK_ShĖxnw1_ sre'>Ӆ}M鸛dw`F/v&DNWLp]ncFY}aK+g_/ɏ][>5sTn+QN2+ wy=Mb]s1 <%pp5L)̮ZJ)v_ Tq x~&Ӈ;\N9BּsG5)["g^p_᭞k55O*Vv"kn>@A=|34 `u 9DLr)XAJ;N{o!ۉSt&#)YQp٧,KaL?eۣJDQtD!{u{KX/ޥSOGi54e/7Ѩ6EpPYur{* zNbsӞ!P2Z\LThKQ93939393908ęڥSc  j9YKpd(ud'Y:NSԕy ä,0 L:s:s:se_!Yn2exfW99j[n2eq-*m}9ӨjRJ@ D8ڼ[U8~ajֹ2+~I;Z{ 6 m|Ƃ˂uo2dWrS/8_({7;c0~.&Kov7b v5q9x>.䩊`b[A85GyL`%Kf-%̻mxiqFdl ;c( ө~#QE],G"8Y}ç_zZ׽ >9[%Q,,ylz%EyrveݯHEis9I^@`C5G0k,ylvݵV/8..hrh5"q+^|~K6>_.b  F\9Q=;y3ܥLš KUב j7ѩqClJ B̹P-Q=^@\*/^3ZQ@4Ey",6%908ԺK[BV A!ܶn0(%TŘ\%K%%'*r S9RAZ~{ˆe-#v*eQ(Dr1 0<s+x.^:Q \`+@J`9s/7ĘO?K"oQU-?H?i2GJ.ٷu.n/͖3Ef&B\? !?3.c+ק*!1 A0Qaq@`?Gqq 4hѣF4hѣF4hѣFl.888886јѣF4hѣF/.Q`R#b1Ѓb1F#͢1F] 0QlTQcvQEQEIkQ@+\,?.sMv `">!K݅ #ؚmK60n~Ӟ9~n}OIBg-v[ł&E (D` H *=vc)#X K̻݅4.`mC5fc?h`)f.v /%S4.`m4 ws4+v=K݅-A0榃mK fP1&!r 00}4v[@ t!MGpmKFR?K?ip?9@ @ۗxLegʃ$3څ4mK*H >@R7}8a[О9 4# `Hd-$ Hhh%X9vMv& ܌| DAs@57oD{$^.ߘ(%nhƆ-= 6G(C @\5y_~)2cPe rL#ZLe) RPsy4.b7`yy ~) N,BB:=d- 8b$*nHlQ$ɦtNϘB`D&ZtxM/>@Ap;+`+(wb)nOP d9.2i`/=o)=PIҳr!N25 -:k.9K~M6؇It)CHBwЊ8i$p%\V߉bױP<щ_b%]G#=5!Ĉ4<ϼd- aձԸJD)(0ij%_ ge7Mv ~V4^_ ] @/!if*B By8y4v[D\Z w$j|`CCMCN\LpMv& :~t\(Gѝgš!CvCRkcɦK݀60p7<@-4- K{σ \M6SA&wyg뗨,]4|#^{ק WOh9I|C):d` &oo&Nb65:|b1F#b;:M=++lDat8JCPyB ,1`QB(0qpP1TR+MP9TK  p_- " 8YU!` Ď(_x#tA|GQEQEX@!!-!4.cH  }ABפ5}|?T$r QJJÖg8ycH`K1FXQS @^X(E7fM:Db1v+z|\`,}Rg$C(zn `('x87@ET(t qkp#9Xtf'|2#HG%@0~/p:G{_\mo @ $ A#ly6$"=zd%n_)Ad^ w8iQ\')#mK>>L}``,I Lt}-ɉep mLeA+ˆ+!@u$ {LaɦtP?qP9jyE>~"x>&y @| iat+AE``C|*@cYiRSj}ri].ć]!oL Oݠ`QԝEx?0o^\G7d\ 06ɦK݀,, E/ !ވ 1QDEY[o'|k#i]AkM`o C 44h4;fP'(nX/ш"?cD - {0 -Iws9q>٬I 49ee` 2ӻoT[ U6m[qoR)u z.]0Np u}r}OFQ1^k3"4A w h !;PÈb1yTMU_1(!10* ?*0I.V0n׎;݀Z87q |!MxEos~K/ X,e`;l!h-yl8|UsH|5Yk@Pf~C $! EKb/E[wMa+wX"@ mZSCzTYx#tfdOT҇0$4up6 h!TN9Q`$Z]!*vMV&ric&^Ts,"% *ƺ|t#!A`ri]9 x[&@sR_`縿 +B {v 7!)M2]94B8@6a " a^ьaХhxrd/!/ ,z6ɦK݀S|&Bn&E؋Ð A|o&.vMd'&E؋Ð A|6ɦK݀S|&Ahxrd/!M2]{|M2 94.x(DQE"(QEQE"EQET(Vf3 .3c1tc0f30a&3Hf3 avAxrd/!M2]`b1 F#1F"1b1F#1F"1 V#1Fb1EDb1b01F\F#F#QF_c)!1AaQq 0`?ѕ]xnwQVi/N t+o+o%NDlG^7$I$B"פd4jM*hPSX^ 4K,/9وd5 #M-\I$I$I$@Y J*tʝH"h+ o6 iI}ƞZ( T0)ro`k/N:~^ :B" OD;ӔQD$ӥ4N33PuEhK{bXGkV{ZJVa5l{07PC5ߘAAA-8QN'{ÖNg)3s*=a  p@/|`u0:sJ 95]UJ8ἰiq#Ԑ5n_/}>Eë`%SV]7 J01ZLkaAJ̦ LJ&t&/=Ye[ajMo%ى_/}>EϢg{Ng{Ng%\LxUcȚ7YQՁ|Uf U<㈮T0-LG ~&FàlTiHsjQo;&-y@_/ Ń+,V=PM Xcc^ M3;f& M zʁ 4bu7V!Hb豰= pV,;]&3ft|-"0Uȸ&Mjh;nb;  8\ڜO0-΀+ %>WX %G=ⷶ1mwWܱEYz4],8먀 B_k:}=?LD=?O耐! gHٴئbG#.?fz!&h)P`-aH+Ij#Yuv2cT"SV WfHP"U X<;gPݵ7x&L!PVz^ t\B1r|Eyr~NOۉۉq9?n#ܻ.V%H)QɱqƱ@Tyדb= v/?j5!Itc]Jj^6%3UZ5*i ۯM:Vae/s/|ˎlBuӼQӽҢ~V9$= lGu \/|*n >w/J^ ^A=QЙqlDYQ՟QP S7UuXJbTۜn0=z;BD&`- L(h袄r.\\?H1rD;蛜{T d+ vLwLU#H'_^4P*VhZuV4 ljWUrPQ:-2÷Wy?!Iz"+DpV'f^_[dp0JT+ўڄ<`>o6~P>3::@, Z`Z7 EbҞ+Stvk%WnJ,@}6+M =g푂,VvZskZ-:f`֣/ iנ(4'# #~2پ?jy'75#ൡvfEY]QVEMۜWHRq@PAVzŵ X5֠kK{i4.\ss:A.\Ye˗sw>C͗۩K.,˗ir˼rirR:˗KDd>?(EY򟨞)P3y4y*NC#.3XjhVGe1P abf eT_iV"[7ǻ_2YK_2e/yw̾e^̾`䋖w̾eNиiJҎV6~P>3:PA^̖ozcы{Ll2fE4.zSaYV\3:2rhӖ%IeU,؉@Zp!* +[V,N.\YK.lLshֳ.0[16^sjy'jGW{_ bޏ϶Da6~P>3:X(6n觥lzPVĸ>d%'̬ d ^4ō:Em)cFӈ*`@9j3TIuca&ȁ!jy,K X*!MAj3{ҡmoS`U:Ȫ26c~!F t5q-UŧFzGF:5=u{;@-PiGYYQՆ" ]VRߤ,6;\Wr7B y* \&(ED+ N6ȅ8Z5Ҙ8L:HyZN,pg!f zGDI҂!ftGJ CHP<,_b?2,ʊom&&(l((%mC\Ge쭃yr.\)r.\jE.\cc:xl}guc kxi*4dH4RyZ1e1[AWX,lM-S>A<:JzyEaТ㤥Š){׏_*Yq|Co?l⤁n!_(J乊GDKyt<א߷ԎoB,ϨR Xm04s cUv ׶~,o]`n;g% #c:ӈ6vPMS3`T%\sf\ ˗.,˗./ lx!fߨuqUl1eNgaϢqv0:.o%u{2ٿ&g}GV $< _ES-[tك lLeE!8Kٛ!@;j_`ZK鱘'K(LB{g:A.\YK.l(쎾'~Ԩkb/ML xtk4`jSe=OFSzL1~2XUi֍ v#F%=OFSєSєe=GIOFSє`6aۆSєe= M9ӑ9Yi/ŌY^u]X5%|T8("8F+jƵf*aCR󾘶[y`OG>j1hmerJ6erJW@%r{+jԕ+W'>} eSy3gʳ/RnHɵ 78=q|e ,5j4#C2:3Y:1Ot;0yl[e\e["eX׬-ze[}_xo}fk!@ Ipfe?()UMk$ƚ/xS[GԖ8`n`sWQR e=iszʹ|3gA.\YK.f]!fјO.\Fs~Ir7h)rOir/yri^hǓg> N"lT0V2P@(S:U$L:Xj(uWPX!] I+C;M+Sɔ)T~~2ٴf[@|#CYIdSᑀ GjV/g> NyԄ"`zY5;`jhg5x.w)hzqR1zEŠh)AIb&O(jC]!jyo>Cͣ0>íABg_.Kj{HV?CR:C|+&g}GVAu᭺B`,0mI DP[ʥvP~}^΅3oZQ= _brˊ.\C?l3!t;y?%Pקu4 |u|R?AB,ϨSKnh[Zj~)t֋`(ALg iZHV+ \e"Q^2.M~3o'_{. :lɩ<!fј<6*\p(TF&}oU/(El.m+L-k^!Ԛ~ѩg^&Uо^M"Ͽ5;hқJɨ\y)X몢2]eZjaJ=}H(Ӡ`?a(@KZK+]..u.h̫mPw=4h+ `]}HSHnjĹsR\IP/3>C?l0 3k첫tR@(hOT'5_K ۗirX"{/ Tv\mH{˗8X݇6~P>3:(qe`U02#Umi V*,ʼc{`aoB`KAyE\a2]N"U`.0lejLe$aj2ltZ2[QWQd]FyFu/ &4\zݘ0B-Th(WphzmNe.\X8Q8G;5m<~2ٴf p2N Y?^&9"*czpVfP/m|1C0o в 9x"|J/~M"Ͽ5;ʎY(􉐠@\ !4Zq.$Wݽ1R=9m =UٓH- &Ղܘ2`CP2 әr,|Ͼ"x:&.ze0!fуԤ)}m#L#mޑĀf4*i6/>CZ֫5!-rkΎπ\%21l}gua+"c iD,: RKZ|ʊp Uzq1'v.rT9##VqkU,fҨQ@>"72B|>o˖ ;#܂ڗYgG-!fя}&hYeۆ@3\f4?!@ \PD[cL\38t(zYJ ?ҟJݣ J&1WE_8] 5lӴфʪLbf.0 4a@۴+Z,zşYuZZ %E  Z*ѯqbt ipi zo0yg5ߔZRZljK@e,,eYH@d㍞ Z+Eh\V#@nHY z@}4,{-$t(mvDʍ7[ 8ln_݅a׵9 #?Ot.t@И[}.МiSkߛJkxg5aqqqyoqiVɡuk`͓taa.4kzw ([~>3: ? %Y:#bm>DC(K͜R\?_ΉEfQpj.o[4V]( zX 亿XXߪK9J; )Шhw>?5g7S@}"GP#ќii|:im״oPSqtIjӣ6^ {@hT S%]~@.wqO }D1Fo!^pnC\LqXsgcɳYQՆx! DCC@ZVCAQM.(ܕ ӎt`*(ºeJ+#^e`hvv'@XKcMKTZaBvf!!jx\ H_m>C=*MGk zUaա`!f h"uz <7w< `,d*xly6~P>3: ح:Jfpc-Ue0^aXR5 Sl7s Ff* A.c81IBm+=Zn *n(ϰMhAH2.A405!qe $6 |- F -miCVF p,0jbY+@ iUT< S5X$)QSᆾCR:CᳱB,Ͱd:@]EfUT!(0fFB}B\jV ,K(0^]mZկ]✻z*2(uߤ7kiw̫U[:vKTڵ$RSAU+S.~2ٴ`T0Kώ'rGq[=!o! \j=A6v<i&(-lOXu%֠~؅CAw>n@<lO'ۿɀ/A֪ G}!H1PAinO#\PH9%˗.*hޒex0G 'J~ZdZ֥`5h5 "Z^psf9j$bmNwSP҆J) @tpk@hv8eTq+5325{2\prGbŘ?M {U&uFf("-O [{1,չf TKe%޽"u,./X@vccEV۾AA"p{9Uq:P+݂{M{6ޱ*S&]#cj 2HUGBot׃ET׹DjV;w7ǹ\p].a5T\WxTӿR^JL7PgLoagTZzp,*t~"!Y5&k.]eeiԁnSEhֺlzʢAH#}giUZ 12\ꁠT4_ϔGW%U^==*UyR&VF`n hb:I n(k:KCÇbl.ł\thp%q\OxFU,1We|ToH{ zG inENjmϮ7Z^@Mky/ͣh:0!`-0iWޱz bݡé P (w"T1ݿX9\ǥX#B,IV_R0;n9+gcɳYvwsɭVGD)Vu4]ly6~p>Q]Ǒ|&QgaC.X"IfC 5<_ |-G˯@Y$xQw(sUVɣ)z2 |o)z2Ҟ)m=OFSх2)z2m)z2Sєe=?ju F[`hg7dw"^{/ǼU4Ӭ{S_y~=4/Ǽ{{/Ǽ񗧼{/Ǽ{Ʀ{/Ǽa[8hQS]N^(4kgFr=#r=#yy:G{G˯Yy;G{G^-zG{G˧Yy yx X9@)x]) /wJ՟0Mgc>O˫_S:g" @D.y @M" @:Xu< X"@u1Er֨].>}3޷3]:G?iϼg?p3Y}>u9xϼg?>xϼaG?k@Subsurface-4.0.2/Documentation/images/MeasuringBar.png000066400000000000000000002362401226345450700230010ustar00rootroot00000000000000PNG  IHDRVm pHYs  tIME  %r IDATx]w|U=$$$PB'XQl ٻXaE|^P, t BzOn;e 5@Br~?.̙33;3X]DܸW&!!!!!!!QH !!!!!!!I$ 4HHHHHHHH !!2AD@DR-#7I[BDi G :~ob_GD"@$*ig?;$ 1a8^!a;3... i 2t0Zw@4 vp( u"@Y@(,ݨ#m݃[D5^wN| sq' zgnM" 6ǻ tDaaLl׮]n=vܙUߩSgdz~:˕(چ ŧoٲ@Q>}&''gggoݺ999%99KBM6~Nj}MD)))=z*..޼ymہ@ 3+((ܺuBCk@{h­gO5@@$ #.s1[/}e[3w᫜1x+ſ,>iIQ+HD|g;òo~ٽ]T?䔐i5HH?!![@P?1H׵wC.rD9߱#')Sn߱c?ie߹=?QN0{ΕG}1v-!Gј1s}ic+srtӭsE֭{\sC۶^o8o=3 >>KW$$Q:֓FEDSN]t )S /0,_"??%ǏpB9p$GC=#_|qbbbΝ'M_z饱7M9ӿZ;,7<333c}>e]'vIKH8&۫׈v& @Tn- v^IIiB=3[@ff1b!CTUwܱ۷OKKۺub^8~xM|>o}^/tٽ{p8ܫWϞ=@Ϟ=Si pWGݩS۷-+k=Lp^\\v\TTЯ_ÇE"\NZZ*~mEm3av8W@ӑw0-p+Ȳ.}{GQ\2do!L NIN{3c049fH=e uR”)7~8mδƘfY' BB8tȶCuжmӬCx]Q\QuS룊& D*}˅d/DHnZJTU:vئMsiZǎ~$IOoףGSOCDBتj޹s Xbbb.]b; 'L8[tQzzZnڴIKC[8p`lUTT]tzt1vB qvϵJLU=m'#UueE(<i@7͠b+. ,vt-RUfș9FX0"Fp}"#f5Yẅ1"L3>znh: ; ) =;ԟf¹qPv|E]<}iiiK,ٸ1v۶]7t]4-x<}=a¤[v u9&fZ0Mwޙ2{v :X vS^*5S~)C-|JˑoyGFjҳHL#akQU=XeHdժU|!990 EQ.\qc֘1c?/RQW_}uƬX_|a x7׮]xx≝;sve~ &O>ݵ+w޼O]w9眻d?H$Ð{$x FiUL-MUA,8!^8oƲL8"ڶ(*!L` B`Ū,(irce11Vq91F4EDUUMTUc/Ѳ{>Ҿ}Ï\]}x²${-w M# #H$d85<W's3+ԴSw= vW#"MjZ ,jǓ[V/Jհ6IX!l,"m ]8g{oQTcLՂX:;8_!D_u˲crcDϤاέ%w7=8akj\[h;><8 a]ghlZjÆ"`_ZT~U>h9p=nFW< 9"5b a5{f9]JH"Y;fOpW٦-6fᢟüqg۩ɇfm*f4d1ݭq'"|ˋ𻦜W?w9LDĵ㮽u}?mǮ~nvχhmc3XF}RO~"rBމS-l96H;Y[Z;\< ^ +@Ô"0ti .Q7Njtʍ/<1cĴ-?O0ͶM^۟~ԫK^:oO}OL\<;]S,#y}їZ?m-krs:qKr,c'3rsVpGsM'k[5oٙ B&M@ 03s]sӴVJ]l_[^^SbH`<vIzG*䊦rZ;sUqz&Nh;-dp@BBBBa"zI Zz`ܤT;L+]@fW1KK}u`fλ{㽋9+sψBI6 Ŝs"[ʚ6*qzjձ~Z h;Z=7HˑoaD5'/Š`n$aمJ}=;ZMLad6\7nm7Ll+)8;/۹ }`dsNm*]9@YR /!5/8#(["%n5RCt0˻o Utkќ7&KN>۰"ǻ`UeX`TU* /,\oջWǢ^Ӛ qC?}qv|c 0fm%`GvY3qŌ~ϟr#/W;_*9Zk!Q-S4QE 8Z{r7S+ʛw[ #œM}EQW~ w~۶m"2`Z[39?;>‘EԉN榕<6lKsN"hM3=Cl2ˮF Oĉ`]W>. EU]ú>v}=$$$$$Z*3&$ݧWn͇DAЬiBθ $85\q 8ogMn̍S=cԷ~[ʫ}n~v/z$WBDYƶee=ξd9d ]]¯ wF jfX q= DdE V߯SY~4f7筯6M[uFϼ޾jvgbt)po14pRl3jil4-i.\*| JZ%zl?8Uo9d9IA)=|qIID@!`NEVx]/m64Fi -ӲUSնM a 9 S3-ˊf04qhľUЩS#C:wMLU=-ÆȲ"Nss4Μ:IB81{BU=D`!gZcN̞` E9 |GmQѭ;:,ϣVӼޗ-xO^ \i9RNT>d%Z'Fٚ(z0,EaSӆx6}p'uJ߭DR':*J~ݞAcN=K+{قQJq'Wl7ưR[֠1绾/N@&O)SoD2-T^T~IEr'514^x Q[ ]XsOن=8] v-9xϧ95nHd| F L:oBrֲ (CtX#G멫ySR~)0m{ʓPȱ iqyy"7ֿzGF妷yCػz+7߻ʣ7Ny{Qd 5n5io o\he uܸ[oz76?7 ϩŠu{aХI)~%J8vRbye˞ygx[Xhy O~gO+\!8r-|]A68%moj{(r8`EDFS[f^܃j5\լhԶaam=GT8uiĄQĶqc;*9q !J'r; cd{!0#-UP #o{֯dcև`')#|'+f]Fif K}_zZ`歰ۨH+Adm,';ڢ$+[iCZʺ;JqEÆ[OUYШ 7D8ԹO?jjBm4Dm=HRBڏ' U:َWiL3`Y{' zmkn\0v7>y=ol~M?ߞ3wMW\aY2v[|bAE+1paC?zmT**@@-"(erEU8 > (tJHHH8w pwJc#DD!k)֠o>WͯZkctnAaփi7l#?LwSފ0Ј!9FT܇"WvydX=kGxZhn?긻0TC la0L֕f3 MΞЉ*bw@_یTWWWQ5kQ{Â555!~=ɌFmHXFMuuuuuuUGea~tqu)ʾ<ᬫ::Տ7S]tp o8VlpdIZ@-ipPF O0DBIu=.=>C>N r*~g֩ @u˯ 7~{>XSg]n')!aaEBʸW}87YIz7Z=N<ㄤ8ᖋG,W\;0.l:S9~ +j'u[O%dvH*_ /$/0QH;i"$"j9^;=+DGog_mZ,hݞ]u-EˮTٞQYWr̻'%]&Cz?{L:˸W]|m/ؖrO\sP:U&׮Y3uODA}g C!8|ǹԒBᠸf\;:pSjiַnNM_#_}AxWXv^((v&n_~|xgm ^CyL}Sȸ*fuDo[f?G9c`ZLTH]u6'ցwtQIK!E9TSA65Hm^97^v/䲇8쾑կ}RD SE0.;A@b~_ t:J kVFoYjHHHHH8 1OCh@< 1@M> H5+{>Oy_ Q?.w_pq}sl?zd؋&0(G 9b+3^j)ݎ_zfzO+9GMo,5/~R(w_^A)ƑT]SHk-!!!A$Ј'+صsݎ}g* 3M;V9??ϲb'<=AŠ.]`z]7/X5HDvYuUcDPLs4ڝu׽9s,ˣև"3asʾsPa`F:f(bn]f$,jB)R$BqLS)l΢g; ˊ8QM=D嫪L3L˩=@8rj{O4$5gY{BA43gD>RU&ػC{:"Q"@"=5Ց=s Z`y= ˋEEs4ncfLC} ^70JAex˪N2ht*.Oo3{5W{|]>o^NYׯ$B,ljh1]H{<*Yt4M9y%mZթùaDB4Tc\vZ2{wmX09gg^7TS ~I=!QUZ#7}uʅ }^ -JHH`nUiq׹;Z |'*J;VvPk' mgd}!݇<ㆎ>xdzp?x7w͓Wf]9+RbRS)\IMI ̙3&O!2Ea!X 9 窪8x`kzŊ-ٰʹYˆUr+mа(* " @@ALGe} q*i? "XG\ }ߎ}laAAE+=-%3/UWXmY0'tFo`̓ sֽwh=;r$=c/C@lx'1kk+ gemx32|>MFwƃy}(U DTABݦ c\2PJĎ6؇!FzBNܙyeDDYx 6MxV~u |nQy8ȱx*ixv\7PIݻzm׿6UH H7t-12b ! w<+9N_32X+]v 8%m~Ë4Oi'*±r@_܉B_^VA^*mj+'aqoy?#o䈬ØtThIbkY9r(R \OJ4BPhx;t\qׅ*F"2,ðs̹;mqD#`]:aD$l۶~$!mvs+^v/w2KH7W]qy݊7ȳVTKB׭-VUXۚh@5X1qUͷy"\h-xl%,58i ^ݥmoL'"].9!ӲgOKL%hf]=ϴν]@Dһc_^qd!3<7O=9s6pƋ;t)'RBϡyZ(#~ b)8iń?qR׏S. Q ZB,3%"@@ⱑ/f_}jzBTlPMkN4 i0lkژuPQب..g}zwW+ZDŽg9qW ОPQ%$$$$&Ѥwì&_Ϋ:ft!e'2FTKaCK׳Pw85HEմw Ü4 WZ"أ͙:gn:Ysͺ­9yE[b=ބީ݇e .٪m@I"YqHɂք_&IˉI@!r *?K_^Uݮ~$z-a¶n8xqlXѹCW n[BПB,ǑNKlXXޤ/F魣nJ+/hDu$*iMF֛@y|(Dn[DCMj?HR>~'#%w4;{ W~ViC |gWǍ?2/;"Mqam@Č#] H9+?? $obg9Mw+mdeHpSv?oOmqwYi%gώV>oUX]˹sƞS&]6WALa %(T-b^zVT)M2岩V]M~DJII¤eeSX-%.4۠]̞"n/Ne rTjoē ol>[QUZGD+71}] 8l`_YSq nXͬZ,ADΙD0eDMH\6LgPI4T4¹UKrV~mϿ.c> Z|_j|P;B` 0lBWRru锉sR`FRIijgOfkMm߉SBH{,G]` r?O.V3Pv8}ܴ% /KHp`wO:"rIZN4"iq"$(V@OU봉lǻЯMq=Wȶ(qm2S)PK /+zvoGXWFECHX=҄-h*+"oDcvnΞcl6:yx(虚i׆'m Q]VyjѦmƼ! z5~>Mzeblpiv=uۢlG!,3-͍V ]B$&&B& -r(^Df ;JkvКOͭ|^O(Dl tϱo-^WhOj[ Jzgws:̱ɔK^&I>՜G*w ޑ[ ` * R eUT*K +=ރ4hcrN $0 \unVծ;ͧߝ:M|g`T%^{mˊVY0n}_S6_xuݑ}SyƥD A9ިR.;)JzUO8s?g ' kB$&&!i?\xG7"Ar0|t=&EF$^Mٜ%psT>ju÷QlsqE qۓ( *"C/j z^Ӂ!cKs#oWҺrI YuHdÒp`ݔ45 ch=Q.[=q/g>A͋wTޥ˯>>_}Qn;?YGwߵ5&إ&kw J閌lۮ}3Pm ZBs{$Nls|gZN_v(hqlۢU`HfO4OUBT̬ :d;H$2D?cA!lKF^"^Me͕b%@7K\@vTSI!UC[/m*yc Ʌ~ "!VQwUUY]s{Ͻ)$! M( E{/cی#bgw^coғOqKPg~jomm$T2LSn RQf%6fXM+n+,2YUi*,lnv/`V.kʆ^7 zO $ }zmAaCs%-`=BBd2Kһ%pDD,lM!?\>5ɒe@ۉ%I:H'&;Ei1uF9z`"I46lS)$-RZw}-k斱mD 6dg@/)G>ORͪ+O?vџ pϲL_7Soܬ. f}NOIN k+0 4b~qHkalfpE|Qgl%‰D"g9fXG0/QT-QR$PlʭH>ʛ1~ɦϺӻm|9~DܲzZk.k+\VRq>EX<{w}זOa51'&N{aaBUr;?ag̀J4Z2G1_hn,ٝLLRozy5H WG V4rN0c`RP(j-r u}r9Kð,]}GM#n'ԊoU% @'";~dX&ǫ&z AASp0LPBdXmD& my V~Cow?sɡFZs8TG"lH-\9bW ?7SnraB{>d;ZL+NyOa4U8Lfȫ'zQwD`lG5GI&S՟NwG3]htnXjvi+6>?%Sz2Vtߘ"O[{x fw- nʔO ksr gEy\WESWOM vD9̰k ~ۮcaBڵƊ 38< ]IdNV%H( ) T:~,C$,f[9ªT^^xŊQlKW{n3v?˟NZŠ{ 䥬>]Ҋ=ɏLE`*_xq 8SFy^&->쐓d"b̒YRxKDrBɴE=%e9Hj2'ڪ#YaBqsh @39@92ch.8hiyxZ~ l9Q>4Fa BL"z _bOŚ?Hz,^:⸇l|M)^B4ǖ(cMg`! ic[iuݕ}c̳4wFKn _L @@__QAҲ@ $H,ŭI=VS6_Q$$E>Ҕ v,sU[MCξsmN)#@eޙ4p࿃BB `Qa FMgUr6mۑA$HS\ٖACUU%цB‡>1z|S$@[cX+~ZL!;-bUm]gt6+V*gZey3-Y{J6d?yZj|Ov9丣9!@X]} |.1C̷gHꞓn}22w˪HZ.uP@34dDQ eGw&Ȑt£^/'JҲ8/njQǽ򰏇 hv'Xה%ۓ 4li`+mVt3Vgď\q}kr9c0|7yý07??f=$,_ˑqmm$l)% ]N[l;DzӕιaiaJDg'5n s)ד[ʮ9|Yj4zA\w/޻O3}Gj`)uo_{+R(fM+K{&ʼM4E!B$&-ޡ `0\SS M-m+H -WӐ7Q#r[S0-[rrY :I':ŕi5PJ(u y[Ca1 wj[_rm-4W]wdVb5?58lĖn g_W=69@U'w|IΜ|닁7v{qUdE7'sxkRٲ- 7rG%6ၓu>Ժ~.a:xeEa v[B'RiniErnc Kž~ڳBRJfj]]|j{?cԗt-5i֜jC@Z“$B6q.G*Co)n~wp1=.ZG–iB!RַZ jpsE3k$`GLb:l<-E1q0+pP/nV%DKjlO3--Mn@;((Q2ÚjyE;qݬ= UkױO^zěN>)tѓ85]nӡ765IVSw?=Frɯp}ؒ<[i &]r~8R4mbmD6DeiM<[xW<֧c{bIy]+D<z~hL+VL9szI;{ho?1ow4 J[pp`G]7 p;7WWW5 ;pH# ɖdhےY . P6&Ċ^Aw 8\)>*Pٯ!(`#(m}<%Rn#C j=EHݴZ٤lB/P}AHJb,oH) b)$'' 3r ={13%iم.`:[HH$ >\gWnB*N";a2 f2ao!M]b빦1gf`Y2.ŢvcsaՎy+\!Ax IDAT!;YYCX?-BC3SiC8ܫuAIlX*<+#.tQ.t!Q[!ul$!C{f cM-y~UZ2'9򥔑HA,ˋlv+\MC)3l@ˁhX&*0P/ոAMiMмtR8bw򢷏0 ɼUTE!b4thlr´/{S#!sdaɪo&]{WѮ_Vw|Ӊ} ݦ(-Â#'\B+hȩ"'vd PAc9udhPR!ރUY̌)^ϼkGlr:G R4;JTY4òq~0چAl'h^{~7Z}EY?VJqϡF*y50Ɨnm;;y r%ë5+Ds 5N:a2^tZqb?V#.~{XJ,L!nrm9ª@L :2 m\![AC>x6F}ډ̌kqE8NiTԨ3kJzJa N*qn6)󖶂44Ӯ)5M~ʜ>]xLjK7יKʻ 遛ٜED.G1BW&Hu2W1aȜ~k]uEco[X6[eq^^A4&B4Z`;(`J#4U$$[-Uz 97);Axdm+rM__a& A Af&F IQX 4zy|Abm[̭鉍Ȥ>w?vIOUTt2RfqixyO~򁙓bG%F|zfK4In:I^8նf"2w\5tWQT\.k=[Hw1̂2["eQiXeEʵ\fI!+t &ɏLO0*نѬ6 c2o1,ι!{<^ ΗG`6cz7,U\ܭk6nOt@*xcͼqSoԾ>>48d:r,ЯdP]졻]Юr7jc?WBu}}jNr{!Mw_z֓x.Q Pn-q/22<w0ѡe)hp sKb@f| kjtkU2$A%V59I/sYf붵 -i[hO]GU@! ]WH ͡.I{tvб7^\}̖ b@Y1 XJBs<4ET~&^gk~^~:;hHN+Je2qo!Fmf5c|!iKUuiIӼ-6P?{G>ڟN{hꉾ.}q2i,#.zˑTE2ds~yes$H-l47ZU6 ϽCw#4 ;A"r3 ~pѢ5<<4 4ߎ&PE|cq>>O!2,,Pe=3U><mbLܞ’  UAZڵɩޙJr\)KoZѺ,V9*[ѻ+C ,%k0?{֭BlV- CwHъ&1=5&5T[/>% ^Md& ´kf*B0[e1Hh\h]յS)*J짗 D6ZVUSlEu+Uշ*٫e*sd/c-Mp3=kf !t=M;˙#i4c`a4zv,Á  e޽=L3 V`AۖK/OK \n."d錱j.#2-\U'*߶SkPr8lU4. bxDS1 S!PκyC}?f@~e6w/fS2%H6%Ex$c .}뤻>jj7ްnC{&|$j^i4ʏ;iwrg=-Y 6k~ +ݫ{cv~`I4Hû ekvА4bY;䌴C R2fFCnRBky 5PzvH?rlr[~45[w|Q^ѤX93UV~Q#:`KT{^yK߾ꮖ+o_=??mٓeMژTYp%z}锫yG ^ucL:$`t^QډCWϨ5OIjvM̲f oU^0k-' [b \v Y<\j=8pdT:H). viȀlaGō @h3Q3L-e.w}cz~y^![;Pii`I˒̚/u]i3w.#gϟس8Kx܍zb<[%nvJ_K4V)Ǯ*A_bM-#X:P34 Ɲ2i{L2C0l]ȑy!-'̫,-ۚaؽjٲaeIUQ4qgڄsɗCR 4hZ&ơw@C} tlNR͒$;,r !Hw/ 2$0t-5 -KĩDp}da᧦_26!./Cx-:mMLihnjavqa_CaS{ͷw+;/R]nf=qɺL]]R;Zcp_'*RH8D._fd~!3?oxY枇\J'o.yʣcvv:Ei*rZ_K*5dۅ ddQۇByb'|hjbs;GXI}p8mlL1 "K rf+)x<דǴS|:-K766l≬;1£cVu!68`WzBQ7YMNj2X}z! '=p _叹ݒuK}8m?RJ@~ ȴL"D`@p,R@:-5+ ΪOdUq49Qֺm22zsV!WWWWazd#tS^ҁݎ!Y BV9,,TB9ŅQ6G?O-_:s]@-Ё{o!O6D]'":Wda"6:<\QmiɈ2—Tvu.ce3gۜGSdm\H Xo9M]Ve♠4byVͭkfIUHr(9]JBQ}ynq3&06dic'zА˳n;hP)ցsU;\i~0)Ciu i)j̓:0tAD*?|Zg/=ތ/֤Rا|/*CC&nCNetgEUfb&kT܇NЙl5Bq܉Dbuol7.Q^vSe.5bPsgeÞtޏ-ǔp:cO ZA0:"z|uAZ "SY1nC6ipux.J%wL_&Ґ \M_P0K"5PU4L4o"Ӥ@h\UUh`Z喅!H)T%ZhYUG^Ô%2|yԙGwc~8퍫q)63ZrIU]tVys5&q};H>}T~^xg\ҿ?\E=8O&NG *Hxg_MxJ8͉+su@sJ,_ܾ~&CNWq~,8 ,&3,[Z^zMXGOT>ob@p9??;/wD;1 i9Al}PSud<4n'g{S«4M5(! O6ّ˂f K0͜0-#Q&KVח7XÊSD.y G-ɒ!hL=3y,E{~&3ʏq1'.XԒcʏk)Cvv[}`AMlF',577vGsd" //ykDR6wb$޹eڜ-cz ha!VS*1d@B˘Ԏf=}󞁆+?uk9gu3k`!)B~*ȝ 4(.ئo߀j{XVۦ K/w^<]x𣟞}PwsJ1E^di9 '\3󏃯K#6+$%ߎ9%B5-=^(>(Wg)Bh]EJSUtiLqPC)*cV3ih1dvh?ԛ 5ܼؿKDƀA`Kv:ތb%Ғ⒥ⰺEM%RIYQV s΢]+p[R}JAt4m~F)Dc ΊO}iNb|1jL_ApVڭLL$ ( "w&̜l=sGm1_$™բ(ʦPW1c@&Jygd}.;R]S`L=-R+u I9A/sߺiR2H!> kAl$-~%TfES`@9% xe9gqAC STzSXNOgZ,/0s&_~[%!<윀m<$ATɝCNz'띘Ve (:iPZ:q{BIU':50 Xi֊é'+|RrAkDr 7t˛K1W^;7uW%T:KE=;L0[݊w-m IDATsw^hya\J7Liuv;Q)| DMʰMEƎ\N3T W,ioW+#R)6riK39I]nm\փ)oHW,7R&<4}QƢT9};א pizK_>&9R^vw]Bbчץ^3ܿ)ݎG.xl\;b7RqI,.ڥLyssr\fJf#ĖRN̖%z]4it*.e[M$#HOGm3L7DxJ,4h؞WةqXU\6 `XL: 9EDs3t_P\x#"5 f.+gް" -F횕Mo4>_^AiT_Kc}PMֱCGnɹN]LelE7N9CkJS"JLbyk{޾SKM$KYF~ڤq؆ژyX_0sj;}<{{yfΜ=9eg5/>YfA7c'$4L@DL9S N&~]Nȡ"} O 4UCtCFh(2博13L|(HDEg\vTPb" 3l]xj,ޞ D yܺvSgumtl麯p. @tEtn)OD lte d_vrN:*GXN2gWק&3ڀhNzFVWihLS͌b—]͉s:8J\m6kJeq6EFBaCVQe[ 1 M.mh2PZݴ+ uرYHyc򑞲l]}ˠ{`1tP+s$98HJcċ6nR5/rOw=u_NJԜjrŴES $ (<.EZ9cPޠ[0btCzKKG{X`.6J7aZ0q˯2E6 yQ~]/C(&VƋkh+,,ݭvIYB`owcv Քn)yK&L.y#/GJfw`9~ņ:1!`Hvg> lOHW~YsɱAX??:)yv.y-o88u._Ջ=b͝ /rkm[oG{kcޣϼ̣Fh(iטi;3;/?=0t-qaB(Wd&V~g9R AID ɔz/Ǽ(͞9o9搜N%{͞QF*J5aoRV5ϼ%r\uT^3?~oa}* =;KyjET(/uݼ8U:/ BD3!=p>p6͚5OHMx{;WzEEKaV؁aN"n#Rlˤ6c9\=$ [2NW57!{@1`. rv)ֹm? 8֗|2ֹpS^UlVs"rӲO?=Imi G^ih7kZvۯY'] pR:yb[snyKÁ{ȞP׽VpBReˎɿe!T>zou͍_ @:}j2]鳒 3QKyY*kЯ4uiJzѫ+ KEs0)jZXKݿ?{_GDE7̶άpZ$FN/>O‘O5'hZVT/mIulo_]gw-r܊0lxL6V+|aY7wMYސ]ݔDRv8(-G 8GGJ2|vHr;շZ uQ̱R"DsqkR {`k_miIrn c{Tqo5"sѸS_Zт9TF"I?D:8kBE+n٣Jįͱ`0_ښF{pO/=_LD !DB#f;D㚏m.t?;7ví|gORqy|"T;?Y☿\2Jsu{G|#|œ"n׽n1;ѻ,EׁD݊}!L}kqfljQQݲziTUY){euE1Ho a( -+i/pszSx<럶6.Ā) M$i>ԡFV@~?\\qķ?mLkSamSiǿ:yuQW}R=9yr'<k^ K֬7ʏNXΎVUW٦VzJ i}irӜG{;fʈ~й 9햲P( l>@@_<`N=ϴxh{P<Ufu54u4TjXUSD  zOC9"{׵vYG/3.W4cg5 $ӣm{-٠&kQ&RL1:Xpl _=dR-N˕C$w5TխiteBq;"^'BdNee`e%}=vWekr"&#"BAخs?(z--u% B*zssn_t%pFx?xhqR ^C=A쪵fO\WCCNcsV(jW?kE7|ҳ>a/lyGG6a27zlOݚO,KTRcrLA0=XDoDY+IUd:Yᣏ}osNi,u'QMו`ndm_+uoe.Nrd׮Ơ.g@uw?8jO H DzlӿϦ8~a@:Jt2Ne2T*ɤT&4MӶ/˶ds!> A]+l$wv|cjDԕrrںCRtYf*3[,R(@bd] ɞjSKz8탳ߴN_vx^InRpx٘?#;VUg 风U8BHgyFْŘW8p#}A` /l^~NJ]|Iu">#Nםװz-- rILU6'|ku5Ùbšo?++R^z!;wtf6ѾoގN˟[zȉf*ɊkmM_?8iꌿ=ےLw:tD&kkCᐹu)IuBrENG ([l:hjr`&6XֶES[NU3 MZق1g~ʈ@q}ʕ\>]a;3Irva;z "Q:Ȑ.Kc----;/Z[Z[;;`0 ECp0 EhiiE0u1κgI1Gn;$.H5f5HRILDXhى,_۩V9 T$gȢ=kRxC(;ìH} ʽZ+g_1n]Ѷ#CAk~q7!ʰQ|s|j|}E9  1B1 )Yŗ ctRs @S!@IbVaA U%Dh_ߟ{= ~<=xsDNr?W\=5 Ϥ֨.='bq,gg͚zaG3Ĝe7NΑLugY=R`mh|vc wIeUՎCЕؘL#l %ִG"9͆d TsgT mh8 Ewtu[ʐP9{mqȉHFDtM'f&dYLgYt&dҙL:Mg2ݿI FH0 "CpNN$!)+jSzM_`$%՝ulB7 M`XnK\a[Lj RA!d9k%&SgifkK1etgU5Dߚ(U*: !!ajum]QgofU*UĵWUr%R̒~dчh@$&| p"ڇmbD`& A˃;Ұ$/_l}Oν|xSsq%ed ;IlrquHT}HijHp DLeɄso:aT81g8e?tO~4J\}*c+ 8/BŲI'A'0=L`ؿ>7)Ji& $p!衈n[eY+%mhktXf6I$bd<'H$⦙ p4+ ùPn8N |${H%MD,oKѤ2iSM\q#̱AG쨩M@c w;#0PRYQg:i,~T C c=bȯPIvco2?2ж*ytͶk\'\O{U^L 7݇0O)W9Ҳ7݉P!x{`c8"vW' DJhHmaU/7$[nϽlsuWHqzτk]q]`VOquK3~g{ï{z2 TCN_/kIuu~r01rLpz4R{Km}f\PiM>R ̙8e4IuOH=aA:"Cd&ښ[ښښ::Z[[[ۛ;;[].wy+WUz^7 ϗ4MQ4gYI)eׯifvђ}r.{+dUpyեQ`겇#D6RIJa`qpR()"u!jAhZ&{`RR[ԗvV́D H(7M!q>лACkw2 |8ȒVaAG coάmΌXV乶N:}̲>ʴxe&\oxq׾Y|OYnS򝧖 }lm/]:_*޾rcyZ "rDž5p‰;cX3 bX#k'h ΋D"P(oHn8 E)鴝VM&<} fT$`]˹m?U,@q(FtNN۰ K$9~ѭ prINqFG2!1[iH*sMV+: mEDu:NEgGÂ8  Ҏ5giz ͱuBڦʾP^8*yw2}='] Wa&Ȉwx4G"q''Zl,`[Z]ː*,0Dl8ՀD؄9 ׼w3*ްu쑯g:WPҎ˽  IDAT2 ;omc,xNR.V] !*2~@%#m:@Y߳uW+0sX򨉦INM ;3@u<`tX߱RIvwd"+DvF8@`pcS,u =tٵ$cɻ!s@ S\~^6Qן҅ڔ"ZIOqxZ'о1VIԍbo[h;Lb oND.~5Ɵ亻7l_=K$`<:5zY߱ qQ'0:sV `z<ڔdڄd]3[|@@T%Y P5Qu;!5^4$ IBaNTHD1MO+_Z8(M5iqf 2U?L P}ib4asw!oiTUT!>4!͛pю4eW [yr։)O2d%pQo<)9=tq hHBI!=dgW:FY> g)UYmq8֕6F;&S"/l4 V7EPAs!Dj }?qs?l&7z6G+"U @R3(BiaMz/,nE-6HU1sO]L;7\֩WvxAް@ 湅|8X5/-wCj{yhW! .⊷TR=IUg$E% DZjzm AW7V/Ӈ aKŐLBP-. %tU u Li_nP '>^<}K* cLMȜ 1aA/(a%!}bv x W)8#wM?:uKë>6Ǧ6nZZ:{c-@֖mS\1ym^̳ű0%@&מt$J/׈k5lxaߤxm?rkqdֿ%+'3iR Ban+IxOʶ.Bm^&`tsYcw%ЙS "2@jXdtU1 2+|-5ơUbw[Bߜm- <63욬q($!Uzxkθl+M?Q P*/.$GC[Y&ze<昽`.Ι舃> $K!pTRLI4@R@e#P(D؊^aq'EOC`mڜ ްIS&KZ.wv}6^!Ulo<N&ÄsVe.XO\ z>hTnW;)7~څU&TZÊ9"WۿaEѧWzfz#SE{|U:sqUj!'T E6}vܜ927ľmMKk| Õ 'ɐKC 48,efX D2r~M|S` r^w`2H(uŏ4 ~^x"9Rl/uw+V"C(d<6W[ ƕ؞T)mh!]׉bP}Vh^݃"?^Rdb,4I; i=oA>$@$NuVLm*l:A#~#јLۖ**``lv=ˤf̘moJ`Y\LV{{!'K=l*fJ< 'lm1hSQAc `=oh[;nm!,Ö ԝ{u~/ƌ]^NE,xelg 8GH#ggfچ)Q3s[nȸ#D`Wm(M#;ojl`idڕc.r(?d̏=QU($sl uga|ɞEӪY>.`=ENgU[?#eh]h?j;+ޫ);?}OW4֎(fr &:3hr-oEFk~x\u_V۴ypHX{qpGe68^HuI '++7ab~Uj +g<'76f7ΩyBIsjx?Y>esernU\|<͵C8ӤdoM&Dʨ|丹xŹĠu=>]/u*2G <-a&^2`ںw{+ǫ̓T&,]{/Zb6kGO)l\#%=o:>$'.zzk;cv%f-[+* &ߏH!CژeZD6*3Ё$$ԱD ܟoVvNH0^" yze:v PdqԾ#0SِV9-6o2k0/#ߘIfMi,X60xvr2{]7gj<9o.IVU/6vaџLnX>mBX-8?@ıǷ˅ [?l%Xav9B}yhpҘ ȸ+%#_s9OxS7.rcS[>٥>ġ' Hٱ k ^۵&8"u7#Fa%?8B/GPչK.|. GL8 IǕysw7Ccw*۝+lDsD _޶X:g^tr%n-ϣgr@ }v ɯxnZ!uꯚy`Yw׳Kܷ:hrIc.E68Q '9n9֮R-s*o>l}kv ˌ1g qД,%YRIws7F:n56=SPozSNc>7fv5 jW * {ʏ{NJe 5We?Iyʹ!R }``̏oE<7*VTt%^?zkӠYsǁ_$PUpS h'o_cA_{-+-n4 s1U8sYUlsBɔL=_>دutޣ3߽>#AH)X'޵3rP)zivG>) 0į~ ~PR̫{Nqठ5BcZ` NLH7n:.Qt/wo_4sަś}JQn .|dا֞8kˏw֔Z֖]ã/eP#,X߹|gçSq\-}vO|cbEt&I@4 n!Ȟ O9o.uL^p$@AZ9׾ SBO:"6àWVTD?KX[_W'p{Vmj]KgNHa=ho?e'A[)+( QM:ry^Wyѥ~V{m͟Dʭ{KTJ]#s_^l:%r>(iGĔӹH?)`~_sg i{8蔏{nOblhH n%;2PɄ:k~-6$8)l.Gڔ"P`WT4fneH)=0ȔӁ ޱ!1!eu^%iCfھ=9!܆{$ yuyq~:|s2ЙI 6|;gvWWyth@D"\aq7̤ՙSjұ\(2U{O/83G c&*]AwNYGr 8>ނ*<ރŠnW}X`N2#*3ieہƖߟ|$A-Ԇ.Ldu< MƓKF;tqzqkVjU+]G/{ik`X.-J˰&,E8j1νea5a{@M{kŃKJb-81L 3>(o0]!M90gh V͛ayUpu^c ْ/luu?v?]s-b_k";ҪrO˞ (MbO0ϯqՑxY>b;psrQ 07%4vS' @œG匊۳goiyۿZ3ҙWA}y9yclE}}WǸ?o$Om0A eӱ^k[-QfmژWx֥tL/:b|jrd>3wIϨ|Bh4 d5 h`,BER95' =(QGO>T^&'+X-R4κbuxչIeK6S~7j>4;Uۓ'zLg~䞴4Dmd W0[g"mqT?h@NDu%bDĐQ_j/ZhBf4q;2Hryg,x=:JVE2"fi]RYWb>6Y+I+|`ZeХ1rAח|zſVWv[dN@UkN {&sƝчOnswf{]Z,۶`*jsg3P[cǗ_-I* Ê5þ0=f܃.W>Y[`A{=-[TMڹ,.5B  :r!>ϛvgvsjd2m6eV4mGPVenV#>Pa^1 |Qanzae- -kS:#_(AN>R #X*I,YBsWd96AΧ s;\z6v"J^gmOHg̏zua˿q d6pmF`bLcJv O奕Yv7'l96"Sq1$Cܯ ARڕϢGcnAwȞZʦQs\]CIN ո@0Th\rЍ1uڈ**'Z +t%3_9BW.MNZJc?ʟpܨ7cRȶY8Z1x+K@zbԶTʑ6/cժ=!.(>,H iq.*o4e@Y}̒dY8,W\l|dJJbT.[?޳:ߙR}i+m(AC vI -ӋڳłM6=;;^A!g0TDhO#db>ETu !QW!GA⦩L0}`鯿qy0L I+o9/4B :6ɡEnܒ݇ cV 4fCH{ 4lW!jϋOg;KNdsd_EP?!uhK .zMSS.m΅$ b 4b:9?c տsJFʌչ&ӫ,8{COhR {|s#SsKk9kԀo]ê,~cKCz4'ViGYvϼ{m:]0=ڎN(rW1߱Q"vD^B@ ''k{D <^.%U]P%쮡.}aFVu]]VCE hhsmϾ<(cz# " ;K3AyB%b|Ppp x[0&@;N4%@"_o4*CL$Yfe9*_Ф/Xn,o[rjB:㋎SVjj6@&0CԒLzCF~iNdS㆘Q}_D H]']q1C"i| eԑE -R0[$[\h -vT=1򵖎 MWG+1i^Vs6o9;6HY//jdF~baGwbљLj`^`^ؠn(tV?;<;3w͒\n{Z0J PBzj0cܫ\eYmrXE6XüzW~SEZZ בPsS""z5Ҷj\/TɀЩ\ј\1+cF!c ɵM-[?(~p;xC~-Q!,a[#lѰۆU A50T7;E`wk  :WoSVrͯYۼ7RFFo刂~V_-?~L2!س?H ~r5Xo^"Ȕq7>¨J"l%7e{֔41G+7IVe[T6[aJ.~V}3_75)A]PZDi9/@r'%;OO+9*8׮=Rt'ILx昱򶹖HgM@ G9i[3ggj.5ǟ{ǪwJ'-z|%8xh܌qv! Ҡe g;'̩?_o]tgDdIqf߫/ eUKɵY{={r{glo.q2_ksTMFE}z&:lr4 ?4}` LH>!6n%m[lBJ(QrV˭ZWI7 vh@D" 6K/kAcM8Pr`>+J4 rp‚?ξ醑\x^)-@ɼOΒu_^w`/|G SVY[' n""\5YY6FX2MB@=ֺ`$*,D k'gn;:\/+wN̼};:"Z9- J{ L =9b $ͺ%ɾգN_ءlLU[ްא z>c/87&)\ֻײaOk2:g{lq`[Fxw\f!(pX]FO˹b s0<Ȇd {O/Xi!KlI*ʫTߟ:y8Xwr ~7@_8w:k:M sԾKܵX'?WҼ2Hz)wjI[cQk n1ec /6:Gmbo|`:Zoo'p )E|hOLTLJvA'&kNFxs$ug||clČ2S+s:C?zev]Y˛5lu&)އ$Vԧzk5M ,6:1{̊&n U"Hm^I_劲z UA*YQu]([RuϬ {>i7G֍͟&aVkKLJT(SӮt8@zpT/IØ$g\~IjT:?!8ankc#rG aɤ)2fTFm_E)ʽ*si9 I@HN찄f""D <uрBdEz`f>Ygk9ʲ1TA oLֆY`Iocz磀ڠ,Y0 |S2UTd;;:%\GyTyvqNUMEH>@!ЂxJ^mj~@JC#ۣNW|Б}rϟ-kvc1V\qgh R\%dAW;tQZنUN{ܕS d_,,<% +rlUi3lS|ciDk~egU9Og~ lݿ RDE A b2H]K8J0GfGjˠ!DrƖgl1CƬhI5η@*9Wz4t wVWv0ܖy^wnhe/';5 q4?ֈt`B@U&"0}K+䴳i|.!+ ɷ칐&Ii>@&%!~ro\/d׉&7 Hˢ4U_W.1ekDEvR0GĢ|PKTts _wo]afR"+9;T.@A[\]X2ivpD8]ܴ(iUuj@dW< b˾;<1ՙ^T :jq"K" Ze{\?k=ȰY-F|Fzrcry-XEzKbcD06,瀠2,ˈVܚb8 l'Pr-|iqU@Yt]R|c~53Mk 57 Eu@웚DРo2@HT>>w9#'UQyײK&٠?w\oˌ:(k:+nmd z~Ӽ<73/̇/2bKq-ݼtC/*k lC!0RL f:oD{H<uIYIQќQ6&lC_*hR2<~W_shmv1$ "e Ysuq#G&w{y}YT37nj23:%OoTWSo<㗺rX(SI[YF1C)Rзv $W " h !$e{/\#=v ¬fp Pr/ޢE`[$ $B'~9(>طiklM*.w&sŭ 9>CejndZc􅪛>{yKr"@_zۄc伐1,4f;z2# -"?Y3Su죷<2wĮ$ågb4?mı^uAUQ:ΧdŔO dE[(ZFɠDؕ ,(7/^Ti4*jR۲}ACF<R5Xo+"KjMIrϳ;n1=55=z$~~! o]Jiç\wn|/+B{a6{h]KCV_mFd4Mlw*W h 0@|=Ht)id5%5]}J ]pw,ǕMg 6"I2"A ψߺ^kUDRS#U[" ӡJS \wEyJQYi? aL ܱu֎A5vTZT'48QϺ7hœ{LS3E/྆PjuM?_B [gYr"(`gS3Lһ, K+%bʴd~˖g{M`yЎ)f~ϛ p[5RqdbP)0KF)ƜLISbXu#JAҰS zg)4rwz(`6=KS�-k Q{ )|NG!war2KV̔/ITŶ$~-?xD[mof*-yAmue-j"Y)A{]J8=0,/tnifC|"c9ϑ>nkin_3Ԉt)%CcKD o9G=iȤ۟}_DԴ"Et;"IOcZ=u׿?Zf'Rר?`:FUU(AfxHNq+z=:*\M_Ot AmBtg(d@]dHݛ ΂0;?v?h=v[×oaNY {7 IDATœ}owm<=j:gD];Y,IjN̄s}ʼ(?J8?rΕM-o«Xp֭\8(Tp}V9ON-OjN,ty 4, NYw\>n{쓷 /9$ݡIǓÖHՂ:l!"hW= !O_'W7.xUL',r ֢cJ;L =:H`WY()[F&=J )S"]e a ՏNqdl61GG2t )Y1*u%%L[0eRN(qY.0Wu+VR3;Z>{z$dՇJJm%Ҽ>xُ_yőTxz"Zu_uזzןDuU륔RJwqzb[ 5Y[.(x9O6+.\C2O?xKtNMPyv/"*"яHdeL2ii'{)snѡ<** @mٮ2|*xݠ;._ "b4 F:.iBpɓ4|3]$?MyѪS5 +سhP3 KbmQ$/Ɵ3MG #3й%39| QD57:nz൅;Ϝހz}ƀ~ 1C[6<{<蠹(%ͦ&}C¬OXH$V&lcSK& |k{ GI"93Wp$˴b۩0j*C&IV @pƧ8!$-r;4~ՠ~K"&$yjk_\0 #3|*(<2]4p-QxGH?~$iW9><j]:LAJ#Yjk ߮8~xN(#NN$g^Gn=&ńlN{o^clly1|PHͧƛ jLբ^2 (y)Dg54eZٳZq/u:xm%O=\yhCS3Pf vDY}Q+=pG;b="FզԊc#$ZjKZqQXҫU{&ax)L@Z4OPPbMRQD\@Fb yxڳGB,sҐDdXN[.u3S|;{a{|:5GM!XPkV4Q4 # yTpW7~4dF "*s:&pnTݰ=^H1Ybj>| 8G PB~uh)v[d |E4Ќ |90֙j^ ŗ}a42q-F<'.sSutv3SJ5 %vk{yg(!5򆅣JX@j̥2wBwkL sl0?Y_մM/ߺI9TwȧO 3/j/9!5V;g9?R{")u5vh*늜XIgv2q,a1^ +<5sQ@Ed%ONՙnG"R[`X u E 5d5j O -ʑT{1*^C]5 FsK&O?r6HO LSGx1 簡B!x%]ܰ)]q1!8 =-|ks|n d:vO ;+ՃE7v`@Z>_7ouc` ݔo!VVpۘί+nkXѰ3nD>:{"Tgsˆ0ufjolOO t`:(oL5Wyhi` в^ɠlZQw a;7EV )w5& E*:z'|흾y}V~m"^c""WR%y-cKGP0H ~%'jR[.hݓe օh]bV23MaFOF %w6|8^A!@'Q?CU^XGjÍ%s ={S05"](p"(xbOSRj\ $2hM{rOrBŠ"KD!D;IiO9s&nٲOV> eb@yHyG@Z[0.Yh`<"5%F6dVSDU8p:j#?i12 66S=Y'5[;jTyW^k$Mw|]\>B)Y׮חsև3%6?nҤ,}Yg} G ֦Lə:5إtV/`ViE @Q  pߺ5K=w2, čث?}DC;}<$;w (~Tukնss:k"RP Ng[q+'rHZKÊ&ܦ (VD<_PYd9d+G{;r:㢋=~| 5'ȏ8%%oi3kN<1+{<ϜYuo=sBDBwɼ 8猀r|{'-)Pg ЕC'՜ ҟ2% i bRF;FJ )ǖ_^g>qu:KAS"z'yNZ% !`_9jT㡧>/i #*e@t`^DR3xkwY[7~=\x4eʧfuaglLe98 `潋6_t*D qéf=ZԖp# 2pСaqHWkT:)D*RdW9g>k8B)Ŷm)Dp8*yd3vz}Eۧ$L*-u[V y@67.!v|w1z %9Q[q{e_Ee.>\?Xccgis31ߋH<*Lm{w_$Rfs,w]HVo9S\Pzt`UO!Hz+ml~AQ\g7Iݣw8 "L.+;?,Q ~f&_ò:@8֭)BDS¸ (}%,aEN ^pE;~G[^||C9yē~rz76i⋪/`[bBƶ׽~Z<>aARp(9{th@bw߽旿,GDtpy>VJvm4lBWbߔ RXYuQY?\QW',]V3BjZ̸!o1^q uBYk@ʀȐQeGbu WF4?`WL'΀J$j^8YAM4wkyWD#|G] ecz̓ vb%Ç=/;yfeQfz }=Xs-+n(<[puŦ@k(>"%w\iaڢ1`bty%Lg.iWzŀ\D"R^e h%J[9w~r) CZr*D$$IAiO>/79̹N5p).jϊe4p~j0k')GmmcsHht;{msoyɒɆñ+ q9 ?9PxMh?\٩TemnD56M8im`c iKaGE2wJv{s# ׮˔EhWY%GO~]}Duf+7BMcA 23^@4y~Tdڀ8DFbܭ7 +Jƪc5T͝{o S"\^^re {cavGA @H0\M 3-$PIKX|D4Rnt4WJK"=HJ|ӭԎVfKIuLNF,: |`;,@a"pY2=|SO [b\*p| {ѕBgD,ƛ׼Si/-"dlxzŕ׵H)HD}k־>cnX_XO>ds˧fO޹vne\XEG;kkyhn?OŻlrggv/bcc?+@UD//hDְz3cǭ|yjS^MM鹌]/|Ōs[2tD@,=:h !L#<`^֝7kr O.,Ņ=05Y:E67jNTNyRxM5WUa4tݶj DADX"B)q~Z`qݲxM] "(N{ڝICI 16/&)I$=k+ C.}HD:'0f 3(=Lzm[ IDATFȟ̝NKg61?spà07W>0PEa `|Gj*$\!;ˋ9(P'@AyL~kC_'B1c`t%"B臁$-& HRGV ю糱Ewòhp\q:\VnWFۧ )ƎO?Uۄoccccccv9|_ D`آSݐ+Vדg666666h":>*d̶4آLrr`b̶4آaO +`Nl666666h+lllllll)D $1666666hDꫡŎEC '-.Em 666666hnN<}8tEÞu6m /ϧ 1!lllllllѰ0/pZ[m9Qfd/ҥk!M ppQu+UU`ccccccN "L`\n 5iÃmlEC'H{S,F}] p]E+x;hRx},nCC"Rn. _}($DdYm~EC;n7( v]|1z+8sЕW#lllllll\p\pEE۶"[]KvHnF9DCJ9Goë(?4H =ޥ(KQ+X{D( RT zEA(Mjms'$?y9n1>$9 L ݻCU00!4V-^^㌱qZ2c`Y dY(0d@ %DCX:: k֐,cRD (H{7 v@  ]B׮`1 „ ;}$cSi–BC@pnaZ?߂BD ؼ1HOŋE@ h 4U/4QQ`Bx}()I@ n'wai׋t*HH~I2H ,'%=”*Oˎ F%ԾO 0JJ[7XIU!@UMCUIAl:*|4`@ .yf FEn7xvG.ticBׇѲcqAknX O<7l@΁1 嚒DprIT ׇM  Nh.ve -\)PU|)y3\@dGOdZؑWG %TB^" Qڈ=˜79GD!)]\net䫮bM: IZ@p >^4YUAQuM߯ ۭ|Uڵ]WKhx FG[ֺt8E6(sd $ Ns8q%+.s*oߑ:)lI[(ęeaa!%%x edXP|YZ2S\Fz@ ''N]no{"^vyp!9ȠL~ "dMS IDc/ƔR&_GD#KeKm5jMP`qq( @+sZ'un1ykW_:urMD׫m:G7ڸW;Fڝ8>}[FѲ3/5=o<#!Ip$ 8Y:u`L kM a)JQ_cI Xݚ NeGu}ESm"ȑxY{'NpJx`yB}IXӦ+ AAz+J'H~ )l uaؿ-Ip@VEDYvq&MNZ7p33͇5fL1fx(t:Op˖ٱxҤMFoF]?!*bM~&?,ꥎK6qfEHΝ3g5İ,]C;[ĉv9i]**#2-d U4 JK難-5;ԡQ/vﶢiE!@YF8۟e$j~r裡(\23ɲ*7$Ѿ}HB"^㘚 Çci)DG녨(Bt4[PRH% 6`ԯԨA>FEχQQBTt#5@Q4< MTuN d8b6ԋLz jAq[|eYee7<ܮ]cF&ˮYbbR3>^m=f̶ѣw޹o:>_ ¤-D2eDr^^ >^MNԑ?([D tSRƌn\Vf6) %T OHL:C64x0&Vj :ׯÇeKsgjfY9sJSRppQA\>$LâE@Iƶmа!څ$UҼ˛8DJ_1=.66DƈaX>AVP Sy:BGS@L3("Y4¢8˅U9<U-9*(&Oj<$r,\@EѦMС*U"#DɋH4S9eGu7AsUKW(̘ѦجYSY87%%+}>G #ifu,yo}dM䧟֒ؔ)|ƌ>b1Àkqd@׮M\`9ƒI#Geaؚ#B a0c=ڷ=PBN 0c1F sOL)9 , +vX ӧӰavfp9<p:ap3%;ema,iڿm?IX#9GĂfWLiTiȕ+˖X\ 3Y$"@A*Jp9a`z Pim!1MO#])S{ 'N;Ȳ:uI.w¼y '~|>Lf;f[ιmCY憁:a]E 5l׌w3 ۴$ mO9A4}, `ȑj.0C.(Ti޽'>Ga\E~:pL",4, Ol*+騫'=Ȯyl%K.}(qn" sƂO>KX7&L))Q` }!*ر[|Y,ԩ!ĉ \V9q;͐۷c׮3A43*nD͛C+)pX+BBn} ٸq['NlѲjYwO<+- RGQ8fMu*aCV-ǒ%dY Yih[9^~yq}2MOI>ˬWբvm#&FԱc2~C94w8jM_=؝p߾:~zqwvs LNoMuInbt3ZG R*c2 >'"E@yPblЧOU3n Evé%EQT5 ) 3 8z~t8 x\w/ u튦IFTޒY**\TqNlnvd$ [QwqP0 n+6ӷF< \>L/̳͸SeJXAݺ IE TyIp?**rb&rb/*pf&qj~*\hv(!Y|Y׮E4eJk{)]ۡ(Lvٰan$of 7vs!KO߿bE~n@' ,Y6YO#G6hB9kPbbdv[k躆˲#ǫ@"w1#-&F$$S[)zóy{:ߡ΢ȄW翜gœrI=4MJ~x5B˂[@@aC;7l#O!taO-6V #^^4҄!Ïm'E]GU%bl@TTg{*Jo@ hر#_J1h;ǝi>SI#c)fNFƏ^蓮ہhiyi\94|[dhGxj$~c}Bۙurn Iȹt|a+QU2 " 6^i>mC ^u{4&b#OvA&( '*$#6߮0}ȲNO)gb0Ȏ,}^<3ǃ @vɲt4r5ߴ^=,;9լ){{IRiGoq֬C_}cfl0ee9vU|]ɲp; "$1n8ci!c~\D Ip"s3c %IC4SOj/u50c\D<( ѪF懗e>˳;Ae6z4 <.O>9բd:9i*aS,[T5ͳ,"g2M1dg]-0jYjhTY6tDf4Uhl$1Ca{{0@d/<B DvGηH0CqG^# θ$bnȈSy[]fyp2 r8*?&6q*|%!>rNQQǖ~TUϪu2YS՗~Y{*wZD 6@1/Be9S}qapNgpQ9TѢQBWƘ*l~'GFDvA'l%fV De _bOK#i™Ur?uL |PpB N1G)bj~W,u䑨 @ \˲dY$QQ]HRղ{w]v7npBRN{fM\;Qh@Į]{,'g5׎?J`%32{YF m6 "mNJ"v:wbŊ 0>|i4#[T[R_~ۉx>JVeɲ"4B$pq02]"m9 I/`@.`t9ؾϑ.>n9YB:/ZI1$i„ u^zիW.%)m֦G܂!,+Pr̞kG9 Y}Adiܹ4o$[L(2e0`@hzײ-1vf@̝Wޘ5z:_Q0%JR"J,2iL?""$PL<A,l/j^ *_T,K+'&q˲V\٥Ky` d-W=ʙ׮4euK!nn~3,& jjE\J![\ReŴ@YuBSCxKj@fZE(՝K8N7ykXJ]{6,w Qu|@ .">pL=<g4 p\111ׯk;w  8͒K"Bdͯص,^q~5k+0۴a %@ٽ_ҠMp)5nQIS'" Ȍ!'Bd % FH &1s2ABAXYUs,-Z~s-S8EX$"P ?2&1p(늹hz3oGl '1C_M$։CUUMl/C,Ö0 p8œ'O0`;u$I$I'6&F`U :wgQ]IDAT(

,۾KL"^"8!P |fn[O,{_+ юIW5hq2Q:S/zz?~G|:+ x@pQ).iRo74蔔+Wx<^w9ǎ%s7P64V2uKwq}Ok2LG>qh  kZFIƷ%[\ pwL]ܢ[:e6 m=ĩ8/ӁsnXfdg%[V䚤8XGMfCvtH8)$ 2,gd'$k_b8!%ϓA \p ,++ t-Kj,؉ǏGu"R1H0͛74Mg͚5sҲ5N1%Q4q9kpå8Ôi"I&{[Mp2HB銦|Z=DU/h8@0uU~=ǹh |n-~xuM -ё67z47=oYޥrX ť,;6бcWfLmҤVDX֭n9/S*9 Ddō^ .{Ѷ4Vuy+DSSo즺eM7iH|951:%uD-dY$.ͮhZ&c67l Q oz]_|# 57,,(ҀB7/`e{4覙"A T K!A`*JjjjtT\o-N*PVsNE-d Y䳃%8"17'M^3| "\bE^"J\7sE$s iq?k)L RtmY\s*qEb vI,Z4 5"ReX>+T9-)JbTn%(MӉ() teccbbc;{JL;ǖܞ"=ls^+IKmWE`hˈ!$Ub/ "">0KU TIDHYVl/f T fD䆝@RoUbI7if|nE[D9c1&IQh-*JvpJ;e8J i*sګ6e+R+\iP N(8W-~B@Bd&zZ툲r8K]Z?_ U U||O1yvȶ5䋽c:Ycɒ-ٻg/|S*#NHu@-Z09SnQ!#+ks;;k#;o9NS3=Uϭ{("Ju;dSf82Ub 5gg NVW; \ωvu9Y/|3&ll [ޫQ/" } 19BsnfDTN3{u}]j5[_|Qrr'&7ͱ9EfG;yj~f!m"a \[}GJU}/ٕw]뚸;vO0Ec'V㾾v|a{O?lM#h5uw5dQM i3p4 ~+c;vѸce'D?O(kΖs7ϛeް+RCk_;vѸ39iӕ-@ᶻC-:0߽0\ɝޞ~Pơկ75rɯ>8PӂOO_=yxڢv ^=f'[kM~ 葌_L;w<񳍙ٙ/Ep۷yǏ-s:9{H;xd}nh{汌ߎ(s{q04}g.GK?]oG}+[ax2΢ymьio߸-;/Pp`Ԉ;v,#P|tekҎGV16E?;~Oچh_2>zJ꤅[:zp=@RQ?;qⲷ-j/r˶̽+r̴5$5$cV(xQ;c]?|N YWL*l1xݴ C~h/tҝR%:_ܩnŷ-饜4"SXok Є݊Ļk4q ·2颛R~O\R~a?'S$Q{ݩ[s{uo gO=-%+ݐR'՜6b}pL_яvhXdj~ FmvU~nE?3mXi\4Z%7jYYY_LdtqFFMݶ`gVvޗg˙sVcOo@UvAc7`mxgzi:@- йZ]y2)#oo4ndk}|&4ڽfnMa'cႨk4++{]ĩ&=wK.u~5q+idzʴ(۷@qG_>CF8`Y3pn@ᏏlH}`H:yPI )Z\aJPW KCw~53w']?uR %tY/8{X?xW ^Y~>Эzc6[jxns;2iŤOG~BEO>U‡z?SzxuC^cS&-RݚjoI3gڿWstIZ\PPNC, 6ܹl_:pၧoe[Oe;ķO@ފ~񽅿̯V <o^?'?D5a mSM!Z EC+(۝3A[q^KRN)|4c&WٰUh>PTX7!@{h,s*7/MtsN~wҊ0{qx$y /]8ixq낷Uϣ4lP0ʷΉ!pi_0jCWԨܘ@ĉ) ۺ4hy鼯~UCu~xқһ [ZĤl]B4 <Ωvצo^e}4N1&OӉN}o?d _}W-M6#$3g=q>>\ץ1xڏ_t뾇{g@05_XwmGFtڛ6JMMV}UOf?6w?Ȥuɲ]A$Iu gۜÐ/~ynd.+2!RI}Ђgm*|giq rIY_~ҮoΘn~C$icB4◈uX{tUͯ"bsTpǸj~d-8O(y_r~x [QFڭf`S {p⢚·uܓZyPͤ<_Ij{h ƗEk}'7uݷ_:1~Wo_wݢ΅{na]#ؾA_e=Zy :m=[%e㾂^1mn)i>Ǻ-?ч^׭][޳:pÁ9md'~2ߺeQeW.duLų儴Yxt}Z{պco찮_f89[^ȩ/ȝ22 xƽ7ew7"x~ǮtNUy:@G1_)au)8p,^^M̟^\K.h8)\J\ D@ßTC-HQŽ/]SQb.UrA"RíY"KȵS*Ehe2Uf1]+s0$򝧀 K4H O,2jקzn8W[k};7RL_~[X48cuό;tU+-s8qSk>#>w< ڍ_<Ygf94"JNn*nqw}>j+skkMJw4jDniQj ]pJєˆMc2& Q9[ڭA/͵'}*, @Wsnf {>oxHt &MUJJJfϙ($ɀ\.7x`Ӭ$L'/Ye@@uӴhƢa[t%CnG;yBzu[n-˲az'{B Bc,KZ_*]G+{2EEBU! @PAİnPUs*` rchy1Z@ &;TݑeIeUUOXmf/(@pV0aIENDB`Subsurface-4.0.2/Documentation/images/MergedDive.png000066400000000000000000001017141226345450700224320ustar00rootroot00000000000000PNG  IHDRaN\sBITOtEXtSoftwaregnome-screenshot> IDATxwx\7ܶ}{,˽H6.0 %kZ^锄tJBKhWlWɶdcm-*yYݽwٕ:3Czz0 J5BHx)ՎA/0!;a$AJ5Je#JǜJF'qcQRo; O|ĬK /T%L:@(59!^JY0!a :W焌񅩱Y{S8^{.9Ү݇[?+oZRL ^͝-m[ݹt󲦎Ƥ~a=`(o0pF1_Zxs<J=iY}}=2  o>vJj깓ɆOM鉟0pF%AU<Jv~uū_KI yѝ<!䄨^[>;5!1:^/w::})P]i][ݼs +v/ݲ/79>2u=?SbSS~*˗ʷ~|M"#10(Ս11:RqOy)a7[",f=ӻ%$7/IӵU{ qS&D=o̝;TZCks'Ν1fFNrίՄ R#&O=}Gr89c,bfy-h'!0!`GR Q=F@ջϟG;Bb#b\^0FL a`e gP<犭_/dLh ZR[rjs [MȸV7%o 3}oyъօ h;wҹFH ?QisSGڿn[ο@y}փ[F麾d7>S 1 3۟zg;ky/Gϛ<􈔜Ըl+zmm%D-$TW4r72u䣷_MrQy))G@y]1\{Uyˁo|BHUYXR_H^Hs UyB''.ɸSmϵ%0ӻ14@Dd;߹Pqb=JuB>\d71R@&a0Lh Y:ێ=7<޻lQĻ3Of,[:AH13SIĒT?L )SǫZZZZQQA)=묳\.{!$'''???::vڵK4qqqӦMKNN4z˖-˗/w;q)^{퍻܂΢*v}ڴiM6uuu`a2|լQ*Khz`l *g;2 Q5wI'̶c@G_@$Y@cɌ Leg!Ƿlr(eeeeee}eҥ_B<}󂛣QK.M}iiiii1-8^_BA\CjC7F꽜)6$w%@aEFO5,i9f+^Q4Mv/s`T{nÿ:ݝ׋~U'2{*OѪm^6ɚ&;!NM"h"h[w0ǒ$+YvL?8321OȿYXND-]Q\>_IOQ`B@!*{=gσt,n,8Y1wbWҿxu]=×髿v;ݿWtHlugR9TQܲ46Hw7aw 2@v [6oxлg;{%K<;;˃qjotcNz2\3Y9gSqsbGcl(Yq<=972˶< L~ *;} `_8jAo3l .?ٲ X/{9?y;OA#3_{X8xaaw|H0E}+M=/, .o*}?}6Ǝɗ ^~jc4oŜy9Ei$_ĚXqc'$oiD_Up3_<|);5p~cw4v7]5M%q]!d+hIN:ע믚&\|f3|,_{ױ|a9{-!h,,Y0a߇pR虝w=щy/\d%?Hιqÿcѵu7 я,H|þV힐2/=t?6ޏ<]9QslzkC"? US.zOZ2N]$*93#/TJYQb[h 0 3@iΦ|OUf>6-ܱR-=֨i:-hO|ҖQ#G.Ͽwiqd/^]sn5noĔq=#Jg9.OƇ;af R*\'R^ӝ{`q/qx[Jo=>>y1fEhyv2ϺY;@7*f Vo2>4U@w 6ӎZW1?kO35[ξ1O@HCjva&PJRTN @e*P`_Mo+寕7ϸ6I1 Wg0 3hG!?tFh@X|]T㸙Qׅ;gy627۸a9x3rt}uJC3#w^đsb~cumiƉLcdBdtjV>0 0Æj7p!85B?D8.;CsGmVx[vjyEli*LuIgnw, 09!`e&bwʹу(|mo\#J]S"~494!]:4%f-hw G%Ža sTm6oVL{7B vUx";a&t|&ħ!ܱEBDciH*0x? A/jJ"ŤxiOw˻ 0 ~ytVc PGн]4% ENkf=wFZfuiҔp2>G)}lCv<葿qC ϧ?Κ>LiS±dUؔjaazGCduv'XB8@} 3seWLLo4fpDwy#Fa%]nD!c2yl ?D|>r穝g4Tm w, 0Lx(e(Ų̡ !֗N4&l~oy[]XYVy!w5.a&DƸ! ! uޞ?b-|Z*߫;:a& , qsڂzPR_Ԥ싋vx%E>0̐'0|( 6*R#A igP1RxȵʻC:<̎쨛^uo͎q^4 Ճ >d1>=V @beEޕ LվUMcK W7U'a2 0t_gmI%B5B^݂CcZT'm`J%wSfsJ /*V0 3;〡_|: >&J]Aˇ+8QjJ}< }g^❅)8:12 0At0ď w |M@ -X>XLS}E}P]V3 =rccˇj]`|(zӠlcJ3M qZcr q1 0k@;Pu>dvh՗\ѭsLCh<#0 Äթ0&;P]0REUy>;I5N!yMc p=zwc AU1;za1X>=4W&X8XB!@,s/ey|R6^pF׼*=#-ja$!a P0&]ox=T(=܁HAR}(&2'_FaCf 0CUzt_''K\c C&Ӥ@!Ͳpa}л"܁0 0gpO O>$IcW˵&fY>. /u;a 2+8CJv*Ͳ|(L -ѐ·.ܱ0 0uhLF!I|mjY ;@ML_0̐p,"3܁NH-jiTfQa{QXe: 0 /j{ xYh$J#*̇*w6S'ĈAXa~QM$t³C4P 0PգrZț0 cw\]";,+ la}]TW'&; [P*uw4|іvw 0̙S;0Ə#XB'lC<f]HA@%)d;\Ta6 }%-Lifa5e,sͲQ? &,J)ժ hK Hk̙0NЬx^a渨z`0rs>XK' q, C.V-0oaCl Ia0L((ʮR%[y!nt 9^/oK2^wK1Ь{: !՗ / ~znF$#3SZղ43kP,d @|G8blt}iC, $h-! Jcae'i#kcc}?CLC|eO[;?Sƈ:6<ܱ0 qޤMgl ?yhMFx!7J5 6hH1̦1 &4*g/,adj=1@@!o;o!0ZϻW@u 'madU-M&G(ư,.Cpt Q?Xq@@@ҌkᎅafjlweȬ%NeͫuWK1ys >Tȫδ Ŝ9,0 WաE)#3{BF@|N9H<9`D̀ȇX(~Mq&TGeaN=LY1  엑 0f߸<~/fdcZ]z(N8n:i3sZ0Bf & *V 7~u6{iCrf494PDidwGZj2 Vo2>4_ jcnXv\f>0UOD; qO;!a@c_J-`ـ2: 0L_2um gOzЮU8Sl_ F[6L |(2 jro9 Ú7Fb|Mf  81<@Zu-;'YƄ^4d*\^Xa7z_pU?Os@f Sw'k:=?qj+i/4NAut6z`! &c>Hea}MҌ]>neryIz7}nDw* #9Șc[ݡ([ Kza!C>=zBKU?Xs3z=wXpke ?;{>;3(p0 3?WA;zR=ѩblc NTxB=u/#0@ZS's>; 8ΤiXaC(ۥ6:^>(.KOsWuN| CDQBK9ɚ0 H&ʺaNġ(x"kc.K L@TQť{;/ 30!<ڐl84,af8x"gkTw5GW?^WsJ3n9ѐf=Ww/>:W<Ƨxe6O j` 0Ó}F\9vaq1yK[3L_` MeZ98a2@t^׻ w8B՗ / ~z_h+OđY=ԋ&\;N_q=Ze4w^\?xCθ2L8  4T7dnF[qDE>u/߼$C,|tyo{lXw..FL(Mb8B 0bLhjTEb1FDXl6 Orgǵԅ n[ pC.J0U0=ś&[\_U;W uϲ2,|>޼~߆{2\RGbfGIScfvm,PTf6vzLIS՛/~"!|@x>|a[7>mcܤ8]UqNթ;ZԒ>VJ1'hiO=kQnw־險-w~=zW9qŶbwg9kX.nzO }S B8JPBPypb Mc1 |닆Io \,3@Nߣl<=BZ@@\,b15-te Dۢ^{+_fN5]>{i=?uPɏv< E%IO].n!`>JE̔  `&L0bծMH@KYg銓r/kYu>Q]ןvȬ`0yINr=&?7_6Jq*0w܍.&ٽ?4:"yDW\8BQeY@HGO糟>[TmQi!Ϸ~q&ϕd)9ꭎVWxOrt= a6^0 -j"/Z#Z HzO/m}Ã[?:+B?D1 pNnBܔp{+EוťD+Sr<{mW6TwwLʙqw, :6sLšڻ U{eq3GX"-MD1|a~;$|[?wo5BH e gGݰgaWpwL(8wP0~! ˞hߌ6o|]Ppw-vNuFX"dUv{1P }\=x{f^‚=xs'n9Re'Aχ(mԓ?2laAyYeol?{R͞0$by6U;CJxyeoIщ&aˁ͋o3apy{+c§?yZVeIZZYaDuoK2  X8.Bvpa¦Q>1ڶipaa fVƂoկ:°0.R_?/7ybJvx?\=磌] ((<",FDd0y=(4ǁRJF3TVֺ;3#!c\USCJcbдA`0Ôe#f̍C?$A|@|R(Jm}`d:!+p _p$MuHT\S|f<|07%#ijG1}?!՗FZ#-F˪]fsw?qջV2%)>]oƇ;aXEz ZL/k2& !O:?_g昙':\nwV5>c㯙wur8\nBDb5q&䵯^8R\]xySΣj%'PTUu]'l!j8Φ&Rʆ?1 3l-{ $`s!u@Y}*= ?{aTZ^Y}i?,=~ˢQw/?O=>ϼO])B,N0]b!D.v5.v=kv]ÑYp!aje< cAca⧔:{:9n1Z^py]1F^}bPBy}y\D\fb,k==Ju{uc]honkjթiT@za Hk$ifr;Yz;ֵq|vq!C8P>{t l6Q(/c[1 3%p2jgc>)8ȇ!~֪(km\ף|SH4a7zjjdPvuz7ؗGrӴbƸ1!?AH더~ PaH 堔x:W鍟\zL~SU#\PEʜpKKȸt\~ni{MiA[쮺C}ᮖ;jK]<=`P&\MJҺ)u<Hpa΄]nqQ}m8K \Le]K-4ɡD[މ.a.lM )YRF=_}qf}Wʃ;n9TR4@+ho~yqE,z ̩3z{t;0 3PwC:bU͇Mqx/XFŭϿn>̜0C}{)%m~ L{ÌEg*ZZEqކ;]^M'P*>| F5$M̗L(LIEIz)D ZTs5d(VPQyVڴc{ݕdO깴0wE❗5gz挰͜CSj8B PLTē3R]щ3{w1noy|ᲒÝm^'P4QD^IAx~XkD=mU. @l?אa Օa:*.-r^MAO'm5;z}9]ˇ|>_mK]m#1wҜXBtrv.S{*wW7U+>k,B RB 3&13&Iۤ*hjyGVSWTZu_ <ǍJHSuܑMɊMnoΊIwe[SN\REKCN|JyKɥ- #SJ>KH9\72>$ԃu%j><*!@SݨC-ԎNH;|8/!Psݨԃ3-%6&$6׏LH)kRR\0">1;.9+&93&9#*9#*%36)>"IӔ]5ɑ1f:c(iIEX"l㬑E, (-u13ƤG |E1 5a lj<=o1Iœ' ;1ݔ˷HO˜::tyh[&ʺ}K<kpF}?qtjY2UWLKW1㮾kQK4}u]TՃr/k+)Ύu]m;k:ef*{\>Up9kfK)jmnjǠP8N(֠@xHth_91s(`2p:\ǞS`CSuv3sDQ؛| K,T^FTD:u Vu5%<_ '脦rvw||rɔŗLY \ +}+ +Pv濪~ӦMKmAVoWU "Q͇\--˖WX  $ral@)mV}]wKSzEcI+E+TR>6ViJ3X\iVvgHٕ!Ykgl]k-Պ+STz4L\2$kϙa\Kʐ53] Z+$aŕ.YjeWh9|44RS$sN;Y45Ȟdߍ'E2'I6;]ɢ)Q0v&dD=ގ8ޔ"(D3t`T]]k8}d49xZLd5RD:q`6 U\SKH]Z؇4^%׏v5-nyuYc5BX"X uC}80SOI,AL&OVcb(Un3Wx<<:!`AסiU_~iMLGMp_zYJ?3^}5iSOC F #[ӓѼ3A2[6 gMSdU"`@UonFoֈpkD='n\LS!٨rOp27B)G^~`IZjeOA$( r|^;bF jҬQ B,U+VTYsM0zV3`S d5@=(ކ \ݻ*ޞ֞n ^g׹6$b0Yɝdm^]gO7qP6^/QM/ӧI81bX j0wUF2\&+#{Z=:FܿWJ^!#ɶ?C;V8ӸZeǣ7gW7JDbzjj+ӿ Nw#aC,T{_Mps?;d룏&g-ZDcStn_G/,v[$S߸o+Hu]ou:6VhPQVvWwe[#(INLz9jɄyyqa{L<@Uv=6VPy4]y(YYztQcx6c&!L_^wVlӤqyR$\f>G_+=nMд}{㎝| O9/g{ԥf##EXQ|fաeͻ5kvLF⼙?='Pl!RPR A{sGuʵ)Y<jrZL xUeӶN[bá15sO__&ړӓb $A1|)yScoyֱcZZW="fqᅄ7n[0!aDJl]$JGM?j/nic{s=_Whx8}>/iJ8Ki5 S:"GڱC9gv|B4 5(oLȹ\8?ʌt݇+1ߋ꺻`MWAs wXL (EbW6lnjy鼩J ."7> pYYO[K@8JUBTV|ńoK;2$plmMD;lSq>)^ g7X~8~^FdҜ|a MiDMVO%9 O@PP9=z:={aM_PQtMN)Fxk(N4-ʼrrY4) ]d49ݮ:4JB+56156E> P2TUY7v,β2gccܹe3.nJ)cov\u=*;dlZvZsz(ϧ@ƵkuEAbc鎖7609\KK)e@x?޳tmoYGQ蕹UGְ۴g;`)+zfz(p%T#2 GЬkkrsu]#&&L.f|9%  E U^TC]m^E>Z`k>QFhd9 M|6bFh7\{+fسp]r)D𵵆Miq >TsFYBQ̊'.12;}s6ǻl=֮sL\<^jUg%!dA޹_\n C|x?7Oem|{5|zba XIS; YR㌔Џ4 lod2h CUZJn~O~umUEц]U-:v4BQ 3'EmWM|" IDAT:tBF0&[EFMM?##, _X=fivu .TF͛ EE ENU=E^ۊ?u訊.wϟ&RGW&IV_Zz/}T<k~4.q~̎ H^ջiO)m)qzUywhs皘<9 w;~_3n܋T|qqZ\}Ay^4b5ML-]Q\>qpCw EJRBH6`1\kdyد|.%" ˿ھrSYQ|_mMDlIy)2#R3L#)NGSSwRUWKQ4I|%gn>Bf-p=*Zd=>HcmHv -jI"?iI-3.q|sU-g_d%n-bIsqfQJk[u/qMNytV=˹ymK޺egֳ~;ePZtǏ hH=^C lS :wP@H9nJꘟϺ?K~[;Ƃrc#VFO]yw=@SWWfijW}%{-jsCzmn4/=iZl?C H3^*88כ?ogvb.C"_2yj*/g] m)=~}uQU=TyG]u`??ȔGƮ-u34A+eEkU+s^W"459.%7RQJlw[8蚶D'y:5\BoC/xM< S\E)dG©[&M2e%_>z9g`eY%ٻgJn`ѾyA/CFl.zg߾j3zKHY=ʴ́~v!GVGYOmͺ?~أ%9ޜgg +x"I?]JY"BNyg.egs<KJ>ԴmNsIte+Prcug[aX6 0#.]9.Eϣ+N*b;XZӢZOtӰ~L3 Fz.ڟQ `Ѿ?>gf% ||\*'w[<9akI8Vÿ??^-~:%gЯ83"ፔnP#+qJpC޺QF|hSq菜Մ?zJ+yFB$@gPS9Nh[DWBV3>_^5; lzsQgeֈ~,g{K\5c,Xrxw1tmu-[ꦑL:(3 \spU[~Ջ=wnqjs䬼u&y(`rC!By</uv r)R.=\_s8U;x>%RQ {>->߭禹ғ{ /.ce|43(2isMsE[8$ǦCZdn}C39 @@ L^lts?y!Bb{Jʮ x/IwαnuI)@XWj`)`0X(/]kYYѡljVfeeRw h7R^,/}F352>[5j\xETdA ৭?KM\7茥p黻w${gZ\5Gw#Rg[Qm]ђ{r֮:u*%~sѾy2 ӷr{Fl5h}ǯ7;gu_4͈y/:=c7NatWDAeA B&gڐmv. {uO痾{kOjrSL[зjS(hD 'ouHD9Ѕ8F+noVqäv6FI ( :"YeP5C n{)M$Arg_]ߪF m"⣝8r[ڮu;xÏ^کFd|<^>گ톯n`P\_΁'>n{<tz͍׾JŻJC%m^SgЩ^geoϜ|}T^ރ~IXu9 J}zWb+e0ߞr]n.Yi (faJ ܠ B N|cB.tTOa.e8:,f_(h=MP~U'R8n+ueyx^u8|!D[yl>(}ppĬ]3#.vmwyݿtV|Ǥ{լZg56 _Xup[a\7 /;XupتGޒyͨn y˃#f3&k*RP &K|wyi],~_+uhm߽8,wɾEKI1>O>=QR6Q`[Gx;7}N<֢Voz.5Ȩ>֩7;mdCI=r',}rvYi/TI)}ד7}Çf% n\>F恃 |O wy=;`y! jO폛S/y#_{fZ=_ՍYT^b{=u08*,msiK'bmfly۴LLj9/=/Qdn:c/7)w $MO;w}œQ9CeY*%q\ñG_[&~\y&S*"roWd?xgEϖ_q S+r#[JϥT]_,Gpy !%3{ϫ#류YVf6ZEmG&|MzㇽkkG)=grVsݧV~Ь%Knjrqš9fl^(o?v|ߴScӲJ:NIDHCEU]ICn#~Е-)J< jKVinq?8K#$Q: B u~mRChd+~ӏ\DW08oVOV<2Q/l=׽3diL/kYلVuU1M[{jxkr a;|Os|5"us]Տ1eZF}F.;yޖWn܈:}w-p~3 @J1Ӈ7e^Iw\x,0qD@_83]wR,@1uk-TZ?hR@!D"b6=-h-;HTQJ?jg=FuO!#Uϝj% dv ^/MS{<¬Z`ɣ"uxCo| Ou~ϔK=w;Z,z8T$b~ !˒E*C$Mx=͓N$%}pxB\'<߄՞qiVdcaRcܚŵUQwD'?`ĵ/>u|u[٥ jyqJw'~ +3ή>66،雧?x{]rD^߼oZYUﯝWB3&m< RC϶Ѧvs<8n<>^W7I@jۮ2WW7:OvWY'bD,(#,[GN$Zcm!W넷̾$}X;W{9jL30fYV}e<Vh cn =gDWoβ`a3kx#[m_Ĭh3x^KMS=9LXWHmu<&?l.|:V?T@>]Yr# ok*eEU_& Kp昴4^CR]_mop=z:Va$ WMD,J(+n{7uWNnj>/]r\1Gڥkxþㆬ޿6yo;>Gϱ[|ƯYx]0/t hU<˳-Zrp >]I0Ǎ8& AhM팞Sixۈ;ZsǮP?\}$q r'O1-Coz6zFu8/*l*XI⡊ s~!BdS'>+~'."kG\TX;r7|PMBB8Q=j%d>}>9}ABbzI v4e[qN9̊;Ou>h=)GEy49{QJ/'=Zw|޹Nnސ/q |E[Lp&{RN1}C溒={Q˦[˭Z\z꧅R3XFi?!1WUZ|[AHdOnէҟ~׏f== m>Р> /(z@~U_s 3elj곬_RW}YYÙm* KX8E}Ɩ'\ԗ A ߷'&4@G!D v=N}1IE8RjYFeTD1}'@|v<͍DOWƐ02,F^SjZկs6qxGz>IJdT r BSAh*4l{UJMJ5m-@q5y(+Qu!Z'ը*7MA1jٮH*w[} pZFFv5ѳ{~# ,ˠ"gF; IDATa5kDZ&±ᎮirWEz%CgJE<5iRJw0yGR{ 15/^~ )خ\j菗(uB,6t9{v`vs_?qk3f2H<J}Nɵvo=PլqbC=KJ0JM,gVeԖ9)|V=tuen[w#l ?G?=ݷ-zNsx l%@E,Lmo\4[WJ5gvY" Bؿﯥ28.9rg6jԷeʕq2ko9Cg9ʗjrsȝO 332Һwȣ^|8sky~,#Sz?#ʮy&?JX2sol$E><{Mtc/z%2[)QbjG^FnS,aj龉k z&ڂZ(nۡFk6ͿPigKvObZ4 !IKvW?<.9}qU˖Z5wo>0go! fMEᅢ( ~_Y;*q&|ֽ2*B(|R9$~f`NEO\>g٦\J.ݿ?ע7R4U;${\u;彵%"Ǯ;aO<7@b kw{ @"|xgx'0oo)I).WGEPq!bUAWV׷%hfE.:׎bwlؠƆn9?߅aοYP!e1љhcJ>(`䩙WVu5-iٟff;= !okZAp{ƭX/Hr' E„O(;Kk]XƛiO9.Qy⡊ ss=?G,֓0נ.Ru+!@ZԹ|aJ)9>7q}3;..DvD"Y>R(6|m6oA8,Ww82a!&!&[{q_y1EްukYNh0(%z%e0}1̅pO m `lԝri=߈4T11}X|4heQ{fP5&(Vc)@ւz o9sW^RV~P->\?|bffN23'LmY \ _vXY`eez07zdP(/XGn];hg:趫Z=GHҋheiUb q"Iyt6[s}Sj%4ixȐˋ`ȔjΝw&'\ ]XY**_C 5{7ly5:w"-w՚ﯾ'4i32n3A)ۛEK8SR2=D.dYA]?xܪ'qx XY<E&2@) yg^ԬN ,UmBr:j9X(m* \X<0 6S"C!pLH$Y͛2?aV@;i/mp6[#QtӲtM u=0J ({xw";yG Oqra3!Δ^˳SJ-Ƥ$:`^nt-;M8['0DE(T R= n0NS Vzj]/ fزz8]sDs:$)l/IIZwa aN 8j;۲^-,HQxBIJDт٬~xalHR5IruP]/zf߿ҐeiWU+pG ъ=[ya!asGDj|U> HdzgFHs,+`Y(8mΖ* O!a(J}E@igF ZGiR5oD\\X<0 s"&inwgoBkM3Hiy+,q(VdԒJ>\LX<0 sy TmG6i$]UsYy~U$e,v{ IvwyzxaD4xzLMza(4}jZPX8n'I+d9M* SX<0 OKR;lZȮHd߿L u=R= 38 AHvyg%Va*a8Ei( bb`YH߿ɲ4ii. ĸݽd9U+ sxa柎EIo@ R#ڬ{uo%v~J<8Q.ZKa?!w8Z:-,]Ӳ媚3r f  =kd U0c0 s*'*JEݤ ûBcV~ <8U(Y{9=,ba!noQM,KUլ@`U$Sr k^O1!фܱ׈b*+$X<0 Ü=m6[&z()дT x{qV犉ZSYx\80 Tw\\M B?T,Ұ߿; (pvD1{11 0;M"zO@Oty[S *%C 0ň]nnM ^T4-PV@$9<\fk9,ba.8s0jM5̀e5-@$ 8 xzHR @*EC 0̥G<Oo 0Ph߿4,2otZiTS4w= xa B챝k^,Ӵ@`e-+ n ! ${<!2\X<0 \nD1!6?Ue{|ESlӌ DPZyɰÚj RW'׫QWWNgGLŋEޢnسQ=5Z|2!N 0RBG@)!k6,rgtf70 0yΘ>o@9^\ ,KTմM+G8E%)YQ;ME1ʼ3 .ظ|$,G 9B)H=oIԡqoݶh^{ǖ-cSz݁]-q]cp 8/@)u) ᄘO`Pj xO!vt)e׷~30!J[pG 4Nm=pv1 0łj &heQQj4ꂐ`7Ex iF(%"`$ bX  $6dQ><2JUB4oRCŌ53A")[q5@;:xaa.^p-P00J5д\RF1w.B8r*ǻ\m%)Y+ BTI9TO)( A~hZe[xKDiĐB)j"53.ʐ7Su:f0 \J8ru{x3`piG"{-+`YiBL~b6E'U\+$(&ߺQjmn\$He{rxM2a{rԩV۲VQz a62欛$$J9E1]u>s 1 0̥NQ)J=B(V`pnYf`p#pnoq.W'QL./IDATǹՄRjYkf+weů]wжAF&~3|Е7XPo}!7-{hG}EM~5@3t8ϫy?d ?K6[ʮeNҴ+.9-p4ʮeLH [_VBMѴ|M6 S8qVVc)' Ownҹe愄P塒CkԿ.T DBg~eOlP1KvJm^y|˲ҒvV5Ra7,,ǻp}uw4ME,u=}rX:\xaa Dl ZdFp6op̡' GN@=O'aM:Т!aaI\Skd|QLM 0 01 0 Oo[rQpCw>p :Z IENDB`Subsurface-4.0.2/Documentation/images/PrintDivelog.jpg000066400000000000000000000726611226345450700230310ustar00rootroot00000000000000JFIFHHC    %!'&$!$#).;2),8,#$3F48=?BCB(1HMH@M;AB?C  ?*$*??????????????????????????????????????????????????I  0A`P 6>@aKyV1@WqyGE:Yqά*/Y`3DTi 3\"}1ӧ G=Q_J'cbk;x,8U]ԌUOa4P ╤sx141OEd:ok5\ε2UMR(rֆLfT)S[iXκ#^H^N}zrXlL*ZkEu@ELVFFrF  zfh#P9#`8k3@AMi檛Fu^P dj$lgY+H7 jH 䍁BJX*bh8kV"5jA#8SZ٤vU.VP zR)-Zh8wk:o5$@S mk\i5 V$l'}nzwʋKe%&@^d'@$I婜:]=>-Zh5H@>nJ @$A 8sMDM" V$l zR)ŘRϦ$W&$S{\ιJT5NON^>~u5 զAa5j,{ zR)V™Itu_jOl8ռzNޝcIۭG,Jis4-Zh\ίbv8kLks)/gz8|i;Ìv2w;:ES9ryLoG*554ūM6fZΆ`UbĀ5H@dz%빈WvFW5w&3]zٔ{m^1L"\9zE2:ej@ 䍁q׆UK7^s9+pר"tֲ^-(̉,3j 4#RrVD V$l dVȖ03,tR^e&a֋LETYI$MLlIx%*+LZ9#`T1R/fr]^ewY{\PN&@Q_%Iю4vj@ 䍀P E2MD D^&@QQj MD 5 զA^dQ*"j MD 55&@Q-ZhUH@ 5$R&@QHj MD Ţ V'HdsZAE (J+i I5K4"3 FrEd5Zdc).J[ΫCkwhj@R) E Q u    4"(n:@fC@fz9m-Zh E2MHjI0 12P!"40BC#@A$35`񻫮51yskcT<ƹ51yskc\<ƹ51yskc\<ƹ51yskc\<ƹ51yskc\<ƹ51ysj|]mhzJځec]35ZjOzM ]m|2 j+ȯQ8ޖmAo,+kGՍɾb_[MZ_p!`<7k]'IwNvTF(9 ?X/8V $t:vJ)ZLKmW;T{,rm5pm7kikiS43L1 3L43Ofi` ifiO-3kT&5MbkP&5bn k湸1MspM5qµ:IAL=үe33334uC}Mz333:xj 4Y"3332qίQVffff`Oxund>h~{lBt/NWJ0&Ě,k'үek[r۟x*Aĩ m$&9labmÎ3|@rcvwNVY;;oWP2`Jb+{E+\D*ͥL-'fm&ՊM¢z~Go>{>5?#GJ#|O^KѺhCՌ6_O'үdT )=x5+VzT,hBv+װT*~Giά̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼̼^'үg~Kbq B̈N9 O33333333333333333333333333333333333333330vJ&miImrrⷋ[(5CW`AS(Rvүgzw+nw `u+^7DֹgI#l 5@Z>{<:jɨ6ݓ,\5͒O=wSIIIIIIIIIIIIIIIH"$$$W8)Zz6kvJ{[Vhf.b~vJ{o[y4(+ݟv#=< Nն*>Uu?AԲF']=F2~Gi$ uٵP̢h.RࡌT@\`3Pe}Kb(ZZ u JKkYfvJmfZvmW*n߆O>+m#qz{u/Oyߒx(Tkl쉰5=:ʵjO㜕Sn]u.kSv#Z;^R# bgU*u _{,,n3/OS1otOOkZζ~WScuVc\jhm4jrc陱*H;^c#(z[L4 _=;t&S*TW;Oak >at;jR|?* *50b?Ө=U=MZ.I[Qu^w?|I啗&MuV<Qxp='8NzNrps:Ϯs:#iaM 6l4iaM 6l4iaM 6l4iaM 6l4iaM 6l4iaMקk;ty8/׍J'q7tӋhhm\v3,xڹ!^䉺b 2{v;i6mIm&ʹi6mHYjvmIm&Mi6mIm`Ef1>daKEӺZϹcZlbG%.B(Į[>dS0114&E ;33vGnf{G̞R:`vi͔/WC >dH1111111111111111111111111111111111111111.!1 A`aQ"0@P#q2Rp?n5GU<.2ps6[~};~Kߟc_eDʉ*&\LeDʉ*&TLQ'/8tԧHiSGWG!q3gϑ#53gϑ#>F|;f),gdmЎ)POœƓT- ,,/2HҎx8JjCqQq%\[W5,V\EbteE/W;/xE8N߃8tbfVfE/u-%nF+KmA $"1\)نR=LS1}XO6֣ta-E9RѡMUOQSĴ2e˟%՘rnURvLm)E.&9[)82܊zŗZp0Gc+ʒPHHȅą[-er%hXI9Pҫhɤ(M1%%CߒYe$}(Ô\ii'I~!ɾ&nb}cm#) :*M5,lYeYeYeY-Y?EbӔ0Le2~̿f_/ٗe0?0?0{2~̿f_/ٖ2[3F'&o~UʙCn1wض'UʹQKǘh[tH܏C)21AP !0Qa"@`2BRbpq?3cֲ= La }ҲYnhl?S/|cÔЯ *ʬ«* *«)~mqJ#6xq˭_?+ + +» +)W8W d+-,Ä?W Q莆]x (PB#>:ez9I>e0bgM<-ja1Cq dO8HVxgJT^ٌ{;O4xJ(mNR !QhQVvF9t`O NuE٭ &BmV6L+F݀C`M#j>S}E_YU%>٣}O#xG4=D49]LQ{Z*;iJpN5dU%RSRT*******AT^'Gdd5d#˦5j(PB (PB (PB (PB (PB}?!12A"3Qq Pa0@#BR`br4Ⴂ?YgE=z,YgE=z,YgE=z,YgE=z,YgE=z,YgE#ԃvىzmJuV [qى[qQ $]5(<|Gv9+n.3{ ٨Swj5WxKf=MՁma4UV %4?X+_[Vf{h~!INٛf>Ӫrr3hEP)/&툵lt[1}Dj7u%‹gZ&Jٵ Y2e _*NI`KܛqٌF!ln܊$Eeo">ޯBhV]^j5[6Jw:S6)6 cO4o\h,pYEf. 4\h,pYEf. 4\h,pYEf. 4\h,pYEf. 4\h,pYEf. 4\h,pYEf`7y6M.ѲڹEJ9εꋐMRE: ]2J9rS s"9#f" ڽАj.QTёGvr 8}b+ı,KX%bX%*yWyWz%yWyWyWyWyUryWyWyW\tY:+㢸:+㢸:+fWEq\tY:+7EUCuW9arEs\<+O!6 *|GrC$6آh51fEָ4i5=Q>`l sr"ʈuNL !F+[`mdK*N$LK;F2TFը_3 eb,].ebvXxPƊh+Ɗ_______†Ex^4WJo\ycEkсOSl;0{#!a=w?A˒HS(@O/ʱ2DXV-GU!UFUjU}a#TwF%?1}XiSm@cuXFWP V5XFaՁQ4Ka#UjV22݋5| 2/RQUU[%dOO5+1B=_XŠU=<>os$=ɡ7"Pkh<JGɟРU&Sk 64J&6z)s)g>1E^KeMecX,}>eQecX,}>e)^ecX)cX,}>e3O/σ̾tLqF`V̇6KrE~!I &U>a?t*iǧh"(N#h{z3OI=<>2ŻrN/#Tl,ّ4R&&)BYZETxBHt|&KwݒkuP=E.fR hΈ;26V$5% 56nwZu݊*,=7iI3K;OI=<>0nS$P.P ]3Y+$QED bbB2E"%k4YPdB6Ewzy~}9|ç_N_0'Y0@iGTKYNaZm:T8OMɋ{\c?t z.2"0=؄z誤E m!aX{=uaX{=uaX{=uaX{=uaX{=uI*.VK<u_s*U?Z|&@C7vF7dEҧ9LgH\9KyuEwVΒADLo>$B-*, ftJh ֩M} PlߒM5(ND&a]6]Rj7ό3D^ꦉV_'Ʊ "ɢ:OHWOmiAd\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]\]CZrzݮr?C[s7Y l210dͣ~}9~2SVN [uO/ʩpJm8¯]~|6,q R l3-L܃K)AjsQb ; bеY zrKx!^P;=nP`mòFۤYq@ZQWX ~τSq^إ >tAHp*vYz/tJʲ 9P޿!4n*)f_?2&Y-!6$k>-M%WmEpXVk07pWpV)Bs( R?ό^U9#b'3il4ٛ:}}Ksm"t _Rq;xǗeY.4@4 M4†=ubg@;ŴNioZWx@yR 7e`Rvn\ AfrWޅD+r O?ω%'T F=BeJOcokGEe+w/A_PH(.jmHnG/(( ho(B{xي*rPr+Lq"AgTsBi(̈1r5Fʴd|(B_UwV+gdڴi_B9?ºz?tm4\-EMEt\=we? p6eim4X6,M E,FyBmz/Q2{խݱ($JTR.%yBF3XD7r  S9B7"'r@\YmZuNTtEg<zkPNULs)?ϧ?֛"y}9}SӟϷѡ!b:GUV#uXb:GUV#uXb:GUV#uXb:GUV#uXb:GUV#uXb:GUV#smYk9#\e:jˊܸicw\G~vWڮ+r;*m]:z흪ڨjˈܸˈܸ?_xpQXjw+zɲ9(pWr++++#aH;iemwy [j A1Tf-MȺ)D%3*g TV&>(y-1ˢ (i ޷^C<ԎQSAWB{xZ'F딭>?A,#DR! B6̃:ϕɂFD 拲4+!1AQa qP0@`?!!3ssssssssssssssssssssssssssssssssssssssssssspJ (gyqh˄t&Q) *WR$W}!Hև\q?qpÓȈKT Z^, ZUy0Lp$,]b "0'Gr#QaÓf,ihntW9 @"ƿ@X= GIpi A04$aQĐ,;QX-.㉐bhb)kqqqqqqqqqrS>(ptBX6*#뀺+^jq.yFүԠ}AR"iL8yOǐ dk@*cfJqi8IeX~>wXn FnKjZA Bb #`P]A ;n$@*֔4B:1Rh,( ^_Sy7Sy7Sy;5PW$TTǤE aEh{s$إו$" $[&Q"EHR)I"""c,MD"H @ !E]U"D& M!H|Օw*BpPc-h*V&BdƣבbT  5:;.P'E$!aAH@&`XszCH+0p( UTzEPE ugW4"[d53oyIVb; a DB_YQ K KېCJ_v'H(!l a_H>} 5H50S }b蠖jT'Ar|Ttnvovo#ndY7*V49~uv_~⇢3o۬6ͬgk;YBm;stcf׿Ym{Yv=@@*hX $R -#y]e $QCQ?x(pc$Fm+*T1&_2`Uq\Vy%#@ T9vsjmM6ڛSjmM6ڛSjmM6ڛSjmM6ڛSjmM6ڛSjmD'$jP˫Q4d?1&G_PP;US}OOOMo ȷ2IP"`X U$@ `(2?W?W?W?W?W?W \:V^G;Q#xdX %^aZ@R W`T)^,0X"R5`w4 CAzD4 CAzD4 CAD4 CAD4 CAD4 CAD4 CAD4 CAD4 CAD4 CAD4 6K20"B(PD7aI]c5 = ,5P0𙶔#d PCD tFDW®- hkC݀~"Խ᱃tH"z6D,X@\;8 b\:La@LC3; FfQ8a FD9GO[_ffffrr| F\M0,X[5+ˆRF(8D >f* Q.Or  VZE/Hl96 bTXc5k1~ xH'Rܰ_QC(C7\(@j?T@bzZ8">U0 B-+[(m7XP /xF槴(R 9z r4 F] ~#PPfQXs;y)$ۑlVTp(:T*[0^@Q(iC tBHA)UVG=#Y+ X}焎Ar|&CeRѕbPg[ɘuNVn*R,m* a`Lgz,7|kZ*Y!Y`6ЖiDfX#H,Ae0acj(UpYHN3=f`V60ˊ&M3C3_<$r xy#\;8 `WZeZe-=B 7L=e2ؗj  *,.ST7\}焎Ar|@9%+эjf<㊔ 5ڀ s6ye4 &aF6l#aF6l#aF6l#aF6l#aF6l ^0(.OM#-V &He j1B@EVXhѣF4hѣF4hѣF4hѣF4hѣF4'r|"7u:F̋!4@n_"LNU5¬d>OHJaͩNjAS|)+Cڐh5q*ưQ{ @C040B @v˅(KQ !ŗ[zD` <#ӛDgT/1iQ1$^)lܝ|Bf5M)I%󸒎{@7@оFz? Ato\})+="bxC O[?[?_?[?[?_?[?[(|lD#~WYl@rHt# Y { m3Kxc#*k%$7B ċp˘l8_0q.O❏)w 6n/gl8^g8O0ǔqao_Eq4&nf^g/@>c1c1c1c1c1c<h,w`h)1VI4z>Ӷq.\эC@md@ -ͥh4 W,z; AD!YP&x_8Hl@(p R!oq !3Ǘ$ lI0BW  +]6OhB!\ TwFNvtPȟcR"%3* VDYeH AXuUhhZkE :0PE7(AE¶*4H}`P!8%"P yrIeE@ 2^Ri zk.G`kds@p+$I(0U`|>4hѣF4hѣF4hѣF4hѣF4hѣFEO  I$I4@up$ $I$I@@<* $'$I$I$I$I$7 Z|`X8}$ s}mMm ,$d& PHI*IKtJ[-dI$5$Wqq$@6ٵKmmK?DJc $ Y$2I@DI$p$}@" ѓg# @e6mmmmmE$I$$ $I fYmmmm7mmmp г z\0sfmn;]Jiii3m m-mmm6ommmmpammmmmaQmmmm /}vmmm $6ŵ mmmpc~ymmmm h8Y&mmmm+eI%lXgd% mmmmm?IHoח6ommmmpE'H8ٌmmmmm͟ 0j[Le=}mmmmmT6˼30睷O| mmmm?O} t_p6pmmmpuUwjl;O6mmmmWOk8ofDd=GqAczVM^6N h6 ٰlmF_0jЊɞ^F>x/(\iwsMxIJjDp*zL -&{ہ>ġC\2:3FAw{>HI_aɔu_g]u?iudUv~fd;A 3.fs,*̺Y1?܊G +d$=ȆC!d2SZBpDH>FCસ.DqWtmxppdj@ЅQ| `S#4{4R.ijGy(\ G|WزgROwmQDNv3@EF%j9ya/U|b#!UVF4G>HN %W~PH݄Uiϣ㪕f/n\벏[ѲȮʲo&2IđОai/O}E)K:X9 fg]<$:AZKSKY4<>$FPNBTjMUl5)v^EۺPH0 x'jN*,B[#Z3Uv@hNQ.5_Or4C,\\U-=dDPrH7qnwm[T\)>P: j^ ꠕ<1)-IcP4chLM!a$HjY:uDKY%nw]%b:)]FcC"'q6^iJH+Gl"Rp AH- hj1)W%$ǖbF" Bf 6)q$W%pt^2Oȩ(W<tHڄ Ko,!1AQa 0Pq`@?֔)JR)JR)JR)JR)JR)|UNp&Z/. iS,tȎ. 웍x:λ~LNV~MĕG?%I{ ɓo5<"xxMYJR,״(|&`\$&aqtqkL6c oOtőC "ʨYO~ߠ6#uoزQAlDB% v7^➕ /~by Y0=c>tZqqaO4n-Z~tteeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeecwH9nf~ŭ1>p5cG~#&p=h#lL|}y6l!"thog?ُ5j|$04[qaॣwmhDB!BkB"זQym}ʹz-ǦL 075ʨ! PZ-BlC4A)8A'߸ձ߰ypi4لL_c+'4JG sq-cm CI.MHVs5? ⇗Qe "<ŵΆ /ёB*z?ȟ bH/%%15qP_Lz-ǦAtm|8FP  Y"l>yRs&fE[5R Cˁ^ܛ1~LmA(& iJpW_?L&ޅ> ͉!*g^y(wq *9I糑ݢ7a-xiݕQ^OFNLm{qϩs֮U=oxb}4Zk苢z-r>=Es7pL~Zl4HEyi>ml'(DPF黺EcmAah-1JYMkqDXΈQl^ţҖ2Z+9#eb ,Q6n$r7xp%)em ^WkWo=^z-jZxjz-Ǧ=^T׆jZxM^"M+  eXΓ(ti|%uESIO)~_O)~]=B?RGSJ}دPΠC)t~_O)~_O1zk'㼰R.>'5uO3Rښrr~~QSSSS7ڢ[(ksWlgV )dR~]8lHg~~~Zگ# Q>wD_ \'N5wԬghGfxziPeA]>@JQtD}B˔;(Tsjh䛫hNLL _G'joRT^DIGfMLM#0TÏ(B A 0ShJ9`hݿ888888888888888888888 ˭0>wH}$ ,mh(DCUG on.-:]lMvZk2U1,TIW.9c:tIUME›wZIBτrQP+BM@Jo8ݝ:t-Вދ,8hOr.s:tӧlw! ]{˗.\r˗.\˗.\r˗/owAG!CU4>GQieEn/ pR=τ&2h >q"YU[̸ԶhIL[ _ :+ 3#m̈́KL1hчZ2fP49;)غ[U@) .]w <3D#>O?S#>O?S#>O?S#>O?S/>O?S#>O?S#>O?S#>O]3u 2;*B![?q%t;(7ر*Ʒ֩|c:Vm&Ӂ^JՀuB 0 qR HgM|J]-UNIJ[= ˭*j"V.(gLiM5R޹QH4󍒨ҚCgb[@Ŧߩo ?* l|!rF wb64= 뗏gH-$E"FU]zFr,As=D, Mz'39Ly~V_D~JpQ@Ngs=Dz"*FJZNgs=D,ݷq 09Dz'39Ngs=꩚ umƪ/Ԩ 7qn xpn(WS3DaΦ]|_gKo=Q[P]H+!X_a=>/b<+k)=BAOEVDZ-GP<($l'q=gq=gp=`xO>oh{:9{jʀ GhL`bL/Uъ 3+`q IYF&N 4ku5hN`h ^mzV`5AKl1,HD!qmTRb=JM9ξ(Tw4Q $ K4^ig@ X..Ҋ]X˜>qZ" m}T ӆKZ@xM;TjPSهDfQi5Sj8K"kV Xt/{=fz3g3u?s3r]8|GSa=>/e hpAjM2PC!îدIfQh/!אe6묡*+[($0|;=`ρؔ*m=Jm +"FRlyxUgtE(h)$d]f WG3!B!B!B!B!B! ֔o9{"*icB)Sʅ4O[Ye Ut-+2cj3h+kq YY:m/M-Ә&qJS9g,圳rY9g,圳rY9g,圳rY9g,圳rY9g,圳rY6=>/m'`ĥŢn'kp3+\jk 跈]uZ|kź|*RYu\|.-(X ,<UZC+µT Gx;MM; wolܳZ,uSw8SyǬf;{|^H sîkP?h[SM%1}OxUu)xƱ(zAbzK:!5.,?|?IO>}%}%}%̾s3r U8b /rڼ !$eפwx.)1//̔zJ,9vͭwtr6 `XLJȭO~g-Ӭi>+qx 'e>S>!O?j>Oy>;ONQ--'v_}'|G>KOU|WhlpY6睥LJ" /e?3 YD*ۨ״U qД NFm3,E+[uL`]iXfl.|cC#]9>|U*UZ-Uݎc]b/N䖢!DQ}^ S۩٧]`ρNPS`+LkRvW`y]BRTE=f ՛~utx43[+H˨0%[k0gb4Sxg@/8p+.mXE-v%K% JD aWcEogm8 ]Nt]@PCs<]m D[D&hAoWE!D]-Q-MFΝb@0$O'ğxM)٧]`ρx)a֜rZLTU2E uAp؍4#RizO8 c 4k8ژ{xT25n^1JF 1?*E)&ZZECu X% oY@(L/}OX.n_2e%~%SSa%t"Qm5T.MDf%yY*k2-#͋f]P4 󈶬UC׮Y < GDyH9p]X\mLkLQd&?]Z##1 iޔB;E|R>U 9ɬVk]ޏӰ+Z ugxAFT`v@2*6eCfZhS&;(,e@k]N]uu"[ СMW\nS0(hwf [^ fAˆq|aA)@T@ k<:C=H0.n%n%eiqT ս]]hfC&j<r  ϔ8K-cgrA@ 4C )LZO2-@.׸ Qr2Zf uz3u A}@KCWHO"OFl))}3DW|;!s!Y\ K]{]3*T5e.CCzsqfp=ak,g2O{Z̸KNJ>P{SNy8}>py8}>py8}>py8}>py8}>pgSubsurface-4.0.2/Documentation/images/Profile2.png000066400000000000000000002602471226345450700221100ustar00rootroot00000000000000PNG  IHDR ǔ@ pHYs  tIME #'! IDATxwWu>~νol/V7[`mfq(I ~|0Pm0{/reYo٩o|j+Ke#fףwf{{` -hsTt(((< !B?O`7F4JI'"H"WAD J)(((p +ĺAؘ""I0l3ȈhLHa]u1ԽH$J">w 'DRPP8 r]XůIY'P3u&녱/e0Fg[FzVq,GXxr]Ե|!@2~Y)e$I;)d'>@@*b*KAAXhiϖyn"jH5 N:Gu.}]M-XP 5?gg.9'%uwٽϦ}ۊًHك;]swzhJZWSxmMn|(bEkO(ekB ,(PPPxYWu۞Ͼ4RY{zcgSGկ1}#}zVε-3::;L[~F,s? ްq3:b? ~O۩/Õc&uwj9cgn=e棛}f3Ppz-^pƂNk] /jPAAhj?s[>v\޼wE'_O|)=]H`nڦmےA?fo`=;{{ Mh2MkŜo}\g]\r%ggX-譫Z1gA j1]ι H$w RPPxYA۰;:QR'"C78ޯ_vZH1sG/:D+ _W;v=BAQcqwnDΙf4h6!&RczOX:B"@2rMO?>]&IJrWPPPKAAx?OYZS!h4Jqf^wOvimhU!DGa "L(p%I ?|Eг5-$cOמ5w'YG RPP8RsϜ+d~E@$n-$"UD@`Jq_?FľBC>kQCA!,Z`˾-CsV<g> Kggi{Em]9UHDqq9xw@i, cl;:g$RҎKTFUk'd㮍TCWSAHDX-.^y"5C׉d:9W) GBAAAaL`eʋ|viRS7YO C_K+Ny9[F~ݭZXʯZ_7q <`nRl)dHُmyINE$&5UP8\^e/Lz@՘(&vݷ={!i\6{iO,?g.?#aD(n{춎%H?mw=ې]zڥ?_ˇ/We֭=m-@ Ba8h³WԠp LCa/>RqR3z*0 n~_rqk[r0cokڵ]'x|le2z=?я`Eoy[/_*níx.׿/6g3οhjjկg10^7z-ql۲nشiѠp X~H0QŋjADQK/+^1W<-m0fN4[Oۆf@tNs)$jL !!H!1I,]&θhNMٴN)W4!!gE}Bq"$!e"ꁨ$({\ !8) )rɴ\Kc^7]sE͝-LN&u `(j- BK(fm::; \ccc{{{[{acBJ !S<"RO&șq&-5n8uYb վƁ9QLQ13-mF@Hѩ@)zTz+Wd@T* Åb880PTH\+X*hhR)Ϛt.g5v$"]7IRRjŪ_F$bC ~ ((C$|&lkcN6eiC( HD$%cqq] <"޳i[}L:akg85ijlwk͝`|ƘTTE19rJpIf82VcX,*7qVPY5S$3S2hΛN&@5 HD8zgל\m7o޼}=[A|w_"RWǑ"LcAP+M#E~K I6S?Mhُ/]"ɛ0 lFD`\KәLfb =C9z3@qM=9́,'7^I jq,*ُ'!(zֶ7d<ni8v_PĤbejr3MǸ$sulLzmhL9MMa,+W^uA<W&f9B ?ʖ=hp i,kxr"ن֪tR@y+^>>,e&Ұ`B=UhJrTӽB`M83sLqyGv?|B[w_{y'yOB?O*`54*殠p ^}]ݱx{~yMLnf7x7lb_+=VPPxIg5(X&Iig顯p7{ь^ΗS"}.*$۽ݺ{tWx3̥BWGxXZOdb_a(N '(~ׄ& S s'_y޵W0N-wSV6y:.r9 R&+WF=;OF(fP\I137&3K@$㿵4[㺐q$"!ő,2< -/Cyhw\w;oetytSC`rY#nhŌEy2#AD6"Y?03_d-}ݳnߣKNp9+Mu'V^vIIX/3F$]-S+էO ǭrY(f*9T"b<z`.{ }x~}e"S6TrF _TpX>-I/x0NcR\s~ћy$Qa"ih2`Le$ƃ܋) 'ՙ59$RXr^3yAet IDAT3P(o:ބ~庀rgosR ;,oNܕ?Xȷ{"&K];j_{ŧ]Hx"к?ϴ.0 Q`fFFw'3xT }9tr3Ml^yA&^ `SzƯw6|܏wk J4׼n=)t6yhsGwT54r<_j:+7{[~]X:NTDȃݷΝg' j U;H`EO>2\(BAȘӣGL;|$"~ZJ'q`d٭89pTu˄"`4.R /EЇ|:a5"x9{ף[n,m piS3oDE w/݅>}oywViNW/ZgCՑ='N-b5/aYD%uC m'>, #8:XJw 9C)fs%̔t2Ese ă҄b<|Yt^#+ү $E!o.̪ąG>[_^݋j]˭/{@~qatyI(+ S R9$o|m_>Y6<"g/E!o+LIbFѢI͑P`jQN4܃_bwu\rA b44NGƏ-_uEuJX<Ѿ7>EZh]r#칏$OJ&RW7LfOO f3 GԄ)*RUvAq\֨Ϫ'f!D n? 3ߚ9 k{k;@Uϙ)j=]LM< vO)(3-65fI(r4 1wx۝sy*";H$|eLI7>}ɓ}|ӝx ?^SK侈ZZd`)5U2ơj lH1sބWM- , E >;ߺ¹|vnd.ϟmy?[<7"2 _G2QJ Vf) 28KC'G1hQޤaRxVϥͦ/:z ֮HHH6\omƏ{ы  6t[xS$bJeCWlF`3:wvx8#"8#@ZZw˛4GTk*⺙ <+j̝A${%GAٌ/3/ԛ()R/ǫ'<"ڡh W.\(uT`ѸHLAS.3"[13fHѢIyKE6-$en͖e@2G1E+S'X ӌj0/t~񘶱Vu&>*4ɀ'S1Cۏ$kQ$?E;oҝVJDAH`TRkZ!z(T+\i:%pbx]XallSfMc;|̏LJc(f&XKxACۜYk% _8qRWJ`Mb@h{%'fa3"H$Iu&Xzi 2t$Z-1q{ʷ 4sEϕK 0t@8"s]kaHyW 5E142:,Ji\y:|Ƙچj"j5/` m/B& q;$\~D2-aDRT141Y74L1fۦn~jV 9jͦhy Ia bfshB*#-hB`V'_O?ՌK޾l3Ԏoۡ15+_okv زog@kCG/,U*BیFxqE5I]M Gms準$-7xئo~wƒs$q]q6j;͛A?aNP(r33X{73vRW GB`M2m i/mpX{~ۯ߹|͂x恵䋷nʵ_*/>O]ΦtkXaI2f2I"0u]11 adY& {m2"(;>`o?߹3Y.jMS}T ?7m- ØѴMshg&J,6sN̡CJ`lZf1 $#̶F"*1\`#U F$H ıp1NR$…1f?%m"QtҕsWz>™v驗޿G7?3޳_3RY8c'oۖe7?|36$Ris岹W[z jW]0R,II:p754ח,X YB@ߴ)^(l2dlmdRP70zX̜{.麈 ZJE&e6 9;ujPᅂM-F-O}`$@ƴT[Xȴ u&4M?/N ;7Ӟ<02Tz vo斞-]M]:k5ЌlS_7$Cv5u_I9^=uf40uS''^qldD65(JH6XBpk\+$yvOZ)?vŌMY=$ 6 "Dfk[}>9#"f-VW z" ~`7=xg_֔ qVʵ~0uy+RԂkT1fvBegŧ%h6-~WSBoV5۰aaRhJDNp"N=];8&M#IDBOz1 gonR1Ǝi1(h3Sm7f4lك{ƙ$EK)P wv"P@ƐAĪ_X_wo]$) Rc[zo:>̊(F(e&U+y8~f˾-;Z,ZQPԂ ^%Ը8FR;ucd 8M)%"@':䠱IO~o*D诇3a>Ps”Se7MNSLvRX t6xƯ +?;3I'&Cjd0/"D۶I#)ֶ?69Ni -lԸp6`יqp #c?xQ $buFתF*Dtf\Dp}H)93paoܛ(w_uCR~[WQ"%KZYW]z~֞ry'W*s`OݺoG_Ϗ/\E0.9埿lV-{,3^f.8W RCqzJ 2Re˴;R0_ϛמyFL|hm ׬|qV*VGs煵Pʣ}!˘DB`T!S1Cf40dR60ٶA}{'7Pv2I#rÛC4N|~!Pm9@xq\_~ߍDВs^ߟK֬i;RcŜ뷯8yR1~߼g@q f,X㘩J=zkOY;}; 0`dqxw kv28FLYt|pH`M{h85`Q2kêy@2a8Й9q6c,IB5YNMImKW|Ju&Ka´YMgibɤnpMqnFQEPW i41v96}F I$˗>& /lFFҝLg."L}[z޼7@"u 8q?PIvOcz޵DM)) Y1\E _)^͌HАT+J-""8vWw㏷ƞ%NBCD^d뾧%QOi8U$,Tw6;{`W{uhc`aiәknvtZ݆2f`$e=늤:[N}<`a8s0szV5/TNU U 6s@Fa(h3c ݊cG 5X 2KEk}楋DRg7Nd8@ZRIRBb__exM=!$p VJ ͦ -ǰ\ntmLKW;ߑRjuH!I&寘bF=D3ΚK>ׯ^;={X(˽']f\|p/_ ե llG7|r߹p22%#+4wKL@ x@\M$H&NWD D$ZcTi /55L#AED$$0LHđH )e+-?շuoi`OwZ3shnؚi8ՕmiM̴.kI$I"$$v_!oQTHGm,9W fVQaxRJb9 Alƴ(*B&y/̛suQyӔ6c!jq\4+7'];-Ñ_i0,fL3ݤif6 a<G-txݖozf?\_۔QGzi6fltSӌ(J5Ƶ%c4:)cG_<yg=W HĢhCMd:1SƖT~ElʎEn3^µ~q9/M`}='zO(e\1(Eҵ?--hhӭ/Վϔ(Z&e3ʛ^Z^ϧc.Xz:ɡMm /Z`$^Ws7?rˮ]ֿ'+3N7O^zT) /MVdi+F@FD³ 9owP+ F$eVW{@ эmv:3:nK7r2י8/:ao?Ho'rW QE "b_ܪ-?V hy1(r-Ń7c+:W"3R8i?oy.:5Ic7\Wk6\CHk>|هk5TQR8"$L3ս!.쪡uhϾ]72WkAW lyD I@ dTW=ݼyFg;Α\uKgZrLn8Ui\"!L{^Z[ 7巖 :̥+S5bc3_P9V8>C /z()!%$+up, ,!Hu=A]KC SX#jA[8I!b13!⼦ [/w^A* UG +JKj"K6T+nԾg>)A`,̶Mn3jpʚNsnۘ9" "z' ںٶϒ6MY]~S՛ ?O؂cP*ped:QF愧>)t9 UUXR};/_yѕ:߱~:2aP]cM( 8WG+rRbjoeԆR$ZGI_te;ST29!P*_ţIzq0"v) S}V-Yyodv΂HQA ~Z{YCރ룙JR)}Um]A'пEQ96)nsS4&d \;OðEiК5uRkk}zĕ~A $D@D ")emPje}4Q{_}O̓!{=PH Fcw*~^An!b]H*FcdGf!rBN^Ii[WRkݷTo6 Ƅ1CkMIAbx fq/¨+ɚYPG" Y^RiJBi[_KmqWՎUX!Z\w7R[}- $]ws"-J]}{B"DBQhÈO$bn=ړ{0D~~H0;g+W&.P2sf ~U1D}v$P t}$ !NŃh?B\O22 vm+?lV2ܵӓJD]8sÓfw]ohJ۱ WzR1>N"0'/5z~ םM1DDl)kGB QEd A$DY/vDJ!SǏkj{DJ$D'I7=YJqKẩɓu}l&ΌY90%va[0+YkvNAS11]|W:cL>y&ҩ&qS4Dҁeʔ9FhƎ#zA  caLI#K)VkRwbكo^N #}3ǁ-Z7io10R$bDA@,< L!=h`W4b1hG%eV i^elkPe[GcX+W9W fP+O[K@ZǨjY 0s* @NI]*Ѥc "W01p*y'ȹ0,*Nj/N#\׻) f~&K~^:FuRo\U!`%-AbIK?5kӴvy 9j|' DʜҺH1';ۙwhN(L"($DQ!QD! ( JT4;FG3+c_=ڄznSE,&vg͒#Gƻ)eX Æ{5ղy'Іi\"YUYt/ۥZ7UHeV%Y9 .\5!D`1 o h] :;Ljx &"}|>u$Q !Hrn:p]g-)?_9ZXe2<9sCpye,q˚W?g;kpٍ[cJ~05FkjQ21_B=4s'sH0'] u[ndK$s0 D"(pDa!$*%dҀ !la_?}ٕLVIC8#)|h=diŽhj/|?ȣU;gt]/!ix`fs)D5XnfhXҴ92w߳šNnrkNdFr# {)AB̍DNfߐ6kn"١< y}{Yg*0{a r"w^2k,0-2Ց֥^KuCFĢsR;jg&eLm@qG) nzە:fl L R"GKgnkWb mIXJ YV$>B2Lɤ*.:5cVOp 1Ȱj=#DEG%d (j^[. ^xMܯbhPd@̦ĵs E gwE!C%!jӟy0_T8x(W'DuC8t|Mbҵ_߳*gvf'%O*KK2jh 񷶫b"}^ꍴzLFҁO!S]A)f h1oVj;l:0 3#J/Dr Q)Qy {,#"MT^hrVjrTiYtH" DAIS[ٍ0fv;+Wp ,Q@dXfK`?R @/%2<'߃ZxKLSF)'nV+qiz8k?g/"a$>_;(~AwmRyi:]݀粻7ws60& sGg-6%uugu0 Q¨ NGӲOR]|iNQ9<4x Hhm򁑆qNH6v_yڢ9 (v)ruBq t_6\kRa3I!bQ7d{;7dHrlps]k loN=_nA>)eBZoUj[^u' xHvt&\DՆQ'D? %~GG. 4H$< /OR!S#렵HD*iDUo G[JD+XgR>M 4< 9WEuBr,"0R}>́ԅz/D029Vd[+OM $fTLsF7V^$[RލD~"xWRC BMjLνaYgs+&xK|禶MWv.:yPpb7sb6 $ǶXW}VJ{``Ƕy /ܜ:*'tvФԎmK?ʫX{}3 IiҺ^Jպp@0iQ@TATiCa+zO${}swmf4q/,)U޸1??/ Sxt&JEO0FTYlEP`BjpYQғ;s*85t,R,9&3!,4$4޶+'G J]˼WɊ ]忽?lp ;?=Ś"p^w/,6w/߹s~V791'I?Qâ Wa֦ٚNܟ_'Btܟ_xgįk]ǒ N]t(@Ix%aɝ]aggjR~pdתXKe.K@wQi[u:R%鞌3k]&vfD;[̼RPOb!j"$Qpr`\=ZW7N&$V솷_5HRZ)9tJ/PL\y D b_R{owo_ϩQ>d{qSCC3J o߿AV 3dhs'7k'\W>+"O_hvgNv`WDeiTZ IaYxAm_@bpqǎ.V/__h~MCg//V#yzD贰(ht6ʓ)H㡰 cH[;$ć{'B\/YRrXr!]ȼ9ufW)9A$(W 2!(QNTHY̘iONGZv?AI?coz2C]btE`^5}W1X9u#WG,:LQ,h(\jv\\M]_kU!&UYmY ЀAM];V4-71pȠZ2$ >_q#BS|s7&H R24rct][.v^ۡYg'G\pF|K]< l[ܨU{]91+8`pu-dfBm(l,'NVN. JmfnzLA!J(("DP&e9Qw> >gImKՋLvksɓcO$E#aCeY~ŬM!z J++ XH\P07$U짧7u=@UyUg `~/os9|l\N__Wl r)c75ӓoȓdwp5A9 w7yʭ+;xyJJQQ Gtnf {tk^5SAXkɶJ{l5|IjVGzeyJe&;ujst)/Ntjxh>c|+`tlvҍT=?ھA)Y=seRRb`^T=sRkSD "(B  (BJ@ΐS|ཞ4Hrw\i 9$:nZ|m5E5fVV3, { U0,$Yʱ 1+^엚静O \;MgѦi\&S%ŗ vL'& F8!2 " Tq9ԗ}Nakg[VwIIUyq={D+_QjX; IN_5s:vU=3R+ O?<`SJyDT[u%|%]1s9 N62kVT;b @]X 83 @\ZK'Zwfx "H !$s>QH*r)3^H|"(~>X->&ـ.0*#zg3jXXǮH}@lPZIV51TX _0*|招|˴[goo>T[6p/H!8_|Sʴ/*Y0e2i8‚y]j)֫)ƅߜQxL} xv_=DYe'6rY830BP+spOok>aJN8EGՄD.3|)+<ǑZ&W0k hSJMi K?[*") Q+D QhSg̸ׅZYݢ ^_YFfk2QQ:Fӑ&-[Ư7U3FV-0O/V_6*9f>n~OQik(ĩLuT`V9ŭ:eS-dd=h 3'G~Ǫ sMhKk䩊ݾ@k_€B)Pt0Ǚg^h^$l bUB FZfF&O2hHx_MHYa9fY5h;hEmu}JV3ݯx\P?E{,1#uJ%u'^(VN] Qc1L |)"J(&$z\rwEXVzye#P4B:ɤܤ!6;8lo"!d`Ф:zۙqcN2(U)@CTFT.D#)_̶)$ 14~rI_5G {W` 1JJ神IE^B@D]V숰edYS : q1[)ݟ`6x yDIOuSZsRn@ 96 ?t/k)++=ek<宯 N_ФHSd75(v'g6RL;œZ}9ƼL9(GB WADyDt͖dk;n%w5ffAfQxPgP@Ci3ނFtD[ؤ'?gP_:2EvMI R 392Cϖ~aS]9y6",^3[f`ה~$ytJ :ۃE!f/{'-%5ƽ؋c"mۗ1JGtY=QQD:@H)@Z7YgLs+dDBIѹ!9ްx)y|3_2L\ʠ!&2xRy=P= KRB1X$"-_X,w~i{1+}r u"h*'Cg]VVϽ{ /p0 )C/gל6d@a>f?f@մi$̥/Zg "*U8Ԑ[ߡq{2X0(*Nf#;@Hzpwi樔19JIԦKn?drqHZ:HtZKv afA)i!넵ns{DP :üX $g~fFk&wrC!ELz1kJYy9B~v$ GRX$"ðth3螢 'g=^C|ѣI vi1s|qSK+иx?iڏ'XdQ 4|}B>qK{s)fIJcZE$Xq2c1#D]zPk+ڶmite_%7nnNkH$0'BRJ_à<)'0&Ao>.4F G""dys(ۚ!(Oo{Y'Uy&; %3hoiᏒmmAB ~џƍF-;xq+E II-\^^uZ4H@ )ݷ{Yp&f~7GT8J,]>ڜ):9@xwvD} @|9D 3`٢, dЕ Ωq:e[fh cYY)[zjxMߢTf%y-PT^5 IDAT>®CҢR?JfIؼ4ӑ>6s|0@8F5#,l{]9.v \ZgIXR ;[eM˭e僙:eGGw~/'ZZ`?_uo߂n܂ٳҗw>L t"a [hW;=޽ƣa?*0*CZw&y`Y:J >Ȃn~ړ%fQyĴuߎܯ.(SAh]9 w%fm~-LztAeJr]j'0$h8^46!TmGW.jk`>$Is0CXF'H웣=}L%#yTw,|b5Ȱ"Hc$=: Ls^AKtv1{f0Etv$R3pDK˳_ۿܟj:;@Hu´%K/ϧ-mb dH?熷L ־>[\L:Q5rR?[;]{BdM%kާN|WȠ`>8%Hm/SxǤM/TD{\]q-#Zj"Mq*x9H&­ᝫJ~~ K&ZRxT?'dJd2&aDQ #>lJ Rz ;VC^ ;rW`K',3C1>XyaWFMV>N"G&ug=Ԯ=({ihiWC~ !@"혆@{4eOZ8QS9Gg;E[f*=R*0ÐJu>XBr V-]D؎8j )9oJgbI? W4lϳ~3;xSg뫎#3sG8(gKo Z!уCᇘM[W>`Uf^>qˇbSśӃW$]*܄ِ۵ɢt]vt:@<0@.~J*Id3JE$H]fd8DB>8_4-Y'qN2!!hU[6#J1@'K]D=<{|1JJD!7ؕj ./ }qcܔsŊp~vqq5n,(niiYf'?)"^`a]C`;nR}w~~{Üh;!D'nUtː+ƂyAXټ|RQdI ARSa\VgiݷYw{?/~qWJ-k>7G~$X/S3s'+[h[6i𨇯y&%Rdrso"h )rYyf0t­/^4;'gsٓO!X,cG~m]{$ }H߇V+&ЩoֿT}ѓ[sN^nXg}/ MJ;#4-z_.v?7xW AF7%Ƙѡu ?8w_*_^Ǐ}1V03,PݣS%:N!XyBYNIW|ćOz\^INd Q HJ)d\OԺHm4:|r("'*!2 PBTHTVvZ&h%9,F4ѧf[/=o}g~4w3 Fot J߇4*k3Y9[oe_B'yo~wnV^!Ad]?mh^`0'//ŦBn!`1c#KY%cϭhnv^w]մp  \!'7i7ʈ0!'˰~5pmyj~1٬n\wZ ЬL2ޙ¢970چNQZNvz5{kL2lN1o OX0p\q3(}Q92O>s1p D`da]w̆-Use|!qmoH{Jx yʅI4ZIBbc#d!& 1(ƼIZz֋^˙jy s=X@`='0>sws&)]t _"ať7Ώ>ޯl 4Qd9oz6'*x`b|8]'s<~O6.^Z3cFe/|9da/|ֵkG~y&cǚK$_1xʍ=Ϩ=L0Hh1SKjk1fߑ%dzMjC;W 袯*?Y~Y?<5?<\o-c|\_yʑtN-޳>>oz89WW%E7|uɅ?Qm=+ʓ揻bgn)$.֍ h-Bӝ1`~bCrk812 _<{ϩ'ww&#'9L3G(sH.`^uF( 8@Q@2|Lg)0{A=DdiR"~SOʙ1JڼQ:̙fo+Vku5l3Wo?bZ_ګ&\rx~l>nJygߕ)zU/2{)G@:)NKK~@gbq B17Wa}.p-[NM }.;G UwL-.a -JF]SDr]i$ۣʬ#+(BEjN'޺cl!ۺ ?`Zš@"c'|8rʢHqv$?]}BnRQm=E; .s$y)s֫mZ0BI~@0\iUz'fz7Hc8W_*R#avlTyXEdzgMDqvap.сx0EݿZswk2߸_iQ-Y(lD7d$m?]hup0w~]s/5q1s&^U%O\ۑ󪖩iUL}Kw[tѿi;.ot(']{rYyRc'rb -'\<O=\G{^^LZ#qRo)NM;2DʱB r`G(W샳% RC1z+Mn"))ovٔ#i$[w-+5}_t Iiq {sAXR~~`lPx_"!+OJ1 +{J1kbLGL߇3ߙ͕]@XVXJ3?:cb&`+9#3bn 0/~SyWU]}"8cqd̄HUiv= ;S ~Y?\mEϻiOK(ZyߛwHόew/ Y?wlyBD1Os7޹·;LGHXёy]B*|cՆqnF0Gb}6 #*'% 2tR>`7vY"w\&LR6bDhj6~fvM}+z }lS=2Xҳma'ˊHiRJىh7 @}.˙(޸ ,b4 +&_9Cqws@.=l!L W~ֈ+^u].8I$ߨ{/;,ݲ5Uϥk4i4s rF&:zy%shR̝@ 9J%p*RB@D2A9>v2m9`d\`Ar~sC ~J*: wvónxqYC ?dT|/4rfZie{LGX@VMoqcvH+Uuɳz[%Æwl̫@^%Y sUNZ`C3s=bم#}pէ+ܢYW&+0%B `ll{̌v.a_̬˽X7*C?lJ,]̊US4ߌ2/? D6xXheeˁN{sP*= :6nzվ_;hȅVL<`ƌV1cGձr.|9_3>tb]pXfέsLR8q4#,=ĤF kwoN~rbRtJvt7fhx̦pNB3ۿTxEˣɋ^kpax4ݍ&#`~7Jj+;N [XiT <Gԟ(#3MznOd7NV5{isMєn+s}K]ɑ:r7c :EO,[]EW$k?6 =C91tFq.P(.~ݏO$\_Y?ۯi~+JSYۮkۡu0X"յ-;mJi%*[[9`f<l);xxMPN. % 4HE nitt$O ZǵEpQ Ņ_W7BðG8$kml_'-ш[2 H~Rku& tK)@ +Zs;! t "9H%H4Nm?$ZaԪjАzTƩz^4_(pp|uIlĶsvRY3@aرXуYe/FJ\N~bD۽wsw[mݐZYTew%y}J`ynL޻ޛO(w Cf!$/ES~O4{1dYG0P#94oFGE(0@F9@L:. 2(D&P LKG̞Z:"UԨ(Z?{oWQߚ{r{#$w#/(EA }A-IHO{.3cssR ~Bw]fffZkw>o;Gh:v w-'_?~g1GY{H`E75޸SWl/ss`0u6S ih Yx{MzZN~}h^"L @G2ydUi[>t¨bO3-Ņu:۴0yNWm IDATc+^I_Wyȃ~+ӈ +d*uIQoQM235->{yzeyey&2y,3gMK]1 F$s-0WDv. y&a%SN P5Md1j^K{D$""3KמSg/ڦ_>k{:*'^`>cϯң}5omA’|p~YQ1%ݵN7W?o{WmVU 9QCY8<@K $r9ĘcQD)DrU,;Z$bZ.D Vx̑֞R1v37*MӒ6#Աx߲_j".4i(0 avUA/2Ge WGnY)o罹!̛޲Ҫ|Z *~N48t}Zb~x X l H2d)h<0*uE"7 UNxhgDUD$""ޥs}"3eluls:jmDlkw㣣pdS-k4 ~ǿ5{N~D:}Ҥy*hx5b_rW\]3coF-(-D8B,3l0?I ^X0591@b0 2q?U>A W(G8}^rPYͳkIK% LLꍓ6܍?i[e&]QUJ-OH4MD# X, (22S 610g L& Vqiȭr#4UOD$""va6c3eUuZ_;˧8.Qd9oA<26u>whB4 Ԡ<Áa񸵀 9\.AbyphH$0:@a@JK:GPHM=XwdH`ED7RNWG]$ɐGZh]s>JkŪ"IV牆bIYjw3qbu(>@Bk{3M;$] %)ՀgMؤ/UU>w߉'LNWB_w߀o5"LQaqP-2eԄ hf$C-m '3D0f$""v<33 i &]V9DlVȽNި"<=:P@OaMGG:j ݚ5)t–4k 4sq`fDiLBTfU &H0,ʪ1[y/`vDF+"b\0bM9W*l`wLi{ c- }7JQ#i]X̬IXgn}?3l#77/~j T"t.5vZn=rEfw9%27Q q>< 7-(fg|KWc,#M)QU1t 0D<xz5&2&D0RVK2Nv ۙ`MQbfO:4c1`& DEKa"Pt_}xv8)G"鉌ڴR}kG0G/d}[3>gϜc8DЁXyϽ}3@Rd_tm̚* vW4b͞_ܲKK;Oſ8N.^;eKϷ8B>X .IyĀ0EnhF}%"%j<[GBE H@ d)ʃ5HZHheT`aK*yT]|S6Rݮuׅ{,!b>٫eF8-"feR: )b r WHR\3E\t?u?p_s=s1C/oO$DePU"eh{F+"]Dر\~ٸ;?~Y^TWKy_st͸5&zأN i9U =;09qţyg~#/lt(CuTjϏl ]TJcd=~׆hT/PޘٖDboh2ty.06 o(%}UtMy釜eX1*E)! ӌ3@Z"ǔ1!3+. ;,@J"Q]:>C'NWݷ|9+ 퍀eNj0a:PD G|t~|B@1{Q?/.ҟjiq1W0yv}f 5\ Ύ`1@$R`W}@&"aYQO5a$"i;=DBN4&YgAL.3~x]NӺzG[O{)sLk[j1s+r㪿.Wن}dX =Nc g N :/XG#Y͛YBߞ3F`.{ 7p}关jW};^EK9Ddt ?PzdG]6 K2|aEՀ3k\֌HN CJQU BTy5.o SՍ^~{` C&N>C$\~5_y̳'N񅘨.iǷ21b$cN:iib{ nNR=a92JP}c \E+Rz\n ]Hfi3޲K'0!R6`qsbzߍ 1+ӉeDDMm\Ys,Hj蹽8q {_o>ta{F{+ ;qCO} $SzO"v3e%'Cb`׿aө޵BŒ}ekHGoWC'Nx[O&y6xqӳ[;QJz@uhʓ)bJ36 25;k{Θ>-9J{g?mƵOxJ̋>5 @3bYLonɤ8:W/K>v=?/ GHMإ>ȭNboJtV<='; OrۛpW ]D}`{38>q^J 7xsPF? kȤtZR@AJmMMf %+e. *WZ;*c~cv2E3&npqaUD@D !DH Q9޲Pews )p0ckW7u'DcuRa_அkk>sf\")nO9S:Z[ۖyҼ2#.]t$kNnTrD{>Hأ`*ukxcNY"f/}fؑzn4[㌽Rmm~dz{N-3R{GXþ2`Lm,~UbNnP`rrfO+[w]3gcwVf{ox|7:\~sgŁi^ߺԯ;y̹GHhkSw)xIGM}<+LiZ^~~j~Лv;Z߽o/QòcI،:0$5l˻42Ƞ`%@N O]":GѾq$}kruqB*fuzCL=֙›e_ g&PIrn]=IA+կTກJY a)!b mY#AIʄ@ a0$bD!),lAƖ̐J#pHy~k?zic`Mv?qecu8(xR{';{n{ΘZ;}RjY+ =#.X{ .t g]K^:77LdfÉ+@Z>'pmߊγR$͐@o㓋{|$hUuیI+_-]&kd:,}GM>eT&J8$}g7ř{O& ߞ=lgFt3=uK\9<GkF׎c}'ݔ {] :𵧴@d^ZxAC n}N;Z/@cDL ZCmu=A!rD,ape+$ҩLO;챖[p "؄ql;dCs.|L#X|yI;ĿnA"?|q漩ܶ3$Db AeW ( D.  Sj@~2A {nixi!ȄAzaJcd׊!DvL)̰zf6:"[ʄvyȒ 3C-_,X~"oҾ]\[9w@k5NW޻f߲ɐf%y O65k] #h$"Qut<} <䓬t dG>He5zuرF,ݴie/::fE*+&q9ux̸ⰉUS|3_u~ֱn<+[ꪦOMѳ_VWlu`rJFg?[g?[_3pШ#Nh9t|bnHw>k5m*3 z}E6~pكG;$.Z޽hݚQ 3Ԇs2j4=ŠL۩QVQKqjAwWalPVc7$*xծito|Vք[aIϫ]ꟆFs .ۚXrW[>9X.:'t#tf7]YcpQ _QN-ƸwLk^Xޑgfi)Uwe)_K13 a hD8RB!XRYR9=ګ9t.y*W}q=HڕAO!-ρŁ`0$2$&a2Md IB),i6q֤)L.1`h~cljkٱ6|q 3̈l1cUbWN͖Sʹk__s»7q!k5ϡyZH$""vDvF?Worw8 :q#kwv_ŞDSSĬY)ǚ@YtL> ~yk}?38kFa nmAxJ\TV{rKV}xW]~v_m8Fhh͚5p؇0C_>U ;qδ i7UXV#%֜j#FQ'ZƏO>r]뭺^{59ZlN%>4IN*=h9O9hy ^>WViSΜ?E^|mwlFUwOU1gj.rT~ķLkX\KF>cNߘlNnxZ»@lR11Z+""2 5MTڨ:\R(X >3Pf踧=zsF]օ0w  !LQzH_8i[!$%YLS$-7&vZSl&2Dý4`͠0WYh#4?W834GŝĽ7ǬX/Vߪڟpu_Gn2cZƜq|ɗ|_96k9|/WQdƷg1FRhy*)bW)?*‰0nd3`icu5 Ţ+)i3*et @Qy=3OwXbuagʫ5Ssb<7n5p'ǩzCuN:~K !0~.vWZڠ1`'IοӚf?ZaࡧWvCY_O߲lp( ?lC6g}~Q3/ [SQ-S'-~q|nR9ϵs o?KyLMNJq_N-;} ͗x̓dޑ_<pV?}pLs퓈Mv,u-qɓ_ie p%uA7AFLQW}UViO׬ (TcDR@H@A#nDdYU`)aqk)VMfWoZ՗kn4"n[Dp}{úu1+>eLu2mH? sz7eu麖ָm (mmޠXզjjbwb^s~2ʬczðs746E+X{*9l@D!Lm$X14`Cyǝl$ޞߜ7BWr^+ai)bO)OVg.ٜn`Y\c0-OixKJRҗ_Bx#Ͻ_?`Z@]< c˻)J1p/nq?ftlu73w}nV/:s)lݽbF7 AK9zE`ms?7No\/}i{QAѽ쳧|\[?abVNٷ‰J+X62 =^qyfϻ2örgN|pR  D5_RU3f<_2!Py'PقÅa5=ө+ |wv͹fsѯ厞ejƍ.bsJP#/QlUŋXv)쁙H C[Pic[&x6mxᦛMӧ U#Gjk|ɮN]cr"UvB.x}T;(ƨɏ׮sO6s. lMӧdZFyÏhÏbHD%e#UY2ٓ p"Tx230< 9DoS|DJx2y3֔{0寮ª$嘣A/~) gQ,17"""9trW1 Ոc{Bƞk~J&#YcXC摯^oP>\P7iXTy%&M73#'>1rF( )e_ͪ|>hn]yjsѢx57ݴ=}ժ)s##""""""v_:ypP_qKwܱa̘ ?SN՚o8kVMkZAknn.`qL&8w޹Fǟxwݺ|]]UeX%?3r\`G7c}} }KeÆ/ʕ~CliIYS֐ͫ}fyꛚo~VK(cA GDDDDDDDK+)E{K3:rZ|Eիxײ'h3p}&Ezb'*O:Z# ,86 +AR@b#"""""""!;r2 gÆk͚U;wn7?toren\B6tuKDĬb"a!noio Bs̘eQ> v]u晣.|gYg&2}_rqw')#"""""ޅAJETr/oV6o "Қ<`$%8d7X: ݶ ?^JK1"=auu ?;767;.]rɄW^ {NYAC0uj'+?g>-~'وƃBJDLߧx,qv]2 Höy,v]J&9D]&wuѰa8p6J] iH?aB{ߛ !gZSkjDoDWK K mڸbP駓: ; ٬6ƌI$ D* m֬|DDDDxXu&Č[nDxi 7ŞGIAZȶp.aHIJlY L$tPGC eh7ҪCF 7J$hR*&Oa`@Xooצk !W.&4ac۱ @Oup Ћ/'Q[ Bܜ qG JAJaY 3 A1)q<yɲ#@>ǁ0d\( #мTW^z  Q II /,.&y, ABBP6jb\VWh*9Z\C#IeZt8  ` ̜IZ3N3&ZZ0l H~u`aJͽ`\,e)ž0M_jD"lFJa3`Q' _P*5NjPLLCM"˂"CP:nUeqYCK Ͳa7LՖGE;N$ ƘiR f<_p^iaH!HP%W-fI)-Ӕ{^Odr/jYiI)h}?k0ޑp˚R?F6OLsl!%K !5IPxwSJD*zu;M81.]zsӦU-_vOJu!#, \`|^8A8рe!*a۔s:>E&Épd(dϣP& rBHJdDUg8ڽy==;.qsm-) ],9ldx  fAJ&Qv`ۦl8(8@_>T绵P…eϞC>?ͅyV$ 'gÀR*LI}#人' _ p}YdYoyd۩syf&wƌ y%ǏOk~USW=w7nY`=Wu|~0:'x㡇]]W3-K,_= .Y,X:7 ;|Ccz1v;촋A'xBZt󔔢3BU0RRdDZCpP @DE!ZC4P*|KpB_h@BShP aղѸd8+O(b8cВDDeR 8|RAPҥZS :% B\t4CE7t~}x~mVM5#ێm؞VwE`ѷ}-HDD`B*w G?b'pV֯ri~xk>W]ի5ΥGmPﴴwoɷ-!v+;n{ =׎l;?9vwΉw}4[Ϯ<.i߅m O ;pJKoBc0b)ۘv>U[-Hӟ=iRq僗]Ғ%c&̩7G9β-?~u|{t٣ڜ|e@0wn=]sͲիf@k+]4 Dl!N,+,X_n (B4T~"XJ.7+lXn[]zgϵeT<*U>W86hZCVmQ*sBIӞwCת5 zcRnևUQ[PW:_o6 5A~L z;[S>RC&vvɮX)Ŝ9ayDJfΌ)jM)qJӌUUPL&"Ba4I)}{=pWs3{v͢E=]zF9ϬÍXj$?}0LmK=+!%VyaqS BH) V  9ZNEw]nNl5k8I.3I)[Z+fͬ˭}{- *8ڪ%>"%W_KA1JK +U WBd ӺdO)e ) R40P] *Lb`* ~BmsOL"#FeQ>T Pq(C*Ń RuM*̖{ٶ|38nomOΗ^ +Vt%P=FN&QU)Dꂠԋ QZg *0УJK0`|aPU2I K3qqRK.W^HY5\>a?{e[:tH!$$t (O]յ\W]u * ^R Lf2{dJUPWHf<|9瞫AhdMU0to !֒rbeېiSUe1#JpHc4F"PU ZV5̼@|<AvfV-{hZ'l4Ei1i۶6`F"* iBBB?E9AO[ΝKZ߀.](`BgeV2[Ŗp]oy:DY.6-E#fnDVV3ԩnB4q){%Z< -Ķ Fy (4YSwE^/6 E0cǦ>\7=vlrlr9p "(' E!g|.FXszYe1u tQZff](Xjwo8bzAjrFe IDATjz\rYSGU23kb,Z!MsTgdBFǼ$0I{wa[aP]FOl|ִ<ķmh@סqhY@סmp*ԲiR]g.)i$%X2,󑰪} M&4V~6,iжiHenH$/l ¶Dr ijY@iϞƎU7mSƍa׮_?ia޽Aa!ݲ65QIb$D"4>M`8 >|!d} &D%jl̼QH1RJ!!06`YQkHzQGB4 . [SS~@'X^֬rUŦIB!{1cg ڢA|]:a>_499yʮ*W[nWJP>wA6g.@iinsJ,fnyYmi=[P[)Cà.W¶Y@teu8]Z#z^hR( dUlOZ80Z}-4*I]ŝ JRKTzkc;nکmZ\,vܙ"nZW% &hYwDŚ&>VWmTׁ$}'ٷ-(0@{. :TPtmL.ؤ115Ӛ .k"VFH7߀+(`:~<7] \r ׯeC(( 4Cz-mƲ`Hu\0",( I:E=08HK!tJPQGPT.r ӇWʲd(Lȇ_=$ vuDIv^6[tǘ=9?P]9ؾF)81u„4\Zh0zvcܱ)գg F%o@`qN e{X>G )3OchP,ضӳ{WV>J)K% \B `ZVI#p`zLښpKpe|zh,B_2-EƢiGA(`SJ@06ʎQNfTw&)|'SWg̙bQWŒ+2$ɶ- Ȕd޴mq, 4Mԡ&% yy B"B""K rs8:<A`YBB)0OТl}Kv`SjAhA8C5X Ao.\XyYeeڦM={HD, Iz ۷Be+M ,paUUjU}\2瞛rP7ʷn5;wZELS$ nC=f{,#ھ嘟Y7Sm*+z~MW_S )S2].륬;+j1C$丮&wŠji:5,p)uwDR1$ κqEJ)!Ƒj27cۚߏRRT`p8 N8vlݚ!!y4hBb]puS\Ge@[_٢Q J(kp8PW vkƑ5`ʎ>p8^p8 ,p8.8pp8pp8p8/LCH7 7 o3'mnfNHj2?%m@Hb n8J 2@mXJ# HϔF`[XKdޛڏE8G7p#2*7M')xosӏ<ɣ|tT|4MI”ޗN;1.)9ܬ5\iABlnXQ(   +rCNOO7%/;JvӤ;( H5!8Q ^q(ܱcGNSR X\`q[ h`P9%%yÆK.$!haqp޽kjj%I.q)%yo>{W_}s/us猄;Bfͺ.Unnj[l}'4Mkj Zjj \jQQ_-!(Jm9#I(PEQTU6)/?{a#t|G,Xk ^q0F$$$ΞN:}zw/.n`5a䧧MĶu,-[e+~߸qc1nhhXzҥ)Wضr.KI2232B$b99ٖeB,!dA7Yy᭷o۶S5QLx4ˢ9m\Jn•W^q把J窨LOOvK{;ڵeeGַo݋rs :q_|UUuo=l۶>3yy9ztVeԨIIm;mƘśv߾> N2uEƍSvXc 2kCJ-JMJ W ,.Nr"ZUU޽uu e &&I ոj?mcvkWZt]F9t Qw-˒#~pՔ) :aNkob,zcl{鉺m! Àzࣁs:exm<ꇳo+}_x7xWU%Kݹ} c)%ɋdAc bG]Wrgʙ\`quF ,6_!d!Җ \UU]{! bTK IDATXӴ戦;+Ky/ *sXlVUŲyޞ3{k))^Ml+q]7E{ujoX<B!kCNN`1 زe /KnTkhضx^yseFjǹ>믿3zgy\S؛:YR,mkCHh9TՏzR uXruTaϜ_2jςϗ7o5 u붔$I,--Zv]^^nN,hU\ܽƍz뽪]צOuy?XCeqx>b歲,]uմ /_\vQJY:%I׺l<_k~ ЯGW\q+HKKINM0[BBQבa!WYnC*-Dŧ~< 2feل [Jia" R B*#ۋyhiX+V%r}}ßB1`Yƈ|P DQmgcƜkwu 7\#IRƦ6G-5o&%;TZ?/v=`UJԥKqItyN5I{bCEGӀ ={=!==mΜ'аaW_}!t5.,߻w2{jB}UUUeOnnNzz-~,!RIIyYYXMLLի'_:Cnw Bbssml. iZ!7V=dz !.\+r 蛛mYζmrrnhO\VVgUx]\UUw Xcoyw +?Ke,6YTrՍ;a著]vI Ѷ&]8{SloRU H-!`AVZs]66s2EQ$I4C$QDQիg%G,(gj%wp4L9vTVVѣLٶUU322X(B4"<5K)EP%l-zaMkn=Z~r׿nŊ/1II޽玌tłM'tYn }/Eah~!z[uum]]}8 ^:O^ ,GjR8\}:f!DADQTq$I<?\2qwp8b֏MZ=Xgz|QRJ].5?yXj kk볲2P˲.l]7|ݸqc:>ՙ9s$ƒa49/9}]% cAN+? @柶m;eqUU/^/z m[a8@; evIÕ<19Xp,n h[ `04-r\d/N_cAtݺ%}]WpP*#1q}փhYk}{Oy獚3))hL s%E"k$0?KVVĬlE)@|7. !ڶm,+] !B8Ʃ}⵵u[pGUUAD4b-˂[Q ,qMMyz㢅N7$wfJhIr?Mr:.ztz= _^mjj:>ԩS235Mg1^{W^m){^,ǟܻw#U;*J"r$R{QbR TkjJ;wiw {<\pߟ6;v2q7p'|ѣG$BUUSSSSJN05յ˖}*7<-,+.x3 裥%%ݺwCu\AS渴D9[utԆcwܧhᣏ>i'9X`|9.dx[%I !2 c￿hwE|wN8A˗x'KJSS㽓&[j>gڴ|^>R`]5.γ`#Fxo$ f)P fiR5m}EaaY3jBΝ~}ҹs~455z)۷ǎW^9#11}!DmetЪfIyf7ZǐTĞ=?,Yrβmdz/X]}ZC@/yxѢ%))ѣG̜yՌ77̙BnKꚇ۷n~ᅧ U/p4pm۶Mݻ;e juuuigd۶E)eRcΦsXKVX[[r]vw|O\nnpqqK/B܅WQJeYիYWOx~ Xlo/X~ƈRZXX iL]v? Gɓ'Yn߾vSRm\_w難5FUՊóf2 U\4-[577: H9>>SL/YG@%`0--[ ڟ1c۷﫯VN6X'\~uʔ+TU|_w݌3fAX{jڴ)W]u,˱V;+W"(%mfff_4aΩܹsb^32X\`^+l޼[.))0awfH֧~v1cٳg{339gO>,|9r$QB_SO=|ʫcOl#>A\[o=0jȫ"??L`UV9g'fg8a|ͦR}]0,AJJAXbD PL ,>))0iZ_a+,ceˎ E"5k>6".:ao5k֬]TqMM=g+?]va: cxiZ05& PG"A^/;Xw&]۶1UUսz IOOҋ9e$3??~_ǣY;bKD˘^zСc !V3Xѻp\꥗^kG8nFk̘JJJڼܣG)56oߕrٶ II }-JMMG=avmm]CC8U5 RJZXdf۶}$):?Eh$ʮRQMM̈́ .`—_. j>hҤ~}rԇۓO>;zsΙx:jW@!lY:6B) @)?x哆e}lj @>y#:C(%˲N:?؃ؽ{OeeMeee*%%/iDga(N™3Ñ虵nl8BPH$2|sezss5!$X>vԾ}66æRXoY{KJ( svFFz xg׬YMHPh]yrwrH$RVVo~ףi'&&ʲ4n;5nBBˆfÇƣZSSç:N{!KƙG]PJ5MBO>̙7}|;\ @GHmBsVJhWV[!3EQ`0Oe:; 4M;>,BB,)l۩eYGuV]v`oܸ1++?E)F8$11QH$ DQ -x=fO$_p(B1XSSbY(i*`懟rubu%IbII?[wkY& 77g[͢EqqqٝKJJrK].ղ솆!O<h%o>Jg^L_il $oݺ7u]jnM[9E"hQ -[lيÇ̟8|V:us"̘q߽{ /rt]/,얖ߥe+m8dqUW"᪪]zP(xq͛7z-ǟ߽{;uԪ={v>c H$UVVM4A'|B~3xٽz޳g}{32:u;g(:eMzȂ :nO?]GXifgg]r?4i<X`!"~7{=rTJUk+}MvlY*(.Ӵ C8q4M+--֯ڲ,mێdeu0)@V^3>\F/hZ6Ȣ3)|y5'!דּ\w7>3X)_첉i.kA,%BVV$/OY%65t:|ȼ~YW :,\P(4v츜\)˲̸8!i7xEQ\IBy>5N:ACnS/`ر 99<=ܙۧO`0(˲8999͡׵ ƜɈZі1Fc|@ Ƙ%ᖱm׿|ʆ[{(br%sϴ[;ۯ(**$ vA0eYlMN c\^^k38655-Xp͚uUF \.8 577p f#!&#G Zo_juVVցwص}NEQAѶm;ZE:}ooᷢ(_OdfwI׍7l Bw={~-AJ?s/]|pyei(ڵwǎ],O8WUeeMMABȸqc2Iݲe{zzrRq$O?w㍷-[4Ǎru뾹g̸d;BlcȼqII( _}p'%%9j<~ga8(^LP}}ñeYp)PJ-ӟ1M9묳Tե:Bhu[Q\;~sy֭h6mBɳgߛx |_4g GqƇrrrǏUeeh5s<3}]tر|bL0j6 Rzpƍ[Z:T0,6\EIDH0Hgzy񦛮'DXִ3( ݺmC!( EBL)e<4XP(ilm/IIO<N>>iXdY&MzSSSZǗX $f3!&C0 M$N~~e>ի{ ㌳ 4/$Xlb@$\UUr)圎˶^zZ9N-0,Y޿[na iOիK.$1M݋**{KqW_}UWMӧDZ\pޞ=g Fگ_M e]IcI iI_zڐ!Y 'ヌ,,+uM-Dԡ+C6my=z\nא! īWuR[[ϲ;u6ŹRSP˖4~UC49'Rl7eIeaΙe͒iMa4:ϭic,z-`Ǚ5s6Mk~HHgDQEM0fifIAhΝr(%1grNV*;XvF6a8ëcccyEg̸ңGaqq'zCQģ`޼ q,˲,vw|!e7FlѢn:4hd RSSg…wjPJB:s[lX~a]v=޵k6;Ϊ<眷~g&ɤM2I ") (bYV@W\oU,.b]w׵ul("4$HHHo}9Ǚ{sg2~ =y@Fx?AM8Weժ,XT*UL+ێaxǫVBlbB$-cA׋:묳f644DQeO?C~1` o";b uWI)'a ^ҥ'tҦN[ 7o:1P*ӤsAsyTikn۱)`0lB Bƨ5+[V ck4{Ӧ<IJe˗-;!L&' Z8=X耰_N#{v]4)c*!?e%a!(uChk֬}G_~DeGWFy /<wnҋ. N9]b~,fKikkڤ|Bi1˗$+l%j޽{~o(O>a###Alٲ)JZd,G !ݻw{߾7Λ7o׮W,kÆ4Iܷt =1uf40&c^C93?~5?;zjg40 @c@R_ߐH*+?cw O5YxR1ROk~G̙}啗}#H&rLiF}?S{UJ/ Ƕ0E9, .h՟mm1HH$-UJBql׮]RK @;m?Xvtyt>=Ģzɷ7| 6}#<眳@6cO?O޲cǮoy JG8r9~.7Fx AP%"'0l\.(LҒ+eRWD#Crw5 Uz|EyE~̣ ðwOBN^N%innR,#KEH0sLBo{׏l?H)(;EMpYf!B}#qnݶm%K:/~s_ w+Vj՚ړO>ö-M?EN7o 7^um«GXGGG2,ˇh)yL5OQwiu\_L=`hh|7?S8JҪCBHozuttY7o޼uFB߲h,fk XR$'O`U0r˿O"͆al ֖oڻ߽uǎw}O>_\v ?}}(vя~'T;S7 ~l'L<00cgE022]A=P/6lϞ;xꟂ hmm}xn5o`~訮B_:uێ566 5MC(TXq|?*F/M~SMOBtϩ`YcuGQ9e-[222XsNӴO\y_6ըIF4!rr NX5b(ѱsy]_?nmmYlrLN't !֡IEֵL!C!|,Jɶm;Eq啧~fg򖿱,si1 (oI0q<ἒs`a'B]aѦA5SÞ'A?d`W'?я~9 !N;TMr&sĻda?c,͚A(-W`1ZZf$nD0{v۶uUW̟?e|T]OB=/yL3wcy瑒Dɤ fQhS )5YkpΔdj 2$ƆSƣ[z}?>T*K2@'O9"T.ݻpL&%Dի@uuu XB=b 9/Peݓyc*D8 U溉>D"$C^.[`MMUJ {e;N\y'rHSj:N`~gYit޼v^B42ƣ(zY_̧ B%JhBN:}۷\R8}?S+VrMc}Q$aOM%XPM"XiX*r NX3áw`!m_gw}uՙ/E[U;c/~K/COoqarڶmpu׽ݺK.ԧ>P?88?pYg~D[salx_.겔B087kVRP;wm[&ǽ60, m:}◿㗿s9˗*HAAAAᨷBhvotngB٬a0dOoiii\,\o3'Ht]O$MM 5dqW]ugz2cq飪Z ⲟw񻆆}YI)l8??HĖ.]fz !:@-JE_} ͜,KcQϺ馏͗a:;;˗";ݶm44MƄ B$ [=cҙ3*&5MW]v˿|g?㸶mC[nmkl}}_gO8aIiy@0<餦j*Rf("X]r\T9dɒNT&ho>{ף&+P9wXx~v 7#-_W첷Ν;?mB"].n݊j"SG7@ QRq9Z+ι\IfXBsPP'9DK1%I;00V݁ +wq?o?^p+W. o[^\C}x7ny׻/ݼrr4JTNNw1MS^ Ub u|竾+YWe B439* 1ΙLl C"VUhSuaL6fFJ2;rQJbwwoG4!AA( ewE7s=+35Κ6$8BΝ;;;Z fJeUM6{888jL~i!+5a0x^AxDaL=oTIK3c*Tw=Ĺ{…LU,!9ڄUjL3B3Oۮ @,/[v‰'.xoTA1O䄁m۶ŶS&p0H  @H @0A# X҉LB rtI"+?K n 2#GX"$A|* BxL߇!3.Do?d!=5b2!炱EYL- \Q}˅B߀Z?Cd"U8* D}M64)‹@1(=󗐅vfi}gBO$Ll_c[f&Ι}M !B0LjQLf%*GVYBzKŠ7QqGAH"Xd`9/d_4LGEG%Ƹa'b!2f9֔4o,Z7 }Y6#e$G bH47oygMLwƀ Ɯnǵ@|YÒ3V6cIq VPxv! CLcFƙ[3z@駟yp{zM]]oAnd2Y B6h`!$ZZZ1T Le]]N`-A-'{i]`^#$@ !]Ɲ!h,ͩO`Q@XD$+X[Gw 3YᅞZb?~h&x'*;Is ."D =L͞= IDAT\pg'0–f1&1bU5KA9`GH ;$,Ӏ0NGk1S м1ۍqV'PL5n\p7-ْ֓MGc~nvC/"arYbKAY AS 'ĈX@B Gk#[oz͇-cR8!'ty߮^&@yP1y/%)+BV$ƒ3VvzL4^ TT_*zq+k95Nt:HBx@I%][ʃ5`H{(c1kLf3OSR (`|`D3saL&X]gk.9'M+vwB_y`<FѮ( ;~_c^H-k\2'=AUWx@-C[{˃\BPjlLH4VX\z8j}༦[InFzrlyӈF`ƙ6ˑE;¹hOʹ5+c6t<-+%68x4Pڙ۽ 3?i bP #Al4< fSBAQqg~.YY+k#aZLZHNͤ +v68S wYxF kXX4L(zcvb/8> 3lhKڼz+6!Ƽ|g4yt[B9[XLI@#;>3~ zHR { ]5FriCg[bƌx l`Е53)3cm2#BȈ',jZIבv 5B҅P5S<;嶌n#ΐqBG iM4ۚ-qGܑEi]:Lj6uV]\51Q7 y$svZlmƺ|!] c,զj*1b$HYSJvyn8!d@BGLptx6H7KTo2xDAnY h;Xtx_DRww X`3QSAƙ 㑨q)M'@6둮'zK}7a@:+1 Aэ1oުsBw_W[H\5m͞1f;ud\ySO`ًB> xkye2BIh,fb !)BQU` D88֋`v˓>g_H̼3)(YY!#'r-bRL'H4^v+2`B0uGᔑ,e3db8 yqV2pCPLph( .c5v!g ?B?s! "Τ4 =Q×U8; S 5kwyEu {`#}=bP,倅&1`fg̜!gdv#G!)иwCǍ| a- :Y30f-9g6F`k6̅V!P! ]Awݳ\PA[ٺ@w%Bh B#5c{[~1w,`aL !ljа==na{jN+>7AL)'JOM)kkV33Y+a 8;#7| nLB!$NtDVC4(m2b1ᰚ&lCN薂2"Aq]mjDےζ HDY*υ` & ,mܤ&*;H6l-v3F$S4A15#ejAtZK;ܑ AI~kBp$0` kX&\s$f7dk5lI͘f\,= uV?P_ @e,'g[!S'`<0aaEϡf,Ldq"a1(9E^ģr{7m~~x՝/o9%&ճzB't~׿6f{>m ']+cH>n~.ʵٳ1ٙˍuuu%t+qgQ.dssRZq_):oڴgq(Bc!ˡq.U8XƘq^u0`H놐QL iC't@2$̗$24XԬ4Ò!%ﳀaQ ىNtP k Lp S,XPP @aDȣJ B(PIŅb yT L0 ؤfR7 =9`s^1pP-BR՟~zag8cg盆! J'鱖xS_ '4.B3v׭l]aeT^,`by0RL1`x"OL3 CɧSh54uGPMnTGB}j,5bF4M:UCQS@{ X`NyH !%,sy?6݅Aw8oBL 2s/{AsdlL?!v3U Jͱ99K&|`_ɧ$cW4(\wc޾fLLҵڪCIBݢQ't|w?Ƹl{+/g(GŒ@q@B =ēuĬYm{k׮t:XP0}ra-oM~k_ĚN}]=!0_]xrҔJ xPLu1B(廊qkHBwR9XfVA+]G~H 9# !MIM^5ǚf&ۜ04-5kw~ֈ֑_JX]Š,sConv΢| 1B3[yb{ x"~xkW71ƀ NcY+;?>3vBCL+޿h<5}k3-QK jJ_ (V]=:o_el)y5p #S{OpCΰǂ=}kΈ7ҴlAv>ޟ>M`GQz4p\]aAI"<`0;']H~g(3/[p\tO_a,k._"Mapa!}cvMӚH+xlܸ?%gGwo:cRʾmW85bL yX*T-tϥQvRF}{Us)hḮt ,3g;dZ1BFϲ0d 2 =AĽ! :e9txcت5cޘ,8kZԜ9?=gokp4ɯG>bcYf6~/vZgâP~cA.NreH0YƦXVkdk3C#Jo=S@h_Tk5y\G؈'zVߖd+̍Qsy!dö́ɵBXt׭[wi+c1!e :::q+/&Ƙ1iӦrb "X%QooUϚQypFܙg?7-$GCC;ܻ`!$0 )%uN0&! ˃ΈA;1j;˅e뱈~X1 11cLUԊ!ERWigJ2UD"4 %VRKܸAgh<hYӷvξ{p#]ͲDmOh\,u8Q%}E/**(((Lah;qj'P't~@ipخ C~UPke勲 캈G^b"Kf'FCI#53E15!?~qWnOwgo۠:3ٚ1-&88{F]cQyIfumlYnEuV&0Άݑb -f.t: z,JRB!8Nss3thhs~Di?<<,xe/|X.@V˜af,@t=C銖S[W4gZDƃ0) R$_ri3N}38gz7Bޮx4h85|0~#bL0't#aͦLgYt廻={"쪚0#5#4;5sVrfK)᭿ǻWIkz =l2 c톌ƀ4,Y;dZ&D>gׯgեR)qW׾ 𚛛K%o]cd?B!vl=k0<4Q۴^ǹ<`f8cܵoϑ Rv&1/JĚ^)jpY_DC@07={^zmy77m0I̙+# : }NXFmV ˞IVUgSl 8M1u#C,(E:4L5[Lh%~\巏{gAtٛ^N;0kmD5 z.'V3quS3#;;#$hQ{۔2ƢsE,;wcX օp+#ޞ}G` !PI~G:"qDtci!8m3,5B`rA %@ bB,kX  9ϣv{H ./EG,[Z߹ 3qw纶mSogA9֤3ϭڴ/ߵetM{$kϘqu'MoT"!/J""s=4%J!2+e!!:MzD?B6O8" QK7.W ͪtD@R 8>!$ӢBjwO:,Bު[޲ڦna35 ]=O;#7MǥM 1"‘ʻoB 1T8b,zkbSa 8:OyDӡ=WJ'͜_{}X9>0TÐǹ&G(L™z5 ę*,B/8 rA^N87s\.u-͚!PE;3DI^ډZ*X% /jg.Y+2FAؕenڴ󼁁;v>G*:j gs0{Y@dJ2Vc*kGiMS$ޤ\'ݻ-[xbjIIDAT6 nٲR yy5qopL3-*L<_"9Wu2MAP`L"7͡,B$Sf@;"Ĵϛ72@}u,ˌBRfF|.600ȅ5Z{VVX "?x `JucjTΤyEJJ v0|)mjtXt ܹ(B|C0M<ϗw\[Ց3<iaF *;[@RI&0;yN+ֲ0;Z/MI[LO|r޼yO>xNAG)*eV2yћ„5VSĶg۶)|^yyxR>2BA)_5@\`TNAAAAAaڒNjmmraiy}zωKӴ{_g?r !Ê`)(((((LSTҷL&e˖9s&BtNbأtҲkfݺu۷o&E3BBѢE WXqRBL5krܩ/_~m?4MI"X ӛbBXqĹ4y=SmmmmW}KFRPPPPPb|!@!L9V^bŊ0 .oJ>(+.RPPPPPP|´#`ә]ɾ;w?S0ƜD"q%?5L0`)(((((((짛A^t}}B)5 Rzu?c==:jΐtEe$P-uVZuVȖO~ oT^orO,ʯme Łq\r2ؖɤqcb+A4%%O*J,jͼ`(ɨ5W1!7a޸e Bӟiځ@!׾1_!yX{ D-I"X gEM @6ib\2J @Ԛ9:bLs7CUX0j.'8NB: +#ڋ5]2 LcG`ɟail'czrr?OPR24=IZ3@]O)M2ҦI1At=~J)!d9'|GpƁwW`EK32ԡ@&IK`ub#&i i5W4l8gJ6M@"Sã݀PDHtEI6 xe!+<)/*J 0:;%O K*(%fԚQkFIFi Bcd-30Pƒ [2N=t8жXidʞ Tro/ @}󬡳Fݲ`A rdш!yb[mklWod/(q,aaAl4O*7oz'Lxky >z9r\ơC'Wa;OZg\䤲ID4PGO8h |b?WuyA ѮONTE!""O&dg+rʷbwr_{k_̭PwM,n5v6h nhNBp<'!cC ҭ_wwt-V]߭:VG?<`0 ð2lXk+.xqoh3|o4'~R[nX61DUN{f3].3 wҖE3fc{d# %: =%ND~e۫cJF~gD24#`-ZshͿ_݌AɸټCzh`Π.ԄRtN@q@s4pK[А!os-hNtž}A3v}Wwr8aaX`}R -VUP5dl殷>UîfYYm6]ۺ]ƍV"iFHn%+HCꈵ:˓mFq/vay}E7>Ľo }bogR P' aڿj`<P>D@Ws^Дfftf]׌+s|o:2B@[l;pRل1pӗZ~]H" 8DNarkS"@&奻}UUv-Mx.Ց^w1 0 s>wS cL+&~H N2_MGcۛvL*_DXq߈aKU\>yO5w3t\Ixm+ظ2//lJV1X/{rd'9'U /MBfaW+24}Q7ZPAyk yU\0ը6$"@s)9=b+r|4 ': #GFN"a> PRZ^TTn '@Jtujg<voi*Xz3~g6<|1r򱧴g JI7!$bW vj|F 5NR‹zC`zm@D&r@7Cg$H=4@fNpPb#F$EA #k=nBtƎV'aL 4i5-+K?T4*WDN`1jDO[r߇)kW199}W.Ցת_.)q>]%^ݶһlȥFՅ+JO=K'2}MǺ;^u8WF4\mE.I?_ dѾlqAK ۆ#<nvjyǎL_TSpvv.qZu`զMa_vbt@քOk>14 4aloxvӳ9p :p4 Q[߰+saŅ&5zHCݽy Pд8%XpαMw{u]scJv.kG-d̍eЌ;u#=RBWGѼq7>tBK_ Og Tv7- 8Ѱo+]EN+xT|TQ#  >[é?prgu-šb"E$*Zxh8*j23W^uM>V{])ZRdҲr\u'tG܈" @OD~=Wo\68whkݝvdEt32}ճ XqE2F0`[UH%d#JZ.k<1N8v*%R^Q 6 pHEŅ?8!Guf/ Do[1nXn\;CG:^}ѧt9.As3Է9΄(K5m_mv#R! 8*;'kH-KnBUACpγ;sS&h¨.[2F)G]N?QILB$UXNܑͪQU,bJaCko] |v@81_\^ L&'K'(4u\@0tS%7S拸C2}fH)QhB5xvI:'>~b|;aj&qHB05yJrnH74Y$ea{q!,]n *yA <+k"%M[CG6dXIZ;sF~h3XҨu6cJ:gy[k,洪U$0\[gT( Vt&:TLk "(\ٲ Oy /qǴBc]J[+ u!04]?+UNʯn8E:Yv֊9#82wn&[kxxV-k>:{Y{Yp˪mƌg:}aS7mwMCf8C9}i\"UTܰy!',p@ !W9@w\װ>%{*e@qO $ɢ`zwﻖn0kF\@}+) .e꼘b4 A~@,}WB=umZ3$bL/NXB)@L֕tt0m1"P"Ri\0!D3ٳ "EW#H ЀA"Jp' $ A @Jjܾ<0{>7nHnOJWJ F%|oMUUiY/̜eQ 5\xNa0=QE;xBI*]ݒ{BCJRdn2I{@a~)"C~FQ__qӖ! ڦ 3Kj~ec= ])*~zX`cOHiSfOE'vk]1 PRaźRCIVc3}l xU<Ԝ},ž;0&=HiF:B#^Lr`|pE/0_0L3<ַ*+`끪wW?l[7 Ø<3/0 0 ({|֏ԯVR'\%a=yyy}s>_JM0 0@D&NPXPuK>z;Qܽ@QNv^N4qbMͰP(yo0 0 4lS7li錌/m `PJy_< ,aaxD5Lp]X? ,aa brO,]Y g*y!0 0 ,aaʰbaa0 0 70 0L_Ah5hzaaM7ܯg9HD 3 0 s๞\4m|aa'7[IENDB`Subsurface-4.0.2/Documentation/images/SplitDive3a.jpg000066400000000000000000000731171226345450700225470ustar00rootroot00000000000000JFIFHHCreated with GIMPC    %!'&$!$#).;2),8,#$3F48=?BCB(1HMH@M;AB?C  ?*$*?????????????????????????????????????????????????? 3;O$ԐARI!%t"` 毣&lwx6-Y "!$K}eU{`̕=s,p&5 Qt3$"Z֥ 3/S3@^=2J  $AX9R<9hrY9V@$bBbvb+{&$RƤyUTz`A.`fcZd@UyG.q!61X:"Cd%{ xƤj['PyUj{G@wFYjXbRI+-j(K 1/QhABS87κgzA""* XZ&Bɑ=kwKU+LvPޱ1Rբa.Bг9luu1Dɴ/frڳ.J玂IXIY%stn}7X$A׆|wB>ΔHՠ U%Ϟy&HpJz@@E3K'BdB+x´?O_{j` KZeٜ[7]L]oۜyyujtW=L5?Ӕ,`Jkd˕j %x̍ \xxg>?xWZ=L6R~secSeXLlИ=L~@}>7 Mf҅(A[*et͙f"[S^VznݼdIJ@^/c~~5.VT$Lj{ _YةʬIDUYo|.y>n}٬H RYYH-WE;=/G)HB*"k^?vs33kfH%JjgfY~~;JzxywYn5:qiB:YCY|.x+'N5˼YٮuE@3~=3Ƨ4+fGnc|>דycʬD *g~j IX!AA  %evDv!R H3ͬ)5#9oµN=P(ҠAf˦U&&Kc˨9K5˾>?+߅>ƢĤ^%y-yRjim9=/CEL T2$c3R  .rq bfJ!llrwxyס5Øe$TDZ8r,lz[&ֹfbIoftp]3q5R@$Xj`rAcH"Y3Rh!S=plrƕX\fd.A b+R 4/C)nsȰYsu<3rc,aVh!w9PdXzNRpz`N8*&RX,YTbQꃒ"sWtcA  4* 4$$ArwxA%A I   rH (z9HH$0!5"04#1P3@AB $%26U8%W&,G 44A :l(hm >H:zu"EԋөR/N^H:zu"EԋөR/N^H:zu"EK~ UJ)W*\pR UJ)W*\pR UJ)W*PC>/d11P+MjM5-jM-d }_J!%5"m_KEV|rhd&bg6w-$7sK;SZ=;(S7O0ŷ#;B2 3mC&I1-l>5 7Z%q hnn0ъRVk(|;m~׭-AҕKJ@,FGH|g%Β@w=oV4[Mj*w:˕ˍˍˍˉˍˍˍˍˍjW(L'*9Kg%4ݿ|${<-9@;KVʹs=b@qS_?ketdiY&Ƭ$ ~гLu6try/vNcs.{Yf1Ť4,[rƻ?sp/"X4I!(0)Ne\ Du'0= ŭY͒7Z`ȖؖqU_RsD4Kc w4N#S` t05AGL LȣM0 -8[ "r¹aNM>B+R&ǬLnRgwj#,i g3׹-," sb &^Ɔ5H(KOgSD`EOVȀN-MMu=}Oy$$ip:*V qUS;~oʦKgYW2ZQb-EZQj-EZQj-E"Zy.!1Qa 2A03@`"Ppq?>Y!~ ٗ?OȿzoҽRe&Xbe&Xbe&Xbd&Xbe&Xbe)t7[+)UhjP(أcUt}Sf»Qw0Ws 0&»Ws GM%Fa]+w0# 0#էFoѵvaaa`a`aa]>L>L>L>LGV(cucW(Eea``aa`aaaaa`aa```=]Ff|/>1!E3䢸W!p| =\71Rh~$>fҘ3i] }}8S|cCihZ-EBiGQkz:CRz-qtEFnk2^GQ7˹]76GPla(v6v6Q] bب6ðlb{bji廡6&.6GP_v6G/Oj{W(R+zlC|⚡E$(^+"ФR+jx}YȲGOO.4IW!F)6lڪY|9jSچ؟!ʘ)1HOl[-nV7-ƦN[zrr6nt_Rv3s7 MK%OW'xnb\&nOuȎ˖Su'-M+|[7p~Bv$WCCt.} e2Lj\)g6>J6Ԏ-:NicvON!Fvjb(FI$dFI$dFI$dFI$dFI$dFI$dFI$7׫?'B!123"AQaq 04r#BPRst@b$?MuE+np^L#m6˨M ]hYMBtMmTM'm4-Qеd5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5jp\/W vWjjp\/W p\/W p\/W p\+:&YͰkжM䏿F/&\C"T)ц@Z4HTNʼ uۻ%mH}P8Q7hA7O?1CBߧ1C;t{4./2rQ=JnWWJH@Moy&T#J 2UEuf(/1>S趄"Gb׹NO??ɽk+U\\L T\$,!\5\#GuOQS:qGXrt{7$GyZ,Sff} .-hx&Շ6=Fh[xB&$bfDB v&o*+莨%l⩊JTaˆAV!JƛIe7gG.7ɽz+UQWӝS1H*TtfI[4M6"&Ϥ-HaGS޴:?%36|r Jwu)/Q+;hAXpA$nShR"]$Tr;[(UFX]a2/W umpF+RfKje6y?UE+Go?fy7ћ.;ܯZ3g ҬPP_X һ|+'~@j%U@FZ@E SLPdժ!ExoUՓ0NiMoL^zWwԭ:#âJgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzgzin6(V2d/2WWIl*,#P qZ\doeyZ&X$Fʥ]EXTJ*SoԴ}mU>Z;/_(TQ%L~uJd3?e]W*-OJ>g.mw b\]z"JkEySZ+Dono[h5@7-ɄDܭyRQ_Ry⨇J3Pwed^7VNgJlrwF@h۬u̦|nXϹL:Uڟ액|']TB C_5ޝԇbޠj ޜto!!_dbT[}P:M!wQ:˶hQU i`2ՠH+du#SlF EП~2* ,Ab X0,Ab X&MXV&Ab X ,Ab X ,Ai F˿ %n%^#*UwP T[U|W7~KAcy?4vj%v QL&ЧuMaIYSCX즺NqnޤG^R@FDi-̃P-NoD4!֨ADBD"VKRZ;!վ{Q9_oVƅ>j4/-&Yݬ*k|\\uWT\"nJ^L,_zB{uiZ/3ɃaXVhhaaVh4.h44Nmb  hqM E#hI!Fz.htzmlh&nPtd< XV퓳z z;(ݩZ$I .Ej.hRugVIN&RyxB\]N WCISD+q׫Fg@}cdoG ]i[FQho-inzDlԢM[jJ RI t^Jέ7~KAcy74:3*tpCXuPmCD橿~-æJw&cqV|i Ȑ;Cњuq^:U [-g $Q։!"8ҜPH0Q9!JEF$Eu0բThO.M Bi{ō%(*7."eJ/34bI:(Ha䬁_(WRcV?%1L==;>*BB~& 瓨{=1B]bA$q@۬ =ʦ p(!x *pd@zMҩm E( #T^MnS;x] *@j@Ũ T%j4.6C.Y%^Bq KglJc oYe+9 9jObVw%$݁Q嘛+G\5ob8q㟉?~'N9,|½2(pH?^{{{{{6CQ; љ5&-X#GA Mp:a)d\GH ,7D21J$!1,h}N#NlKEgLB ,79mI`۰#@Z@h~=7+N1)"s=UQ7QK d:AZ4P' 6H @2G$73FG|uh.6RA+B~BV"v!Ü tR#ְ}~~rjXNr0~:@ZZ5OLb T DTCmP;f3MApU`63Z4"zX`KM !T 8/њ"+hpmU `}}'<qs09 Nyg.7ǜAQ].]b: =ݵ~H21sF*hJP`\09}ЋAd}"-ۯ<A5v!q"lpe$sLĈʾQ+󐾐 dp4hfV="qPhJ(a~3%Ԧlkʈ$C[\ !Ĵ7+=~ so%; u`@"S\#6-Pyp{{+]˝^_D?gfgfgfgfe]Y٘J*J>333330?tQ1b}L?Z"1HNDH%Y J*L.qFn9ythp iŕ[$.6E̲9Ȝ'"A ߡH!Z -/4_MP2$!Xgs0bYI =ſx4 ȑea|Ɨ$|6GIOI ,/ <$0 N[6^=t?hpO3(Ա!{m7'B'6]0撶M-hbM ~.Y6!2rhg5kQ>$(mu|'PR߮xc;,a3& PdYpLz@k-0TJ XIfB1C1m6`@Vk10YD`Zx0`I̅|½:o,qjàg#$6iপq7FDX-$[LYHEX7xRI~9U$ 0F( uDak\ ҿI 5wwvg O;!;qD3ToNc/-(/Xfn6eZnRόbdu8;f>  qD+i"  @3`b8m qoCl 7Υ(lR4n_i`fr}K^/>;~1)(1`0׺Z70XﺂXpg*̌`ԏ280wB$|OmpP@='bzB\=%G?OIؘؙW)r3"73^Sӝ;9Nwsӝ;9Nwsӝ;9Nwsӝ;9Nwsӝ;9NwqG ;.x'"x'"x'"x'"x'"x'"x'"x'"x'"x'"x'"x'"x'!3 x$$I$^ I$I$NNmn R2A`omm @H 6mۀ͐umm Io6m8w CI0I$(i$I$3|&$%'cmm"\$F$X}m܀ $ I$I2M7{}{ڣmnH$Z@I@Q A$  No mm zA >a#N Qmۀ $H@H A$HI$I$I$ $I$I$I$I$H I$I$I$I$I$,!1AQaq 0@P`?tIor4SA&Ĥow?"!6xyqIyo~"Ϟxf.z_ac_y7E|7; ,S|z\/6p<1&p6J]o:o?dMlBm ߁1clgMz, IXhJǞwKiѸ5]g<N5F}ajo 5<7<Ɋ'UUDvNNȓ흒;'lN;'d읓]yu)E?Y6<~v?gv /A;~2ԚVmO"3;jܛV݊ '4zW "!ho|DŔ,gzno0-D?!6nךQǧ\ߏۏѿ+ _sH$LL4/omS(%[݉K||/(__zD@ pkh______|/SJ #Ϟ0bdz3WG?]ȻL$$go2)/g/q85bqFU$U40bjO6 $q q`+$$JfA2!!,:.HU欛L ?2=֗r:\ay4tɯyQNCQ=$|OzSi7?7ySY5B!3EoJ ԍ߻Wn17 B^L|o^ *67??貽8&LM?,!1AaQ q0@P`?ZH5DY^j؊%˫#s?a^FT˼nR/'9J,4¯ 5ӨR"據BEQ)*wh))S2?>QFzD3X;ZʿKk9I,ԗTE]|.O\uMsnw#Eg5_$4S;Eg5>15̚FeJHx%\:EQ"⪒i;'krtmr<`.B%@Oi ~Nn#35aѴ!St*LnnY6f )ĉ:n A~ȩa(#N.7ϸb B੝_(d]H&Tj+8kB'"7D78Vٝ$I$I/wtzuaK/,FNy5XQ ƞ$D {JK)yZgQ ӎ )HWD)E ɼD!τ!I#U3{$7DĘľ‘DGFB"B<""7P|?#_G"E4x_}DCCC%FĈ_2M?*!1AQaq0 P@?ipăZXAdj\œr{$T w cr(sjNytªDcў~~~~~~~~~~?Lt5˗.L 7˗.\r˗.\`&z7ktf=V3ŎSW#]y|8t#w)@nsfuuvqrt.YHGbnT|A 1|pjGRҚvcv; iiCO(O)014}VӃT;.47v^Y {d;ObkmmmOթ[q}~Ȱl]hxJWx898s Gpy=6lD<0o#O1./?#OIFBv׎v%ERnlqOK}v{h4}\ ªOi49ӾqIH KgQD,pu)eWYK j)wkXxVtTPUsH,&EaϚADž@l.S"!lk!BMb.#]ɚ.}:ش蠾xlp4M<#0K559A-^DB|@Aͭ@zeAEE^WqԒؓ_:~ oOd \{c+ [{v,Ifx UPR}0y[CmorJ( [X"9u!ALƈO8JOIӄ]✧ל5 Zzu|NG;5EB/nukM0[-Jy6QWڏ`IUh,#@z/jwqֺzԴÞ9ÑX!]kԦ|=* DU*t uvhӭqNrL5$#o7"p\6بn\AH㕁V\=f^|z*ǥ,u !4,~|>_/ϗT!&j@9Xކ]cϊg3L|S>)ϊg3L|S>)ϊg3L|S>)ϊg3L|S>)ϊg3L|S>)8-Q ' pnNvA4H(&6<Ѿ-:i{ /g# To{gҺ DZ sC'_|fGZ7ѕ@/k(ZS}qҋ*nѣ`O6*;ͳCi'bBS"mln9Q"y:+lH@ pEJxs"kjᩮmG\U#RZɀҾb]>d5֗ݙj ʬO&i\ģzK9;bԿg*lySku2؋TV9^0dvXRilGHDf閱sTK1$vZhL&u@B&rk P #TǑgguӮ0W:*P&r K *uxp^*T?E3_?E3_?E3_?E3_?E3_?E3_?E3_?E3_?E3_?E3_?E3_?E3_@"= ֐RI*3KƁ0_9מχG3Ft]sD -07{/l֢]GP1v;ڄ9 }0l[xa@/Fi)ߦYX8n;_fwۙAk͖kN|jfxw')Јs$^DP;c*NPxW 3RKyBX3r;SC6~0SrJ>+?`=t4"26e ߏlP^lY}UQ1Dϟ~2BZEx8,J M:w$h >LB@ct Nbf)"ˈ93ߌR-~0@ JĹ gϿ- ?I؀\bHXR lgg?CCg=p,s18  =|A9iKNlNuf$9XX<=7ƜAUݑݑݑݑݑݑݑݑݑݑݑݑݒ hv ͐Miۮ&u.$MCm3 ;i"_eQ_hzoE wi*Ac|Œ=[c=>QdWq0oA K?SYkBSM|` d}VE8.ϥ<;e:^` %P9/6ZcwҊi=JXt³ag!BS5`._} N)4/YE>,t8zX&ꇾ;`ޜqK Ay.퇔5eF a؀P; LO.!I5pXT]^XXDk$-#R p,Լeu("Mt3% =0QRPxpL+3x D $JH n18N)A^_7'Zu"@_В{g#f1+7ut"v'_ LA#P:xsÃs4j(iI bK+^8[:yҫGGo\bl)?%ja8scATy 2~AZ`O_!/<韽r)$Aa }ʒkM۴bi[7 .9S} e)TAd q9fO(%4Fb6ڽsMv] ):^L3 ^~aQ4B_ !JH~2 @0puUIeR]l95'H7s<_@FMT73ƭg\2߀'`BQ/!I3:/yDt :ߛTZ-<`}b]3qE[ _>z,)>`*qZKpue~B|^@ ;s/rpxo8)|dP DgK)ϔ)H{Slh2J`5u15(rrwqgHz;43>?+q>´c`Ugpx;g@hs*:mfm'_wj^ PvpNlԏk=a  *E kc>sF\:(MGh.AP[ޓos)$d"KQgz]3g{lV'}0{%sIA%# ~vV'A"\NcOsĢ /|Q(Ŵz9 %px:忦RO!=h'A.'TbQP9PfAZ:tq-6}/{Ôla D/lZ(RKaZSy7σW*/o2^`~Oy4Bi59񊤨{oS|Qap'L"7dɥD<;6^Kh;ڳ M+L(V4keN9}uhEgZI nnCv0̺1 >&4*}[]Kd'7o=ewnzǃ\}翧PaE"j$'VN b]exy6< :a6*5-;ndA<6c@3ՄsvjD X@TfW*&lN %nHfA[o9b RpXg=X*-p٭s @y>6;[v@>ZL8wN_;/3 ?D !=Ytl֟lV'7y7-vk^\ܷVua~3 ?>|g3 ?>σ3 ?> t|/~=,y}9-yç)݊(2<:ͼ+8_~y}c@hq-ћ( k5|7(V X8n9gݏUhw|z ĕP^hwLOqF.:4Ly 9s G%nD)8 䜗MYD{|ZWE~CֽA&dj]&< X[Y2 yV TdSu.w"g^qv#NΰBC]qbyġ("7Cmhݨ "7Ld6/n C|.hZVd++ǫۜ] r0sH:6觜<|*s8[:劌{do@ ?'<w :ѮwbQ#̃tOLtu)\>`&t??Sa鍾#Ur@$ #4y) }LK¢-N& ڄwLz`WOAqD@yb֗Xn>7Jtr,4kLbNBۢ"s<w =a^3JZin0UN=pyqF(c]j*[ e5TW|8qC|` =Ѽ@6-gt9W",E m̛3ql6udΘ{lT|ùo6KscAo >.?/ANpWAWÞ=h%63I_ >H޿|J0Ey* !*@! BI#Q: v(68N8cbm\e"5"h"y_\d:[ צ Io()o:Pg/ DЭo80Yڮ뾽0{F`!@\]…{ai:|„") H44HI;8D7 UC2|2tc%|>e*M dQ8#fbY OV֝ZP=D۷B+"q58}Su!,g/?!CvO Ua;2];.bEG)qF`":Ꝝ*L9HWE tke}gߟZEx9퓑5\ d1lvn0M<*HC[Q*#7?0^z8 )#gY}٩b$H`; m{4^fpifP  r:{e"In'6]tkNr"PB1)*qǾA:]̐g/\rY MBG5{ fNhBE)Ut`1("tȡ$;g%QC9$TY|JdTFާ,꓌"DGNgsEBm݁Ŋ՛`}pt*~,> @b qG8/)ɬ(#Oƥ66e1L;,F|_Cȋ-3//ɐ x/> ςs/> ςs/> ςs/> ςs/-.SYcwE4#y|>v;a|>v;a|>v;a|>v;a|>v;a9qс9Fsy^|/> υy^|/> υy^|/> υy^|/> υy^|/> υy^|/> υy^TJCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSubsurface-4.0.2/Documentation/images/Subsurface4Banner.png000066400000000000000000007663221226345450700237470ustar00rootroot00000000000000PNG  IHDR 'YtEXtSoftwareAdobe ImageReadyqe<tIDATx} ]UyxyIH $$f"*Jjj-Rlbj[l`X5B+@HI 77ɝgk}&!`zrk~BJTK$΁DwhD`mhlC__sik {1\/.Bxuw rqЀl6<… |H_[n|[[aĔ)cU;rEn;ە)L1K̓ړE*Ջ{_W8W/]W0/{:J?/.0+tX[!̿%mG@q}[8VxFA.ԯlI51N(t%{a7^Fs[A' ̹R5Zǵ޷lvn LbYec=>TW.$]:`K9jNB=<T:.0{XS|gבbܺy6}C&+Ր5~˥ 2̜3."pmK-_T|aD dsCpdaCwe~pMܛ[^} ux׋W{m鞉hy{*UXZ4ta ;1qΩcxMpJJw]ѽ^@ 'kxm8cj۫h;l)޺5tehÊŎ} 3ISuͣؾ sf%q‚8jO _4ݍ=r HTKeK]d !(v/>W"O:܁R]C-Hr4eeA)*pAItx'2|#_qJG#mTeb%6p{ Mc $r]IF FaPnd6y$!^ m2EhmA:P.v_2A}2:`|%Ul*dxr_TAO_: oC($ 10Д{htW!pWW}e?gyn&Dj-G*)Ni ZdV"Pr%A;JCP`Q R㲰b> Ϲ5 9O ЫxRg{E1zts}!4Zm㰠wsرu B8֨UpH}8 OXmlT&x׊x:jKՠi$jX-")ar ) r%`^ZJ4_%`uj%UtHKsVGcЩ>g/N} DEK/B+/xAHXR`Si/'`1µ`P-Kbt9WRCAnZ5],KpV|As +G'&~=Egh2? gXL_C/2>:d-M/{M%XEY HnEPW־^P{)=4"CP1zn} Tjө҅ܜ`$d3m]%/TG?F|1PFW}m6!p1{fY~+CUZNJ!94B Ԉt~{m>(@w8g V= =#5zv4C /\NZ kz؏I4ԩss%Yϕ G U-@w?\ѿ<)ҧZ-5Qxt$VJЃ) u xSj=Ӈ@ P&4y/ R{F]@ڵe'T.U.-9Qeݖ歨Lj[#)8ZP@R0ڤ l@5 E"`鷓2F&AF {-P ºh=#֩H@ [Sw6zܼ)Qd㫇҄ Aa* LX-%(ufGbl1Cט׆?[27~P_CRr >4빰紭 mнJ:`+yJaysOJ0^#2@)cD !_3>?=4l fGAUj9ʆ'a涩3w{qRsO +s Ql]V{u^ZyN1vdk#,&i5-E84|NuHNX^t¥w~/dVj9" [&W"T:n@"&/ e/Yp A^ [hi[ld# U״j©~K#( ,~"ju8BV).إ(!n\.W!}zٽR37J؞ A,mk9-o/Y-M!K劯Zu HB9 M eu (n6AI .瑖BgP`ݢl|Y[# [Y$^>TFn\D~eФ֒CL@_&Vӄ0\܅9uD!ZlssaE{Rd|-csגΑ՞s) a? r1܂Swz^RV໠ؔ(P"bq })a$gF_1?6ZNkxґ-~4 sGIb"8eKw| Y @d -h^W, >(HpRh{xO+}oE]9w #S W|19F(P*#(]Of6#A8[c QTh\ Ы*q₩x 5u%Uhlj.l^NӚ7).Bk#EL+Q4dς*qe`ŵc[ruw~ R#}j9! .AAJK7-TSiw@->&l8e}\>ܳC8(!½AzFB ڒyE!"pKI1"Af[LHŖ#oAeIӢ,)af!4"K#hu+'hE}VH#| `#%sɀ2n a[! Q"QQp[bmg| L/ PS "F̬yAB>ZN914/ZP?=8`a:/#N(c=K‘sz/ & Ei0놬c)쮝dKxa'J*M fUj9OD& "&U)% UQ27U ZB!{RZ5SJVtjDQ8 CKv%f‚-:c!2]'4]HˀU }}Idsb0b^˾ޤc(ǒRZO"(]#J =,vlCH8Eau\Y-ISX xRoO]pa‰gD P(p! 7<([Mge +\l 8egAqqЂ,(c4];e0"%/s|BAPAQ[$ƐWJo3h *[Kʿԕ?2sa>(TBB9K ac^\"#\BDIErAеC;;*a ȯCcX!(o*ZN200Pjy˥}O!zg7e<GMM ʉ^UҜ574[c}xuors6ԍª矂í$ҹox5,)^E؛MX6 g1Ϳ㴩 0wB zJ$"T=ꘫqב+3 !.’̈́+SpV&a - wu < Xvvu3  $ )\MBݯJ J,LڳrzAIB}C̨U68`(lB1ID+B)/ _U *}($xA%'vv0}6#M)Lok 7ʍӃu=-ע6`Y!iՂ^-'#jy.ߣL9]P^%p[۫31* ̇0 &jWB۵\}[Kp)}Kww>tnAGc"jͺG0},\Sg:bߡ71u :v+@k]3jg7(FP =h5?͐N9HS6tV)gSZAlz(!DXBs˄I\^{ nϛ{M)%V,zlRl*jO.Dr A^ I\ =pCoґ T٠bwdV`1WqwwvMtIΕ/2XPdI7K/{ !%%Z0Ё*J!Ӛng='s1#$}8 LvWPgQ^$.'RWy8_ާN*S:2ۥՇ~_TzTemcqW9Xny睞 =gG>}⋱``ehh10B&Ơ<0Zkkk=+]݂^><mVZ幹S `]M[aVdPw xE6FWG |˻kpNbki&\OV׽/l[.(S^JBh${~{77?^a>4w;ԃl.sއ= {۱x`%yl{k]t K]:@/YӫPӥ47D`Z22/LhdUck'Lz{X l* #{}퍭HgRJ!{߉@"ڄ7B(*y̙0qͭXn%]cLqc«{.+`Ҩɸ?EooJsGKLK\RPI &Sj *hkBi]%*E9LD9 4¶Ɣqhl*g cEvyTM$WP>iߛKcG$= )ӾIka RG4u,H i@NsvVFZ%n ^}aR6- 4CHt-,?f91MCR)O׌>h6UlZ!)3K;I@B:g)3z0s45M<sNIWS!M RZ|SDn 9!%% C^$´;2;>/=Z2\ z-={ov*$SO=uҥKo馭-꫊v}/?՛w }'p"w#^3֭u]۷W;Yk\=К(F\K F '$qs3d ;y5s&e/ݿOj0u4nzʺ< cs=(RI,2sx\={R!d9Dk}3N2_ 51 &=FO㺅 2򅳄r69+MRo&VKfp5I[qBs4ڬ%C&Ik}-t <16z $ KB,e1]h<J4|6#f6/y#cD~VriqGVFKzc K<4"s=| y@!WHxT x*,%WBŧBNjiÔ0`oi2n\/!0$3\0@u+9e~8R] NayT}͚5'^z᜿q_x㍻a4"+S:qACz`jݔy~vZЏ8$QB#bա<,DNqqDB-^W-'論c3y4{)hld90\>هxO?x12xrӓ1n:jZЧ]ø;s/bT<ʳxl*Agɪ=Nz䅔vZ]|(L&r0 nޯ̦.xu ƫY.gQ,IZ3΅ +oM&R2 +W]ᛀ?JGQTΔF{|@~koǏ{ 檻UWem|လByJQڣtVrV%*$ D@r^2l>bVBj(N}ΏUZ$7.z83C|BQFyDHv03̐vvJMYQgg6THxcvɌeވz_wZ;>F}"wHG пM.urrܤhDFҥkFMM={aǞvie{n={:b}XuC/>łw/cϺ߹^y~3xb=ضu'~??qO݄C=94KOq߾qބZK]}-Ax`x,X8H  ?F!ڍcg`|$?}qJf$Q_[UWnkOzDU^[7{p5 /Dǀ, CtdjFF2o&i?Rt=qYXo .B\6m '}lm4GLsxs\Ow-T` _&kCZ !_@k`Gz}*/ MRab)w4O k.r$wsC[GZlY"fqqE Φ%+-֡R@kjsD<{c(NJ aϔH3SJH=Rh$BhJƸfb)=NđV %ac1ʤN)}bs?j(w|(w~sկ^Px.5(oXi7frGο8[*^8p-Ilz᷸i7e{ܹS]nf͟Yrb,O߅͏ ϭٌs6]aY)#/㲫:Ga)kjpݵCkOW&bKq={T[I<ϩ <7XB$RtfϺ f ݇v{ lyg-¾C%>ph޾0?ԍk^ڱ_G=nא.ы?jrڅ\j#]!3 ;en@_b*R@T6˽I]V0M;Sru(N9\t8,4NѨ ,X`t+ 憥{8鴘 MMN*; @O &J; H&>ׁ6p lMEJ&5+H }iDT"0a!VH.Q PpGt_=hX@HF@;ҏz'V[5RTkb9'!8;ԨZZq~6@;y)z}ceJ{Jo]-ok:ytY+aq &~McG8)Ddp`{7?U߽ދ 7w"5}0K#Oˏ4uL>tעc:̙p#1ut$FmBv@6Y}(kf2&"VjW1趬wT.Ah!, GBQpNYicnPy2OJ=A4`퉉+`B__tuTR@? H3xm{?ĸz*2,FAydRJUN_e%:#耋l*[W[&v}Kn͕>: VR Y,HV`2BExW]&c2Vȑ  b;J#!*PyD\.o|ǰC 4՜NJe? JcL>N8Zăs҂嵡[C>wHX >ԯGw}RnylV6BLr9h$v)qH 3v[4l m71?/]s#ߘcǁSrHJS1Gҳw|wvrpʠKg;ǽADa}s \"HK_z3J=WKW G*xȎz!Pz:u`Ocx 0|Ef0>&] jdzv᷏=i P}PbD@Oo7BuuH( 'm9aQ^-8/\9s7;YYHڍ{\EY-S֭ l mi,{J3X !1z~~ (1p*Νw>zzRã/s&EC]֎_bWN,u.t !QŶ^?[c˛6;&aW?b,؍C_ —Y%eM3=}/[sl ;ԒEwAǃY7SR ^l`,Sp Gl$kDobc@2EDHOw3 H0!Ժ,dh nie KLZJ19@d@k6ґ8IXQE01`zq++}iDZ9}-=_OG+y\X)i0~- JD(qZ *c x@>g&;=t4:ߕuQP4a\yM/?WKŵ:j<_c_1,<-Tÿ~ 8S2tٲ 3/8c^၇GbB2mfMkK܏zϼ&&͞PSt-9G&„EJ܈'~ V=TpHeT^/ :(_}PE~Ahrdퟹ#7O[>`p#'Ѵnƾ{<뷭gтp$O76[}nYտakOa6DY"9%4AFV]_N'֊vPXVaH>a 03b̭QFT>JCQAbKuAօ tE/U+N y(WK OAWJM 9 heC {=ӂ6/~$-'G^Y. ^8+﨩|lHX.۴|xW-[R\T$B\(DQ{{HR Ģ0AWsVV[e9S.3:KE'Svɰ(q|`Ur/8вyf2y sZd6A6#n&$,loL&>ݪN RgQ]?MLj9j7x׹i+_83 g;RI+7&_#|E*IH3<d>Ud HBc5[;x> [yiS~üoU"uuZ ii}Qj#M9}X`Æ 7߼*UX Md$R}cY%)әF1rtԎh+F]s[y!54ϫoY7T]RjB: L![ttBO<+{_}p]gis+Yx^EӊobW0cemJcy>~Ly?+/ǨQX!3dY($|cc_A#)8 -ےKDBTo !)yJF@$SY.vReQ!W9 ._9nXoK're@p+!#1rEN'ɡR0NgW ezd{p«֒\ uK>G3-@btuguuް(iy]ܙ84cM27 KJf\ԩ˪5Ƅ!!qEf@ZpJL$ ,Kpi܄X ~aJiQrM[am:%wk=ZHeP?Zoíqf-fCf7]JâKn,\`qic5\?S̀΅ [L yPx=־gfd2Ba Gr97#u F3zaMIJJ ܍K;c/ ~9g}EI=\7x={o9<ȴ_/_tE{ qzZX}_4nܸjެʕ+wqǒ/[o=~v-B{zz;v?//Ї>m7MZTs &M5\s̞^}gv{p?~.Cd7(xż("H>[G+ M8Ɋ.6ɹZ|eҟ5EUit-6&kx𹕨  cPsQqK-Xx9}Q1u8YU!NDN.FPĕpgsKFׁql£#tEȲ-BBLmXwrkZ!\u2FfnYY)ť[ pɷX%GH6ڇk CưLe ,JJ ::Xi?ssӤml7*xygPx#bǂE.&=\ ]G;CVoAJ}'(MYXsP .԰FT2(8?ߥn°.>aa4{0ӹq ) 8 v~R{Gu%R_%2P~[xXꫯMbWWWW\q['b׾6M (,XpC[[]~zއA}ZSh{SO=+Wbؼ9rpАB&iykjjOɊ%{:HyRw~% ZNU|/ e@Q(\ChS/xwR`-n[d;qۘ~vKu'1TLSێԘBׁ>/dc7]ir-HwB<܇;-[E w~"\O #0o =~>k=oLE6t8E8qd_! ˅Jm Ҩu+J2ƕM1t¡1ͣ-}yّ;b椫linKCݾR5`_Ci&tה Y >TaG2-?Bn[x:3-z{&i2Y[lgѦKSXP^3VĐ̘?' G76]f=XxǑY{_wHsq =+l\7w^,jNO8IË 00.fkx8pf E3X2o|n냓\~jbgNsOEE⨕͈ jJx=v"a dŁ \@cS?ث[9Ν[2S"/^t8tG>BFzdwA~]YˠVHk}CZYȧ}DXA`R#,yA~[ =(9 \й{qW1fn];\ϡ%WY*^!@ EW}J%/N߃ͬI= uPMgr^9sSK;aD6**ma)RhdBw?x;ҭau]]xQ˱ $/^~?Y8Śɓ'w]wux)򗿼k`~SZd܇ K c̪1*!"x+n|mzl#>1~2.b}r}==~7G?QQVI\H"ZZK3 GI{܃ נgxϻQڊ^u%Ɲ}F6N.Y `MU1h\KVؒýMu@ ӕ2%7gczځ}>>Tӫl|wbz6W[t.4ˑxe#M,M:bm,-~ZEMM7"ow<&,c`B$֢liEg7Cg.Fhp7w qm6<ڰҾe ?%k $/xI "E*{) eɯp@HG q׮a#dY=(-YYn{0sL(8XDeM ;YК Υ$hsO߭@:tNmVi{Sģ  *P}* Ox ^0uW߷)ԯx$:xОSjI!fatB/}n2w$fJ^},؎rwP4N!>2eu7gEWYq퇣pG}/A 7hDK8\p5[?Fz͋Mfy{7*vu0=7w`K?Y 1gR#^S g~eo0}hꘅ.K@G Пy\uUqu܍Ew9WJv 6{{l)Jmqڪý{vVKH-ڋ]dsG$Ƣ[nEϳlGBq{f ZP) G1{YQg+ l?iSGS7dZ=EZ2 q9_xa/aFKB4FHI;AHvaH>AnA,#`]Q&*> MM3RȚls/[֮LҸ Ȍ$o-D"@fn6X2vT)wl%dKOr&X;E297A'KhA}*6\ e  Or>PY)qS"7n ſbLPPot_=F&=9GX]R.[pDiJA 7tӻέdq{Wt9Vd'w]9o}8L%K̞ \y'}zlذᗇ{sIRu#qEKuEl8kN?c³Ps5v$'ᬳFagq͟B>X=g)n/u1U3qҥvn k_@Egbs:N1כŀk~udi?r$_W={6ګjAcCN.4I ܆N9JD%sz}dFfIHJ/OԶk"VHO ?M=D a^A6Vx/q,<:y=qAЌ76#۸$x<(PwPpwKHp9RNRףg),0[YLEU`]U4򮙢 O 'x3^z 7i 1y`pi>,: <}Ezr>`)%q7)>H_ۧSpWՄJe(&CqѯE(QD&ܘQ<Bou4 -5 ](/4  n񯕾8Di3|s@[%O=P.)^K#mM%PNJ.! 0 !s5K8t b&>)-)(9um8at8*^ݐ^# 4J:ܐs-7hFtb<Rg<єƞA='~sPއJ' S)7f 6@[ܜ+)+NVIi3E]J \1P|T׼|zDCZp0w^.o)B*jz%"G#>K/R1nn:OӫUNeq7pV _|ŊLcƌ߇'sqڏ,.MxlL?}ӑºQ?xa%0 ΍ϥӌ:\MFybc>CZEpfHPw7aG7np|f,?,Dc㆗¯9s&yرչ$m췓]=rZ ]_-rY#uP%% F|' f^Sسa]7#UĖ-X7h‚ ,npQDͪރKl)1poٔH,VewTƁ3C7ڇCw#ZyX VfRȾ\b=S8 kaPx ;9K<7ùSmF#q]\xpHIkOeqaR1 p=8|y氬)tô̍OG&ՋWrF R\>%Ai\bŊ >vd;RWs.Vڵ gA}O$i݂z#|c}ssw 8kw+#1a!L77n_Ĵ4^r\|.jROѦj9! EbإGI-Ӧ#ѮzS&ⴏ3>|:6N/]xo: 0Sh2i(a$,@,f=[ 9N H,t;-/#W]ۀ_Ct% F.W/v%a""<+yr\ زB{ ZZVłU(Vg,2Cv*`L4@M? .44Bd"B!4Ěgw=CfҬ'!"@lb@{; *Qp#q,{JNbEZ(-, F?^I*+z` ͪ+K، b*}wBʯbs9spcz[G6 ͡6FSk{3 1 +CN"5T .k) l06byIr-JOp: ,龭/30RYaLQp2N]MXzPN|&a،yM uY-E\zREwӬu^i[sX~=k׮w 4>)?'/?n{G{ =ߣ{D9q:F豦e޷I_wT|H=aGgWGDXr⿸̍7ݘ9犯+p3]-sl0_z bшuϼ"dԆOFMJlNgY41 UtʑdB (-5!PX ɣSGGLCACJȋ`p3=#4tF8ى0ԗB rQ;y.dNjT/?ѹ -T*gOabE >lkc.:B3<}^td)z;09F|ٲk+'l#&c.:Ҏ0BB8G?~֜eOxJPQP8bU!lC a_dY(d"-H=i$Mp}{qx뭷W<^>q?_w-ĉ߲@ s3Ǡףy睇~um$5rZ!7a,-kI=دA2pHK!|mH~S#M^8-&vܙ16u$-bC|佘^7 DKaE4ICc.:,FZy?xq?"u/./ oܗv3ܵk0sfk_%`2 :wz UZ̙O|[oMyU?~k_>/򈳖]ژI3oY+Cɤul``)i8Y uՄQa-\PYww55F#j"%DFbޱJܹ:Z9o w{U XvAog R.ƷWz`)sXo$R4\/ FK͹#I9R-*0c[*` cBcئ`^hUI]*X4KK8\WaJ1\hئ;0@Bpp-A|!3o{TvMr4f/Gbo^/~bG#Ěi-!xv!(ѳj0e@-"bJf܅ؾ>tOF3Ɲ__K'/Fk<=C{*~/݇_O_wb7E3S{;E.Dr?{_'G{6&'`8Cpw\$@Bm#F]fgYo+VWUW+y (u@r.CMA&pVtw r8PIu0cMNZ7(vbPD}KMܰ{X4;%F+脄2A ,"ŭ CўЄy._n=xkZvکGdLNVsaXy;H9vu&BWr# 5Y]bO R bo3 )BH&n[V.~|fI%bp^?.1l=aCX<uʨy8k<0^2 Ępْ@m.cM،"V$C؋'rV#i"ULs|"FKGS@IJeȓq`DSogu:R月şBG67ZyȞşA 0z+'6f[&Umtuq.9L <{{|S)v*7-K$KC{hə)P"$}܂H%pUCc$OwY[^YYS%D׸1yjXmuhWE@E`2[qD.HNPJbH6%:CkN%ɢʚ/E5A!iGS"ȼ &-x&52ky>.12DN@')[AD mX :,#KCNAQFbF@9jj{JH ?02u4,^ǏWŸ7RG,b6[@*\[,ZD+O;L`n/~.]|)袋0|[h6 vi6FhSȮƒՂb2=n8N8;< 6-;lNNҘrfv4תA>#/忙d49CsVu:~#C玨]һ˯оʞ(Dž ՒfܚvJ#A|Lh@twJ /x(Bö',FX[ēqV DsR7N"\T-#w)ըa[Rvat p ƬPTT}.ڒY;@Jk@r ~;;Oȃf0A=?='e):}n>=44`4IɟfNYA#(yVm5*#<*-$&a-.l]%-kܳ:tpDqmM.dw4ra]d7O|ƚ<Q YV%H@01q!ÿ'5JO4=W\U2$^aNgnuzJ%RLv=D]$ $"cQxP(LQ6Je6 +)H bCAZDMY7(q 4pdly1%x M{Ph(d>˥&Gg5%v [MqǣFAע%%%P@3t8soty]v!9*F;mB/r*E)ɩmma!cYN@nKbn)hO# ρ(h Ao@+..FEEj=G5 ЬʝPRy۶m]kr4I?GQOI6%pR 336^c yRā:ȭQKz7@tDGS\|nA <$#B1v@E5.b&"$"rocZrbeh(cjyjN5fxjAeP2 87 `EȜz؃5(GPE6dQn@[ >0ERRaC|[#a&BHgfXL?Emi\>rkKb:d7}]l uӤ7aNɱ(1^zͺ{QkG[pR[" +\FW-Ff7g9 ʭ1+I@69w;N0rJjMKlaݚjmZ zS49|hC.( 5܇VFgU!prsw8V|43Yb1@ N!-9dxcrX X0TaA\8Pqk.Od (#9 JB8^#2nԼb EQ<XRʽ\R$$Tn蒠Ti 8ǀ*L+ċPA(1*E+QX2ӋX ]KR3~jp-Z`c L3EC?xG3j%3g'OKOҥpRDX"BWjZZ @U=AgfL&8D/HNs wFGzdDҏxQ_S/4`I3U*U+IŅ ͝mh]3w{ˆ+aԓc6XST?Rx#6`GLD m0'g#/$m̘r2`8k^12mVpN\!"3M*w IХSLBnk$9N F,rMX0Fއ9>1 I\@BfiSC24\y动 2)ZJY "/Ja MF/q#btf$tZqX؊2h͛'ՠOA}ariȄ%6t2 < JP ~ (H';.'K*Ržha 00rMCx:&n Jr䏟c@n/οXVlԩUԓX|ŬǶ0t$ (߳[u&T\opnme2imD 1y` 6-~f|էXtQ8Mڳ\ǖ1Sy;pBh0ﴙ0޵zΛ7 BAv;DAҚa8~lOb>t{Hy;a3"CZʰuȶ h,[W#+Ōf'Ɵrf,vdLjWJ;tI_,E@ 1g\OڼiGUYTUny7 ˉfz0I 9AdxtSG[Թe!o1'bؖ@$"^}TC2)1a r xƪ`]=f9v{;u1%r$3q avuXz\ņwll'H=f=!Ղ UfV uE ][(DЎ,̊tnZ7evz4o<Cۨc`L 4D֬|D"FOz6|́{ztgb}9A+ ʙ3OP*-Hy]%| ԃ$V41!K[d >O]CS͎z/ 8%}: ȉ֔, &RQrK"A02%UVI\=m+Y\C9)\Ll(#!4:;'ќK9߇H /QT"&yJ =ZW$MP+#A sYs*nɽa5'mnrx5WuVUБl^L޻q3CypҴaSD8|ࣣ6Ʌ7\՞w]Йz`>͒ `%eoӄ*֫꽨o ґ#ngGǤ7gS "̮+xt"M:3$vntK2\/%Qn-q95Y}H8(o>]VN,r=veACXqˈb+NGcY8XT!z,IW k X|߶,Ÿ?~p>o*C[^;pyE{txQKґw'u*'Ii:'ױׁU_ w͞O5 OK^2edln_uuvk!ž5JP#r--ɔ ÂlcgZqJ+@D)[#$U(W!HõNlN5ȧxR@{\oGˎ |]ڕUZ-0xIiWvume-~Kex%/QvV6zbm-^"CȰzϗK1ct$IXhE_bw{ GkEzBkѧӓ3 EE;1%.:K.f7 t 9xbC) A W.<%1JcS1iX:8PHTrI+('@f,QHK7jjDqa Z#%&Yt=: >׳?L9HE"QL{r%!QBTD O8!2+Ϡ -A%e2U!w oc.aa4,ؘeձsE)rM%QydnҵVJIc u2os GS<7D#9<{ew<\_j8.] pPX›2B8DmLh$L*@ :(?MmOQR }$oq6L0a){NYwBk7A 9Vr-Kq@OOQRh?Fwkm8TȈs!zuaOth$nd1/@'@DsKxy7napzf5LAE/Do0&DMjat}NEgXV' `*39Ĭ1}f5:(mm6Y]h_RDK2Ezx :mB~x|ýX({~{&ªCX~%{VWCb91@'U@vA4[plscu7H]7o8w1hdeNoeu϶"ÚI᪱K ЭvBiVdQ>9it,!ǞZrz2 TS̩h4kWgebmJ7Rl_ P<19c2:v >;o^1R\#ȨMmdǔǑ3c ڇ?G54oUM^Ӱ(k+7Ce1C8ĹNC}S5`cL1 UKx>@{%܂2|=Tvc X}` 7c|A.BB0l[I{c^=w1E_3ݎ\'fiDZvږ>6uj(.?ޭ>Јm J'S"O[<%Z6#}ɰOtgj@+=^ *!ܽH@7AHqZZm[n_c.4`Qa:uii0[,6mf͞eK)y7FEHn`c+݀<[/>E;Oo+?v&S BϞsϚUV⮹^$\6 5݋o7 ׎p5` pʄ &"%r/b3q:6-U5xͷpDEU;F+#',i{qofzzZ69|{5)YD& cfBQ y&- ؼ;tr0y(Ht_/@[%(58t$%_J\! Eh,D=tHP$Hއ|^@IXQV \  MSPt O5W4PybMLj]XHl"׸nNwuW/s9 1`3RQo0+,D\.cу30zL},200Ipo#e2b$y_c1C$qax;@㛨mm뻟GGKծBONj'~ËkÔ9xvˣH%﴾7ִB; H6bCj4=/OzVS;^ʘGGtc0>*VT.Aqj?L/<m|ucTs\Ǡ`F$7~Sj `w7X@W!&N [_®8߅8€!z)\xba~17Djߣ@i|lf&]aϰv#^TgIOA&yS\4JTn'}ﰶն 6;!Z\!z{bZ5a-8aؕpW_X;Gw+ Z8H}圀Tcrl=qWe_c&2&i[+r9i@`&v/}җXW*բ 뉃cؾMMR0~}q(D dCF!@ƳU2uBDV2}Þ 8qE37),;+s'Aw¹S&yCbr|ITJP)!Aj:J+# ԡbѐUDB 3M9ϣ4kӚh]سm//ќelKk͝*D sO>QЗބoS,}ؽu'ֵpͫc^xܘ!s}{*ѧ?2dgBCauONP[USKw^yEL߭ ==l~T:ѷFM/Z[{ߗ_~yBjp8Z[״ Dm& 3<Q`!6_QW;w|n#P =akٌ&fg>E}{0GrVoT\n3LudfflfW.B.KO"{ぶW W.q>ggя1.`* DU2-8_ZԹdUG.Ѕcu.Gp|KA4$edXR<˱IACUE*.=QNhATK9gFY&B Ј!:67l\UƯf B`FCEc v1KjICajox> mþI#ݓX.u9xxy;89ʷ: 2sPt-d.~{׋XT6ׯ54]3<D~8@F«chuw)=IxVT~ -Zvmy' -@ OZ{܈.@y~W*=Q7!$Ux{&sXs ,nj'"僅T[ N~LsmbOnz@[<6Y!@^8X}-:xrxil.>jL(߽s ^XJm3^AyU).;R; vs ~`;;M&,]K_S ){߇/-E݆jV4+G-))f(sJz2^VV̮AMeoY,v/=-ӭÔD!u(*;/Q1tY3;qyX=}=Oi,읥wE' > U" cﹳĎ)Xy` 9l;'^/}yٟYg'\wN=c7L} =ѡy/OpK;46Wvz2ȵgoơRË'|dS ȌrbTFor5zy[T)%t*ehRA jeĆ*R@I Zx2S,U .1j$wK%3A\R* RInnB-f?{;(S>scM:hb)ZE.%!DtkYUHbO?}>qD^,ja@GAskYD7ya8h~HO4\k=X-P(AKޣb$T}TW+bc䴙hZ9\^uqv/nҺ'D,>~wE)' .@^S]c=]#IVvđT@پr,YVRr-gN z >, a {8n:rss?|o:nߩ8h!Xb ͬ8{L2˾]ŋ+`JqѺ-ؼp|9]guW˳QHZ ʜEXPqL$,&/ضB'AW) Xd4\],V2gK: z%_ ),PDwҢ/ݙ#(!+P~z$/b//[r415SNFh`?ɐlVdH0?RTɁt4@L~&CKɹvWG.]^ߋ%8l߉9җq򿲛x|]L% >B*#SPh;?vY)A㉵50O^ .d.;v"Pm4YP_3;=A<0 #xJdh nB<0׈-qeXZ (Y"WFf8kScn=[^›@dx"\ pV>; 8)ivWw}>QѲ~r-@^OG.&_qBfSpzhKhp6bis?'16 k/äެF(wa]<-\2C3Jd۲`pS P.\ ߎfWt2K @t?ɀٺxn 6~[_-5!-J: ޒke)4\󩯼OBlmizF.F_[qR:1X g0v451ڏ1Yqހ"wW# kBGa%ܩ3^!tJHƊM8wèPjǒCq pnٸoKwXRIIRFd1+g2!I$-Гz"SWUa O=BD5ETiT'[shU>tټ/OJi( sAגuKiX՗523yPM{?|4rl]s?>}ɒ%GtuOZ~tMCtjYhMٷoZZS&2V-K~(c4Y=!ӝ_:::wߑyzRRR-[bycJ!ҿG@^, c=jjjy#HkУG5 ׊&+i ѣ2)$:w@'TG) }켉 (YK$Pvȱv>ypkV|ˁ$ȰM0Ā=OA30/M:^L# 䯺nNi[HDР33 P'z B |_fv'qD1"xҜ4tןPJ/.] 1h z3vw #n~cc+6cC2pc|ܰ]ާcA x[dYi~:;6^%PND?{LqŢxdY٣`&}yYםeLHm+V6pj.%5g*SPEhm/5Fa[+B:+.؎`o!3*M(\#2H7 8.!A<,Hĺ2 RG=üua##^o܈st/ T4 /ǃU_aa+k$K4[gkY6LH) rW]*O#z zR#1a  |dϘ X7cDҥ7"HxSFx;ؐŸ`4܂&';*؋2M-Po-be:S`w :~4V IS%/GG 0 8@ ԎuhkxNXHoͅNTtudĐgN>PPpB"ljr8@> (ץVm>&*guub:m.]~x: D%NGG="6B&OED@KkK@D/O@@L@v%1+%xQy.Z +p8@?Rb>>L\]RR(s&|3⭠&qdDC(X' GW_߁m+AP!paؾφ8f4DY )ptTB_b ^8lX?gS2j:P Fc ̘ ]jKSwGOrFf$@͏r $Y8XCS.挞ކqrX)„mz݈Q}`1%3S w3_I(&=DAfRNlܔtɋJW=zJ|u`5mk[^)┑0{`deOqsȵ?1 ^-HH#tH78աYY y1PN*{ǒz>AuzLCn,8O@L m%B&$<"n~f.d;$Mo@{NƖg)H [lAߎtDz#]h-o14?Ë} x'`) 4Q8G&)E?_gZdp1s&(fݤ*K5Q{\3ȶ yf/&o: #.tG 3tȇ/Cy޶[VԋIH2Fz 0PGo `Al+)oڕH\§Z%ؖ ݲ{j? w`R=:ڡ(-BNEDZ+᥻4ZC[$<LHvXI \A&8_% Щ5M<ܚJij??fo@6$mCH~k[z2,OTL/Wu ՜Z\ȵz{s4@lqu?=}ݣ+yw.?i~<]Zc ‹"jUDRÎrK ub L*N,QT[qH<'Z V;&3i_QHGWr\;rdtTa/< (\K W!*ԯ/\cF2v]ML7wzE :$̲WF^ =zhFy 08s t 6[1!m"{ 2zK#<$-F@e:vI)E(%ŏN݀O4A2Ezr`3l@զ 6KDrT}[[0fLZ 0Y3@tI&+<謬CJqoSwˀ@q<RI?1fih)A?%I/t>YՍ61m$h519GgEI0oj%7 &;g-̘P<yLY q(\4u!# #,`8^D+(}觞Iyo#@511_#}kf3P|`ݤ3f葄%akG[`r#/LT?ܤzhS:L8YMƪ1W )29Vtjv8%g%/N)%5E`Suq"Rc# *`h ;5 ~_8yr2`ؾdF& ބ~[o:qmJrG ua-[6 pQK둸9I|𾂠,SFQw=|8Tj?sK Qo NWfVtnYaa1[S.Ps:e֬Y Gx4Bٗ.]e˖x-RV-- ?Ĵ1N釺Lnh3`Ĉ?;}8pqG Wl j"Ϊ:3FVf%mV{[qp\)Q `1&SR:r˜Rh ګN{&|=Fh_$AmQ0G0W)g"_>nҞ"A&TO-zR3d6nqr-"."g=lZF]BGc#F6B`Mhe>Ÿ^|fҵLЦ)qhu*PM+Jnr|blxq?̼VaeW /RlTkEdrP?;ӱ1 ND)t4>mX*F+&6<(v{8Y' LIXM|YقwS1l`%T J9-S#xWS|U VF4F@ oގ_~1ӚxA LLo0y =Zvc'vE^h)մ }:b+:Iԓ&Y&T׷t~ǫW;t"B'4<# !RXU t5{BbqR|)PDMhN4'.@US+ÄZJ hCyMRřn33yk֖oAcԁ:LiG鑁70tp/u9r]Kw9YP.*T )Gr2=./OH]]V.D 헂qG̣< O_$GS3WL@ h@O-D\ PRkB=; !iĠ"4D[KXԲhD/oaQ |Jpp|mеaө(<8F\ ˑ.R5M5*0Na( O~HIC0TK,oC?t+?7{ @5/` RѮ "jn498ew}'-Z7_G31zFl|q}X,<,7D!Gg=;fV8 2!Ҝ1i bkw/?Ŕ["fl݂ŗ_ijF/xiwsG)xX}:~D3^OqZσ>sQChŜF&-g hȧGocc"g/lcŗ">k)}1I5"Pi'0bO_O>G|]{hGZ P`F/:4caTmšw: n$ @1^wNoLN2R?q8ddsN4gk E`ZIU{gi;2uFIly7z:dH3.2ahO8,^~ȏkpݷ2hEݥJ =ܮ*IuqW5'!~JNLv`*1 :IHv3&3ˇi|s9H.J&?l4%maS@GφǁgmݎL.()ÑT~{['(KH YG]i}^I#F6~X2ly஭%:2֧=,ly tT¨? d {M `ڃÓC]+.٘|]0nAo2b.CY{'kLfMh5U:7yȥ^T@Zda\ >U2"CYuQKm~c:  =PAnF *>f7nّIwN d$ ݁ lt4'SRsBW[ǔ>IbK?,^2+H:rހWK? FSR,BJrA+_nE+H20U&ӁJѐSKsRTJke>풨1OIR#2艔G^ )>Cw7~:KI}_5ȖB:_8b0\= D;͕ 3YWufy:J#I!@?iSW{:.l2t QYHOCObiZF0a0]ܻoP+vԒkڀVهu|lLЉV-F|l b*u=w@1|*؉}UҨ"yNvXNf };\\g|_qaT 7az`۵>y';t0L$oV| &%Ҿ;yِ_B YZh1pV5`p^)wލS&c" !c 'L¢-Ox WenQ KyRi}{ÚBB$^y9 ܁5P|ܱP2>PW}- l1{IR :8-] jF*={FC!S0`kVQ".ߏ /}I݁ ?_7wIdMO=^g#)?fE L1>eݤL`u*3UD+Ax$"`ӥ<_ oIE`_rŸ)~/F^R]@ZrؘT5WC%-l@˳. aP5N!.%\ kbI9{(]]ҡ.if4#Co;.t3=xӸ8F7뗁t`WՂg8F=,ؤC\*$P*@9%Kѐ#)mPLlKcZ&ȁ온@ C0"';`"@eu7DPwXE َu[&xina@kak:M g@/]#0 xcP`ȢfLL  XM`#v-ቷ C 䭿e|4ߍ~ȅ̂F.)<4JqC5qF2 t󱕒VVy 9;c˭8&KPly&9a%< @` ~$Q!)l\\7p!뫿oߗ݌9[Z{uX kM23RLFA;D"CY5bX9h8p5.%Y?K]4ɉo`y(D<"ܳ';ѳQZ}IA~x *9>3S0Ykvv v_p>~I[g2%90Ǚ~>ESFlOI>}Z!0qtK%*BPS8ɕPB co: c-;f$6s{HP|(7!_'7r3r a$YoոPJ80%B Pv,]=AB)0];0&v]&,zQ܎|i9!UtY$p U)1oDyMH42|~8Ł^0W˿0Zl <o%Mزg ?)!%aNc=+.?I4%͔JĄXнpRNM>!r0U)`D Eǽ; se \'oX'*(oxmSՠ;R|.#cOmn 4dD>b WTG鏧}{H:ɋm(N/a1XnNڒK,C/ 0 -Þ]>h>f[RVQU^ԂBX`ut h7;s/{Sh?8|Q,|>.VcO I x5Bl^*=_N`cR oێxK#CC&vu<8v=gm\8ߧlGe+X:R-`B{CJB1? |O }p"!$Xg4o7'sr|ѶheIC Uűil{LyѦUVDWfݍ"cH c4a>,:c3<-̞ f^ea׮ jJY3\87zV񏝓w# d?0}^EGP|ْ5pN urOSA$TX]u@C8-Ǫ 33YVV Rds#J1mK "%zb,Wm*VĹVk|>lAbpcl1v-[rZ{{14y!4Ա*!pL 8(C15_0\= pOkS8uFA;jBtg^$&]! YD8ӹZ,_(dehB=)IZ ,~[M!Jy'v/`?u'FS>}paX#0<kuotd&cfd*v6PƑ QiFf׊_- !S8ϸߚJe|vZq =K?X0PK?0a"y_Քx0"=}ע~T>)7Xcal^8ꏡF lڈSeoWo~ :D0-!;>dM`3 cIrAlܐ7dX̫p&526z~3S>U9btn#U&h^] hTA%8c bfTiu[)̶=U^?K]6?_T2Muc8_24:ݨ 5z$kcYD)OIB3RQ 8jתD௴q t8EIcdv~c~3pՒs0ԣ/~G7SnY1LfaWcMm3<l6Aq9; y 9=|\{st[s`Npnޝ!R=[ʬLe^|O}^2a`,,FROAm͗P a<f%:| 8?0֯Ab`#7 !'yE2bxKذ%3/z;jG_ই_Ob#pۓosw܌lK)UBek|gCTrZWKL_-n= j*:Q}\H*{+=*2} )!WqS>Sd:LGm"TZo}ma,^T=PG{76@xt~#&8fpbFb#jaoUǏBi8vjЊZq<'W1'w\{f99ʃŐ5)Pr #'4+ߊ/|wq0 A_rgQڡ^=T.6V})˽5"E#q ?C.g*]T5~dҧ"3}B ypzeS{i@tՌ?Q>\&Υǡev)Nx4ԅڼ{Zx5K%Ng2X} rRh|QX Q0cFjC^vc(n{~kԫj,fwLN0 \Q_LŒn[iISU c|olO`S5x` Yh9r4y;ey=Nxo]'j'@. "0@}SCKt'E3[ H8;hMݛMVsNL; _>:t7'UNc1Z48SNAL] ˬ2y.}@g;h/T2 6@M/(&}?EpkLF/1 +oO@QO$C,Ad2߂HgEIs88]ZpZ$1IDb"ؖ9s, ^ًgy0oYDpRJke{ ×P %2N0b=R)fsEǑWxü(E,*WxVݥv"_oH.]}HQ[af72ؼu+mcpf;Мގ7by={֭[m=6'S|3h8 2DҼV4 QzU;EPH@@&Y3!(W&nP]]X9AG-S$&Y2%S:F*İwkk5|Ƞ.11rT6$ 9HTْͤzŏjNv:r hf/1=|KpqillIa@/^فU6bUӨ<ٓ3UkN19jQjB[)p:vEJ< R@K+E'@l3jM&Մ\&PXg:?>O*aIQNµS,ŀ5=PM@c.+&ƌDv~&Àtq(A=**ϦU K[o3̶NDn)oP;/o=RLof,ÌIK6\iK߅oNr?.*Ks" v 7F`Ӥc|\MZ-*b v\cj'xZ1$Ra}#DøVtO[OQKi5_XPSZhAtЉr)2-cEuKs=e ޶)zcy˼{%^PNX-}s&K1!q1yɌJgdz% т3#m|\UԸαH?m85.,-^)@jh蚅yv[}9X=N?MX_? s&1b,>84Fmd7PZf9";da+Ȉu+j˽2x>T $=E2!u-sQ]WEhF7b!f@de4\ls4\c5'֤ Y@SL0wwU/EX^_' ql#ž~ ?sborc:gbcV=Z5k@UD“Y>kVCnAa*r UA"W zy6%`6CT .* 4i>% p(z Z;ѝtsy[&3U#&4(UG[Ml w\*"Cb=+&q|{z :KsE.=ĈW1%~Z#7b&ޅf6F61Ma= VޞkmA4zŅq%KjXԮ] D?MF'WhvLBڨ~q-P*C+?E^M m5w2G sA~6.I/1Ac6 bË/w,\43T.?xU:ƨqNZP@=J^si[&*l_c"nh*pAZ-$%DC4nyB,7ʕ``P4}ƒ8zr>3_4g??X؂M~K?zϺ 6 =t/rd"z[?p_{ݎbN5ߪA,|8yvyYY'U{MPne=1oS󱴊 bhk0i+|EOb$D 4J]6غ@ UA;4L' `̗2w$/9Bkh:N88kqX|=XE jqa:eai<;&lD{xɨ~ d3 w "HsZ 0~JU9&b@TFz1O.D5oS[CS*Ɣe AXJW=?PK]i/A*XyNv'U0 TX N!􊞽hK뉰Y+T -= %sHqTHlN2_BVCv\U_35M1:Z,^1D" Gb0XzGxrwIj 58Kdd9$Si5RDYēRM5N 0M8J&')ȸ%AZ-Xy= /Jxn8pnjX+͟P)0eZ*oͭbYޣb2W~>xIu'xzVfHFEwfS${Q{:&LEgB8e[Tu®nCuf@=NAYC8/_ yAdLe*&u%kJ3˻ih Zvd# +KP)bd'fn :3X7 \e0zݽLx^cIW' nv q Ux(8dlIǯ.T&)2*LrgfvpSzmO6hMQJ'm6NT%Y&`KVAQ*'6 VCIYWx/8S>R< o] "C/w]`;,}m{&My?` ۫2b`~x&WzٽHG*Y偸=R=]VԤB,v'"&bI?@gBI#X/|m!f̞ ;܆IYٴj`OY 18z轗0/ukZ"v~X~Z|BBG@2/pa(]G2Qj=8E[@+9T,%0)$sʻMD/H!;A#T3J%ǕA ӊpUǠu}ȺCHm{#?Po͈b$^莝G̮b 1+7]j.51-U 1dhRgr^cHydniPpBc7k6 1&DRAQ( d44<`oӘ--YJH;~yz-9%zqUؔl>ZM8x|a<"#0!{ 7\zbݪy(1VF|Oq``5^’YQԟwh ^Z )wT_5q(%%H)W-XC^`0Ry׮⑅v w\/>h/{ wXmK\Kw2b_ږ ET1)@K~yH8/U=땒3ώ<0^JʲֆFS︣?ظ$^gc##I$Ywp=Fs$Cmm wo9<n 䓕x0U;^alMPl@AT\pLib X[sa`DQR5 {1K|A2)ŵ?,!L=Uz,NtDB%`9К4%f[;T` 4QScT 'QSiXhTHF&{QgNII )^t# 4 =lb'[܍3l?[{?b8&kBut!q .YvL@+%UI ܛLb2OQ]Ό*Cp Fah T;g2)@%!9=T3k@L[z  Υ W9 wG֞׷^{nО9( 'K`}vj jET]hQK,,Q` TYN4-b; 4om9AWjLGl#Y @A9[.T|a! b4XJ2s ;g{B}[yy3~/?|x^ֿ1!al/C?`kre\ƌ3\ 32l /<jlb;0>6:^xK&2{@+߇! 'ؾ2@. !{?8(_y ?mU0g5M2[-8fTՖ60J:]s'%SۘStdĩYi82i5@<^ 1duT8m/7Rzkd8<f)Lr"#u`MA zTf8R:Qq(ǟM4dVv~^|ȆnaD#R3B+ǰXf?^n\Mhf=|2r<I<#4KLGliX#Tj=R~Yo*W)SPnl0L`]Z rTT^,8B$RM5E&Rꟿ/\SJMl z泌[0;t&f^G*%D RBpU! ZC vH̩X%[GG—CV%c#{01!U,}.7*c5|0'+5M9qnSe.Ez6> v/[euMzFg>i8ׅiS]r0N٫́\$FcCSemqǑK߹nSP[;G{9@gYtޏ:m'qH96q +qRx~ c١0;v:?m%G) `-ސ# ^(W2i-%=+C^FcnQ|\+ZRYNj9x=9{w4rT^:,bޚyZ)6EMb# (_V +04Ӏ`x>"vj\E֙r0x1/#ہc;Ahy jFf|Vw zօ&2puf ߌi X9P: %bI1XGٞDV(L: h(| $3 h(R3PN *rv x%4 L DϺ3u^v<+qqn ´>r S*e -iKP2h@EIMN~9VɝypN08dlqb>cs@Lb$$0aZG5C *V?7K@*ÊCPIKN8F)Ki)|CQz__e;K|ͯ qzLI*C.a/řaD|΁y< ]̦ۅ2w7AV3H;qD^r)'hu0`.*>dZT*2R+J i'zF< `.8Bgh~94,DATK A=ĐA)djAs*1k&KvN,N.ۅr%D_$YXJUI)䔡UIa4`.J:͞%sBME@'9OddFNzÏ H?(v=kԣ5Eձ #jcgG:p#%[^ tzLeIL>!~gU/9 U.B8dz>ߌkrj#R}0Up)S9TO7;qrgqk.c,L~<]C%P5Hfv`Ԡ)W▿8?V$Vqj&z䔾n)XE 4*MFRɠW@ 1mGP@<ȖGp׆? ؈u{28vхF{^£/ǙgPhٳӶ99 bJןi| Ќ,y>})y 1`Mg͡j^a;0^|kNDv h6\ o.X(ee-fIįMt'^rZ T ",Se[>|DU|e@m7.Qq|`4H&Ęט5pVxpOk@MYyzPh"#.صؗ}4**i6BLz1K=.C8D%% N 6J`ߖ0x;;79o"KaARy _vv옾!efyEbTW< Td N0:l~ 4rހ;v0#n!"-'X>i㨮kESDcxg1n o& !G =>d4G{o}]Ys^~!&0"hՃT#kq$_ \c)uujTs?qG}31:Pu [@(ٹN uUQv+H`MjSҨ32`4ϱ-2A,IDՄ)5I1˛R+d.!'P { Mf8w*xVK R_-c"i+( .&Z` r Dz S~RIvU _* :.~薻1<B]GDtl&BU2ڸ,kyEv5<ްb϶w=W\gkz2[~(2aASP!C-J2`)ySUAj1a J"TѐYהs( #24 ^A 6e&D3/YO#MCy⹀eALу N"DQ`5,X|D"vD省3+>,_qy0Xd \mxnbd$^{4T*b9T%vZV`Wޓ`<À[n /߈ b~6phZx:ىވ v}oB&مO~xݱnƆq釖 GPWúo?^ _ ^yz~p۳س֧p"vc-ɟY7_w?P+\_~TW⤣KǮ #0;߻w"^ܷ~_|L|ƴ7-9ϻӳ/gzzo|M|u۸#_LJ޴q9N1)z] |Sz^ԪES#I Bov0l†gqc|As [%7)K2Kϸcq"^vCKU#lj }J{}`+# 8&GKk)C3iWp߷j6|z=>t LO#M݋g4U; S<>xLJQaZS;OdIٸ<sˆhMJc3is&ddxTvicƜ(3u hWL`z J3QubK@Fנ Ͽ@f ̆v#9(A`Q#zK )4/03&^W;mp.c$>Iem':npx y-ƪY0n$ KTߊѱ>nU<* oNj4`NAlU̐Qóm#/qq=C㒷=<:g*v:3[^B8l{nܼƍw'o6"slD“enG€cag3nڇּYu߸}x%.Ɵ[W#s~sm_rxNuxO xҳqBf.{Wot2&8I R[ _#,kw\kW#_7%?۞]nxx`2n{zX}}qb~2Jh \"PⲦ)K+ FmkH2Ɲ72GLje Fx)߸_`hsqyW{r@v͠2σvOgi.G96+U:яT1*Ŏ C6(.{k8:q>$`dS0J(fBA <)B!iL,eX$̽xJZx@޸ ~-Wŭ[oU ֽ );voWݎ 矏trX+^WyrV_)p&k*[elgT#6X¶fl 霮\Cyl$3uG0:ɦ122ƪU{1%[qi43̓ hͫ#Zm5W^}%m܂S.>ʢVC1ƨH8"hxR|g7Mu#_FsSjڂ !픋.OOQkd'm\3>?"fcfMxM 2P49}lqpbW0`ƹ?x>nyyHَl騵^{كF(XB U%:QDrdFDb+.gyr'Rv/jsSBBK#۹P1W/lpvj@5cryXi%p K9ru<q`Xo̼Xo0 @&!jJYGYS<1E{ A K6pnvXNBg[:댅T.W Ϥغ>bg;Vڊlkӻ0U]X5&4aѴ,螄鵳iWNOD(;\++VBMVSrFXM"bhAǽȟ!BE $xLJ`|K1')Q*"eY79ӽQ:+\pP0!BP`9BPIF;A?QƲnમ[0~lFi [(R HFnV*'B o}u~P2T*[ekzjhhlD,g-VC зn݌\ptt=sSx~C[sb})Pe!djnӄk!{a{?kMƯi|oa߁WHį>ɂa{.!tb݁1j}=M`=;ͨ;rX ?y;sdc(|j>'k"L֗+l{6_^lER+cDY2?𵍝x֛:" a<9xmvy |@} ׾{}7 WWg0%jԜAJ8x e|b5<IGGG@ =5WIt$g3κ+Ǎ˱rOXXGG,979DN#:+1߻:@7hHqbpD D 露4\b'&5Gr T7n"3_xnh@}K*_E1(O\HM4P kf?J"uFa=3n 2,7 ps>H:Cgb`n[s;={`w &6&4R_Ԏa1nA݄UGMydr*"FP傤TQL̈́tU@$ X8,wudQAAJXj@[ƇH6H85ZsxjG B;Mqc98AO\*8>w?8iRn]+_؈LjX,;أʵ `2U)s)cgPtelڸaF6D\A*lirH5ؽ9Įs##a }` >6m+F*įLXE:8{m5ոWa&_Ut&|[_3NAuʓ?y#&"aZ-.9t?'.̬ȗn›ݏDO}]xZ6cIVv ~ob%1i7o427"hӒ{pB- ~)|ֱp_']8zw g6]uw5^[.sf\ӧwv/O|_Ncٳج)OTӑ$Z]R6f):@H8=ig6L-kW0b}ǧx‹08u9vqLB椞i vM%Ev p ӻ! :9[,# ,7`&j:5#3ֲ5QZ5Uuv-F5L=`W1e"P徉͂eۈ,@:CGm\ǟϲaϿ rAj&nroi˝ edɌ6xRk:z85M9K.i@넞&(@qzH1KZ&*dό݂1{7s5J-?'AmA!:4K߃%'îݵxچ0Ǿ-zlls)'X~uNŇ?]L؆T*&"sINIPD!+M^wN`".3WgT+[.H1[~Aw, NA4BMV.Сl$ %8FGy5b\z oeqk[86LBgP۽ c\uDtu,fํ;qqgxoљ?jv>Mkw ~'й 7-O܈wԈYSg⤛ZD&:BG"ߎE[\͟bJyh;[}KhPj> wҮqf#p IXc|;8F|~4,'w4,8Cy|Vnś~5IO?4::;1kL6y٫]R 0gϜQ}j` ^F%-96[;ק6Sλ')<8!nU Kqduso,sgJo|4M<L7`g_f7 h-8|!{~122[/.\X, & Lb=R$GJ9lBUt"<&PyB"wk/0SVp.eeaTyX%i|!3r+ 7K9kq/ƭݨv0%g1|=5(quc_ziY84r'!eB@ W #w-%Ĝ}Bm:m*T$[I\":<.J=uD`L*F&9@|Lgos"/kSGUϹ{[ҋ=G.l ۰c-6`dQLa~ۃsU zBr N [30sBjèԀV&C<s:x.n}1e95K /#:UHR{ZuoŠǑZa/hUe axTPjO;m\XEoH%J.Jׄ_In nfj+t\8l|tw01cʼ#K>r֬sfMǡC!Js\t>Hy@ӂED<|@G̝" *T̐zLV!< P'q}tYn9Al2H .d_ %J@:/*dHG˫| ,ƒ*H>Pkc2A\EBJV2pTϾiփNT? 8 gok?mǰ ̯:):ٛ:`܅݃tU% UL+UJˑy_Jb?Y#"W j1@6ez 2zp kke*4(5,zfa8mk@ILQa*.MX36R{δ-P.K9Ϙi!2WƨA1O?='\^֩9}YD07^<+iݽ} oمQD3Hx:;g7=➗CӴaCqt&ajZDٚ9vW5 C5_C-q.6jUhx9:]A ~Jҕ YX߈Y@!NTkpn`9Ub*!f3gg7~ ߻͞G f4aD P-h  pb`!Ѱ 6X sy8zQغehtaRIA p@r, X^]9*CRK -Ex+ MQvĔBT/ٺR} \2mndoxď^֛}fA 'gxp ErXջaؼ}7F.zcxf*٬!Sk,0zƲcT9TDڍan1{ ~/_3CMBWȦ@ Rܤ1J*S%Vɣ(6RRsVK$Uoy7"S|;ntgx-JR$R8ZPEwg 48)qC\ҔY@/dR4,{_ICGקp{/ UvwUUYéPJe(_\yλ~<=l&q,4Tchcq@&0dy%1RQLdh)ĬY^SKl`L*aRMinǬ.Ԇa6 Fr0h)Α14(VAA;]$P7wv 1 ]hbVgA +ߣm5X*~S#5Ȳish<ɱDPbmk@^|TA_sw.& B)}Pz66u?cab6Hbֵy`/@{) FӍbq@غe$S:Gmdmj9nNN3ebF[:{^Y҈mUݟƍӦKl/0Zch)6ƫc l˻Kg1UQ2@;|^/y4H((o9H V~{ǽxݙgoÿ~|T :a`:ʦ?Yz5cv1˵w/ƚz*F.bndZ0s|o|nX{0)D6'VcM 5Q<p ׿ơg/\f<$2dPͭ(*̞:Sk~OHx%1*9w^oFZi9DdOh =7~V ݁}1-q9rx?5]ׯ8S K#@ul}7`Dj8PtU@H%:me#Dv$1 /pa[LMR.0mREXpcp=%*]-5%9-?2umg% $GDfoQ@" ;xϏx퐋9bH^`j^w.lڙKs;;Ƿ⥡Lu8SQ۶``l^xip-O^ԎNS1 zSVtVw+6ьGWYUsPqWJ%"o9$^s9 rDkQWM[;[Zܻ>rkx7~q[è; 31v*r_% ;]'6 ti'0-6c_ ,΃41EC'Z\ \c͚ 0g)C@[DkgKD*&{9c8eo>KJ •$GxF_Fp/Wᔅ]xqi ;hz̖.-ŒLС:azGxq bf8A~Y: f+!/{Pnv '}F8'4·Fӂ pܼ.lFݿ ku 0)6 Pقu/kcoLJ/9slw B 9}|3{]ޛmɲܻlm Nh Hț IBP ؀ wKdeٹ;3{2`㖟t77;;3y nGgcG`X9y矊|t<?aܬsq&gQ|YIǏ<"O&?|S/ݼ}Xe.f7rHr'!嘢!@d,FԩH!!S;{(8q%MX,E5ye"|L']eZK0,Aף2 ĵǩ&OL$Ht7ˆ{dኌVž2tp(Ɉ471ъX%3bvYKQTcV*viFvGdŹ[9SŴeAJ7 ΀LDP!TZ9JU <)#H[F ә3\2QE#5χT4 b$AJX^'[%;"  v} {}z[5>["ccǖ.ԕ3p{%{ap40.a3ÉD1W0+c3IJ6+hpF)KF5R8l|8gxd㯠<;Q?NvNĢ Kgq0U|{3(DKPnf>LԔ[B w^zvAҺDOfVn/]I:EǦE:1(Cd U8"=A֐䞓Z˟;>Pc M^jØ!l!K*YӚ-9v}? ۝(xD]_vr]NH"0n&|l^&7;0+߁sXw=~}o6_9?=|1n~,xv< 8 g~!_yؚ&ԉñbI <4,yoX.P:>7w<op͎0aX 97=p%v7ctdz/3>{ݵw|3Z к2&Km}À"XLmE$.kV5M D(t =zl[al FQ#T x̕{e(olYa4f1GPf/޽gÓMR>I0|C#N#0Viؘr ΘQ?[ JSTJA Hnbn]IdxRVf8{&*h 4iꄡ{!&`m|- ʉ>*@I&J>YE@b(EI2;:JB}{"c1$MBvϋB9φbe":9܎Hx7t.^ 7؉̦k-u679ln 0Gй0Ѱ)Lh\?"P݈ۍ3FqrSc{p?íb'y{}W]ϙ߉wYem(JJ 7o< s˱= L}?} MHDϓ*ƅ/~DPZ<=Ӂw߹ ӦHpP+437KLN5jϬO`Ӓ34 f?pc16(鬒D!0aX9a0xa3$Ej;.Ɩ-F]:ӼA8ы[ ]'L=aJj̞ KϜ{6ӰTetWNπ5 HM %hb0agi?V@j*YV*Ġj'ޠVSAs\&DfTYcE{pf鸢bjWRPO*՞X->!sApd":fL$nvfiS3 üAS!6#y񃠡M^}o m u=kZ{<)w;&wq̀81Rq9# *9^y,UO=M` pɻP8P:<1>]8nl!֡":ML*nT$Jwzo{_9W;{E8':OKK tg^4?bZEe}-܄İ.FPPdžpf؉fw$@Dב,)Cai8cZiÎ r45]Ҟ p8) &}6l~#b78QTƍ?h[g񋟇kp|pjQDխKPgT Dr蠛΅)g^z"O*CϏO!; ?/|n[8k֎ .;>ܿ}8\d x4F]mO.sL@(%Wו <&^:^է} KbiLIED=Vfx 0?9tqWknAm)' .=1i'D -Snu"t$3J*dHI4Ʌ4HQ|N8TF 0J[WrN]4 q>fdnZ3a2\T-%872CMkƭ/J)5#߁0P*NS&0gE=+g c`+L.w)2A$ 3Ӓ;"t+s BgNHVu!zD7Fw\}a|A.k~ڑ%8a`u000AG\\)( DuHhUAeGx$jC&V&#;g$ؙbqv-gg2P,eRoqzے.͕cר~ϣonZz)C|kX} 7|뷞$Q__,11!=zس$gQy :M4x,g>cLݒB .t=G=*K1o@l<0w`OoУMHqkD"z~~?@Î("}?~_Pº=A+,EGy\W l{a97.(@8 *طmL~.p#o=#=׳C*}W#PbcML ơ ՎإDW=D`g@V835Οff{0&?&j³u/ Z%RUXOt=*ͫ4;SDf|)m(*"񟂤X+b#J߼TP H 9i _y1< )GTig7u0KQ^\NU cIikAyEԞ74@U M 4zUBvf&NkQ`i޷tgd, j@3$0h] ټ漖stkoiO.FkA}-:^tFbMZ%Qh%p S<БhBTr )2MwƖjV2Bل`J&`{]Σ[܃Fp>3thbyoPĉu(p!Y )Qmx}! "^9Juexexes|oU5Ǥqegj_2,8Ջȷ۔y f)xeDvJba QϑfvaP^A _0a9vL-Z~='wZ0POH1GZsmNٍ&U" y2Nr SKpOz -ꗃ(,¥ ?؈vᒛ~O`le%|\QՈ(lh/ڋbZԿ|boZ0z|Q@%LK\ya8)xd<gzQ4lzT0=w㾝,x `'Np^wB ,v3aVtZa:8/ MCN:nHf'3b7ߝfGOwcp(;;wT݁d\w~|^uI)|8 `s b1FE0p3Mrѭ^XM;20cKqM?ŹO;u)zzE5L4!#^q"~s J9`;>^Z- 12%d@drTX"BTA0LЄV9F =PT7U:َh3#L ((3f/!^J?.ѣF`񚒟5 +oZh|}w%YM3@.et~ᾋMJ%ˌ}2QOc:EdW}$U9Evtg҉@FO4Wʉ5U 'f}tjQޢ:6f++>bTC4U:ҢvGp>\!fjvɗF/PEـ1&ܑ^Ip-8" / H;9Z0!g}vEomh[[ $lpN>d(h%Мnvn؉ 7O#"Ē)V`H'q-"뱼fB\Wյ? }z{U6Kw.A] \8k(bO|q]b>pjۣ4l+#ԗ3?`WJ6VLZ/r Pd #:R1suvh;g~tCMw"@/vZ ?05lHmG$xFc tvjP az 3 nfy?)@ߠ1%Do'LAh$v4͸^v:\nH:4$7J s@/U 3dpsPMSs#ȗV\7d@~&Su.[J,whfk E)ί1Bf9"y */ Xwv+F㦿TiF8o36G;925bjm`t 1 *ZQcV(#DYu6]p,dj[7ZȜPetC`ʒ%0U+EXKJA!gOHf6jvi"TQ?b@aSc"#Ol.RrVeĂQw"#fGUL`̦sR Aa3ުo$Oػ5DkCBpQUu8Cvr.=%XƑft:8^=n(C3W1<Nٻ}~{)n8* G8v{CAS/z ^Y /,eqCf  Av~|>`@ ϋmZȎ/W7w৷mU]8+gEBLc->#G@Rf V9,S]5IDfO#j. unh(FǎZ6u`,&dI=]uRhuV](s20zSCr]GρϘŎ"?dPlQXk+<Vb>oƖ"K("com>i/4rVƘM ɴ$sA5R5S- v-êwp\< )H:J[4ΈK1?,C>vM*H!؏b0G^ b DNaY8i3ai c*j#˨[MnEV +s*bdN0Uαj*px,)(lOIt/-إuS*-0\roPV!Y9FL3ӘIa: M(h"3g l[<gzF wbDWF+߷v]zX+QP}5h,Kk9"藈Ӕ/g%֐J^vj_F0!sL}L;Yap6Po8fgW2{|_CkdZ=bt GIlE \tYpv}m~8~= yZ>\ -(\aѽC\DA4g@ Gj*]ag,2BFT=W<~x": N2nEf?r\4Y{m4N@a FNqpTYMEº\%0DD()U< cRjKuYH#XB%*-#{|"Xw,<0_!; 8(jH-\A$LeN73oA.( T%Y'rcPcfK&8!"c(SDpFg%w(/J 7Je] e S9 URt>|m4<TT\|\NٍГtFط}_EƧD j`/`(X}g@# Na*ڀoi4!V5qӞYFYq_hv!=Mlp)Opz]]2[VVnCt ӆAUZ4q$"cqC1:ttc˖hr"Qؿ|TUpPQ΄m;:YtTXےaԲϡocڴ~~zBXzӳ7:tP75ϭ&ؖS A06̑! =Ɗ՛yyٴ=- #_ۇ10rTߌ2[p8&ՓhPF3nH?7yr8AI6)`If0 H%,1)K-l w0YtvM 2F]o:^Hi~QBK"b`Ju͊~^e&1G 2k!.(͘fP=I>sh2~M$2FtIaVb6LY@YbN#*Hp` ]*;r[= ˄df&~[!u؅q!}7}q\l\F$3wjlz [g+!y5,DߪWAFx5(k(,|$jy8F4AM?v:tl7fB=8iwBℯ2GsaAMqfF܆'| .@ˁ;@I0.<0W 쥚 $Tb| =ʬaR%ǏTĢ|t8;\_0xSZ񦆍@"ZBB*ցyNLZ ˆZ"ѥ&)CE6`OO*ݖ,p a 鰡ܛ4w9,"잱եt"8:c>/0PJs83DSMaGqo܇M.ȑxk9R a/c;Ox{$o#GNc@{W_nl|)Fk6%-֟49"i%v]7BK8SOCU+7}^hH!Tu*J5P@2rfaSqYWv G![fb99 1DЍ<yH+΄.*XMd^ I]Kg~CEA Jr-U_H?ߤ;ws;x5MP&G֎K kV% 24eдRb@xXĈ*m0 GlM<];&|M'0aP ڊ\SQ?Gla$N)vmE5ƴ]@$NEIәE"(Ǯ3[-m1v `۱?_ (O\[I!9qsƂ93 $CR\S ~ 'ȑ"Xs=.Z⁈YDĹU8xp-Vtumd6E_FcFncaX 'ڏ7&ڳuA{Fz+h?8 z=;>ȴ/~p`q}"o%wE ==>7N?g!/sXRU5w/pw\u.yC=~-7re]mNLc ,5R_)0pHU_m&C@i h=S?^ c鰋>!^Ƿ?>0}Fk^ B4 L jLKP€m b/BI!$S)?MW?E9RC >Vf h(T)mqJV&WJ$hI)Jf-_ý1dUtؐ&yEdeW0,TȦL2%U)Wej䧠H=18qyQ*%ʥ\UʡZ!D/JS` *9GRnĚN=`^Ĭ*kj1Shh7?{A@oYkB]Ck!jFW'=8Ddnt,oг{lNOi/=ϋs`;5~?f):;톧\L%o7\-܁fOxg*K*c!8(Ks MV_id4/A7lSCeA C1"`gӣIs`4"73 ֢ϣKD+k`۲?jnl?Z׆B7?z=W~]<p:ݨ /!M0MSNmGy9`MS='Փص XP46cP1ɧ %P\zz6cj` 0i%ؽg=kn0+g@9kְ\IYݙ`K.yũO_:7=Bu`Q?Dԓxcfy"{xnL=m:/o| fk+ao_B!:_܍{׮e;p9xbN4aOw+<jNO_fFuWDGɸx?!2\}t~QAW:Ui(/59.2ieZQwc~p@UK:u!+#w-N5F5i"bNăZ@t16SUD$0SK93a/d^nnm0PI_R0H!+R1(ΩJ)J! " %ؒ3PXVQ!­p֡YHb]$> ~?9 '3Z@y/T\q֭t! I%;U;9;):9]\cV CD(MR*2̀QR 8M;4odNի1C}}b2*iQLr!YcTK;v|')ky'm۲ukjbӦqoh2",_~NOX{uDٳN6Qãw|W/7j܋m/ |OGឲ/begi}.?v+ae2~2~ Lҗ2 Pcj}3qR'.>|s1zs. }3q.;w f+gOɭF!.Xk= $8*bF5VWx+sX2Q1n9 Oa 3Pͷ"*㑪&F4x1H yuL2& CBf *j˥y3 g}%lJfTYxkkxfkw -t9Z HA3iv5i&85kez*quZP=AR\AeU*/2TD~Dj)؏μ1zkmŪH3i49LP0C}ye 2pVuD$pĉYIppdM(󧡺`&bq"#쨸W8ğY߽{9 g GaO]qpxL`Oa7')ZZ;NCNNkl?:3{3ø龿`ܓ1 `Rq(`Wg(!%͸ީ\P-Pπ=rX8OCEp94lۋ[[RW2Q]Q7oh2`n>5KrYw=Ͽn-wԙIZ[5yAxǎ+k)'ϱ[glLv/a`ܘ!fG/Y<&UDBK4Y{-Ǝ6M~QQi?mꗱ-k~I}ee>or%ۿ)X~O\oj<)s~=xu4n,[UwZൣ)}M4nfz>\YnnC/o6-Ώi&9czyT)Q,ظI6˪iyY`i,AV\\>c/HCg=Y!|o w;]lyYDd[h_P?.s{޾>~].OxogëF7#pZɅ/\1E(b_v[kì݄ۿr|8]Y6Ç+8jw l8~|' K859rmN%;^ld3G\z:c4c*b;FW4RkBj8SѶJHӲ-.UaOa\MߒTEt66fHV;.ü$kdT"S#FC jlCĺyɵ(,Uf'Oi&C31Njiݦo &S)ܥڔX9ݨKe?}ߨB.u(UG p,T*G"P0~+澢f*eՌCMʗ^KDcٟ/C8s"aA .h8as9lг.ݺW!@|lpw)rv}j<`njx|υ4 R X`]ЅH};Ǣ1!xd"pu¦3?#Ɗ(Ugc*BE~ | QK Z.:= <$ـ0 ^_ >ִpP4yS u<Ҟ`2C<Te^w?Kص\9(n>=ܞ:ڶbZj|W47z@\$KSnEm]0@/F_SDc[Țo,g+Vcde3@^˝q;1&`%־TPHͼ +^f}_chg׿u?Y+X{֟*PYX?ؘա%7ANF,p_ϟ?XZr>FTVbJI5^qo[~w {cf 571ҳP$ kySwm|Y3."t{{$ЫY DCPH4P>5jM 6e^]OE|2Vg~nN3ϣO9M*b,PmfaTx*^C+sO:zC=F8mN?VhQjT )("j5bf's'{ R@Г&fݨx$gQ7Oczbi4^3_j!WnfC1D"i5l-ֲ˺V3: }q-Ʈ E:Æ*~E4氣ّe%Niƞ0gԉ睹d!f =g"[Z>:`@c];g=e#nK;^;sb81[ vٰzAU신 h$M F=hiyv"zچl]yF/{vO6}H_רssӧνx?0,6y8!8}rش[Xsp,xMobXC k*V~>k.#ۈ!CڳtFz{֟gכ!OϿ;yͬ}Vof;: )[>j%.Oq?L8m3ČS+0 @8 <.F(~1Xq%̤4m<bpY^Uo=+ssyJ6*>݋-Ͻe& \{OXpÍ(>΢"r58d'bVXHbl}Mׅ{/f5DmQ =~r*JxA¨XOQ9P阉6 P-%bM-4vW*N kOeY@3qbf@ґW%1 EYHE,d$l@2"\`8ܭ "$ZE]y` *gxbzvt_D/1 <7Y_7+JdZg^xR"#5~"DH1 ܍I E e.S)t+IM (pEQo"3%qjp4gEe'N3݋->*ϗv8nǚ6D@M;*p|^1([LwGy9E>gÜU&Z 31Hw6_^vY6l'|8y(\1}u&މs1yX9 E~Z'?-ܚ#k&k#0ףh"¥k -iaL8^lD!A&~FY֥ms[!/^V*~ 0̯ri(-]A"ؼ#BSYJbR#XʉCٟ0klVR4师QZsx<|/ P&BrPʦU+he6Vѿ4Vr ̒Z#q~J-}~*_)&ofׇDDvXY<?۸J#PPK09EP\RddS΀#4)3;ͧ#m;?QW7\ocdUk'!oD8ٝ6W1\p,$ƕe(.?nlr=f.; 3Ua,^݂]}p~:v~H.hȤpbp0fn$=H$X:#߆"ufis8ϕ7q~1O^'dK7/?N~\kϘ_‡- jucpU}^yH =| {|o`eYP6ߠrXDCԱ P4hwSC ݉IelH 5ԢK+*ĈQgVeBTPoؓRu>Z6;0`$9Y`Hy#ԓ<[yCW93Y_j1~<h B[?:=uؼ.+BhNAC@.5]~%C@ٔQrW>R1-SԪW+5X4>-Ȟ{L=]P8nRO.ڎӇc*vti U%Uoģ ٥;yʽe1brO;hR2N8B`jp2`ЯP@y9?9JsG'Nz4Ce4ZSqx*˯oGQc#fwXCXr"mNF/&٘);;^؛5bi~%o<#gVNG24\#h5"[uovN6-˛#фG?~2vw*^_sǨ3fW3h٩!o@7@8aaoFKq4ǑG+0=+0r4X{'ȫDy^ٮ,8#ADjNwgL^83ߩu9Cq:tw?Mk||q7<-~u=tB,6{rǧ ȭ>^_:5w,"1}X)^|GΏ-h9^4݉;1 xN8rzrUd+A-mU!6F#' i  { ]X1j6gsM)oD%iD(c F_.6}bف:Ҩ4trgSڢ^]7Zb?Udhzq7|$jQ*JeGI[ȶPM G5wdd̀hd<(}Lhp. N B?1(Amy?UmgM(0,q?va\,6* )؊}^Xwv|Z;&NSGMFUQ>5(Ԫ᥅+lJ֞xf$dsc)e?ǜXISR?kpfp.v#9ɛ9Qu'WN /l EG:v-YA8ɂ~CQX8s 8Fw" #:㰯8_=W;FY,GMH1b3`ã! aױ'Q0`F]| XMGfLi&)S#=h e[,ƾ-5޲FҦ>}^r==JlQi5iTj#K%>J. HP͵dL7p~X<ZL-U_]u H{nY 2+T`^"@V7b&\6; Y>E2nP[57,XYaQ \K|S2]ҁ_S {& U5ּe$9~X,*ؚ du8ib f+3U>*C@1^D Pua9GA8hGh} PGGxvVlކzE孠*8: pQX#: tr>6{xa:]B;H!NTv~Xupp:yY'u͸a\O9N؋ue}XA J.eؑ2 RsS/\ O~&nY ~5/--9 UMabR4B<¨K/1fx)-)w݅u?O1ҸQI!zQ-Ŭe~6iژjBZԚA e:HTbDrhN+ +{Pόf"qSZ]7KUy]> yDG'#דF2ƚ4KӒf`k(؂!H@)a"#jV爖#dH8e4@L " DQ^ǂ/*JxZz=3 DjBҺ6@&'MQMIb# g`FsKGK$ndr4M؊&湸=PșiDA^YP/$}nIؤl r?PD8+ H-CiA&jjrXfdKPapdBSݰ衰Kz0g!o 嚗杴W(^0;ҁ *\d;$$HU;V]aܡִ7Gڡ˜(Z*y<AhSˣV$sF0JVekt^ Y>kptE%%UdG>1$㩦J/VDGFRʣ뺚pLIlC5!Դ]>|EgK:m?xR W3Ã*R u֢V€z9 (r6ǰu&:`4g!(ƍP8B_?{.> QvԁyI E^')]JMC{O;}7TWNƏ~+l\rG84^iG0%2/3@*NJ(su+*D)UKY-(`Es*uCDirAREVi,%Tʔcu?s$ehz 8Mk5> !BybׄȚ)D-xT17;/2c!_Cʎ=\QKsΊ#%v{eL5|.!:8^(MKbC~dSPvdb)2ocR:QfUFHk;^&n9Lg5ƈ v?8#$b .1+7eXLTF:ko6.[re˽bz3!y$@@!L7"[嶝[vgga;9HW{Lr'X?*4j?' zs1znNqJہNzkDrgo/aFPAs:NW*{@r|Qy '+5uz9`SDt9RNH<1|}1Uw^uٝ=ވ{&Ko%4.~#\GX96eJ[JTyd8x#>|5_f(2Vq:\w|nt/ > YΝuhc/qxOʂ1v9a[H ;+Ӻ늗hޔ@3a޲]Xk`ͶfY?.9>y~|f FL,72-%oB[M+Vl)A+9F sSb5PEOU3bj82C5Bt!҆oץgۄ s1W|tQ"j ]=n]"+S\GQ.ks=oN˫e=vN] }>MI#I,K7^=f;&4q@ t`sTD UGipZ{DqW:e|Wڏ8=BP9A:B{Vq;*V(9SeNǩֻn>kYލxi 6#@4ބ=nsEq_gJ ;ܬb(vշ⦇?r~4t>OD|{p?*B mMm耿zlw;Eiii1R9"DG)jsg{mF"GqZcP;ߔg3n]WGI C*z.yyA*(JCcŖ&0i_#9 ɴL7o1 c?^YoH:K()n` O!өn92hn5fGl;roxn:b aUt-JNy?ij+Ah]qxTAͩ(i!4t[.!o/ L"mU"v`}5GSUw:rKRW歧|z~YUڸщyE]tvAL8Ɯ7lWT=SU4rLqi)v>7w ʽ)VTz-@$[#$ WܠEgy2ʛ#o݆h4` 3-2-ӾFT#*bT*&*{Rm[Hiyv5m,mpؘ] 6Cʊ\~,~WayB\:6;)onJlF7AdA4e-Fa3S{NJZ-T#@!r4KQO8=#x Xszntwn*4u[QD}&07%?`͚(--Zg=kD1s8S_5IcξQk~͛7@gg.E|x<؃c# n*%J :Tֆn ?,HhC~4ՒtLkr1x)l3?~! YkzPSHބ~d*w*5@]u QUWʼn0p1D _:Oݫ_QׁX6c;h:G VԥuoSX+t&Vץ) 'i;9pP:{!T -.`#G)& E')!4ѬSuu%W.Mol&bcH06>EYbL&Gy# L꠹Y\47$2-ӾF%wNT#4cf@гc̣&/44D@).)yH44qZwvwsƓpb^~NGTpnrH%U>++99=_j%̙s9&M"#O8+% r.[ZuwcڴZ'#k׮½%#_z*8 9*H zjB shN q**@s1G)=5ԋw9 d=k*U@? $皽D+F WE ;" =*c0"0?P_ĺc2%@"T$;2O=OYAHTsǴ亦n4u#hdTZ3ݒi5rRE.Q=`Sý2lFȅjltCWOaCM.R2# ä!;+=u:\֕8FΜ -, mxth@q,O@A⋥8s0nx~{`p@nN8@^e]+K}.T;P3%/8}LikRϣhcE]"^W5\T]Ы{:uB]ӱ6=\VsnG)WC?BdXa|96ĺ1ZJwe<& x<~9,xL#,w73eIU&/6G{{go2-ӾG'Гsރ h`C1Qk{8yӫv;Ij5t*3%E׋AZXXLXD@qny;y1$=vATp!6|; =?Ow߀]w6غV\O;x[a_d ʰѪ<,YŘ5ue Qp4Zzm,;T{Ϣ䓏˨=UDCD 6W_+aÆ `>PF_D늊J<0eTtLCpǡ{Eww~/1xPYZ|(_|<*++)-wGٳK\=iL}vީJpWY\[>=^iL^:sRJ1:Ҧ4և,3;UT_HEq3q u91ETRkV38gA:\WP GPɱ7{HQ\ PV/G(ΙykE,Np0m{ p~5 ieML˴}6~y- +=r~b:Tc3Aι[ X?tB3=׀#ni\-ЃJg4$c?@M1x=X8Tu ;l\e ːv'Ub 24L|Z{wWs嵴5l?ӏc~X=}p;@w|Y1 -71~0z!@ }֯9#Fcq*ErF\nFⅴ}o{bdJ8LdZ(-&fX?6:;Wѷgż{ו[h=# ܞc&ORU]VdnA=uuI>#b18k N(> /oO_9Eop'<C7p r(E4M/F*.Gf:õtM5jRQ\u$ }wZuv[e' ֒b[vRU=.v TKPlXf;Qz# ggg˟?=L2 g}5.QQ1R؆k늢[3@3{c]Xz-GP3-zu㼇TipaajEM3iM1P]v [KHbr˛]( w?qBK"&/4w^tMehݨ*(O v 0<2.jV:"@\OEn?N:m܆2ӞWyr]{'j> ښ.p ?T\s݋L.ςxJ߲e3ꪓR;QXn|f̟?O?v&V\7x'NBKKὓNVR@MDfXҼ1ۀ!oh}s7k?QuU?!˴LZmNx rmA{zPf w:5zT ;V=5=".!>3ք9~@Vm{ ][v!#0 ntbs` v$ǹSR",ܕ ԦW3G>k*nOCo|uz:>uPۜNQ{嫻zu y*ieݒ ,XE>Gv= =8f>JףUM݇ ?ҥK->)L\|޴o؎bI=7/hTgػ6Ao7%_bBY!4I'޺Z 6FGg3bC~R{TaM/gDQSNwܙ}4ji5bwͫFWu }̣Ö{U/Ya;˹qӘi%N ͻH$wW_跁c8ZaqiiŔH~e❗ء0OTTw L-9 ;C[< Cw5BtgXB@] Ýkz锟50Qk;+kHl'!ð)JWS w79}rsc~gyUJ+U#mAc7k#쩟|SEᔒI9#uE%H] luE.:E>a+-F%psPĝ߉Nݐ"FW~>oinyT|򘦦}(ؼy8OKebsĵe1=e?BY8w=>#`7[~/ XogxP~{h1ce+콵3-Ӿ;-]*oQ]'Wdp"*uRՌ {qr=jyξU]C)Bhי[<wdbr=3X |Z[vnݻ6!'Ǣ+pc8[,pq&Flխ!?[l z g-ǐDп.qjBmObzh3Nq-^~g|mj\yxo;x-Y*5m!vĕx98w`幇`bi0љiF܉8UCւ@4/$KDbۛ\c#IF2|LGkq#xj;Uo1g#i25I+EB{y$4]AP*x#sჶSr rsQW׌@2j5SC0Ϻ2ƒ`ul|MbCO=nG9 ߣ0s2dpexg6̴ܴ"n>hc~޾vpqj/RHF]ni4.fpP9sFq iP.jjS|*a[ci͓۰a(,,58 S O䧈68~N)?*Q)+JJ 7v95CG_2C|!2;|(seWml==wI}ce0ߎ  1aX)NwuA3Ez~.Es6Vt9i$D\TLeT}> {Ayzn17]Ѳn;6>OHe_<sUǖ4=غG_[קkvv#%Kkc6িq), y+P[PUűs'8}l@ױ_]WY+iLR#a`&L1q)V0q 9L^ NrX[Nl?S%mt)zO8^Q-OznU/%!0O3;;m4$Q}9<xrX_?9CP= 5۱mzԷE A(*𡭵],)n../҉XdzނH%̅,ؖ>!$3C<=(| w:K PZͥաSw^D,fr}u[D>񣽌ƛ3}NڟIٌ391<oݖ2׀VW4Y=; QvΞ.{O= HeTo @}WSfW5fT!<:m^qLqIisN1 ]]zW䣼([,7@ ›l}1Tnbt 0w_gإZЯ_څRšE l70%9\'R.6kAQFK:>~[aڠ"Kf64 cj1/ƤmQ3܇ 颸0`(_gbWac |𞉗31Po}[~jdd"uMKt1`-/ !Cc c|0rsLGs ax%~ 8!K%Z[Mf0)*L>tEO[uُ u8#{/,.l`W֬2$ѓ\O{$E-@Ieȑ QX. ~]ɣ'p{x@߾#>?2&ruL:ݔ|]_u?21i4EF&s/3 +?cmo1]1 QxIgm"g=e} ;K†u qQ\:@bbig`}\ECF^/_\a+,DjѼZ ;6"T}鶭&v2f dU>_-tЧCilloˆIgWτ ߴO<V0bbпh S ނ1[Z>coƶ2 s*فqxbl⹧<gO4;Es{#4M+N T:ty*Hєd]@pWC713@?b>QDIm9-gNZ\Aܠ=4J`w2Cah_FKO m]X~TrJuh)vg\[ĈyqX0n# %q9/@A}q^CiOt!7/FHPoOb2PjA^f\Z ^ uH,<{^d0+2=7ZVMcoCV+#Y(I md SY,ҍf(d'>e{} jDk11x-#a_7A0~{sU8긻ѼATY8 wV_bwA~ dgZNΤSϻsصERw*+)!9umu crŲ8&L woEG9\VTFuk0L<N;\X1`_E,,nC:[(f~!!w0:7}m!@E`'_>J-L5gܗhl om/) !U(@o=g(vbg);L ֯fزE/ 5}*tLeԆGp [J RF<\ȍ8fpK[8}?x98jj8 J ld=a$KYбibK(ݚoQIQĐY*ܷy8Yyɱc5Uɒk1̯^±mcm%GU5pqhdDԙ'֖L's NǓÁ '}l{-]W09hJʁ6&1H ;yV4@s H#={ 1Ŝ-ɨ|wB/j&8h?->s #tؙ[Vb}ɷqŕg֘_CThɨ0CQа!.tKp!д,wĽFG^921<ŸIR)n9[#& dsp/TnGt2ӢsI.w9Kl/IWCH59Nחss A:v4 `dCb^EQ=@%kص+,{,bMoX6v: Cfk-0Ym7ƌAVxT/V9Y$RWj ɀ2 0HCL ;[Q-bUG`ڨhxl?66{;xaQet$ u>k`@߾s+`2u<WW1౏cZdAuUVw}SѧOyuր܊ܧ(iMLr[.ukQ(e_.F_~]/wޚ^7Gp-XadtJ_22Hُni=*e4(P<](- QO?iĽށ .'^zVW7ps ~sK#G[)-+o~ilIi +ٔF KFR;@jWOc_gL[θ] rLГBMi /^ z2ludF&`:d|Aǐ>z'9c;p/#m:dvwW߻6.A9SU[;#i]aE =*&g3g!Q^αu>X (R/ÙXڸKփPXrZZjʜ>tg~wC΍]x75ANLm9kuŕMH*+D1)@Nþ}\2qT9*Zq;[9 #}'o cq(3Ȯ~x:/4Zk\ _KQTp9⌉%G;5p~үQnny+qڤl@8N0j|;"Otq oErR+BP"ᨱRZʶTZ4vtɩƤDEE%hh( KOJolAssCG3S~dJLٯ S82ϓ̹o%YTq c ZH@_t.OIw:P5X7&⪘*{~'i( iv:׉O*ϥhQ4nzk3ÛEDZX >Æb]ۗn{;o7'w gj%ayx:TTiC;.=߶u{8 ľՕI]lEY'/Y]_8j;,K #۞]ۮ\IcwD܃~Ń] {}%:dL&~YC+ccVbPM% }Br*ʞy U` i}y+@a%ƌ}efPr4ĺrsU?ˏyp%qqexm{ aԘ|abi#yh;L)Hufu+F,:;wvW?[ڈ00vv L9>^ùOw nO|ǬcqiLS$֎Z){*&E~M d{g:9 JP2fq[n֍8Tʭ'Cgc 7DdÌvx LqsQMU5sL9nED 27u.[9:-e4w&Sځ1$CO 4h[(%(k/r\~5K`غJ{1äql/p"}ZL8omd9>Z1dk0hhvaz K9Z\ BC:`8gN[V7!ى\uejyP&**6>Q16 qBWq$^f(| |'j@ 3oZ>dQ'v{;x'&|"ocG~5]z4f7 s/9 \uԾO,Y' (GʀZf Qta}DAUQ[uڊ C(Ds}`~GⲲ@8Nh[o?Ҽtw\(ĵ A!=UNrh=1XXUW0݀ kO\އX ?)4l1ϚE cLM,'S̹L0ZQ{4q׃  bpk1^9J 'Cd-NJ 8+%J_:l\XPHH Yz᡻ iqM~Dظ u gkF,Z؈k_'m/,I1֮i%s ,nBYYP:/Z$U8E~Nkg&ʙ_JOTɓ0_~V|3 Ќ#g(DG{ #FcntuGyu`^ՍML04 K*)kxYZ-ݡToZJ!tԵ@2P}I8'?Ň {.?+ E[1.W(,â[~lV[m1wމHG9"s-zE9u5P2 4gغ M r###belrfdeY(~PV - 2L)K~'Z4SN#y1,ϰ]l 1I/9sMT8dڐyf D7`e2J^1>OF]# @ϱmk\F'1|$ D3'8Et)Q=Ċs[.Ӈ,I&q\#Wr€rud({lc(gB(ޅ0P.8#>Ö@\>/_^0^ꃪS: 9^|beP!lp;іU jڱ$L<Sq=@(?T-GO+vuT%D -&I[&~~ Mh!k?PmTrL9bul@ SR[!#G5M9>.S+l";𣁺= 얕*/yz\RԝX"Mtp6D"GS@GqSN5e*m']Y۷1~h-=֭رqql̰+OTlrՊsM,K="̉iCwB9ZSURՄrr,B@ 9&9joW }>Nk?"qt.>ʠd0-nDq٬osȇgނkÈyط/p{0*G >q\<9[+ڎx|rX$m^xD1oY-xo#9J@]S}s |w-vֵ#[L g׭QL˴kGGmAqնJ8sS:se矷٧v cŏo/rVG*e"TBTl˓%ao&kɈӜKI0̔к3:ɔ4$J=Lq ]5e<.# F_zR{꣏ce?@8En߾xjQرc ^Ȳ@In=v}RˁL ݕ&dWZ)`!Kgs\4#!CLuWg8cROTG&Su~~EqI9=:o&0v%d$t*(t;vXTA,:0L?~bb@ˡ8{4y!U2:s@;y|9&8j)!jߜ5|M¾K|(\xF6^Vt$\e0~h7V]TLik#ǟv^cǺ{E0n: m; U uG`H@9p}*\fT/sň!=ZԈ>}LF{ֹy4(}UW%kT %a6&p_dž ᝷ԆrnPko!Pt/woW2?ܪ,uV0kc!{#~b`W!#,6zCAb^/?jT)=ɻ`l 6Xf}KMZP$]UPO8NI<ckCv oi_)h!S"wS,'_,Ax=xz8 G(Ccc>5s')A|{;+47o+!DIoevm&b%:%]30_bl#Х'YHdd p+k0b P1j 1̞] 1b.Ŵvmc8n&C7,ADyyJUڊ#/iځ;-P9w`^p-&N=R|l!E4%KA ):LP3g3?V|̝p8O->Z@S&pAށɧo:O\W0}Wcpݏ;1{~&\w#&~ro~tjQ9_J~Kgg]u^ ߻ą}%F_\K#J9R:)"#[9j,V]\ +U gkJT>hjJ <,)ɖs!9WCjjP%ܿ+{:BcWgw[Kf"?-v3۹`&ـ$BN OFqĊ_?6P pw靖ѭd6l?Ґ|l|XUvdRvqˑ[ =)g\4a{PAhSy*.3&lGI4Ur9HҠl]q`cF[CjhigAMMd&[}CCk AYŔE}Yq 9T(\R58]N6Ȓ)ޡD5Β^e-V1%٨G8׽43LRjE*@{8n➗Wি/_]s'r٣*v@iIF}Mؽ.7i_Q RY9Kg3ϑq NGpmh¸ ˜0Q'-۱\uu5Y6**xz Ζ%מxtTxߴCFҫghtqNua8>xm[ROĐ(+'n8aa| h2OI#^Wc\WuɡFr(#mQc7*eJK$MC8c|$p= EjɨU&&LH9*!}KP Pt#Ocgʞ<:v< X9qKc^V`8|sq C[\Q<G:ؘ*SLٲSg _@u1a!.ݱ[#}Kq;PGII.=QM\|WN=KFA #(-»݉>+q'z}V\l \{D8 zI"irN$#;Ve۠*.FIQ5q!AE*GsNJX>üT"Ȕk"9 @h};檒b893<`'e`lb;Ǔt ̄ ~\|-I\j($)PԧRiJ~+A{ TJד X'̀`9CdAy;WKo9hgÔ}CZ 143͖&}!R˗uwqյزֶ/<Gb!xN+/|0xZT27dErګY8JIAb -*mk@y. c!OEs: 3"ka7t!!/;zdځBS8ϴL*ֻL7`(*0 "hnI1>!M7ø2NU-}l +QLz;DpY}ǛФ)E8T, ){m:j?0M\&1#f̿Ļ;q҃bxԯY&T2 g"޽Z|qۛ!3U\I߻ }֠-K/X|yxZR WKaҌ[g$Ne0xig>t{G0L}Xp9'Y^ ʿ2o)z0KK-lhp}'uASi5&0 U 8JDq6/E39VsXS+?ɔ}-q\~U(hQժ l^_h\Ǻk6W]8];;!d ہ񸘉>} z[\t>E0rE6[#p@|ׇ [.J?0 H>0`1ۉ 86Hl_n"{I$J'}9R5ؚ+Xtx+XIV (*O}+MƸo_SR휀k9wh~n; ~4ቇ';s\#SL kʈq/qCRq]0)MVuP}z8Jtl@㔗oUBXJY2-֥9n^9jd K$5|rx147YJ;OA!dXS ⏭reYFrxR?]yNGJ$"I=;=JP=1A&KL{)o`^ڃ̩XMe.iD ?j߭@8rN_y`]űϹ QPpOT@V0zA pģoEm};rB=SX =f2-2Y<?ܲp'smttBga3Ag*d]K$.e3ǟuvuoT{= {Tۢ;v W3KS\q:` !]*'M>#? |W;@ {/CXp8'efIoܴ͛6rdwޕ"q;.D Q z/O3ckk8ēҎS2uJA8o|O %䩦4lIE)J`O_qt";UzMƴꤴS-uf*a/Ԡ D9Zd5y:¸psN* Ҍ*4$)-qphhϖӐAC4QY5]눣dgUyM hg(ăG#_|q* {U$e }vX!l]G 8ge3D3+n~[@*hLtv1+rĝI{tn.hga `=ƇroC=&5= ڛj뱝 1qtu[Sw_~eX.7*bl 49}J̰nR`{޺ 38g5{ 5ĵ,S`Օ߽YQ-d9kSzW(X!5q<&"\^3 7ʽYk`ԘST{rHF%#ƛjw|EPQQ˾3@NůpD\/fs\!'һv63IuAOp ~cKzeT7V///xpii֛vP\ kJpQu*(2`Xz'JYԓ{(v<ȅMc mO̡<^vgt%vq #+**0k0Yxk7P9y F͚m/#U7ހx;ֽ_\/$ӈHR%{U*=kT9P U.PחN00}+2O9h"lƙ|.er '{پjmx1}HK.% ;LZĘs,K'JJYΕxQFQn2뀏ZnJB PD(]P.],XbW{WDK&@zfYx}>0/lrosTJj j`8X_>Wf l;VQrTUS"i䐳Br[7.(:ub4kC;&*u iϫUnjۂWyD];%!T$X$ |1]Wj[ ivi3&9uAc4Y~TI*j[|g1q-J9}r=hi:a\52@q JjǮ"^kjQTjƭqW E9mr$bR*Ii'p g[1Wz'tk Ԝn-Ot>'A$Y m8CX[˴9S]x5/Z M{vƙ ,Aeu:`ul'ꐇ=w_elV$ԏ rԲ`FHW-Uܤ|?-`@v؉y>b a5#rNjf7-=JMJ+L.~b ITz6 V-;ra)@D6Z/Oy4㩗`#17[ѢU& Ѫ~YA ݿ-ǢCpVi qz'ބK/a`xpRPEfLXsU˶*NFfi6n4cͪ s<+P_A[x.däp{!]sݳ^#A701\0ڦYl`S`WKbڒ]؟_t 'n Yָo RΩQ?t# c]FsC "NNԋAsdj2 ,Z9;D?O&kfzij% &>|0`'ŦMGЦ=Fc߶ `f _~+WTԋ>T +~)m8ҋrQR^12;Ǡ6 ?J z1 *;#T)\:T,c6pP}|/9_*fm$wtZj6SuӠ0#<7k Zc%M2'$&q0.[8gýԄIT'2 jV1WA摳 !վ2SE$[d+$J(_ dǯ+PZo~0vOa"{qpB]].l\b๧hsљ5o\kV-M?>\>" ScTi&yI"sHD%G3 @OQ z-13Pb}Z[ָ]6MO89f45<vJnI_IٗyƤYG T˂ û}2 XR ^iTf=%)2@8KL$Cl9?偟oTrsfաJ9AYiPE)'{h7|YlBֿA>Z*3`%*ʱm/zvgc" J%${gc_)o{TԢA˓nDŽGG-}u{/ Ŏ=PZQ_5梨Uj[G'.2Qw!["s|髋t6%hO-{StL9[ƒK8H([]Ìyz͂TuNn~]m4Vm۪{*E\{M߳VY b2lxsKlE jK=+1$$Zp97]Q7Cq*ZCGIL J 8pβ U]U.Z;&$YѾE"'Hy;t̔X8l6P_[ָ5nۉ=TϺ2i %Jԗ3$#Ӂh|7lTFD$h@2N rB_4u-]† $H{~|3p|i?mv3T9YVu+HJ_&N_$T8`mr̹Ā( {LEvypttGC!-@wj;lqO ;nQlC{z8Tbe s>(Ѯ;]x}}1>yraJg T#HpX-0jfE}]%eV|R?جgn55@QPRFV2B[jo- r6FTX`[(P8mĀ,$FF| %D{n}%)ZMXN ŢS^'4ݵ[dj"]m'Rʼp{mKL0b)˗*IGM[ Gkp-ObkS.8,hKQ 7WWFMD0$)vM5n*+zP\ 4ىXu.4Vaƭqk)*ZL/r ^k}! k̉ }0MlTYsHu)=)#c/ #)e%R1+_d+(7g* H^. %{\D3.H$HItyK@ \ŀa%{1Zxbp;P%ߴ=|:7Xݽ,Q s.ZJY$&m:tO!?|g^/faO{qPA-d/N̾ZA@kSWW?׫M͘y;N4wJf9"T 44J+ B?Cz{AWN Z١N-*Devü3cǖ~4kfCi)q(ߍ JЮ}<2p##é|ϏD3FɏFFvTg141iNDJA!)ɪ_HPo(* Hr<1*@+9;Y3@m1Ըʏqv` ѫ|(kᴡ}V"h aƭqko 2 3h`HCdtre~cE3=HNι]M&G>)`àè2@SiPFgϦ Da-rQ3b([ʠ v~2_J;WK7" J8>!Gz#4% ĝd4un7DXʷoR^jjaҤ g6I,x"}PH+@BKlǃW-OFvBMvU+]+{C?v*M^JYU("`}"YN&lDf&]@l#GxB7I P! +>]gԩ$!$?KgfC^{uzL„{rp8fu]xvqă_~.EmఛrѽGϝs *[{5.mV[`ÆJ,9xhçX}OY!N%zdq]J80+qrD LG\10 8JWez,NizfnUYq8y(Fԇ h=lBZ .BbI5.3z)ɤ' 2ψJe}49TR8Ήk)EY|Y-ШDHzMrA ĞgpR;WĞD&t913gfkAK4uyG] 4`֌d QPn-Ce ej0BZa~_<* %]HaXw 0+~e G]}b/Uu\Ù9kI*z5!#3h)0! P2%DG``TÞ m="8'Qj$ǔ. ƶ @`DċYn0o!ٻt_mxl\F7þ}.\Q/hjY3;v5 7gHW>_'؃~(9\^LO'!QgH)C e\P\ʱQ>:q\Ţba9M,_-ޏ" ^ʑՒ eK!~@'+j=ADۈL%!?'qkܤWq21?d*D2RY3*g>K-8r:gr.}zI,yd2G>~Z>4(_c@6_ 1@qjĠU% 1@!Ȓ1A=l(/E|(SH)>RČ7fMf6Po~qH۬][#5N8M%Xl1)0Ɔv]a`ܺM,M: \0 ~2Fl G߂frEmȽUtyI _$. TZA"|}tbHÕ&)f1ƒk`U5/0«M I=js##ىjUяjWqFumATWנq0 e]Yzz1ݨ%"#.Zid^0, l@J&!mQɝ .Kɜ"JȍY^H5Gt)xq8+ }s iswIli]HSx{+i0i{c9=ux쭟1'!# 5R5u8 .ŢE+PmJDׁgkv߅+bgI} CXċߗA>(/f-i(22<1$U4>_FpgⱤ=:dN&%apF2l%O/T9ƅʳ؎juJC *d/׫umhA?ڛG- tJg$U9lャWDY#v)Im̠rq89+ AW6~^=TZOYIě6)E۵H@VZ L]UFpoޭu`4nVQQr5ﴴ4jSo-N$mk<O& *mfD7\. 0z,Hee}J#%ܡ r=)\;B*jp3DF0ԨݠUR*eJ%os  ɕ$/cFZ2&:Q[jT]@}% 2 L>L0 gӈ$: 1h֤5ڷAN׮HULXǎ.g]5].H X5{6j`ҳ[f.OehėɁ·FVč^ g ^ǡG2EUغl6%iVdlΔC "iSBL)9f݄&L3#Ab>W.[2VD &Q x*uHl 3U1:{Gy kX v6{{Co&D`hs G'@WmXj-D]EQV%Ԓ?QЧ':p'Z{O45n۟h* /,,@xAArrr}N-r"61!ax%s,8D0IJ. NHt@ŀ((Dnjq)سW\,Gz)5C3reP\>MߓU('E)'51;0>,PJy`gР;`9NBM>f$` f%]3+]O}qP$&·c ;.@ej1`u"aл )APc5ioɅ/>OWOكaŻ˱qlݜqm!'W poZT!hAUjHS3#x/eU&½ CbcORJU`hhZ03Ek,5wqU!@=ZFESǯoc0Y Py٦x3lMA3qk-/E|B3*oЃRb#](F Ҳ z/jK֡F[vZтGҌ1TBV %ܢB "h'R8P&ѤDDi2^*گ$-F B [OjB+ňԣ&SS |R5gmfX8VAtj$f"̚mGPZ2U?=ݩ_+NAzu^?vl؟ո盉V"7S=kfOco.{ՊpMkyT;;}ϼ:énj_K<:ͳpㄩ+yq.]aբmis\ޛ?vktZMWjd=5:ސ奜aЃ6DgKI u}6+TbAsxDD>Ca'H8 Z]YE AЊ+*IG sli;!;Rz/쎿9 [þ:x'9-ݍi`h3DLя5DRp=4!G֔Ha Kio10ndw\i]{q4Pݿ.@iǩN9@qE*\fUp$c[P z!vfEΤ4:OjX#ź A!j+h3'e 7uՆ{  zuV$)YBeD@m!DHRԣ%᫤(] 1pXZ>pΞvd%U9D2$ e?DtySq&ˏkh3ցXE#3 dI ;G]X6O+u +j#ӫ~Yx^hk/^5? 3`!ls.@aMm,PuWm~{Z5o-7|} :7/31o(2ߺ3fނjYaj-0YذTeeرv%V; B;9惺#qB,]=/̟>ZYRl_= ?nق`YWEP괡 0J}Ԕpal\yE8w}D$޽G߫nYsp~w5**Q7yK*Ga!W՟s~5#N gtHUعn :C3E`ˊX6g/_JO jeB#p՟{U CTale䳻RwX8\s u->TH&,Z0e /پ-@.sdFm-/:rGRiy7ȐHψ4 e:3+*fNL;4O0W,!B޸+P 0XLf٭έ[P o [Z|{kAT D}:G ^8%PU0ORlPD?!$ Ϭ@0+XĪ*#AHQpI$X#D~΃hh E (gIH yID>) RuQY%?C8 H%Q7wbr<)]ۤ!-щ?A5{/]1||߭Mj~tzO#qPH~mnsq]xNk+qBĵ0楩!a5(ve{BxǕh0Ͽ+/.bB;ڇ)S b5UWUYB}ɸmhԋ|o=7`˶ ls+S^۶)7^@Yl6 X9kq1DZ'ok8窉xkOۉ6`p}}^xvLVL%`۸h~CWP-ڌǮ݋܂)u+[5bC(L#3zylM /\}==& ų͸]X>}uĽw<8lxwhU "FMz UX|s\l~|V{_V+@3۶>܇MrVsf\!w݌sO;,ڂ;F۱)\x ~|c2\7 9 s|k:'!ϔOk8qCBQJy(~i^&MpŋspONkwL xj =H]Cؚ 6a;n?; GM9_ճgѤ5 ~ 2:y֡t5-݀KOi ;TlpKBbwGOo<@!zP["v>r|(] n~W$g_WOy u<:5,9wFb&KTedZf69͔0` WIe=0̃Đؔ$`܋ |/H~,tp" hGκkU9t IuUvN Gd@/diUD@yzFg~?޴ǤB ܰT FeC̆C;T!`5P>ĢN0g85 ` \ŢpLzap I*+Jʓc\<**xŀP0LJȂ{s,R6F֕(nԛ_ )""CH ` #` Ht)O.4CW5@1Pa[;eb0QzJm3:LIdHr DYfTMD ǯޙW{1mn'Š}V2Nov͓t `hsڬZg?ml GM(,Ok=|{\^lxuuJ帎_ZGsLj}\w_D7ꭧ'3KlMqQ:?[\7ӊ.?K'@"A3½-m8+jBĨA=U\<-ƥ3qaXj a7JG#iaŃ1s;nTy "gyڜ_qjj.s+<l@^~Ax.xUx*#1>y"{2ib9urØBT_o䪫+PVNᢅxNOCl1Xj28_܃cۓ>' |LyFteٳpٝ1zi x˰1xnF\p'T4+Zř7 ڄ0,8;ƞUAW[xj_~=i;̘ @0 Ç\;a˄=\#D}}.9S&~=o+yx:(|9Wͻ 3kg8 e6zIb}FGz35Q H) eNL8KF„Pzr*:MThzԼgWDtsBo+ Rp"QOP#ˀ,9Wj# D9ʖRò՞T',דO d}hB\<⦡ut߃9i0_@y߇ !NQSR*ju逿*3K߫rؕ}YT|aqjhn|ZBbidz|Dk4!b*zB%}Ѽ@XߺJyIO DZt&;ӲIvAV#WK"3%m S{`VH T Un:;TA .V+`٣<+JT: >Y]U[WvW.;r3YH9}r@i8{,K忼bIi"W, ˔g~&$YmV-'8;r#ч0Hl:)%(ʧ|ҽF $'|۷?e AlMY&q߃nJE<h #g 9kݻ]ށ,:`5h`M (#~R8)͎Up0cqSjCqt@ /-֖h_Rd ܞX:L ,B~B&3Ponj5jߺ+lLc} z͟1Ԏ]n\<~UʴKNHEE`VU=_}6\![bɸPh[n;Yő+N+k)Ai./euٰ)6ґ'~02#љʱڂyr MBDcC6cČ>S"9C 3Q72'Z f>gtcF#f!Pz ZbfUM )YMfI$$s|ٹ2-|B&!d=7̓ġX)'K1fS.PT9P*IxFʄ)Dmz~Qo#gZ`څh9i8Y=[yޮĜypD-348}Nx g.@~[~?)Yqho+_ͺk,0+ψ]î|?.Wb6 A!nm0jfmTZAr{>#%ɄqҺS^>Pz(A?dʃbܹH}I5REIF\J7!%~eL@odLw_F@ nF ŌrVn:קǸi𞇒 7qLYʙ;\\tH/j>tnǯ8CZOzc|)ª+`OF nţuF'$ZUסF}&"hm{ߙysfb`PvK{jv4XW}X }xp_)C9V&UQXS V¬7[ϓpJ,m_yGǂ*GD Zts 6]xEtZ[=AS,AZ^ jW|pX;\uW_[kYO*X-P\ٵFq4ĩםDecq/c930w)v pL֫vq`UO{պ.,ZO6?BQU.YͩIʸ-Âb՚\,\ebڔ{Iᯫ͹a.> 'nT K\n:(){ݨTi$AW_ 5{շ,xrtA&^|sԙT_' SO&KOw߯{ƥ(k9wd1A<ΙK심q%\Ϭ$/>F ˀRjx^|IdQ k1z5rlʲIˀ+#-aP$j("oV ʺ."R!h"'og%e2 '%"22BREhIQqA,I$c#-$,ke2̙4I1a¹X)ǑQ7L=Rw ܊^]FQ^1]t n=ӪIUbӮFypujS.΅n#/éumgAFFW~hތ|32ƍ|'pcyIo1h##”]sD(%zUoO" f p ejN% yAn,2Y',$l(ڪwT@#WuGT'\sks8C-zBNXlwl< (Ć+5m_|y ^X[pU+G{㦳a~t]2l08оu:z 6Ch4/ggt!Ǚ(^)|s7.= >t1u ۷oco1P|l~;CjT >g^Ѧٸetk\7b0:c4r-Шfr@ 8yMó@3lz>kbc9׶@㲳F`Y):Ԥ!6ũDRbaI΀.092 ~:&:Pâe_|YG0{,=Ł&Znu@M@ vƨy? ~y \|9z*7miOFp,;cy)ړS戺OŨu&վ3G8:(/ 6#⬑shm?™'tA}hsgǝtpr̖NdZH}xf͒0qrm}cDD4݊g|z"bv\b=Iw QL7ŔgG*ka0{g3: hr7q GzZ3;4JF >O:],;CT$eYa;2r?Q#B\:ʆŒw 32zʄwh)`{kd$rRTreu< IH4{n.P5!upA~̥QpDW3LN"W&0 46Y_aCwS7+Kqɸkp)<>y >ۍIВSp9)5t&3z ;Ɣɓ#kwN۱1f؆5$ 9C+_~f-ZY_"eSJ!}I%cI1mCDh''9(DȨ0|% 'wFAJDtnpYD.3hPrn S!3VZRbL^ϞJTnF>v1o))׮)G͚4Jӫo[ -G0?PYJL\Zvq;HZ}Z{qzG ۝t*îu-h`Om)GnI-ҳ$ΦeU9Rz}Ѣe+蓞Z_-VS}(+=.Hf"Y6ZL@Ui1%!hKF˦ (DlbL *HhI- #U:UKM߷ukPUۋ2N*1 k*dz[{rIQfvڋù9R1۵)n!j T-XV 72 jS@c%~a-~((ң"Y^Ŏn#wδL4S)ToGJ>'Sm?feܲ55LSX)ka@u.313x XbP 7lF fK2>jOHA4/먕>QmUQC%%5A桱TWkBZjnWU-*dSK'~w(Z:/pMZ =&:u/))A||y~zjgϞ֭C۶mx{<TWWm~+++a6j.C4Pmc<C cB7"!Dɴi5Hю%cz&Đm!1W$jUOʔqWX&ZںCB z3vNgf9.K/YWQZFNW(-9$ NE}FH1Մg`M`зύN3Mf{7u~c+U:j<i}*oT"8.Ll;P3WojΙgLnn…Υoq艨>RXARZQˬ{W TT{1e7Pd7S+n>|f̃^/=UжHtmv-;~Ɨ 6|/vQ#f’Y llN:Xşק΁;)t=ljs,-W=%liܸER ș)@Yy~Hq=3TJbJȂHM JkVV1U2r)/-ʲ v >-I5ܚTb<9{f[^0Fp~|nee1G-غlwo+xWroË_z~0hg]=ވ$⹱}q˫n59mlh,;TόNtY[>'dII\KT,3~C]9 , H>& $ ST) S=pʀ&{W08寝6Ha!r;1RyA`!+IH@ 1ZdY""hݺzsDJPu*>uJeA&-B20 2|<;F~iA|& q{aȩm:\]NǸ[ĸ`{ N?R&0]B۞zúBRp'>8v +jl`&|M0pcp˃SRrlԪ-Ay8 d*b`'Y`%4.J&l_&EϞ®AjGF kI!gk_΃RJ|Kл/ADv@S*{DY[P@`9̳5Lk#%PFw`S{4+YMbl*&qY'psWkk6W-^6n{a{`Dx` kcnl)V|_+}d\; DŽD.nStzxqKO oEa텈I"%ѵ/rҜ(;UaP(ض/8 :kF1eY;qqV+t{?[µ~KSڛoDv݄Rܝ)D)v,k+;[ǡ} =xaʻp3q˄LW#[֕c c"1~ظ ߍ{ ?>g$FJ_޹bR.ΡRyw|%C3v,8Ð%`pV2gNgI>LDw>$0T$+/w S$ Ԩ4!9O$*ej2DO4(>PWQ0ʮM}㊟P GRWp8{9,XjTYϣa8OOT/MeVDYIo1ǰ!~X0%4Ff2[*݃>g Av݋_Ev+ǵHfAvPY Y҈~pscߔB\oLY"3%2{t@k2 nEvd[vʄC8>Izteȏ??tZw/a7w"{A|n ei(`sPF%b˫][P!ݛ;Ne(`":!"z 31F?j?4R8Ĕo 3qi&x͈o#z~ϘP\}y$ԯzՂ=l%Gɻ&4I4+sC=6O|س}5׹X sW|=Xg "& 6Ż͈ x&8f,CXo{1qqZMN8- 5VŪVTm7PiGшV10T?ժ2Q A=D|*!$WM•`S pbKf%T0h~.xؠAAk3e!5 $  m %6SkKl$xM$.|!u(#bІJ5%&*m M*2Ը07=t{HMKMxp89Zf_89U%=ʄxpZ8/? 6C;ea,7Y8rx-}c|PP@{,!)kbOT! /t};,LIL92KYo,$&i,0=]i6ߓʗrdB$LrcƅDD@iE A%㸹Mw^̚Ơ6>iv6$(ہX݂ѥCkM$&. OHQ&5B ¡|N+1q xjDķXybUeS`&찛eߖcy3 w& esMA 1Z#Y97*}ټy">vN^p$>{sD=Iu?<J7" "*HQb}Q4""" B- fl̝Q__'̝;ί#?Jv RK t=q]g/g; 3dD/{raJb(4OQq朗#m zl$:ŘPd"^_z'FRVbʻ~¨BKNw7qAƝaI8 z~G h;'AJwFSdI/itg̪hP; C:*iDUsZqx&:1Qa2\ c8)]Df^AYrox}MnQ`Γz$ʶI8Qe-(Z%*O֭$苀 'rнY>PJA|%6~5kv_jmin :w E=P#R9ЬM{DEVǃ|^;{m栚ͭzhPk|0}qʯ>BhƶG^/~ܺ17 O>!={AC C`U9v"&>(ݯ]1z6|q| ΍”л2bGExڑA-ѠT[6 }F*^h&[h$n/j;q为`@1Ssի@ |jPjK^qXJ.Q^nZPF.EY0[Uj'(pke1erY p)EdojuJ6V | vBB)4 *' #*{Mjj9u\g\s:u0Z\rJUJ$)^{BYZ\KB H;ݳЮN;]zCw. kvdvꍜ3W}ŽEͨp\LqapH؂ūW^>mǠN𷚩./1 njSB0 Ns:]7 zK ̝Ah&eggu@R(-YP A=lat;7y'ѯY5 )7`<Oग़JPp[0c%pA ^L1(KNQ`=p%. ]PNWCWs~5a+[b1^ykjGo~oz9w^s(gϽ{wU076s>ǰ?b =O|krﱏMC63=~}.QmoAՀz闸XרQ}1Nm|L>M\:2Ln&An,r{xr1cʽMc)n6)ȼʵYa . ̣'|9RdG2?c>g \aQ",d#T*AQJYŦܒۯQ TD* ?r_jP}{2Py6 u+Q"'Ìэ4D;pjrmS @MW5:a{EWQ|g@toKyE@Paw nQ޼"Pqk0zp5x`?3>_ wF6iP?=4A⾂E ~A#1q2mčV8*@DVڤ৯cNA*qzj )ؼlr W&).%/L*[FPnD*s~T҄ND V^ݛC uٗUi[W ;/khTp*"1%7J`kP}Zl:x nH6~贚ϭ=2 m l7~U"n鿢MBFzcUoe؈ aa=!IV^v kTe9潁|oDH, _+S=RQG^TE*<7D~-S aٺnђG-oUq8>ŋCsemk~[DbথCKoU=k_Kߓ/QyoLƺ (KÙ psaᗣfކ/.Dˉ'p@87Lm9RA.;,AEX<8f)Cv>z{ӻ r;zG팋'ex1 >7;I#7i?;Jrp R-& J( 4yM1$x, 3F("TIj>]C ROMdb&2qfAW]}~%OI vjTdk /?/ޛ0}Um#eG|L}'rp< 99=˴:Qv#6nNH`0 HpLxvnۢF?>>ZIvԎ0! #+/5#τw'#yJzSK+Kp4FI4 U"nFL0i5ph 00z ]MÕc :\pQcWnoWs8=S.e9 Yr$WdA` fS}iC.=lނ7nE_ (<&MsDf|+?"Ap p*S`۪5S6TrujCRL&pԩ= >_ܛrQ+نy=,'w#95ou8{dl~]:\?3Joo=Eغܦo;2q|!s\W?z!2jܴ1W\@c&RBh]Ue\t>]`ނݖpt)܂ Cƹ@m pgG'iN4:r+S*%@ԑY1\2VqTE~ /v f0A.^DOU jv“P&80eɢqËg ;n/+fx3Q;.]V j#1u=d%_ǵא=?&7&9ƍ帝8u%>84ʨa^~]|4T/ڇ7'OצۍqIXl-Z=uF#Lq@OS%+f6HQ%(?7,t0qQR;D7y\V3C9OrČMuԚܔ &FdWGY3eUwu,Vdl \o4rS9T*Ѽ1&9ᐑNHqKG߮X)wshfwzT\.M&iWK,Exb.K}੻aT$\ˡ\#WddP_陸TnBٲ~($zV |T''2i\:n "8,\z.'n_ef+X8k ^K7SPlZ%:"3ovB_}M/ W5[|fCEqXyt&ABW̙ CIRnP=8_>ƭHW Y4V> kvvhUWS_KEB?ڴn -4ޛ>oS]hٶew`/˱q,[{N[uY|u|#2~"8ZSO9~).#X~܁QO.<>),{$4F(߹ :wNƊ ѹo7hpyx٩8v=)Wa?38q6f-ٌ5дA3.cw/PCO4 7z?>,] wh3jT|^ڳXбiMY%~M4Cl5[)θQIx5N^p.\w-- O>џ(]?O^{>^ҢkpOu`ʌoE V<7x$.]::CXv p4WÚصs 27ݷq>c㫏&by8ULkgӆ}[:;dGAz I~„ 0W(m'b_HtA0QފM7ێ"c u0XK4`ö\t/7&3PϋAIID 'n~elJTĵ=-- p4IK>Vao~xN&ϯB]TT,9BBZFcB3=n5e0KINg =LLf؄cz/A1[`%/=,TIPQd"iMLBՆgpq9+%,+%Ng$nˉp._OAœ8p.s^;̜R5:-ܝ:u\b5HO%2*ۼ2UDVo.xb9a@r>clT_E|u8s]yLP'aL©W1 :d eɬ!M`q_J5ѯ Ƥp"BCbX:X6;b)*FIS].\X<ނUI]lBH4Cd.ڀ#&U_0ʳ,|}QKgLYoN’&XtV׸38q`VKkҔ7@RN#(y: ~k.B!O VXݣ#`''ư޺4m34O7JCc7W.+ĴF1h4fZb\7HR2߬͊ (>c 4Y~,[| MVhV-[!̷q壏pz7=zΙpuХEQ<=j,CGoW/LBxwޯHw[~/f xq:[FXd:o M'j+gƍAa'+O_/W5Y bĉxeٜ`,Y 5F`ϑ]Ib߯<Ņ%_-ڏaϐ}|mϜp%j(^?󦾋-Gb1m9 vNe>ڡnYWq*1M3&a3bɵ&|l8@yp'`ΫSTat}u&pB)ͯи,,~Il|q6Duhuh}33느ti?G8sj^y=Tt'-Ŕo`Ƣ[5:d 7KIxKyZ5==ȆF.M^'bgPΦCPE#*i d R[&PN񱩌DYc8 . ؂UH*Rp>*n9oG^Ed4ehdx˦ᲘHTĐ8[9Hf>zɌ< ܅F$lC#g}<$+¹-Ƕ}_}{F,+&n+Qm:q} X6wohU+ 25鈿q@:>u3~ݳέt[M4w~؎9Aҍ($HDxX@CԘEMK[3;J{a -aΗyN8ײ3Bg =>zZOZ=01A͢4Zöcx5& xǎ@TI=,% ,s^ЏpӪ3"B員>OQѭinQC08[2qQ7?C0tԲDѬEet2 RJN IYfh (JͤF @. JOpemTf倎Mxz<{[PG Tp%H_urpQ,B`p' #5J0l"2&f5[ڬ:/s~mDG88em}bCxrc/jz99 WGOJ:ǑgC4qWV"WIZl4i ;zt5Z! -s-ʺ;^^| Mqws401o]4 .ma0Bϫ5O>Üo_mEǮ&zM8t>ȉN"3:M~ pR|wÄq "V8Ljs#^x=ՅQ@ʩl}b F’vK^>7 W|goQC榸~R:γ?wNp'j P)D&ʌ h7QjpT%AuAy o}H:=yބa|* d(E&K[3A8,G|{^&ːG$1{iIܭMԘZHAƎ裕*wQH+`]8{5[dFI)yFh0Li5֪&WŔ8w\GEpcW[a F?ljQ.2G1Ms4 (x%/9%(4YԂX|7q91Y 0+~KQbS&=fg{dyn9fH5k9=# ,fgW4Yt}}d}oc[cpB(<:u0_;-;/?#`!ԒG5F_ Q:bk=nJspzz}3\a52OƸSg%?\*y/'=D]?ʩWA^Xya6MMVFH &J /RYLBEN~ʾaHVbTa%ċFe*ppJ){A#Yvv|'9)PN֥4dBY ^ x5+Uj9\.wcXh=L</Lz q5_u}k]:bAnhlgSFb cַq U?!YoiS_lG]1١_@V b!I3`0}{6 ,T}ny ^8yc0oRe %/0%޹T#uM= ( (zDfvK*2V<(D1o8_nDm6# $qMHn%!=ZրI/KN?'rl) rt MhR/zN-IBg3PlU0*bi4+i-}6ѱFfƌQ "zud^B毕ٓ3A9Ӫ;jթzplVRa/z臘-i؄ZэѲE+T 3Ht@t{i)+@r-DXԨAg_ZBН_p\= #S<`m]{tFc{T.իBh틣' 0#Foa1v͛4A5ZZ _p` jUt1{bBȨ)(BlU[| ` K#} SԼ)W-ocz(zжE,Zn?cD0>A>waQ^K/JVG ZJض %]̠Vc]r11m -|cg֠9֬#&hд Y~nXa hQ3dpoހ[$Np"$8TjƬ" DNQGT۶(5nj)<7֟;ÕhץƾD.$bOY*:L8q y1*1 @;WFR5Qb(|)ׄU]SD2VS`(&b#TH1k2m dh´CHdur5 ]hnٟ ы"󢢕zpe A7 [V@zZK$q۷\!5v;Ơ,,vh-HIOAl:q#Ъ Y~h8FTxݩ)ZWNҵ$$&$!)1^EH? ]#3't$"M `,jIdlп>4toe{'i JLE%8Mz|*; kN cc|#ƍ5@ѶY>ayY\? fNĆֺh)D.-b.?Atvv6uN"֔◥`\ǏGLL &ĩSϴywEަMXV GJoPPP ;""Bjk 55 "?CttMj\9bVIAJ BavNΟk!tH;|}3;^qx8,y:FR./RCdJRߎ#ƈ:B|fm/ܡQ7Ўy!Y [2>3y C;E‰8d4ooؖ;[a/cسʔpS#ͣqs= x8x/Sqr sb^/˒8E\[}e}E8eŸߛ#nom+ךr'7"1[TidN|V4tX)A J]@[0eݚl$ED `MMD-3L.H J:ZG` 2bbI̅(qj7h0<&ؚSy9ـoB|7zQ~4~s9f>DZ)E,2@/Yw _Vo]P(b(a|pu.Q@I꫈8NE'<\@ZF9~si)Mh^WoTJ26h*@HIܒwֿ5C\ʹ 3Ss:Gڏ #vl ~݅]G9nK hWvU% q_rZGєcUkZmQM$0@ei¬\O=M-8=:\Rrwc}j j ܎8 '-Asjr٠T9\\.%x[NxXLǭF<Վփ@ wBc4"#] />$둛A"KbQC /3 kFÍ;FW>}m$`ƬС[#_2{WNCxH_5WEUysA! ܦ3E9\y7r^ CTg>U3Fݥ\<7[~^񦀙pn pW*wB+v\pk䐷*H[2Ԯ{jt$| @\@N{ϦⅡmhXt:XlVpQ3W M>^Fv`Ղ%1iԺI&\ɅܼkbT0K[Oc֤/䢥h_~`xW8טΈЏN7t+~^j |m؝~3WSбm>?Gd e48R%X7Q@~"8~n N'͉ef$Ԑ.$rK,K1Il{M_KKuBmht-;fv )dIo&ƴ{ . 6Wt^ "kD"Dj5:n%Dplӯ MTkt.~f+ ЇaeREXv`_G3Nwp;,RxXߍtm:%Aᯡnp$(BLAR ,BDL78x97 {Ֆef(ج镜4MPJ/)R|9q\ H:൉-Meh FJJr蟾SS*_T|t8Å3{v`īb=0tňA}A.;@ B q-B8PlA1>е!R=X ; G$W&OUdlפ=xo/$EuG IXמ0S .&p2+ޢ~#螀҈-ḷJyiqX+_BPJzcԿ 79rV޷y/{]Lm7ǙySymwew|e*6wMpgt WR*GFf-׈]LII?bƷ@?V s16 )֖wS(% Jsoe/9AԐQQ"Ƀ? &ѝ1T~&sa,!aJj @JǏ|-%p|!)dC@jڲe[}5Xw />ٽmK_mCC~-&@ u pk4]Wv./vӌ߯l@FQs0`g|90-)W:lbDwmXQ?^6~Q];`~Yq6< 3&׏F5)$yx!_Cs 8qnxgzRQ30Οt>w55i轗GHmL B^2V|ͦ>U?iy5ܛ[(d q'Q{,<1sm7m O;eiEt{20>jL{I6LԲuL!$*2론a@"aQ"$CxQ LS1Nr9h'=N0Au9sp8A%H8ڦPk w8#\Qè-'d-mߗ߻:iuȞalO(~p5.-m>lsQ`m &Gz x]8z)KbYk!EJxJBટcg$%`D\L{~!a+7zWFЫWo C'/@n ?r __PNqgf|Y}}]iHٿ aͺXa $ž2<~5S1'ƨY8OoG;>xd}> A#?]MϿǕap.vx9>ۿ3o(=^~Q<5vI BE]ޏ>$}cl\9Ǐ+⎶0 "?r/_z_oF~P©qt<~/7|"m{bwS]\~D΅xQ:=30r(_&|ud|6i,3 ϤW`+xvxؗ-~+&=Ek?i o8u%xoh0iI0!{L$ B6h = þ|cQ`m0>ZWJx <Є6cx!x1aIa}g+1l\Qb!O#G*7OaCpϐq=ð<}F ֋c wW1{\Z@HRlA0g)eAMqlݜf W>0EDY=k^T_UWX1DWq RGR[wWZ+)9~#c&ք-:=N ҝNN_;)ۧ/ fS qG0KJ ϡ{qeq4(3֜[ DA~<ƶ+96}5&݇p0).gGv6KN~e+4lN mj6am4gaN\<;ux#ל&MJϓQ$O\3Gs"pF{l p[zX2li8ma˟@8dۄM ȫq pVU`%bc Gt.:M7/MVĢěDU1ig3|辶_|C2`2ޞ5~ݼ2[ 6,ąs?{",YV>Ņ;|z_ߏKF݈}xo櫘>m">_NQ`d\&KtǰPt(^ Dr' *+W3dGS uɥИ,)nTZ 9C\R=V jvԙ2'78stP[VSOf '\BO3 U2kpkrl.:,R/KbKx7ۡ1M]WJSGr0TiNZןؼc'?Rs}V#z-k5a϶%x}2 ش}>! oLEIp+~F~w>OCz[es018j;vH2~HJKh ,c˗ .2w7끈ZG9nz_Q,9ψ PL8=YS*)*4,, AriKIv'B6?II؝vÛaPh]5z~1}ѹv'z d bF=w'#-FˈyUR׷OcM"QSt ~ tQZwm?jb#bRWпa??tjnZ(1B>-$^[#+V\/Y$C:ѻ~OdgA/M⛓pA LjtۊavKFX rS>vJ174+0`5\g9jɝLZ\ GM!QuC9R"A,b-MYng/OvOgc*'&Z)6cAhy=f [׈-pA-=|.(Ƥ\TuO*G '.jvKF DAuX|b4]6w-Ẑ 6Jm4U߂ F#0v4qshJDK3t¿]ԯ"4G:Qz(7 nxd`Gm#v9^x}3hEbJ0ׁ}rz@R8Np>8Z\9 5nTҶV2ػ{^YXXXzA@{/-hƆ K,%ƚD&11)EHa]XN/{bb!:7AywwrӣSN{Zga+)^cO %Wc/']Wކy%蕟bt9py+QܭRD{ozKIGT_wD? ߻>8jw#ꊫENw@aaciW[1bM>CP5v/MkW_s */r|T"aS} v"\#t+~MhL"}0~D|xN> =x~ _7#{qKKѩapbihY,^k ~x-^N\t ,\ބEƱxy9; $x*u`|Yxkm[wOS?ڼe83з=Ƨニ\6,27>d7<9]9[}#ѥ8\~ 8-2Cz+8]z=Amai(9\H,Ĺ"G̾B{P 3N?L`pbD[E!g6J8K2gV,GV#%gC;~ u_i 6Slk,az4~\hÍgcro?v.jN\2b#?{OQۼ׈$zx܅<Ām\5DWrh~~Ryyx\j`݅@4oD;q&-w4mXq{`/QhT}m;zXtirSEqfSIS)iʴ/Vo\w7~Yie_"nzz>xxɻ1SB6]7Gļ41GP n¢G߯ W>-bP=w\t-,U i\sy6aH(g}~R{ oʣWOfF 9gEV%ܼfZQ_/xd^9ӊu");Qb>+G㕟^ơK~>8uWO~>&μI3`׊qGq]`ɼ{q秃pܐnp`Q>z,vlKW_'ǘi5;sKPQDE[<6|~+( ƐSR gn4$k"KpAKu1qvюe*nĚuk}"d)j.#렉uP8Slb !Dź:<kڭ<eq'ᖏq"יQ#0m{.0R~p7mVQOTkn{S9]+b\aϟEUAy~ٟ/< [7k_¿ֿ;{m kD/hSOVo{>A}7xXG&C0bD {]7H.׃fϜ?^K |\rO e+#Dr&Jsk}GI[ڣR%bz є0NLHᵂ_E[.JFu%(L Q&rVJ;ߊ#DEM RS"U["E١bӉ"o:NK%;`ˇtz;16V}Mv/ՆB(Ud`}[KpMGcǼ1[1̤~Zl0a0y:f/>"ӈ'#&\+jfb0pD_Մѱ?DqI;G>_qU7Cų!hb !J#;reE,X(&93z'N(y=4g_Ğb#u׻ɸ>xwy>\cFU2CG 'Ob+.߻i\Z]߃{zWc;ۀ)(,膮ㆢt9θ7686wr E=_6wz4,W?X]MO3jcؘDYn;O9g`X50zpF!L 3-K l6Z6 7 ?;Dҿ/c y/.a7 c/CY ac;cM`Y#:iO+?#rqߑLJF g>r%c~h0:TAeT9ԁwI/`yxukp]ll*bgVVQQZ-wfqk1.qC~P)2x{8}b@+F`o/ DRmX>やLj:cTxiղ݋pӱÞ=ƚ\Pb3/cw% )sXxnp̈́kP]T7i0;=K~i9&ӼY@Q`PE$s4SHeZ)DetB.o=R3 ֬I 5c%[("D&K}f.IQ$SMQDrEtp U{G,ƣE<AvU#~NۏꡳpaqGAkly1b4x}'Mx.=bbRw/bٵ&b|r=ȱu^T<?-ڸD샙{)Fe 5+YlrDAED}1̈́ [n?TY |5R.^3;50 /蠠j8DqH H30[[L(F4%b#0Sߴ [G#Dz!j_ٍ{_t_>A{~jaz{Uc(tÀq>|Su4JX5|O0~@,-Դ`܄hڽKw;ڰfg(4ݼx7Qa0GmX tȌjmECM΀@=y=f{1vmAa>(bcSң'̨_mtg[8 **л{IjWBCІ~SÑ:3Ǽ_ 3VEnEAמ(ذj JEyabtw~bأAۼozu-Ŗag "ѩY.fXm?z,6Tn=Pk7W I6QlZ=J\S-|Yۖ#‰'Rt6.G|z˯3cGUU%z (Ž݄>Cgߊx~'w-.7^ks݇b(;[6Х'VZ.U=QMx?xJ(1l|iϜ7kT8ƲeЧOB!u5|[/J5QĒ4Ƈ FU}*#v#e͂t:>qz>b@ɐAs;6hs~.H^~vH';V6]?̎"p1m9dZ4F;6ƾA 97]3 KH%ޗyRf<8kzyq,k6W\19b}hA>Grʹ{|\6V{ŸC9/)5|M|;aM'nr&~\8gއ *::z.[)Ul+à'ԣcQ"FOtpx /}Iw_aug?pix.Vқſ PvlG Eھh Ӏ[^ЏIX|@V#:42fʹV=@f q XkPv3赋nh(0̿ch.@028XF?ŁTwf/@;taOK'. 1.chBӐ{#5G w=OO^}`uؿ\0LAP-<_.f)tYpk=ؾ£ ŘݾS]wL{)WeefW;4ÚWkEĿ7jpsǻx{0:'а} h9-Kؘ}yDN1.UU1Ih["/Ta!ŭK"}ZT;HiL6#%B0+Kp.iٹDc2Hq0D0 G)RUehHX/=YXY}nsbeR]̝z#1۷O--z%/BӅDRl[XX[ "ת*HyaGLˉRqyͨZ2UHgbWf9Dձ&=۲AI,`jOM HrEuL[" ֽ0x2^D!~aA4Cԍ~[oXo8fUîAMk=_K#z^[+_+ak:G' fGeI^$REN~73Fv/.@/- vg"q?Ќ8_#|Tr{6z 輍KOFffkVwoÃw/dNk΃@5)㹥\~]y~8^z㳯E\|_;2Xgon/z/>"Z<0k{o缭xk߾V 89&d ^aMHQ5Gcr.lA]$ fNiu]'iB5bCSm2e@8ok7x8JE-62\/%~.SZ*+pxyk:=ICe"D#BmYUc ]&D1o"ќYWYBz"r ,K|*SGMvUWB[) aD{ /hDiq1<j(̣ʼn'}Ww8>^r_SN8 v&<4 ;Gz9;c:ncőGygw߉6݉y-?Bͮ?;\pp:ٿi-(p 5mp;<y0ָK+DvJ;U_Ȥ㡹 /) sQXIBi|D|<\fi*.4:ҀHDJNe-:$i= %NleKA8{q8ciq⑏CiN)tpm{g4 7>WWlG1Я2YLX{h*aM8 9+;oz}(r_toV1gG)7G>#h9p)-& TWxQx|Q5{PحG,zC0q(OQV| ;idL]|9yo{Cؾ}NؾFT#ujV6 Mo[w:2?kΞYcNGa1h@ASW Mz`'K,cc؃>C~Q>Š-`vrobN"4s*JԷ4҄%֠DLXJqobL> UG FHf㳅 Pȩ3QDц;۞ZN(c]u@d{DbJd^0\G-jئ =42 3E('#tl 8I} MѦD$>ɸA%іÀ,2C]kA7rVOw/N7;T[@ ~ʱư2 ,se.*B՞ZJ~SniȪP`!vJp)V58{蕩,Զ kf{/{kƍ4 ] Ufw˟DذCƢSrD- wnʨ ~~pՆd᛿GbkKr6xcc1n†8{wٜhhlV{NOV\:fGk@= G *y`@y_tYkFNuN듪4h>o+薳D4\ SJJ1!("TQ* T;d,1UzőeuBӖ12GRw3Lb੮Ҹ GP31P~īѻS_DžId @DcޏԸF0]P8 އ߿ 0|0ly |f?/#h wDQ^V*I}-XV.oԧ n--f0Ž]s8qw\c,_Oͩ3g܀I%/n:Ż0|{h;j0 0}\} 1f{^vB:|ͰUUbZb΍pٽ8om,sK;O'AR= ގK!C{?>6gc -qM:O]ŕ-'kOXcld1(Oo5>g^>݁yb|c&.\9?jvo =!zLN?FnIt5 ?ƶ7n X7rֽ%^q"<uG'މш4om\5nކWVVvO_9(5:?v8 ^Ǥ{f.A-RVW>D7go)<6Baq Cdž܇%|JO+6.ŏ'\pg_r+sqnv?'?{-~~wg?ߌ\_/oIK݊" _z+%={F ~zp~x3?7N=U}F/2xxj +S~{aà1@ŋ /ןu=.=&HT/|w DUH@>T?^(kDN!}" DUiD $i5% !j@9e AϒnyE sGqzt+߰A" A<Yi~d^*dIvzM"\CϰD Ub앎I#YG(P0"{N+f*hH(тsHwq`+ ۍ\?``eg[oa˺s c?q׼M˟ 'rd?>p*tlhjkw| w?Ư}i<xv`3yο 7vwW߀E{8]$i<\TKc@T³@U(N% f &= ?6=sD hGYD%l b SDuZdZ*NpYޭB.=RX N9A@<֌n3АvǗsxP{hhHt aN/e?>BkdؗRx/]9'>݀a.lj]65cDۆS1T! 1q_O60,ʾӄ܈~hDZGYeg*OF)e7aJL¼?xL1>t7vggOCrPϼWba_)]1o;F2] qt}M!t~~ob0>\1gND ケ A3NW*ŬblN D81md4xܬo:,{ paZ:54zS1k}Y >*1 E9Wqȣѿn̋jb ڷs B6eWUUy۴x~>242 a A% `!mj =ش&m IKS:hL5DܯʵT8Z*P(xnX"3ڸd,OwL<mƩO2bJV)-w* (2^tFhhG' bwkORNnwoS^nӲlv~|#y5N/IT(?eO ($e;*>Dvv\ZbZ3ŖzpCRMC!D*JNqJLNFX!iΜ1܈:%C# pSR 4)A_sRmƹ =q^qw {f(y Խg̉u=NͲA-(b3UcYfsi(hVLڅps4p+հ;:?ym(N=b ~~d GÆ\bT Ǘ,mX}@ ŽtNE0'NjXď#rs<'^PEXB>qz?q-q.`(Ha2" 0 a0}.{=`wA\q(Vn'$6Qwf1cd?3dƞ_5>ca.U~fʾ&@76~nvg"׃X0l cx?Cqw 6<u ;v= '^drlٹ"[q6'nG#[ u-K^Tw7pS00b8.}뭊5Qؿt>AN3^()u ɲÇ*BfLQ-A\~1X)WwnNJ-0oZ6x!#2$B}tJ? 2)OaD MG!'18S y334~K2ǂƍdxH ycѤc6PkM'7|Y#3N]~x(uoqJv~R_8Ac\>>јa $:͎%{H7}m6ECsHRٱ$; Y[j}Fwp0}8yHn,h_c!֐1|K+ ډ`dq'ԟ #uXr:¾t?cEɓWaS09q6Ai s mNq?t6 3C7"ɐڞI D#GFm1ـRgvq] 8qP&jY~%㚪JӯHw1xŞ\;\؟?@' <H ,P5fts2>B5H5,ЦGM%AD@ <&2>P*(yCH~b~x<9sz|/#HE%u@qxmTNjzjlݽ٨mDZvXF_\rcЧO_lܸNrU(BĖ K:UDм(Mº'%!]FeЫr 2],f=)bbUɓfO1u*T,E.3bk5X՞˦qӿ׿޻٬AL: c%ыҧ`BjljN025bl¦yv#€]Чk.޾9(Ϝ^&y|>[y_18O5].ڂ}ˍL |N vH4E_3:'$[Zmٖmtf!ub\X2DP2d#ɰO؁iќ:iLd<Hq:OAKW*0&n)l%QLI[I1 )Pg8< = WP]8KȼR,D#t Ӝ>[ :L%ƈ*Dڤ4VʭQ%JfP"~*RpQՃ I'")tw_Gjeyqx\|9]1e =t5`1^ל巨.#Gϴ'dGSd[gW<֨sRl̔' П\2/A*C <*TSJ*S9)(r p̻~vw`zEΨkۋ!pe4ĉRC;qOH9AmN1z\m?&^'6<{7#?%~O{GGnFJc ݬ2.(5lBe[uө&Z2LP@Vf v`$s}%є|{W*_ dU.PB?}Y +ӑ1"CL<Æ\WAGm]R~e݌Kv+ɚR9b Zwz471PNW1TKP jK[Am2VVbɧo q v)1M3#vPN$L;/immşn QҕNOjHĚs)Z t-Q{UTBU'DPOPWA5l}vIݜR2Yu9 Rj A Ҽ*B9"/OgrDb~"<^w޳]>dP{^CDw:Žq)C+0G~-pbŦz亾>pɴ]{FfXsrBb;Qd7ӳ-۲-J"ӱ33 JFYJĈhd(Y#V4d$ф(m"PH]㬨QV(Κ T4Lflc lFi8ZؒF&]"S*Iq0rHHE%Fo⽩Hk+bxgV֟ E;D/>hy&I(@=pay;sNWu kByD'Jۋ꭪Wd7U7&~/ET.ݡ:)BuƏM5ġVRGUUqĚ3^Qʛ߳ ƱWc̎])HKsUy;NPQֈ'mo 3ڿ4R}OB7Znc9U4 п.; ̳-۲ LrpTSf2%c(ec4G>͵R)t Jhia2 ejϪ|ΤQf.{Z}!-:~Qj\g/խNF*#1m4zMqjfD&|JPțb iXD"1UUҒ'5bi<+#1hIuD[s ї2\V-..43)UNYoI@j0o5JgJ&gUZf6o_#TSf @ PPCt( ij%6͎6wRtjhjQ1S׭`RQ(%U@ i8f!=Req,'Z[Hk_c?ro }˺lyo/َ HLݏTs #"dcg[e!WP  :I36* <Z.[e#M8d6Fn*U"H4b4Zp ȢZE chԩĔ 0WFv9'L$q [LAbOnP뢎*p,Unf =ERBVTN/O V45h%%j Z71*.1J"8B@(ꞔ2zJR-+Ω>+C$I} t2: AS{֥"j,,Ԁ>LvՍ_Fr)F"ڤ8=h{P9ϬB5NٹG-%>֯5 |+qGݨ=/8p* 韎ZA +7Ü_~ue:_Q`3NO(:v9U]Y;Th$+mٖmvH8$JQ ):eFPɊiR+ӚŘD=0דkC>5A*ht[tnK xkHtHu2hFϡa$"{kd<Ɩ~U=/Q U 8dk|BjR٪yEBo媲R"]2JޓUQJ_ јI&GJ :`PcQ^pBh B*(e58Gg) IaHg SHWЙZJG$T+kFu-s ]+0&:' ɩݢ//"{ԋ"uO4-BBV9_ʀH4wp\c  gfjq⓵uw pMԜgt_u>X9nƾ[Y`ϤtסKY$1Q1vPYuB#mٖmfՒ/ke, 1e6"4i02rB*f/J I^.(Ű&fp6R_Z^~nDB=0O~."m5 nTҷb1-5X["UL%E)ڤb&J ch5Bd[Mg3##ih71@Lf#rNe-8j|5vŠ(:K4F1uDgcv46@l̬_ÜX7g y2jlgČDLٖmٖm8DYΥlR Pճ #_!Sir4K:Y7h)5i[{,Z":mȠ7y?I*ej3rwFYl> iJ*a,D!QJx"k2&R5:u:RT xGV\P-!)o[sGVBUbTƒa!SL92j9<]ݒ)"s!U FOd֨ +f%҆$,KM-DtxqT]Lv$\*eKa~.~/žKtt3LUit|qMu$}~|S)\n/l+Ũ% %~z>j <$ˉN;m؃1}d%~5Y\8C ]dqP0xr|3 xف< 9Dx<1$:c|~RǏe ~&"ڒmٖm&J5▣buSEb1*!eH!D[^N5[,T{uVd5YJbTL]ScJ_UC%/2͆&$n3\HcU…8Ӈ*G2:JpK_&HQ:IGPH|sfAJ/[Q`PQ6` cٱ`aK?-/TbFop,>ԑkA|SH։j̩b.2é(U2Pu)ƹbWqĞʈO%>T q6AY Tu`iPRЕ/)/SME8h][N頧.STpLMo>qb޲Q y!:fՏWma+JӝGyfGP_ZPEno0p.fq1v/?ibbĔGzVN"7ק~]P!mٖm٦~ZDH~R(CIF(UJWҪj b NEӅ(*-TzJA 4SY*S9GJYJQr Joaާjb> 7%3CeQevƩ@DkQݜ2-efϢ&sJ`2DŽ4=T Nj-fU]k5HH?ÑJR]MB6(R&]r3RԎ^肞 G!=7 J|*E ~!eTH()`&.Q~ügʫIjq\czus\B~5E0Jq2Sv;q?@~_BJg(;n Q 0ĥp Wet_*Y_v MK0΀v4 o~af,M 9i3sN{:岿^dw &mkNoڇ7d3}/۲-۲v1V (PH9C':fPHߔR);0Tƛy,ȧٸ'SjU"V"GR4[jE DL$E:@WU9hP0K$c1G0."@+XktM5. 0+f^.K,_̗5 ]#^ڢ*K(s%\wͿó߉=% VE5#EٖmYMHPj5 ] ib*#UZ@$T0Ua &rU(""PbVSЎDC&0 h,NRN4Z8aK2QXVI)D*PTS~PP 4%EdV-YtgXRu=UPUMV!1֔|`(5lr y iBX+h~ވfV[RRmV23sFm'  ]CzÒx#9eBڴs] 2K~1MS,WO1Ĕi{j^թ}':^5' O$N%ئ0yS5OD͍G^ g菲7 }Jsa 8ѱ(H0`fcԓśe؜3=+jw~˸>xBܐ/aWg?~|)Umٖm\W,*)\{J˚P2R$-b5aSK&)SHbk9%MseM2._W #8|mMIeܟy` `|}I2l 7|O߃ZF ց dJ.k߲ѡ"L5>hϕcD,, r{J2ڔmP8>gZ2KmVACH4bTT;4z^P>#;f2fڬ%.* !뜊{.U߯el~Cu@[WNzj~n]كoy z.țWdO'O|SI#^u kw7bZ9O;8[,G.7o/A(BA^+w:9(w6Hp$"ꛂ9m63Θ @Ԉsᅦu4 ك=Z !Tj 'j-۲M98Qʱ47w~:ST:Az$PM4Tah3ttH2k7k.@' (jl b LRH4ܦ9 _c?sA,Yך-{KjpjĨ떌Ea] ٻ@B`Bƣn8ܞ;k|lF= ;b.8|hgca<Kim{QfP<PZ'?}eE_lTVWxؚ;CE,Iwz2#'s0V`Ιs(y=jlmBa65Phȩ%^rѧKlaG4UhM&<>6&m…G5tqO$d؜VF?Vmه+ww:~yH"c] 'A\3c=S5( {G;^ص]  72!Id[e[e["-S? B!0۲-۲-۾&<⛓_TFǢ;oC }o޵I@-8Wh lloBPfD{w7@y'kbh9ː%\63PZcG9xz[-tfwp?ȶ8g[vVTTS4FQ#K. ɞ z72pR,^>گ"+䙏qJ*Pɏ9܌2?}@J[\)'5J S wN46o6wjlJ&;+w;&xHL9$)471]Kov}q"pdB!f4i>$_j]k^O2Ν1-)VIP{D gINb6.{&sq*oenINԟԵRs޾hZJδVR'AM)BG(F.iع|Yalpc;1kl7؉Qs.6N vƼ{ mK$l(xMyy۵)bCkgHa/Re6a}Xi/j4Q@q]! Zae[e[})WӇw KÁy͞}hlJ77~6QGy! E\EvubbNˑqy%HJQ1یkЄ1O?o7 XD ^/\\F>1ƌ߰ O4;*\.xf:̇Vٍ~Od#qu9yyk'x{Iƾmʮ>^K9)of9901 `7p(ck7 P7)WXimd(E˞G,KMl#;5^ci,)MGc&AHYbN?S#m< $)'JJbjn)t$Ε-?'C-dlЧI|tm4ȤH;} O-ǓԐNH̝pQc%'͖X'HG)g%4Gx<ㆣ=맏 fQcOFxE2n^33cpk$v1O8~'C~h<]`Օ=3-wmL1PBȦFIlH$$%AH0b0.mɖmu?3%ل1h"Y?浹s6@¦yݾW9y2S~z)@Lᐃ<ZCj2<lnIbr5 dHƒ[KX)2AUYTIf\p~ҞF.,kvtQ{͛3By<x֐zN?ER)]f2<dEyߴw 8!5NVȑ{NִgߎQWU?;n 6}wI_סq$vhfytoA.gDAwV ە,Q9̓534\Oϐ ǣ0@RhS=kg_p=9\BTɈb9<^P} xm8N#D3 )~GVQsۈ*UGֈ@nͨ ߑ#*GZK]پ}CADvrxozT eBba$ڏ'>0ϫ5Mm(xy>? mUʫMa_QcVS;l0=}_H9j-.H3lD8',ˢoXDsgr >@ιY0^^ ?)նej4taL]9 ⳧ۡ"{\MyW4b=@փ%bɪf,oŊV%Qmm& YkC1t C xStܶs]d &*7q{h*1W1E :K ԣQ6IGcQNbXPH5*ĥ+nCz<<2w(E5'ʸӕuD=CvȖ(8 ZNySLF+sW+@S{gG+Z7c1Hr\~*v K䱭q46wwt!\=UjC+Ġ55pϷ!մQ#!|(O W;-)Uh8IiW}UǪE(blfFZ68[:R\0m>E: ~"`o2l>,2N3`' l f]5j66ՄaBO@T [FDxL=:/KGqS}~T}WSߓ)A&,+X.;9ș@ڠEa }Os@.GA2&ϗ5G_ER" q Qv+Ni ǁq|4:n >cDuiZ#|"1fG#Lr\QmS$RT0O@Uc9,Σ4XڠB'r(!P^+; O ?IZka?u<6BO +0}ja. b !H$ 1}v Q@Bl5n΋"0j#2k#*k"PP+a7;R9Ebոs0es:"`kkˢxXLf:i\A)m(9_ԁW؆g^m omQW^-UKu{{` |CZ;G{{;2 S%6=zzV*}3G)7ywk׮ԩSw|oZ{͘4i!9t:9S?K!H!eJH.zo$[6S(f to[h^+Pӊre|'e*֬2yDm:SSr]Xb pM@ɒBą@D9ס]pl(rߥ_j_+ÿ,SCIY}H*@: 2s< Cln8PO̶^:n2~ފBw~Ezư\䰤}Gs3<4/~14ULD@F1 %6sIveL/R-ՑO%Tf>B_D[B@zƐQԜL%ayBk&9e82 O3Hzϑlz R fX&"G*C.Ҕ~kʸ(M 휟7g.ô؅aKR:lI-:mhi[9}֨>"h[U _QcV"qOsm@뜜!hXƗRP)Ç>}mfK7CCCta)vƌ6+PZ.lIuK@oC/@kyjxح#sΑX˵ `9 ]O#/3(|/V5۰-UQ߅'%LA,RcE.,Y O.وeccso\ZQ}2s HK=FuYdHgg}]MDjm21s6YoKaC@eLxsC!`9`RԖS6)b9a oۂ=1a49oۊiMGaC&B&U[C[eX 8w4c*>^Eya^ѣF+)2Q)]=hmފ}) - wu"7uxT]+@! [ $gN]W&Deӕ Mi|;T'!,W $fΫ&p[p2`{ۢ)L%҅)L#)l*L6\6'y殀`@1-$N=s' i"/x1)HTq R2I⭭s/W=g`CpȜL˵6aYC7fΚ~ï}q,|v9Wۅ76v` R]L2zȩ^ܖA(3] D9"e@ƑG,Mv9*_`e%l+{pеBO| Oc0eLN$սIh@$n˗Ȭ t_OnU0Bh\n*@*eE2ݓ!@ zf'S Qު -%1ʃDc, !Mtm2]ikEE08\( t(#S8b 5Ap{ %"^`息&F~4#<< *Q{ (%Nٚ~Vf]m}/i'o C"_3 ̅ճ22&ʮ&Bnp߭9HK`} p`3#v4Y-6"h޵-9& ׬u-է\YU]a 5N]J`1a`T)CK'Ζ3~?{xz~1 c iYI:>P2@1O`%@ iy8û/O=.}6;ƫkQo4TioRRX&CҚĝO ~>}齸Ƨq3$MI/Vy&Bs[xtxa;2+O}zp ʓїYoQ(y>~gt=TRsu:[`BU 5c%{$ET&L035j8ute[7(NDH_TwGVN _BV|BQw)%@cVBtqMĞS<A5rh Mm{I| 'yvNbbz1A?l3"oyզ;M$jZv%m8 W$o4N!ci&L! #B{Z%B{_4[ƣA+)'lrQ/t:m TKY3GOϴt+C\mJ7O@ݲۤc&I+f$x+8KKIMi|3u[EIKMD$r:=_O?XX9?܅?.FŜuxԻWۅ1?dE։v{OoT&ǿAVz[V|}dR\p1zF"6JZ8eoRbQ[GLq꥟Gksm/܃o+i}^{g+1q oڴuBP=dzj nxO-8p)I [& sYI,hsQ|iPL&z㟯},=d̺,lL]UkS(ٳ碪v (q)u„Z!E,[ 2Lw9(C+O9 (WƿaÆ!֌$eЇ)O3~D :K/Pde o9S S䎔6J[A =QY>a;GRC,nfs@Dۦap8h#WFNĝ=-RŖxFy kIK6[+=K[D sdW:i:_S v1Тt9W8ϜV'fE4c@?1#HhKW2yZ nVrgPuTj݋b{97 /ܶKJ@RДqrف_ uK;$/㈱Etsq 5k[Ei-lO:]zıIAv-* B)!'`eK8q=/]rN1u6zZ O;|(HmpEu%||  nٮ֣cDSHZ"Y6@T{nӆV}GaI5,+GHךWy{7^_] ׷c6V8T%C2{Y*+U0/S<J_GA<#}pǜQԮze8c 8rV%.q 6>}rhW%q_%ɧ܂a̼*wCVDSI}x֭[8ӦM0.LReuuAQh,{I8jDhDq Z"H2I՛+QWy^Lw~?X8 SPӴM[^Y Fy) [+y7Q;ZF\/u-5gÇ l۷oCGGmL{CKZ^D0}.gVIٽ#QhAkț:7݀dLOrI,DTnj6n_rm}GәAz}`wR8~&4f礶 z\@_:=SO,pLRdT_;$)NC+h W3C|ڹ"%a7-K<e9f",_'j1Pj+! _n`xGeò2,"(9y P: KWq½?1[>5\vMޱu9A 8vNa&L#aw jQ҅TT(Kq 2/MP`#B#- *OBo WɥѠy5%C`|PYE `dk~{8 EʳN:y_m_tyZE!y;'8~ӯ`2v+x>bPE/'n&OIbܽ1&u=QD3.( oWAף )`z`TU>",0c\pwL!|phtۀMM-?,EpW˅!wko oSA'IJc>6 1ܥV(vEs+;y=3ZM²ޏ;8 յM}p³xز58аajjQ㖛COBtݸ1|$T*!Cjp_2lЅcg/G+7nu Y1;6o\n; |`زj1|ۘڱwmN-$-d\>3kx-z(~}^ks*9֖xxfYGQ'˷o'z(sfe|[d]4n6A ̔z 6I&e8^pbJ輄/[X,yT o+8l+1>S7\W瞊ïOr29BU3cj68Qi  c6kM8u.S).S*gz"RཀvlG㦍ظ~w{ڗlg1's}7Du%G l'*dr)RО}ޛ:\V#$ NKMm':0t_rM~:GuV fE,SOYBA'z_G U*QzDjiVZyQF9a#4nGhGvr=QR'zn/EZ1)"Nyϖ})Fs$gLy%6 8k|:C48Ius kܬϚa(Bu~^ @nG{CȱE0)!;p8\Ϝ\!vSpZ5R^T /ǔcg1Sa@cjw@%,=6!N')es4:&R6ig} vU]=gbv\`u} fN={nj<5/3.Y5*T*SyStI -ىD9b{bM2IP (N JY ;t<[W!خ aꍽ`ac3_\Ȅ.qftu5#Р tY)^^{8!םQ}p&_J8z>}Jlb pQzٮ+A,:ڔQF)f| vJcA oHo;9*Ծ98gujSAMrqκ#3>G)Ίf3g ^R wxBiQʪ'8&N<n@hCcq\݌P#T3]L7'aGrL4Bb&'83n|$E9fk=osZ3벻^t[]砳h@`LFΌ|8&,l ׳|M-h?/\}2L aPYaݱQ}P<#' úQaB xL3k_9vbMY7M٭ˬфjJ)مwI(pIxd/!ODgOVm6ӫh2liRq +`뛱i[ P-:TGԆ>Ӱ|_z faLϧ ׊5W:2|WJ % 9mw_;6S|ĺJ|/I1"EqbQEGꕞR >)DFkLd;JG~d<iwNZܓ]CO8fg6yjxp̛?iyhbd]7~U~>(dO9l򹬅0n<>+VGRԓ WC}M'w2+޷2hzrB("女H)ДOG(CYyGBYڻp1 Q=.I(tn!b?.F@V5{Bd|,F4| тuI4a} CԷDyV@t$Rcť#t_BtH9;\̓r$M.6zZ$Xi@_;H,.I'q rB7Y57vTi\kq#EhT'ìvp#Zh=.qFc冀ԁM\N(TX1Z>t=cPjxs\6ՇR^F`x@=7()ߏ5WThe4 :~:}}Vg;Nz͝jk^LmVl4ZtOgEiwA_ Pז猖Xey߳.M9z?i6H֥GOT7S:(~(wAωNS;߃R5*![,, 29s:P2 5:ײo4c#F`bz/ݾg[1]?|<1a\,vQk*Сi.*ƅ4?e\R4˲GzFfdspUU#B=\w> ,lci/u˥-DeNy$(Pt]'MSU-2p!32 6ĥ4+Kq}fxWsw$ݲMnow+RM9w$ ;PEL.'D Ϻol*`{j1]Qwt0zH"קt$or[V~Rm:= :O5ηىYzoC$/_°>%xbMEʹY4xhGzr!=[c5DZ-2cR"c1ձH:s\\_t-\.$u7QёsY'lk?GgD[8>s_S) aR[R'<esmwjf.(t[|$!5l廚a"{3c xzds= bYt=+ <@5V9}fa}1I|ǜc^0͔io'kʔ)8ʸ߆L*jMg H#pʔv@ʓ(X*6`ȏptgfL <{]hư1G~{c}P۲UW"vG0{ 5tnmQ(`=sJSk9(N;D1Po줈 Dϩt8Fm 1{rד]p B./V ?iӡQ;6C>]Նju$s'p:wC{2?[vP mz@ (,򐯁Ǭf@QA7 6aи# RjGO k9z+s u$-S.ЖZ湹dfL\&~ ':q{46o–j<6%\T/}vP %+eV!ߌPwQ6Ύ|z 7v]vgޕv1`j~`FҖ`yN]}6I_{KžcS"uqM&{_]$:3=oymӋ>MZ6:뷷gYo9xtiW»׮wn?s"&)9т`EX 13G Lh[eokE>s)P-V2`FdXMeӷ4`~Ys>"$_6eOB;}\oTKԛ$0|h>2-jnf= 3HQ - ^!F&bJ5[TTY4Y|qVfѮ쒦F D\{./9!;D1'Z߀‡^ ΍,sj:3-;м[ZoJBGR;sZ%[t8{6A';;Bŗ{lv'63&ne(.51cwp0F#f #DͶ\KWof^^ {3<ƢRYTRE-?QsWx,+8h5ulj}kvB@Ye`*ȋ910(,:o6N0soXk ztCLa]S'.gy+aX޿9ܔCoyfvQd*SRǔdwL*|رo[}ZǶ}яh_졵jksH<1{>Fۃ0mDbb/iOnйҷ}ql|0gw;9=Aong-q};<ٜB`7Vo_܏s֎_>}fě~o=kۆ(Ҟ-۔YZt-ZZ7ӎu>LMl]oDh$3+['mUU5ՉrkZѠlW7baٔ,e<b>Ekm16l]M_ $&P[+[qdچ8#ǠnW]#% L9fEu`p Vpi/%NmD5}7V e%Iy( 24Wڠ\pBj.]y I9[v_;DM֊rzlkyoEzCqyjDŽ#} { JDC;/9_A!YBXQF [IGta9yQba>L%X]*\$af@ i,3EI_$ǥ,wZ31vQCLk2c: S}n/f K, [L*SہѵƓhǁm3_96v{Nٓƺ8~LHލcxb}Y 4eV; ^nW #9 əlowɮS xn4}Z4WrN v*wg9*~ICJlLkssk3D{8h䲽ҸØq{5KMx*{::0:? /oCinW<YߜCg;tb;υ?X{1^΢~0S߶e(41` %w J P;JR׶z/ 9fƫ$~I-PKp6t.ca3f%YuJ`{?͸OsH 68Jk;@;nOvà4`m$sRGt+ڝG!HTӔe%ʞQ =V 'Z4OJOOJi)eكKsͻ^ 4 4툒yF_ xW׎B$Ur8(`Njr*ٸn"{_QG,E`UgAĔv1,Q>_@s[ĩhJdz-ނѩ À,'`G}YQ!Z,vU Vr=a"P -:X_&x^sүȥ8|[ӑt_rFY\$YPBH*U2&"gSC]@Y^/JڶŐ㨾fq=vL6[Vm=rf-^1RwaqXеYPMiVb%ClO($lĦC5uOh!G}Lؙű3=KyD֑p!g(ZZP' 0i*%rIJ1bfZOșӆ~szh2 }7twR5)1& t[մv:"S/D"0L.N O"频N<ĥ$S߻Rō4;PGHI#Q5AjZk">T3A_}.%apHD߲Y$[@.] %LB|Lӱ-]ҮK]n]Ny%s#]vzU}ks;pȘEv߈!`g'0(OSƪfQ)E3t{:@>BJ%_D)B0} !A& o'i"\[sn=]dr͋,G9M?mЉ?c:f.1$:t[t<„6jjkBc*ܱ8C pl0X G7Xq8hZ~FqdL<"/%kyB]O{g~{p= ̟X Ҟ0p.xO?Վ~=6`AsPӋ̋>k6< ~OfU8 \KpH 5_Eq~6-g?=6.., /a&G>=|$Ǝv.Fc2 +zBL9C2Z7㎫ĝ.D*>N -Xp?oy&v&VWXpXb#OM][ҀSLj2KuHɽw֤ШaO,n=xpѳj~1U!4,wEmL`$}KANKMaպmhbXXʧn/n=Ĉj x:{p%b`d8h$Wbqa[4¢Z ޶-ť m]X x}8F75ե?ob'k \K[/| ڨ\}:+&b6On>[\>ޖ)#1 ڹj{_@&v9;:Kwgp+l{7Tw8$AdǏށ16ě\4sHEXr=qrqSS'y(Ǿ44BBU#Bh 0V-@ˠn@t_<\UBG?K"5'B'w|rْ(L$z&q( |v#Jq-䄚Nu T=G׬[r:Z"P55A1mhVvrejWVX:ޝN)r)+*/f1!;%44:-ʀn/+Un:|]8r4#U0 דb;G]]Tj>]LqjgDt5 DXyWTg\~^BuiǶm L' =`@7Q&]7NP$l>=1=y8x/Wk3_y=~>zUo5W_9' ԡ}(Txϟ`Ua9`n-_>cˬ^Q҈Wn45Æx~CQŋb:ڷh2>6؟`s3k|~4ZMUY*X̆aj|Y}~jO[2L+bH74?E:4nJ󷣕)g^(҃E|mU%|\uWv9z~'Q8٘rx+<zL3cN|N̨٘h6w& *ZE5ڴ3` xb\s{ p 5//~4Rש׾w9=ۘ,_~4lh"Z λ0\UGؓm5O܄McNgQz]z5^/ߍo]y<mFxooon|x90TEY-K Ԋpx[[p-OƸ2nLc ~ӻQ|L[cX:uaF&9~ ,`oEa~Ņ}Vcw@_?'׎)~̃ݧ;0̀-tA_uu5jkk1zh2{} i,_N1]ҨPQ2txr]h4xYe#Fqq1rA(+LU%T%&dX }QӹC = r4@ )TTU#\t2Yh+PA' |>ODEr>_0տ QR1P֔{O46Y]Ƈ*TVTwb)] Y䨟BĚ|$E۷lU(h"N zz^:#Zύq"ΓQvqCl hbq egG*ui5(+痽&aA/5r~/;H;%2˶D#'Nc%0vzFܮsf-(D{IS.t.?mkjq.1`u4u:\X/4_;hlٻ},9}iZq`Yr$/( -M}aGLQ՝+64bEo`' I4&7$P~˨Mg]cfM$,!5]E~o+;L=qR-`Z"CK˾|~rcX1jO;/to߽ [:¯.-O_5&މ+pzaj|>8/Ot7~8X <&sY  tly6b]*< [ ;_xzei'ӿir[ѹuw>l<ν"aGG׮XߢPw2.<~6V(1ofũPƏFEXzjxe.BWXv">u|e??SߩoPY ::5:38*Sǣfޛ'0N;f?FPO7t>gX5ETA?:`@Qku'}|kש\*D6~?͜E-B8=/߃BGV?}?@]{>ՌOLrbHv VU+D3kBeWxpQ?Pkx_|[Ǭڰ̣삇pॗb/OO< bjREus:F :](uuuϨh(u%\WA+벋``]]w];Q?3br {AU[NɳMT?nўt>U--l ) ;0PdEcxG1P :4㧟/'q\ŎT~+MW8ƴa9r)}7\~~{ صSdGqбk#Qw j܇?'>+!Q*+AM$^iJVvPkmYu f`NPt]޽ǩ,Nc,{]ͨ?\Z[.GOg׫3o 0bX^uuҀ/{7c:uhky;O/? V/e>[~sbM?>SrܜӰȱQdg#{ Jn|iD:M-e5{<>C@k rZhn܂s/'͙G_=Wcc:;p΢\;w98/?& ^V!9)(]LX)c=hHTg(}{O}C$Wq8¸SUkH 洯ğ_pY'i|ȹxAw6ސW!:#ɧ#qa#,n8uY,Ivu5uy}Qs8p#󿄉. :1{8j9NL$! $"4)jg BDA}((>gAE* *!$Lk}ڽwf?>|{>첾k}waGBo܈b҈|Q3+״D.8*ls`r >Wx>ʐ@R~u=dY PSУ:(%WKv=A7>UԜ@E)2NZpys`%~?wl_019j3`Js#oDS,<;||\q8so'V1|斯`҃ѳ~-ߎϾF\/" v1GM҆XB.e6n.w3`=+q˪.+P"?:p*S#'@\ =e57Ss}w1-;;b:bh8rL8*f?Y` ?f "^K:c_ӳ#2׭7|KOhѤW㮧hE\WSxqeU<=%r2ym%ddPQpiPs^~x熇 պZިج*gw;& #R?ܫTPlO"d)VKȩDQt<a'8W寻L#Q9P"''vGR pwy <5N^ҙ'/R6 G]3^Gҵ`";.Tz<UTĎdo0^UĎEHH'JKsfOôW18*lz+++H%鰣Nl"?W׭pՌ#yhbPݭЄ;nݓx{jriW-|y(>q "ܳ<()DS}FY#"ڟ ^+abՇ2s)}09#ax_pJ*n% dOYH|mno l+PImߛk 2̎35hײ}DFZP ~Z]p湩 hjU/A A[ ]m];p HKm?OwN^8_a?\S7qo8Qܽ _qq_睉x J̛ޅΗ˩ |C"oo&ޝضq#zn~˺t 5iy&Y.!$8)Nz\zn(5nZTt:`], rmo)*CԠOնk͌>WKX .ł*miPS`a8\ȥWYM{-㜪؀Z97h^!G4}9yi*(HcI %63Ex։_i^riB?' (.GWPڣ~Veɨ4={ۓ|kreǸ"ĒCbbC]hgh=֥2tx>*Mnks4rZ6ahkJPNstUS9"z*9mkW  [1eJ 2u}a#$&)E}}z( #x♗e;.85{>:;V.h8U7m.R$d1CP[#}2|p9}g;>GřoYY3 ? "ۧa΁)g%96.1RR{b^]iK|E4Dyp'aMkL G{ ~yޏ߂}K*0ȁ 9j1[zmGؚ>_ԍO]xk<B}X~GqYęo; Rh$78{IxyMKv݋u[o=GZ> >Q^j3RQD'Y'IX}>p5Xfp5a ×\ossD͢C{烸sa GqɩpKw?v<1Xo>7W\㥡4tI~rG 8^DѝL[`aG-)'CR\{~<|}ۣcC8dn\ދ x' fg:c0Ҋk`JkL>3 n%r&fхMy 9`vg[ /cq߁}ZC_KCs|b\˵>`\|#ntK0S;[nV'jpۖ߼;K?.Rc's6ٍ/^~%tx4PZ_-ǻZ)qG2#":|2GID)~^T#Bî.S)7/(s!:CPQ4Kf!5p fRjjKX $RP; 8zd+QB^_qmNtr/uvl_t {ů-vƙ=4;5{&Gu~6݊tN=Tf'S4|-x'qG/ǃ=e}ߏElظ < =>vŕXy+]\2G[]VV{$ {zU۶"nR~|jQ#$񖪑M #sd%) 0%{k0B$0NN+ /ߛ&Q+Ek\U8WfiWSݕ.*0KrYyX4,;SV 1yφV#s[Ia6 -URcs\h _LmgGһA׫A=(I81*%kAGKWr0}؛;s55 5~1nyߎ-Bd֪L(r:Rm_Uk4b䔱J)?Ā0흝# A !\PbN\4| \ug~3a=ڦf#qڒiKMMSoO{{Cnno b5oZ[>K`5iadق˲T^=}=P/Ew):TSQ`̀lQ]J]Q٦ B|)S%:YcJpjo9y+5d۔˨l.Tʩ$&|h* @9[+EeDŦ2kFRx6|ȘTZ]*!tQB%ꗞE: 16u8,9x*?<?xA^&ּ ! r9//A~i|  䅼Sd15ܞト c?tPy?/

S{eJ># 2ƌRj/fռJjU8׶E=UD;!|O˶MjR9eD0+}ʏK!vG{kopǿ'd#x~'UD ˯N`#^GQ̦FIHv!'ݕLSӕ9@\`ժU8q7ƛnşzzwr7hbJKөczyy1_\QlwXa]rrTSp9 0<8,,r`k_(cSXW<t/?йѪ Dy[1 0EL)+txU[U~3{Hc yie QǞ?jt@W +cDr#NyC\@ae<(kyB)Ï _݀WROEc %HyVa1NPX_kdž*veq4=ar]9I *FόX97M=9,uv1p({C;nxd##n)]<$U#aL3P?g29NKI]Q5b1)e&ԧ㺦ݾn=/GՂAL,2, ƓՆc>3,ViN R[+|Lu=`D" 97s(0g5uVT3c@Bgb #E}bNkHEA[(U9 S9<2`+dTy% P9$;$r;p^ 3=;II{wLi="7oj6zSI]-x >~x,O \旺584Β'ңܾoד BZ3?ϠuUs#@d3į8=LZdc0HwUpfz#Qͱ\Vy'*WV HԹ(WQ?Z/4~hR_1P$G^Q/h}z>4>onFkv.uzwDs,J`ƷPT[7ܓO׿%~K^~|ߎ~bN/fΜ` `9 j++UF.gFQg1Շ͛6`˦#E<%hm@s]=%p(ךRv 9^\P^G Pa[[ Tgj r8V,C`ǥw+{Qd)%-& MN5:s-k +*S6z֮psBPcO8!jj_!>\l^_Ңנ,DƗ7ǣђ#*"Z6)x ~YE&TZyKMMwV/wݍ!ٮl폒UٷT‚_?Œ#ϓ׏qnn-R],?݇y'mnK0[yhhxEakWسxs6ܟ Et F^ (9{SnO55{~C`/TFHTLl&Q}+V6~U&j>Q9 G˻Ust'OVfmr@LKxXጱ[ c |[(yb3X$*^,O$he[_6_"N G?CqwbN 'vQ ^n5]X% 2:6s ֌ٸk_`M: $(oW_,zE=|F:\vUJ/M_*~ߢggDGa2RwfT"|5۹&9FM*E r)ǚ>Dyt\-UR%E[ff(I<s446;6B]In*qo]pvIE^G9*U]-Cúd*wB/,D j{{]H #pB{s~f!qo/'>2Q5~E[GU`P  #fQ@Ri^#i-&KRhəGyut޴CA99f%t&qA፣v:% M]/>xtO>c5ھs@3`"Nwۃi4 sй>zb|<ɤɌ>UgUDx%EBF~D9heD1gWEǼ٫]WgG.J{HH֔ϊg;g@t3^u1no^g+1Fu>ZonLQ 1qٸqP{K8PnL~k7}'<[ ^^M= O6gkWk79H{ I#[fsq>2琪((EX.caijJ-1LhSuNTXUٗ~r |Xzy#,vf@ 4wbv`a$C*Ĝvd6 `x4[пUlEL'U_U/al,T_]{Y{t?vqhmn]ho_Xq "M]}34؏< ]iq5v 5VPef!Ҍ^8+C^-= K/s |B[ʅQkS*0<-U^,_X.DRv5SyڊB|Eh|̈́hb& ]\9/\g2hv|D(1qxV'ͼٳHF'g{9O#jUۃ'WLzv)% ㊢l*l_uu^\$%$4'\0N 1#|5{A)*a),ΌbAo̷o;_8swػ wRv)<`!J5e/ѵ"i$n)X[@~ { de/ZaAGbYỐonlt ۶hU z.<\ ޔFy:y $\KrKɘŹ$FsK`\'0ݫ*C 厊%Lp9Ft rVFT Hwm2s!za9SUH( 4ޙQ;fs_ 6`/h3rURU Dj&EVDτ;I#~7ݲ2 O tFB*B9ޙ-5Pr Ghƛhe Za%{gh9|ܬsBHr \%T$+6;K;Z\tL.H-sPAh9P*ᗆʡUuP]rO jkH")E/>%G@<ui(;iD}"́Z]u ǏI! ^ь_X}QwTzFx=^t);,ާ xw]Z9":_C~ {t{2^\}G{չVeM<?=W94BkE݇ LQm|/&F|Uc4yqv} BQ) \I(Ђ Z8@(X!6b5S4hGK^0q%3>QB=yo[߿{w#5} HS$TtaA)S Nv:JvvE|$jj2=6خ^dr j1RkH"K:?`*{AJ cXUnTpزqlV![[aHN+~(E˫y%:]I9 Ai**1 es9OK#^$mA12GB俹:Zzj"I1 @`ً%& m=CbJyj*CktWuoP@_;( VCE'35#)MdǎΥ'~.簓IUx໠=TÏG j u5K)TmGSw@%yBaxPܙQcQ!)d2EE}J{m _f߳Y]Rʭbx@a40\܈%+ށu4𪺑V hމ 9 zq%pߧ0Wqx >\r@Vj95h̟c54""cveЭ<*1;^k/;|COy> č SW#x&բ#2n;(7 0W<Ĵu/2#k|g8p7"9}ls#m_}T_[qsN=UQ6*{v +Ew\^fQUb4N)DEȷ R&q/=JI i8OJ Rn$GE6"1e5[Q)X{xc%7||6 KbHWBm")e#Le"t6-E%piDzcʨ}iޱ[9R[b0HQeGQo{s,$,<.xY S8?̹sQ K_"mðcrZF o%Q "J}n, <:|( +<-4AxМIN_{ 08^\KEDt:H =O$ӰG*L(ʃDj[vh) `1E zO*$f_ɏ "3%CSI":蛚g9JSw; {Q@|O91.I`p1,X?@% hzë+vGFrf3;H|6 s-cikfw>kM۞tCQB灡-٣=<U]VA=]}Ӗ)@m{SRť/TY=2vҜIh~Ki_a@PDHPgK? aD}巋йB7TO%S# 4l9Xߌ9l b xkf;QssUe?lBQ sYFMwo_*wE֕FL_"Дz͢63b`LY*^[3$X-t:GFh+k<U&Lj|j~d;R-=gl_rk+B~(<̿\sB!4' z ]Pt:2GmjA=C>B2mEDX׸ r*<2,4O,PqקQɋr>:H'H=_yFU ՁW?|-vWo-l#CUPHZ0&"JOTTXf@:/7"c^_XnʅM0b50 i]EsɱmIn*0ciپQoT! ( XF_^ Poׯ _'Kh 7 EDX(CƼl,Cy=xT*]aZO1rǎ[x@9+sϑ6." +e 3ܦX-Z_M1B] {M5Y pu!nkB!&T+/`%nuN3Ϭ:qԃYT̻j7qLeGzRݭpOTe _AG ?KBe(= Ƨ0ڻ,;N8'3瞏|"8)gs\]r)R4g@%N0՝"#c\֌">\0H_Qp nZLqg3)0I a%J>az5sh0$,E}6šA޼ f d˱+5!n%`zv3D"_T$f:T X>(z`vlY Iy5f#>cg\NqjS^XQtyS^m-aSk u9tOQ-gi"nȍPVv.[grGf5yin bQt%]9U&KWlGdG_UsQ|'ˤnCߧPMvkA.izrIS`wtZ^CUUYEɦKy6:.dKj]HP=-@`;kۧxn0M%{;RX]c\MAyQ-SEC'|O Gh'`9*@{Eijez$KPYs㟐}y5ׯVWSdD̒G 0$">RϻQc鄴Y(-bhO,gi&{1FJ5M&`%ϓ#jOʾZ$}T4&dsQN;3B7PԒ0:Z-f@*=6`OIx_,ChM68M=g'1_d{). VQ mSSbϫdQj_9dzGW7m40T./rJyR8QWWt/ؑs@^()%/7C"bfs:̔~S&q\붕0&7EJuB6,3 Er8Т)?'޾%NZ봷&qjll*!ْi R*ap,,704bc,a8#4$Ǯd_Ψ[!'ۛS %"7,),H4~(dV+a.OQ {`y׍ֶ^='sJ\*Ys:P{ F U]_@W:~b\Y /"lOt_H)~VKoV%d/VEL^BQWTzщFKMw9NI`Q1ǿl)15 ߵhKYPaS} KKsqz**Ȗ$fU*C0/褉eӨ9lz󪼶SJAMlQrH& ,00}|~o4:]Rha^g]4q\i[+^+@VQKf%ػ?VTLJ-Jckdzhbyl)*I֧HoM"e0!ʦmI:4pqab"dH]V@@ͻЍ)\yF.<"\)[Pby{,yr8(W;Zǫc[EQƄ UO8[h8˨Ѽ"M,8raQDY3j{hgGkcR%zF8v؁z6ǃ2I !:scs^gh%%Ҥingj2E(mrcHF7]spGrt>>2Yy a<G'a6t7`C1nCEKغ̒)tS>TQOEVUo_dJ-*%ד@ZT2-鹿asY6~ϩvOvzɈlhr 1n x-\rQW&Ac@+O$+ɔt)= vRn)W@q,!7ٰ}=;؎9eII?Ƶ8WZnS>/9:LJ :34 4 rl_qm-~?}h s\O{TO-Qs%5_yQ xx}接 CyA~sƈsq1S{<~Yz5 MwT$Zr۹i{+`1B9妡 59Y3qb边^G~oL|s˪)qHb ozF+pxj>gkkFAcz4mt: |a',5o@l$ڑ纡%R(R8)#))^I *D\;2qQEFn4 hrX.[bᮇ3N`wԎjfX%47 xh# {mƐkQQrD}[#-nĿ/oGz0(ඏE^ӈmm6 sT+6[9,R ~=c5}C-ӓh!Er;8014&n lF֟"GI˜8S^sK8"t!cfxUwLZyi,m6[kp"*:uF-vԏf@|o1PYJhjK`) LGc*LCsxit%lq13V݅PJ@jLܲyQ:2퀊RR3`޼'o!GܤΰCԑ~￾ZΫ"kLJs0@@ {~oH!> l̚qX "A)&$.7~4 hEzgves0Em* %n6ysvkqbV"uMVUuBπŀRj]ِKu5rmȵ86QyU'F@zE\L=m]:i;p8^òy*VXt3tՄI+?+=qQtUb14&]ؼv=vpS0 0Iؖ|ʕNh~L(w_X,P'D+=\ oʏ!8앧ʋyk`W*](時_$Eƽ:i" ^VdtAlb|TmL%9eƊiHwq^C߳j W`ב-y%\, 0ljǔmjmʓiDr~ 9a5M^q='N1tZ^_#"[P9AbZtN]_nT>]k覱7( Ԣ&1! \V'^yJ„) dGSj{ ٪auJ+:;=ל=w|=vIvsWwbhS8FFReGs.??%F9Xv|n[-r_فyM=X緼+݁*‘xe.Y]ŕ?Ս'4bPNq,k|;D]~h9c1'މ(矘O_zp%8bN <n4ʾh%-AW4[p̡/")ǣk*=_ Fš xR ưD}b+=%yrTYߎgt}N/72پ \1\^63'koHXWj[pn׿&Ojy?Q3 *ѩ Pzc'܈PPŷ<"+MƯPc-^|xN5uZNE8V,mv1Fc[p3%)+斧LTW-1rnG~C'ۉy%LqOQY"R7Bur($\Pk8Ox|g.hCSRʳ=GҼEQ}WAiw\4 q)r~Xi/<&{0EεO?xU` Fy '`Ch:(nQo[؀8GZ2pK!tpK~ӂkI699Xq[8%7?a)qRC7}3⦨tRZ9ڢJzM(^k84E4\_ԁqS.+Bx+Dkktkuj^mk s9ʧ_]l3lH ]גuJ5\6=Ez#EBnD gŽ#xD,L?@r̀.٤]msk+jiTB$vtb`[fT1X5U+U\W0C)PFX@'| w3&1 <ch[ɢN[ )L?KLKzES0ږc^*B!d6w&,?Ah,TCaDy'x[b LOeNGS* z. g˺߾S,\f2mZHҾ0k虮aLZ /Xxmښ,l펹K_rJ4~Wa&BEЕ 'W=C^<8- `qC`\>K:iFOִΥmH{08^AJFIhr~LP X:nHs†RSJ=*: %;+\ƬCt(l[ETޞ A&/ez1%iq$m =p^y:DiN˝煗𑟎GWL-c ""W=ғ[q1,;]wͯZFZK(in9,cn#V ։)/ 2AHI/ j4+q^@Ck8xq7n Ƣ*\\zlڰ׽|'I^R:yuXei\8ry߼~=VPbo+۟r:lZ׽r:J1 ZdVs$;`q~yZ36< ܌#$} cG߿G,D2Rt{| )\>@MWGqF[L Ͳ 7q)H3#"Vܺ3qIA$ǰmud9?"FZ">xV/L< n FB2tP/?#j232q]8†$rnHpqYn.Gs%Hs-<(:kszi5KعCSP|nN<0[ז ))S`4ZhF̴ʫ-wX-ҥzv-xzH3OEk >wnV:-/ҀWw; >w-Lǵaq'Ɣq"y/uw~F"Y\CVDCƣG3a1r*zJK*OEup`UJ|xGd񏺽=--n+&C¢:JUIБo yZpӊ5+a)\Zfnp޻#TKz1U7tc)3b YJ o_r]֍P;U[Z!b>Kh{Jj0c,ό`LALaVj)=v<*ӡ~ުv4zjpQ绱s0eۉdF]NH+JmStDgPF%pΪ 1.p*Bs 1kV5Y;PJ.k%tr%*m8O8 Hyr9ʛõ*i:iR (Wh*Ȯa0bS,g\)mB+~ZV-(G/<.e2 wzibe=<r~ KS؋h\GvJADJ~ 'jQjBp*87w.gHkXV<.mلJ(ʹibc(rpBmگJ̩^dFt?`8%BA [DWM7Z8@񋽜PMikLJԢ'X.Qk&{}O ?_Y4i.(NŴ*ilȻ,؄@q 7cQgClp cAMh߬ WR!Aw]RhI~Gx̬fE{Zy>ЮoIw}kK-dϙ$ 4$Fk%cG;anA&y)#l~O~Dk4`6[xalKI% Ãq/vgwp~pvgChB͐oViyƫ4lm;#co.Ǫ/ Nì~7|8 V߲ڿF[~WoO~ɔjoUoilpD2~6-|a4S~V~ 045OEjFQiCj86|zwv\tvR5mK,VPbh>*UB9n"a$Me9ɂ#`JZkM68!Ai<68c0{4l&XЩko(뻆)q,wؑ? ~+0%D(ؔ)߫ե):ѰL@_.<ڵ2(0u=j\t+-Ȫ*Ǚ ]/Q߂bh?+צ+6̚3s-@sGHYwvW"ΦV50sPsòRV̪P}Kba)'RO:'Ĩ\#k4kҞqCNU!HaĘyA}wnVaVvlpoc|+T-d?kK[yS\(E׉;,`!%ћwmҾH׿Et^̴BB0s a05-%Qc]ۚŠrʧ8P >\u.<]uhd KОȤ4΅/qq #R0uq̑-8I~++5׎a[]+>o0O~E62V^0 d3XWcW7wk3mt& 3}͗a3yv=O0ci(waTag(f9TB$gkÜG/FO>V+5㍳pl?Wݗ9O4/.D6xj?GHYz[jA?tQA9rjlyɴ*<k U7/ӎG4D[I|~-cCxi|8.B@[GkB@e.ti9 y%ā>Mg؈ gR!-owbWwcf|~>ieH^~~̫Z5*Ȉ1waV\h"1_މA6TVPjqQH.HټF=.i4ǚ\/<Շ|emx/FjlZ8j$^ٚG.4(R1 1e 4SY*GDKՅʬyƶ|SԱ<?b(pI8\cK,CBC1u Uxni> 1Ks;]HϪw`dzZDs%1֧ m4VO S,좋R<\JT e«ʭ,"V#e%ܲ2y5evX{uENt'K'z{kla(ʓutܘOLtk+{U )~Ey\Un#夶nЙ5jCpզ(jS7cC;=YQj{= F,UٖR" W`kwbڼW0{ p]3_\6˯W׆Pxa}nlYcxnn<:A&x Y]MğܺO f0W +/Jgmi'V%Cxog W-Ƥb^)SD]x4VgqV_;,BF@ݼ]]6;#KM Y}԰Ե&fz穴_iF=zJ^R~zm:>T=.΃4tl }uǩ L_^-Q/.Txn#j)cS+;_mZ] XCz*TgٝgPe*{W KLL"Vwb[ws.rM$@͝ufwЉn;.Vwj.8szԘy7 p˽݋KJ[eV ۶cU$B x|]=o [keGfڎ|v\,No3+s;FnY];Ҹho I0;Tn6{p':ztnnYu_\θ߁dc?\4jԉ9Fu݆Ӌ[بcLŮ\/6N*.2]uؿlaV5N͍4wf;-!fg/c;p8eZkq^\nA5? ן؉Vd1bejm c*}_n.@ yD4.8U+J<**eyPnX$4@P^@Z%:=KEW i%vbZ<-D6Qt\ig_%pnK֘Hשx=ac?Bٔ8  DfD6-g4RL-*<=۷lA22v:nuH[LO(J}םL2pmDg2F Nt~k=kj?0j4*n_"Ja&`+K?X V牆ϙJWE8fIfṋm9[` C9eokף."M5y-]]) Fw[CB&bHp`-YSsC{hd~86Ku:Ksdz[JdAG*( 1OK^# ?5UE]NB 5<*;[8xi6 7 FXjcjK]SRsJ;h\q R@Q\MGW>ٻ^^XrzNקMޞWs35{Q- E"$0KZ=>Do}bB Z{ԃ$W HϾ59l$_>3,IAukc #xXŦ`1O68Ku6'y$G^1w82=57H5΂;ȐϱjqK4}ێ oM;Sa~?*Cz2AV*\ ~&t,2Ŋ,Z܁g4O/,Ohޔč3[՗!GPFH{YQ^/WoR!_>CF%`O/OSO. ӕE%XEĢԙzc خ7LVl,acnTj0[.%jĦD%?H W{x[{)bg{ wj _ eyһIf~P֚蒯oV9xAI3+^V\4@uX>)ר-~٭2 䅋`[ *-PgCi[ۍwֈ__Q""W+{k\Qr)rC绻-+Cp턮Etɡ}mlߣDDn9(^Z(KBb1xMb;3mHo^kԱjmOmgQ|;1 ^osܸ%#Iܢ+7gyLaQ}u%/ ` sn9E=@-wVtkK2{:yW7E,{"> ͝Vmh5I6M) QL^ ^!lɂ*chQF䓍XXx".DU#J2=ƉΪy:leKGƍƮo4];w.WKo=&tXaG7T5Mj~:cDsfC`m ~kqwSPʦ][~F5B~6{N{k`"-~|5ݦl#A b| 08"ކ-P؀ā h5JAQ#+nlf)t*@ߓѠFʃPbb̰`=ǽo9|na9`30Qѐb^/9t¢*Y -X溦2i[Ԓ*_r "nF9׊W fhۤ[yw:'hDޣiK@I[l)"*M] tLO~aG0Y0u;#:!}GE!:n-uFPScM?jwp{lkXZau[_ 31 uf6k T{D6OOZ@3wgd1`p#ogW /}xSFskXB=ɿ4aN=YCB0{~֢xRmd7{DvE? ij7$TuErOoZh/CSM5[R+ }߇% /8a. @(EFd!eoQ (S&FiMQ҉coo 6Dыc )3Dv ;MgQw [q\!F4OǟV>GݥIj~ոaut>GqGp:~yW7Fr1]l1S ֆ'~[';‡v—|6dم^|oَx<5%[B]MwaPC6/*{ nwѥMv#nj (ܯ^MM cvtL%ʹ:ySb /}b }ގ_̻$M -N(p[U8-a c[-Xr+`5Β%=Op3uma0#&F\3aj!`5%\$H,{l诋=}9[9:BV3ދ[>Qa3r @eZ_9@drvI#xb{ܙ4}xreHc 4^$zr&vE&`TzOPh\ac̲USv*nQB-X*zU71AJR1m=H.+Դ 3xt'm6')IgD<͵ꅾ̢ڿqD;nSkH>"s)xd?af#Jǟ dѩ?i~hSg6]=jO9ȩ?HS3FŽ߿#%A!LQ\y_ȴрټ ( &((TAuu`8h Uj]_\+[[LR![2/ "n X:')J_J^ jTk>tm%q"~`e1#'$zX$FX$4Y4ȞS$,ٌstu 4U| p,p[rg g4m7Lu(Ŝ絛,˼~w[gY~61LZlGO60l"u̜6N,+˜7|>y{La'Ӄx}kxqFʫX~A-ݏj c_sкm _wu>&\K. ~zm8k~3~]wmQ5ǜzֵ lP0^2 5,nG@%$9fT#Ҵ],ր0JXE xkT<-.q468:R^ gJ=k/>#[T{Tn{Scڡj__V&N?ǯvzOާȉ:xTM7שkW (RcK p J%[\/ n6JƯ/U-EeT\#8_3P]@`k\P >,A AwGy % VK 6R"G`lVnZϋŨ˃"e}nKn`(PCO\(DJފLsCR_v(`^1DmmELM?i%룿Е1LvYWWӇ&RL2n@=e(Gٵ\XvSї`AٳqbW|3zsn17ŴwӦM9PqYqQS[[oyZ[[сSO; x;w`֭[ɠe֬Ya$]" g6Boäj}:(^g=Za{,Y X,| Ge14ZFXprzN i3Fu̶%8 uSQ Cb2`[UYarQ#@yD.̔G~?KL} oR.:Ap<*+dմo%08 ծn߃w-߾ g^J.~-Q%`?#G>-61n 'x}VGT,/a9 P\t&F.*7JaFi}c8%.]Ūr*C;*㴼/dx3OqU>/{[#n`?FR-9JF[t%[q|(`]pNuǔunVsET_OoA-,Iz ;>TkG &gv&do3ba#- [1X.W6ﮮK//| شq#=FfcŹ瞋kbΜCqܱ;ǍU׈䖍0"ۋ#0cpQGb z<Yy:|8lݡ0Tag0"uZNHcg2SiTSkkupT7`P0Ge^ 'ww*YQ41cSՍmwp-[" 뤤vr 3 rYd;L5 EaJ9Þ6"@8J]L@pكٓ\]xUǏYu 3]fP}2MM.;J)@Bח:(耆4/9͠R'JM 6Yi޽3ĤKlȍVBHW!\̐,$q[ǯ]yy,ȵ is׳, Mম7fjxln)ϼ)TAmkR+pA-8HsEm("ҚG\%omA}MlLc\H霥Da -8PC RY⮋JΠBs*b97߀~ޕ rڞQ?}ZMxbZY;;+Y:UJ,}SZS6/JǞ EZncV1ߪjcPT[EzETzf-x?T[=Nn8vh"ۘsܶ,P,L)v#.Z gaOyJ& ՓdxM\ 20QhI(F}}jw1x /9~"8wj{YÇ@c D0;[[q!fS+:l 4nS4 eԁ˚{Ss}ĘHCԹ:۔<¤ +VgN`";I?_񱝜% !mvV59D8b-Iaq.Fɪsy䕁0(k-·c'Z2J a"DvH.0e/ijuCej~?<:x)AQuK6^2"08sRm'w :7ehvRitpuAD qUpՄڸupekGM"i-ꁧ. MhjjD<CzLh+e @e-޷'k/m{9~[pݫs}}Al2T_|y?QZ\wߪP8g<-b-}co{۟{?5>4}y㢫knؽ{7>|hV`d3M`] B)P{Shp7ZDjY@-O |`vDEB~o0fP#ݓ7#axo2hnƐX=+bk{'{^^㝍o0E{ʨغ-|6@0*.܌< Î]nhI>Ra!b6q" W@Ůu-ejut(Y([2W?BBzj=V5Y%ZTBFA0.Փd'7EYK̓Qcj 7" nbmv*Իq;֞nj}zW`FҹV[vO>kݓ OqzXsTާ=7>QI8_~+]G xqWD5a8e{:gd|ndT= U7{9dmڛcos֩ce{__}o8X}Q)Gok8#+2=bFCZs@S<4*:@ ,z#IpM`Q"%3d3tM.6mC-;wb]0*Nϻ[ϟz6i+< W&=-ew=LMB.(~ϼ%a #A4ƪxwţxd{SXݭ;"J^J_&g8lP+ke{"(:,bOn2y;F z'KW&!/w;qNPXD}/b]̛v m@+z|_W y%Sƍ26^DQ_߀ș.Wj9٥pZKI뛀cY3Et&t Wso> Vҭe4:QMa>pzT{#2Ϣy0 lBF=d$K4sR6TF egnVFrj,2 so#o Y+*ݴg;7.L+P_" -Fu)xa8A8 a؈$1b">tܾ̉5L?|nIMw>#T}eҍvcƣ(SZǔ7n9 uUbjU4 ǽ-]K-ч|Q;~cOk_,ËU|.m-ep%yo C# Z*dlP-jct~='*YT{^ϡ| 9T+Rk6IόA{4b:\PB ֮qt4h.EV9Pm)%c:T^3+D]k,˕C dF6;G7!δfQնX ڰI ^ڎSc&il"=U,W-5T tu]i ۃޮn$+k|4V[JleZ{ Rsȃbn2Efg"(z{J&Yx>(t\vg#N ߦM /TOmD]+kXx1heкpES+I>Biڟה8\syJh E<4,hGlp43H_M L./Ga ջCgx:'H)R!~㥓}XW'ӵV>_>۵|PE,rpIo3RYJf[;94]#9&u=3.Bdfz>pk9-g}̺BNBB^Eyn =8yY˴P}W̱b=j1t"K( z |q;Mјde꽽ݼ!&Yܞ Ĉ˪c CbEտYY#1z{{ZS7I"KRa) o\~e6lnS Ѷ@tvKbiꚶnmSWhk=]'>0P1oM=;g8V ^߲yZg:MTot[Hݪ}w6VWͤѦ/*"eMLFd<Ԫ{z]_=A G OvnB齍,6auN1QbxW㵦i=~@{ VfSnP<\ @ƾt24gՂ+}N2 \!j;!!p݄&au1 G/"a[* o6^8z R& #FkܨVQ5Q,B0@>ANwAz%IɚT~>F,}}_`Rp}?8S 4mMZbK(V2rXuum,u6Ͷ{.SHЉi6X4]!Y5"pK{D3,&wLQ(7Q?|٢-ِd2!59SRYm"jLpF= $457chݺk;;O^=sPAΔUNjdT`5%v E'vP7W^# SސKyu_B'br[MB"plG3!>wߓz?19†:L: \=u{N >[P-xgmlgKϮ{V^bA'_Nhx'o\L WL<6jk `J!],*^c| w%X`:C.~82si^6۷x?˺s@AT9g-|u)D(AcEM7-,ռG)Yj s_[ZD-use!}}+% b,/2--Ԩ_B! |E܄;uc&:.A lvǩAa3FoOLsO>9yыzRAsN(l-y <<_=d8o㐱jT|vm?FN÷_~{ڸϟH>!'އAZOb8N| 6<,9sC]w߀gQIKOq܂Zc0N8 ,"0Վv:1:(-u/ wP ݕ9]+#T}$BW'<|=c;/dpA=}\bu#]d̆Դ.S_JQֶgjMK۱+W>܈v%8ÑFE!:#PS-c̬ULo{eus[Ưݡw)pf/2a y-|6| ~V< 'c8aIHέˍ7bp8'ψOG)>Mjsێۯ+vt!:p.Kuӿ6fL0*յc\1_-=x7~yr0>w7Ժڷc8jxJX Un9Ǻ8 B"q-jubW_Q5W,^[*3pؔ VsmދӦ#c1ғ?ON2al9EbmzK1c ;R|勓u0fH:tiA)`2aՂgՙQ -;QMyP]y VϺxx AqLX -ro0$sc[{P浺À.8㑭 1ȳMC_4L_KZ0%.;;O-g j\4^&T9|zZuWE#K`o("0iT$;sViR+W(mkFM@@IdШڈjj9M%!5C ++bw.C`j/$Z^ Ui6{`*()<|@b֙[[},8yNSZd&漾ڮ[c 9~ Mwq@!Q} LW +2 ]yG%z^pu}z{I&vl.`MzPP«9݂~5N[ *1{̉КclK6\b]~޳.JD̽;BltE]^7S'` ׯ}pe/fO^Y^ ky݃ if[Aeu}{{{}W6碩.HXIzKm8|G7`ͻ]7ùw<.7n'1nt/f;q>_-ũgWKzqa|#gq̃?oǎ12uaPic^)_1cQ5׫/'|u«/=<#$'_mzW0n71KаQ1=_< OM%L¿\ƅ3K~7VnK/-Ĥgb/a>#%!qI(I/.R,/߰vaa*oœZO_\hkEvD"ly_Spj_j!ܞ`/_,Yj߫ƤkU||bΡ^{9~MWwbټYګTwq0#8b&aT]]oHUul|#a<gtp/y.j`Ǐߊa,ǰ8F}h+U߃ νG̓`nϽ.ֽyn8т8&u5k&MGĝOb5xm:ԱXh. 睉;0{z V hGy+mқ⑫s> cCx>G_>KCp޼IfܲA Tde_Kp''b߸~'2_ØO[n=kpp6 ?SSO/1 ~wo0 #욇0aΡȴnB&ͷ_?tf)EPmX.v৿Y#f t1'`SOL^}.ny:F&zq_Gvcpӏ Z7]g0cP| f8b~Lӯ =~J; +- \c Ė4_ s2Rh5*%f;׫ְ- Ι۷^=G)b("/%teWyޖ)`OK!NDPU|yvtV+mlS}[Z[C,mnzo@[[ZZD-3}UlN^{śdaK/3î0Za9_'jmk%PK08>Pij ĬRmxsKDg'ʮjMYoK- 2l8 XAu,_C>/Tu3薀/d9D%t[) C`uX2]{L;Z_dxYh%q:z&RYd™8:(fk7+ZeϮ{F fUq+@U=':&VHy2x#OܯR1bh' qIlĔTL0i7~ͷgiVl)AlQ8,tVE:ymD<7ݯضE(vc4CJt`>+5BagUvVfx1 ;bvht2^^'a;BS 5M9 ԫQCc`6nyOx2#M.=0jHsnd)?W熡;%m#:8Yؾ~!VۃM|k7CC܁u˟5-!GM{>XGO.?y..|DL&Xć\}V?}'n0^?4?1rE4پ3Uo醓uk_Ǫg9h "Ѧ3YET [ytvmÊ7OƜ;0c5"tt"վ-X)ܞ?lШ[ګ/~jشDX1gNFCʙl U9kiiND] 4E*]òlG^zzJLx )U_7MMݴYr;FRTx=}O|&(0C]?+oO--#TCTT:!>~KK &^wM&9V Y-iT[qGojԣdhM'~vӋ?{ ؼcf&`H4E<]A؊ 2 ϶cH ٟ<{W֘Z3JN d}2fL4 yL̙䢭sd cZYDSNοW1-63j\CpgTxY6ۃdj?*QS.G7%~8`u L~>TS+v |1>*Q89S=P)PPQdϥ_z[}YLczu&SaK¢-* ip@SgFUQ2`DE6㬺et[j Yv*tw d!ܫʪEfP`4Yd'EqjbZ 0糶,hTq$P_1FGs)չDgS9|P "<æNǘЬ@WvJ^ώPhq.|LRj՞9EoN&BL=DgX6y8!F,GH qum B5Q QRSDWח8ȦԊQ+Rfk3Toȿ'v,g}M6EnK}Zmw@S2 ufdj%\3tʹ>L+8@-]\ɴ(%-V~uԿ=ՙMbGL(3c#$[#l.+i2p c򞔬\u59+t4H adF7LBya6Q2C5f PPG` ~\ӭQ_naK}7L:'F=O2y<;o |Ñ8r.B6cͦ]d?O{?G``,mkVbkc!,:v!ִ3Gg ꡗs$~jXIGs{QVvΑ>8Y|.wUnH-||>׸7+WBuHjs Q^mɾEK5!yC.5ΎV%+F56M4G( (S7-GW`_s&h*jVkEWguܓW\Yuk3p4pco>)9-LGh;ٌۚ8x|S! bWqvlj@{TC_ďij8ᐈ>V ЙhSe6a&\^zIHh',>rP?g3\p>]+lhiǣj,D|VL}vygj;Ӵ|7ob83hlչ :Am t-)G4|sGܵj:\l=lAUnve5|{FZI_\ \7}>cl [H[YyL_ ρ,Hk`%$I\Ό-qϽTfC4ΒI& Z&|_Hl1#n\Ѽg^-c}k}jSEp0&5wF@pC}P6mT(C5KpO]e?l cP8dcxUc[amPFvCZg&~?*>O o 445`3P?ChL2DF4kC?._^ Qa  ٰCۘr\0?ǧvl :0?01\ۻ`M0cZfA.ʛn /۟: qvG|E8QDA}=oqN[o .js0c\\$7VJ'b$(ik~&<Ή8pte Nەgٶw>~`OYͷQUyWb+(uyg~'q~d ^نӿ%|<|W8zo(:k+ɥ FJn%xN|b3_4qUᴱ٘pe8(w8傋]}; `a?÷>;~z10rc"gGG>o} us-R?l,:*})oӼ1OlcRb̉hT땓Ă@qѵg$0z.~})d#bq*'`pLƱ9n ZԆIv@ĒZyO@t_ZB_*UZ3?'[:m{ = JyУG7B`8>Noe/ވ.g'#MPdh ,\&/vߍ͈OM',dJ5՜ ߾\d4t#/t`v iiq9WQ8&@( C8 :[;ۑt+NRzQ&jh..Y,t:5sꙫd*@dIGu-T*8Næ`tEuj] Z "sl\ Ye FhusҴ Ek-fWHI)5,.bQ (ͳ¾# sFi+Z_Suɽ O 3Bl~PڐZܛdVWV<&<{R'JA0։d YR]heuq/`. is#/Ԧk-^p``kGW2ЂB砍Y0CթG`s@tG81{A#Xiuև}C4 ԜʓFͣD4&(.wGyez%bg9gXǶ >)MF54ÆF$qjk!H-B|*r ¡  ~%׽G8޿{;E>^Yg|$!N amaF#]pmHW" o D*DDI,bȪ26.j3 vm[HiAJz]e䚉õPya8Z[[Q/wy LJbl\=~Ooai dX:1i Kl~nmL2oOAуB{>!_Z"}2kϻO})3A~=X|h_?J(Qufp=(ԑ  N`LdG}jõny[QCr, Uy:6鳈5JFsq)'NFV Ok'q뱝?>U #h8'Ηz{e|13S35;NUĢS.[J6I:J~5|`%tie0^._ I++!@k:'owhjۊLΓ6ɶ3ti5#TLmӏs}&sIԼh(۾I?Wp`&1+HJA*JYm.:omEmM7Ԟ:rAx믿#FRMu8g^EcS1cfYA3gK6B;to$Rxc?s8O_C4DQ' tK{D]B͡|G4U>U-$,e:3RuV3:{ `WP_ $ &Z<w%>X6mvc+`KuF(QtM 쭮aSL|kԲb-80`ܸL,YWXQ q"<.D-[2{[XTɪ-8'}R"MYMPfb@QgK |gVŝClڶmHvu3M>Ebz5ٽиQ }byC $ 癓{OTz_f4=/ٻ%9xW, x/Ba?bزIȯvIDzm}>AzbeEعtW3ϩBa tWWT̓)0>7aR+e<:o?X~Isl F,̥ *5Onk[OwJ5kZU9W{"f H=y7#.efaB%z!ggF/}EzB`,t/y1oJrV Ofœ25 E18$0[]\.|<?.FJߣ)+pto`3u&]fqn7cP PS yLg1VURb2(5P(5n{ a=9iꁨ1sbr㥞+r4}VcIJ^ \Cd;g1tߦ3U SaY z <tߜKz=/ԦE (S9ve滷P\'اbT v~u] y o-ΝSyW.YCsܗh'ف_ -/Ōˎ1|]̦b,@ǥn$., `gfk?jcx|s텋}0W?~ww߿ʯ~o u}7쿻+X]/cXTٙ;|˟K>UyS er#oNuߔ؎}تQp&p5&u(R|>|O}7~l!96Xx{\Auo7X:9yRA cn\ݮgP\rݖ\C'lGzqL511sS]LUG5h2#מzy367BI73X4Hvp&1Fqõ V};LCD{"s~vqROnPP-V yf( Oc; m@"B6Nۀ\w;Y_<4z۵h4b&W87Hكb*^ٹ8Թes]'S32Eҽ JT@c5Z\]_B5ء`PSU+@5 j.ŒЈ ^z}YxH=v zi|S/Rq XF9/"+u1u+88E;QnŒS}H!Â>vkK8Pw~٦¨h=wkۉ}heUk30fR\*Ԕ1bmXdqȁk=-8Z*u@ z9_>x$O?nν`ڳu xCW,ǔ5q|NQgavj9^NߨM| zyDZ^=i.gwXfwtx QjȰ0-s7[xfVº<> q}ۧC|<'?>z?Ϻ= z=2ioyhwYn@najh\ jh똻kaP2"56sCGn*ϊ.kL?]_Y:z]բ/0]V5wGʥY狏͍1"ɶ̾15G;/욗]`A{:i3lxC6CC}21ޭxXtg,#7&` &Y>d3-΍h*T*UB A3ڮ =̐D;Su 5<1@ubdFg5=EcɴM/P- V1Y!Y7hy[oW>,Oe|!Mk(Mۼ'F*T񹬗dY-;S{-L5k@2dlf_72eAGOfː`Nqf] ,gL'\Ν2 vʘ+2sN@ cjH!.;+/ED| 3|˙햁CT57|a 3q(BC-CbR6saATeUs Y1y*ڝ*%z:wKP[}ъޚzZ2tul1H|zTXQA ;\J25-(GϻhcPV9n0²ܩE>jA%(!{Yi @R_8^w(?\x^|n QgEjE8GÏ.̷(w&Uز oU:ܰyX}UZnЗNrz|QwN 7?89:/U׷՝r|aҾu=m|!84r=(t-_n>d=>9ocb(rV /9ơr gZ!߼pv֪?ߐ37r96v}`rSMt6#ޣrc7(^t{ϝ2*KPv{Ė:7^&2sU Q̏qo9WnWn6'ncl_vKͳ6jlXI8oaW/Yܻ5e~l|b t{af@dwbbG+ ҡJ} 2Cv#Zj:nFsrW7PC̽m4q[+\lNiv4ގE uX6cY{&^* Ng.3 59w{=^{U[y粺Xh?7 ;f$u]|gWrqq.=\@kD9{C2̲6P(PS ה5A"dOtMj3,(46-pڜreNޝK`Ѥ-Of۱WP2S:߉]/ g=Z;M9mlr5\SO: pXeꔂY$fӺdx̸)=Yqُǜ*bFjE(^ UXCz̥b]YcF ka kڔseĂBssiRCR@DET|3+1"fNVχ6;ox3x]Jj>m}y ܷkbuIc|rӚk[8?Q_6`>|*/4?{@ۃto6'# | Q-mJh}|@zG ɥ z:\(cۯװ82.O0Fi7c'O/Mܮ8.7UWgȜl##ٮ<}d{IGwݏo?/FC8\=Ȝ>c;Z{٪bX!?M?B0:vn<;m&qk ]|MB^Ԛռf:bԵr!U4ivڮp9#s 9,pUdCt5ITÝ-渰BeH&Ccʃces;.Ɇ̤:o%XDͱwL2R6ʘm5Iv^~YN;Ӆv z11ׂH'rLO4phN3m#)p~8}YLʶ;nm}1H摭*i'C EþFj1>)lԬ{*gG@:yKFS/TLykZK y*n4BHqg%w*k *욳%GuyѶƢ]tQs Z`jǠt4Ə-LmL,8~)'gDќiQ%5+LUa&qЦzI%nom~Mvwl . ꆉñi NjAgÇ”"ٜͮqR34U|})?uΩ_>[V;5\8I{c}K ͹KxVM1yt٪s w]m}׿]sgX~U58_>vW~=cw?wynp͙_cy߸3u:3:s]t狻>n>w1ul'qB[~rlj6dlZh?/Q !`K:K0JI&c2EiN;ha0![5bJuɉ:h5yBIZ0PZ6}D|Q)R&dn|(x2S&}UtOJmīɟ-v7:Z^8 <1j&t,S35eTTԖ[IHe0)ܔl4G%Amm Mb2y(AX &R>>9K֊B'O[){jN_VS}ak[a >gA#Ԉ.aQd,'wfΔ E3#v_R ;mibL((/t\캁Ssϓz oG;o=j H>7TZ~{{޾%bɥʚ<}ݾn_9J Bx1)#|c:TӨ9ЭO{̒}4H\d?C&K\lĶX.Wڃs ޓjnD*Y[$*?nnfY (E Mo+Ӭgi#CZit\987׀{/ޗ*_~D]Ñ 0 )3px ߌ &"UFo$/ fj@DYMV]\\-s&`l7Ɣ`Y ۪X[Dn2t 3%J),@a+ hifXEsUqԙ]YYKSh?:j\*)6 ,u'9E{Z&r |BnaD,Yɖo1*.:J1}FiAb ]Y[hKG͞6aN)и0s"Y%.1EZa_8Z @J (eO[q{].7U9Q3Œs/)0(mxԐ#3VMu3>R׿G @6::?Xjo9&hN*cОǢs<>:E+ݾn__W?n9>}!9/|H0s2o5|}grtt,mXw Sż}ݾn_l,dONNd15*ZKc6%>Kvc:MYLZdPmQJEz*WN+0hXEo8/puvj%+0qpXxmyl] NA3{c{;߶6iA =L5V [ֻsLmޔ鰮}=^!P"@8BS!pK33T+ oq})2N=bS1E1Y:9` ;-IIENDB`Subsurface-4.0.2/Documentation/images/WeightsDataEntry1.jpg000066400000000000000000000101371226345450700237200ustar00rootroot00000000000000JFIFHHC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQVN B"iU ,&˚*!~3<\&3SO;[z&DMRV.H 橈M 21ib$+H ^`3 Y$+ 3@fhPz$dj H JS[%bFTDT#Pdj )T@% 1P2A!0"`k%oZթS]rX㉹i:/y~MylqU~nU|;aSSMTWz1KU[jﮯTubӇo,h\(1U]kg]Ү]RlTSu%‰dY,K%dY,K%dY,K%dI$I$I$I$I$I$I$I$I$I$I$-*S}Nd.OSWC_5vEWhHΦߒof:u6].[87r53S53S53S53S53S53S53S53S53S353S53S53Sܷ!*[*;:zS} *.;ڰ+,ʕV!r];Gt~M7*Vs ַH,-e?e/_B7-ȄB!D"B!D"B!D")!1Q APaq0?!Is躩5N<3^1=bQB&ңcufUgҢR_Q v8ĒVcv6y 'ZGDFp|&CuAn6oX1dJ~CQ2'~O[qM?(!1Qaq A`pP?Ia  4+3uUc&m.tboҊDYP._k<Ah"ܹM lȒI7nܑ2P7ߕ 2FH_-(FSs*1!aAQqP 0@?$/I?B <_xD25tʒ|d:C.bF*O r7 3lbiIk)kE!'ԎmojP2,e=nkRԶRw‘ {(7D PTԣ?3C"yD/LYTM1i VTkQ4HNtXpQg#PMnoon\W=^xn\W=^xzWA"xzW qMAaXtAaXtAaXtAaXtAaXtAaXtAaXtAaXtAaXtAaXtAaXt@Ƙ(:pظI$IvI$SC)r% 8bX6"|iǷHLɴi2I$F6Tʦ= Й8oPM!*6s T6gc$V>6jWR6ؠl\_`'"F L«ᰐlQ *r$~`+(|84_dۆALGM)K*.Cr5H5VƦ$0iҸ!nIt<_ؠU(=l<:V2ec' Ac+XV2ec+?P2ec+1Ţe.7-fs3g39fs3g39fs3g39fs3g39fs3g39fs3t~;x8+/eYoImi µkf2$X59R׽i930\X縕ʸt~\(K=ڼmotzzAR$ǽPJn8M5@\1%/$t~&93mt~LĚF*hhhhhhhhhhhh aI(Subsurface-4.0.2/Documentation/images/WeightsDataEntry2.jpg000066400000000000000000000116551226345450700237270ustar00rootroot00000000000000JFIFHHC   ")"1+320+/.6Pz#LSr?]I4ڥ{77ҧ ܜ'/+`^_znO' ܺ2dɞ2dɓ&L3&L2d,,,,,,,,,,lie|zv,v7[|zv=۱#HlJOTc|~"fL2dȈrʇ*rʇ*,5dɓ&L(((((((((((-&#$Vd^]w~}Sۢyt]2fmz_7VK"Ƒ^tlJӋ(Fs|Ei.{d^\ /е{O&kos~"dɓ&LR!R!R!R"Ki$nɓ&L+(jXNdjD?"Q1A`!p0Pq?xӁq~ jɃ|<ڋe2Xcrtl˥)*y+ cXq!1A0P`Qpq?o:dBioLɓUOcp;MTR*EH.ͫYX2c C!d?. 12! "APQqBa0`@?4cŐڔYY|3W'Gҏ%ߟ y5srG?ךF*zugq4kX5yǎy̋QK]j(((((((((((((((((ɈҿKo>vcN] #/'b$)㳓ׯU8Z[RK^YǟOB6k6k6k6gmgmF6k6k6k.?Sğ4N?'՟Qg.+(2jo~N&EԎF/<$:|iYQx3O\IjtNQK},.Fsy~9y.3_rޞO9qdWwVcK OqJQͤJDs~Or=Z%~ehZ-c޾7}Mo_Sz_ԧFThZ-=t/07~#<=ŗB+!Q1q APa0@`?!~򦆄V葙-$Ue"$~tg`Cb5F^:I#9R[`$'V ֖i եzAֲ`AfVBcn[T& G.7pnwnw 7pn.7pnw+J+J+J+J+J+J+J+J+J+J+O&_BO"WQ z=x6'ӍkhG|r(@oaR(SS_7` y> z=xPcs.5L2qZĺؕ%M7Zh"`ZtHJU%*"(6Ss~3Tjyu'u'u'u'u'u'u+Z)c1* "_ȩxd2D$H"D$H"D$H"D$H"D$H"D$` ? =74IZD–1kBvYs^^Ii"GS^<]HMj@GBy@7rQ) ^@[LKԨd5 ]|ra理rsQ=|?` 4K/PH,7HəTƲ%10khPzb7/#th^+OF(W#;#k2;Su;Su;Su;R7o1բ-D 1]wGqwYY>3VG I6䤾E fEJODBPWfƏ| mmmmmmmmb!mmmmmmm mmmmmmmb6#mommmmmmܞ$vmmmmmru-hmmmmmmmm#@֐@:Q9@'I#'!1aAPQ` 0pq?pU5dD)": ` Hf( Dv&$s.@x/㴼v^;B>M*!a1APQ0`pq ?Q()k+ {ep2o!†!,Յ8 (=J \-ZR``])0AƿazosHfffffff`,? {xZV53ΆL|!cu)K `ٔo^t(AB#l^/ie2{A*!1aAQqP @`?)"Ϣ+biAks 焛XIJJGInKRJVtnX:) ة&Ѣ]&끠G;׮-f6$˚pSJ%k\F7F7SfV 3XHDВSTM|?bg:\FYSn9#rG䏱c>$ʣUTnanaܿLVnx2>$}H9#rGbMG|?bіebfiņrg$2sMh "z,22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYuM E,٥-zcEi/cRdO=څh2k=E 4 D(Dt@#VLz#+L40@3Y ӝt1 .(a 0 4JY A!2UNYl3etAF "6 0hQXi@LJ @Y̳fD3$DqY(U T*PU T*PBU PBU B (PB (PB (PB (PB (PB ~3d]#qò9._XHWEm7*7o; PBU U U T*PC[U @U@|:XnǨ#\;2d]B-qыvx `1C 6X7ˏ`\$#ְ749pq? ) BEA!HR!HR!!VB) B$C|}cpNekw9ؼxl?:[qN]-;5ۿqݙi8Wtǽ8P3;} NX8'X6gn3*?aO(9^X`5FtSݧ+H Qȷ nCG;?s 0 4"A)*][_@FnѺF7_h}u7_h}uH!J\9`}oy3a~? AyI$MbMp4I$$!I$I$I$I$I$AIN2I$I$I$I$I$II$I$$I$I$I$I$I$I$q$ $H$A$I$I$I$I$I$@@$IHI$I$I$I$I$AIIEI$I$I$I$I$II$I$$I$I$I$I$I$I$9$I$I@$I$I$I$I$I$AI$I$I$I$I$I$I$I$A?*!1QaA `pqP?t \8F,umgb%OV6n7v9aOi?t֝5Y'.}STp"(PKب @|!(оzQ8ܗ@7 ',«[=#sgI+!1QAaq P`p0?d,DtzzEї EV@RHϡ:xogA I^K0bc3<ݗT*7n2bkys^ jM-e#Ǣ(#.:*e :.x"ў?2%l% Y.nTL\b{)֌o*!1aAQq P`0?ZkGF\/fF,B{gh{3 \rlU[Gh\ R9OOA+ޞޞޞޞޞqsý<;ý<;ý<;ьN}_yku}_yku}_yku}_yku}_yku}_yku}_yku}_yku}_yku}_yku}_yku}79e˗.\rų:PKC1M)xd 2ˏ–,)ܖ\p$jVH7h \rg<0 N=>=>=>=>=>=>=>=>=baC$OOOOOF'b}vŤ:v}y(JaQZ&*,޺ty" ZAxtyT±ۣ pB jT :x!q&9eӱ~h?C4`3,[w/ 15k[ e; ھK`rX2[ mp%S  U-kV /7I tBRBXE"E,oKTlk_ñ~h0%1@Ϣxq+ b+fGa;WZZxv/|Xg͍K@3>GtwO>GtǖMR O>GtwO>GtwO g)Z @qQ/wFǼۑ_OnDm|{=/wLey""X =3C4zSubsurface-4.0.2/Documentation/images/icons/000077500000000000000000000000001226345450700210205ustar00rootroot00000000000000Subsurface-4.0.2/Documentation/images/icons/HW_DR5.jpg000066400000000000000000000167151226345450700225240ustar00rootroot00000000000000JFIFHHC   !'#))'#&%,1?5,.;/%&6J7;ACFGF*4MRLDR?EFCC   C-&-CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 1tx=,ú03d%p, -zggAT`Hâhsy?7:x K#S@]< iK5{ Eu(T,,<@%;U"JJoVq<XY4lA3&r cGC| DtA3"QΥG1yi L0y;A" He Q`QZW =."4 2LUdX ]6A4!"KbzX=Hz,qd =9p`QZX+z$t~,Z/5iYFyl>}X79K@!ba ;w23ՠϞrrK²{]څǤݱlҌS]qm {a1oXjYQsp9=eWw|۽Ap[|⧦^Ut [%CRϨ2 j3o T]ȳ9轡Ҿ۪TzG@j2RjgkC"vb~1rp|;zE9j%b^/opʨXyU㊆z9CL'@hV&Cvױqpˆ8ƯԻG,u1[1ňk`cWaDf|Ba3qu'@/>&u]ѐ'|31| D@f1{2V~.# n55 xql 0|ekj>SY{Qa D0y_Wia=2e[Ke9KkzkI5/[ڗΥe&ٌ R~Zs0VC A?_QƦ>3>= \rzk7zj~_N ُkdWz:Y~-^10 ZԞ̬*%vRtA,4oƯ eb>9*Ć7x>(&-(ѐ4jff/º8ڗ}s#42N~֬4ٕ#&?L|#@1!A Q`? F09ń0׍+fpܶ.(Bo{|K.%^KV^ 2pԭb tþ#1@!Q` P?I&tn|`UNbc~YcAtQ𰁌& 09:u04! 1AQ"a02q@R#Bb?+dm( JTj*p*]-t(S7H0URNw<~qa36C} T(<<[\9]쏃dB c4MvnUr>k+KX?MXUH<"4.+u ,6;@nQ@5M lf`0m/,# ]&PC*pTz]ǐ,ik8%B=FZx i1Ƨ!RqhuB9{u nPyX ӮF斒Zz]TEdn_1~TFX Iw{'ML4L'!u<l4-n-5QW%tC)ZyCtw_RUS.#WiGڬZUL[_[">~4+ ^oFJQV>Px ?בBΦaQK'S7XLv |V}.ݏxߗmEIbOe7I]]yX], .VVLNX;aO%WwcfM{ߏvag6 [~ˬh~,<)sp[v>^:3Y1isUE_+W$}Bn\vg) HX?v!3y]A(nmHssC4pT9M W?)!1AQaq 0@?!+E!g* ~w,;sg1Y-a)ZrR?rӢ^kԣ,hn! )0jǓkCϘBs1sc,*.兩\peT%_[g\5(F%m3 yZ0{RQըx8aHš3+>ΩLx#;Gqchg4{a>3jx8Mo08й#CcT3 lZ,Q^a@ca?A(_ωn~sO00*۱F '9-F & "["WYf╳R)S5xwZ3.rLf /UL#+p0Ńcg,;uˎO1r]B;W[X&6UY> U|6!h \658r#4wk@)OVFrh2v=!wE?sܶ}~;%sRs2s3'0LG[=k(Z5;̹Q@\_>+rq{y "?;xܜ? EKL}~$e6rjSf5۟Ak?dD`*,crv'Ǯt˄fۥúEkQ7}过(>! :-nG (̺2zMoAj; s#fǁ: ew.oM]<ݺ9=_0WЈ2t<^Ц?8fd( C_>:ޟ_5=oP%@ABg2"lr@"[ w`>:O nx\ȧAudp䊨S/?ST0)X+oέBղO'rf?gF͕*QJzH"p  1(ĕ3DJ,fO-@+>6tvᆙ-rw1_aL @N- @HH$-tn$ g!HAI KgI$HlLB߭L@$f`@զR H E@H$L $@A$Ii2 @I@ $ $AIA $@#@ ' <H  " !@1APQ`apq?@ QpX^]\@c0@aMSd*k'KǪz^ N4xx&,DN훲Qy׀ !1@A` Qq?DG]L/Rh6[ݷo}^eB[R&{*,&i5fOa3½)!1AQaq 0@? j"MPzU6Py9n's.KpZ&Nt0T >jqmWO U;D(60% c;w-pgߏ4,|T dS&JP8u۬&u8Z@#W:l#U˚ 6,΅mC7 &Ѹѻtsv h un츘lr |{^v -Vٚ5Αp^Q .*aI|@J= q]46Bp=2) |Aʡxl5L8@fnLP fw)wEWUުYw3SamޝZU7)ұ1mzZ\gXZȺ`%[BnlUőEQEM+bg:n 8aT6='ٔE100X kqONYsɳ)[r6}, ,?4qD[hˤoȘEdRVXR3(3=ddV[+)kxmghАuJ (PbME2*!ai\f#x_fni[q,BJvfv]2d #fYpu\`18o iZ7U:3 dy'$Y}_R*` . .sΝȀ ^9~{@hA#;*(?p^ZA PSRxo5wzkWORfY""hC_{x-F^Wʴj&jpXA 0@~xYSPoaB8@"Xkf>e))4 kʨ{DxKaЌƥP 9Sm4=^#2aF]D!ƅ8+&F5X:Z?"Ɵ݌8^Cb;!I.H梿l4I~:Xkɜ^LA`+ nR %#Ļ-+llQEd4Hf> +YY=SH\z ALfǬ&7HbnAJ ˈe%^!'gQAg|h+'߿Il׿߬΅uޥV~OpNvpҁ[ѷ}%W׭LSL{-@*8~S[;gXZq0uky\Gg֮Goyr5H/Te( cSF+Y_%"a-mgt+syrZp4MN$(gI̍b^`[K=d+Az7 =GS.M$5)pWD{^N'=-txzL"9 ѸIN7q( ^ )&ܰi ѠP̊Y>-aǁ:\B[04;UN|Ā GiTZ;3 )3>mGCj 7=b֩-+ugwلe(F3 8?m 6O Subsurface-4.0.2/Documentation/images/icons/bluetooth.jpg000066400000000000000000000070761226345450700235410ustar00rootroot00000000000000JFIF     "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777||D  !1A"Qaq#23BRbr4C$%&Ss5 1!AQ"a#2Bq3R$4 ?P@@@@@kVSf1O@JΝ9TVLg8fL9qmM`; ̩j;+%sU{Gb<0ձ7wqWdE7ӿIqRw6qc>=j(#Vh"fJ S'@a!;o] t*DehCU&!Fu,-sW?hvxWNOẵRqAñZȊNЕZ-W>z67*c-Tɐ  asEMALbNyw\T '-9[L X D>2懴8Z;b֚v-SǡyC#BVXV'.|r#ib.9۾Y׭e`Zq ӖۃQ)U=)u7֓0 |@lua޺-c^ Yӓ)oDC ~3O3AA /Z/\xʛ,LtzylR:zvޏuƬpʓ*&fätl SCU(7t>b?t*\dХ0Wr?43Zuz?[tuK}?sRj= ׶u*c^8?(N¿?~ʱWF~|Ѐ 3YHHlK9iSX"py opY`3dǃě}|8jl:.k$-$Xr;(ٺl508^ei޳÷tѭi};=UwNi# ,GM1AKqU2BeЀ 3 ԻՒ3`}Ԇ_ʍVX<@ʎ B::5I:ו' Pu&`)e|Icij]=-hTO/V2VMxu.#qyn1fu p6u.+TގUjETXe#XE|Ug@@=ïx}V6OpwvnAiYFIZѴG|+b)X>tJ9$e9<"Z.Q\K[(k-hm+E'FH( D >koxv[/je>f K _ ZhW9;ڧ|j]jqSGe{j+޾_njtS7\]gOUtU.:+UQWū?U΅xW7ȹAᚗ[0[ܐBc˵2ոZ>ʧ'/$- N1@j t8ˣ/+7T)tM(KBl#yj,Za_k .zp\>gE[@/OrGTq=~;g&V#rFe/ҋW = nWB6\ddm:.BJ\'.Q5<{_#h'iU֩$ڊRy4;2b tQj`o=q |` ٲ< B &OOrjx?MA/pw/VL_ hI'`h~u1xvJT:Qa;EC8+~ѵ7x">WQ3IPIbt0s}.~ MeF>FQOѰD!m h ۓ%5 o)Yu*iYYH ֍g޳n*Se^~vF㕪)3\tMv7TOV6!_v[S}Z: ( :咿 d%S=V~o;jUlF>&~$Mndv@m@l  `XӼ&&D >j#Bnh@d#`B B Subsurface-4.0.2/Documentation/images/icons/drivers.jpg000066400000000000000000000041231226345450700232000ustar00rootroot00000000000000JFIF &#/!$'),,,150*7&+,)  )%,).),,))))*),)),,))),,,),)),5)))),),,,)))),,)),)))po"6!1AQa"2qRB#br3!!A12q ?8JI/ Q fyim9̀gsvܾV, ^/;\8 PpAtP3hvO,'bFl+լ]kгgU"tna^)e^-Wox|NSDG4p0斝 ^ց-0r ~]qG8S5 'Le;F ܜmg!`k6Jdph^j61nѷCۨ!|G Q8;oEV _b" `;e05 niC6JBH $[[T&[!QmZVc0tojJВRTnjQ@^^]O ?zH'̍SXlpDƲ|Υ*watwCM=iCZ\r|QmO~چ l8LmC _Pe^%NG%͖|(s#+4ۙMN5hŇWimV/3 "{k|vSKG.]7?<9A_x UMeoE"Ѳb{'JbMչkly+F}rTFZlVo@N[wĨm#]ym\Ӫ/Cѹ A0=kÆ&1,^*vLry3(yG=;"0n o2tlX"Nn޽Ź #Ia$J5fZ")I(@m%亝'kgX߇xX%៣BQuog﫯p8X4| o {RZZG%^mt"IҢI,@>I` Xc7Oee%N3o?QN>CO ]HmJ/S\\\ >^ZJ7)++C;s:;  R('ܲEb14/0 UUy{7s'VGk6oWڅ'8ӟ(E_߻"Nȫ23TW[`պu\.3$+mc޽JJpf׿fψFRY}Q 0t]_NW@þ}Z%7eS{;M{ e,ۙ *<,@UU~֖s?4|lٳ>Ͼ}8x`DQdȲfD[ĥ^:}p8(h,O83i@q]Z[)// gattI{lps-䫬d/ ;>t==DQ$aIb. ̺u[ N3/^줷x<Çgϖʦ&ֶ.- ?xUU2@.sc}7]7A~&''sx<0G 0GɓD"ĜC@u෿%W ֟yA!ȼl -AI:h|)&''&-`j漠M{vuA"f F5klhSV@ڕBNfY!S,Y,,3~BUQ^yNeYXthO/A8BDSsrMw[6}כ 7ܰhf\@uu1==M2̱IT*h~93Q[[kYP oy9>|啜`Y~w7փ8rV|>,/ܔFn7V_wuWA׭c͖g%i@4րj7lhGf`0ƍ " w㫨 =j%6=S没Q@ XHʕ|Y~Dޱc. Yy /n &\䄬\ə+m&BZ)455sNۗD@e \sD"qk*@ww@Tl/’,K^};D{e;F~@2L 1@joLK7څ(V <4-B٫N46~!ǣ>wA[[===ϖoG#Y$MӬm@}=EEE) i?<055(ǏUk@rctEQ%U*ںg$g} -zD RPh㏗y-c?Au 0tftm\|Tx#˗/ƚ(B!Ctv.J6Yrawг X 5y(AzŠPQA7Sz5,_AuCUUbP?"ՅWZVR5޼5PTTDyy9TWWZa뺑JLLL0>>a&zz>w d%6=K preDg}=ΆN'Oii)@ p#Qٮ*0==%pihzۤT(zӡIMEF0󺭶6+8VB$ի$ Yq8n^/~"JJJ(..vev90$ňFD""hX,F<#Jn.s>rff!I$aۭrp\x<^/>׋rp8̓L؛uajF*"LH$Px<((B"H$ITUdz nw88NN'.˺e:& IDu4Mh3g(w6S{;7,&LZZe-3Lw2bc3ew _S2 Jg' ]IENDB`Subsurface-4.0.2/Documentation/images/icons/info.jpg000066400000000000000000000051151226345450700224570ustar00rootroot00000000000000JFIFHHCreated with GIMPC   #*%,+)%((.4B8.1?2((:N:?DGJKJ-7QWQHVBIJGC ""G0(0GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGOP wwpjH&n%FWy `@vh0li:ݘ>e? Hy[UTf@ǀAjU[S4{fF[;!2ٚ4[K:=53lBeWW> 0,UT^!1 2A!Q?C͊ROQkvR x]!/(tF;R LVb!zWۦS=tdqzz'%JgPX_/?x/3 >PCX!M`"w!:Xg4 E36D$NȵS|F2K&!1QaAq ?P~Z!_']|D?h|[ڣ VܖXH8RFns.%L«NݤxNH(X&sԫt3n0njY2n~^6b&&%fOf.I 1V*'#cJ2RS[U%P7AgYh/z@lR@ cX7Q2"<{R}~XW,Yc,>_x?+93鎓eJۖ\Ct\b ' }ZbKtT؝a qCVqj c*2AG]|~ 5Q^&^XbĊKg~Ӽ>KF^ W1bhݚcE3bzz}ɣSubsurface-4.0.2/Documentation/images/icons/iumis.jpg000066400000000000000000000216721226345450700226600ustar00rootroot00000000000000JFIF & %0 #'),,, 150*5&,,+  ,$$,),,,,,,,),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,),,,,,"C!1AQaq"2BR#br3ScC$s!1Q"Aq ?`   Oo"CSO_"q/>@ZL $-eRqzG6˺Iٶ]B]2ZS;CX]QOuMpJa[~"2R)Ip9YlL:D@:gi-FmBVzIUbkwf%)=젆O^wFgn'OtOrV*3 -$?1.9Rr.'ڍHOV݃2zC 'r@ ]H,5ڈtZTR,W%V@ 0P9[5M|Bkb?B}~EDeV ~?B婯7 7=pF&ׯՉ][Y6_8|jZ-BMZ}1\p^s PRZH!TWaQWqA LA8)q蒌  NhJP t9>BE9)Lܔ)4z9V}峨jբʴ-h5ॵ7\^,)JBOyQzA;iNqqo0*| +*ENzZ:*ѿm ǯՑ%>Y5'-[֥+#?^q()~4G#r:Z9 ԩ "6l(%j`Ϟ[6% [jN <ҖmW8ij nHRzPgq\B#dL\^25Z4PXmZ^0JV&q%vtl=$8hϺw`%8[7FfBk„ƥ  #8볤%h%AKeI]`DK-So;;qͣ!WK=} Փ놧=jTBRKdMbA]ك hRZ)I_[)p:$ϴ~|_T1*E0ߗQ1#αf4xFP:TvJRUJģRh0l*<}qe Mu3ճּ`;kVBY6 Aj rozN$r3(C㟯$&Zs":ѵ[LHO%",GOwG/^3RQ]X{z9xJʋ ^/])p㛛6RRXν>ĉ2䦷)8k )vM{0n 1Y^nD/Z1 ^&oa6IJFY=5k6BT|Czy3hfA$ý|"SQ)h_9xCֿG[s eٛw,16%^t^TqP|6Vp, ih .DԔ%LeZ0*4m<2ͺUC]s D]DpA9w ^og&qMAoFpK ~)'oˆ_CPY@nSW uhHXUJ,EnbX* W0g.Dl& V4:(b* av>}ZůcdZQg!؅贚vg"4F-sV >'AE`BDGbz6Ƴ]iֿDS7mu-Zb%H>Y 9tamn%OvW0LJf% IP (r og[rM7 .l=ejtݧ{*bI)oq$%;P%"7vd pQ'kXna-p-H 0.R@#N[EKw` 8 $L5Z}K l-l4`4 HAX Jq,*[.p(^J< 8g}e$H_˞cTGΎ'V%فyR:*g@ \ g~hwf0z9oYלIEͲR 3 [ؿ+sDQm듳&ZI)IgrX(qqt}2,1 I 5yb΢D\I?X[WlJ ,JPkQЅMj?Q |rb`cTן#žG۴CكFk>4L%zI+,*UuƷT ?(w1>}!TsCcGߜ *']PVQG|DCs9w4S[n^pzXBձ -i*JB)K)%D)$]r Yv&}\ʲ,(yҖuJHSBH"4p3Iˍw:3U0M.Dz4 ʞPDcЄ%L[e˔8H$ ie _ה>;1;;XTDkQP+_ "!(7U% PHQ*&"C>$K IUHːD(Q$7;OҥZ& " 8qq|VOx ů3>.e(P8G;V*nˊ­W&=?,닮}'ILT!IxEq>"]%Oz{t4Mg*A1]j@{0U/Lf%cNpPk?|cW6$gDUTbKHJZ_-B WWXI{iAa@Pz$Q0򦦵PRO#H)6U,I4)%s,Hy$+2)vQ6e|A2֐ }qxY W<6Y1~0ON?B. |Z%]TOvbK%ZZ1HZJjn˴%%Reu)w^ sƝ/WɷK%Jt&,:aRUx16ГFM]&LØ6ZL)RJVR; Q*ucV)ɟl hx<>ʉkTE~rr$"*t_3sHI`A 0'vd]9t{b & ZcECh[o˔Te^0) >(wif HZoWzC%5"ىdmX|k!AB&yI(Ia@@}|}^ 5%nRxQ %Z'9n%6/ztLq%>CKo#h -RL<~%9 GfM_ijRTKzpDŽ'{w}0Ij-Bk@ZʘنtBYBVd%9w] I_?jt{iГ{U8AKuZ&rUPoUniMZ(RU-JR*$qW%fyZ>0PıKWx'Xׯv}c Zy|P=TERo(z5ğٝ<`@·t/֩6Zyaԥ)TQ`o2f<˩sN<^S'#$pTAA)u ڤ';P3# E2Xg, V'%%%\H%UPࡤ%,W!WM/Q#9תyAY; CbbD<i ȟqaexQ&e-KV" %En]f Rd2ay'VV+i ,0X;`{4(,uVuba&'MTG>Y;2vf$سW%2@"_Y,>#\Y9 Y!2U5C~b\yx|r`䦔@qv{ԣ1/7pTүndRYMՁ'%suUqjc3}8bw e6ՆBWdg߬">!h͹9P eqIZjcRy 5pշ3)=PP+mٵN\}E/"(j_)2x5hB1|ʭm݌]dg'(Ey[iR.RNB`C+/b1}SΞquѿNsRFUf7\=6[rb||=|[{5UT2z(?5yoE LAqx?I Nۦy'ln݅htvy JNF\N֫ʖHΕeJDKXу{4f2bb蒖|N*V;ےe.d2*%\,"kt)t"$VƏRBމ y@pElmEXWrRf\{%7:AnU(QžwOdÈP{Q!VoL+ARen\).UV%S)rb=\^PWXb?iJ<:L>%3gtsf^Ƚ"aZř >ygH }NfOH:  X:ZM-%*.1PmJz JVT0%%GևFjLXA3YK^ x}#6%0ՃNCRZj~%5|,z^4?p<α7'p'?}P=ۜ8Y+#PAU>?#Huao춝%eHM)*e@i@Vo2ZMe**BwGt;B'%7 !,13g6Z-2&IRub7˳Ι&`QJq;Dz2>. R\θ?%fVK(=sExyFէG,dϽ]RT t槨Tiq6L(% {+?0`lH+Y҅I }+n&Y)h/r,>l4H('LwY[ԫTe,Tj.b! Y #]rV8MeolZUZi*:%IEd~r>#̈ݝbMg !%9Z鿎OS'B%Y Fj]za $ne :*,ûKb>|b{a {ҏAIV5)ZTldcYf&R9A)ɜt98iWwXla.Z 8$>   <ևG 2.ɴXHXyh dcdQiGt.X0b NyxqHf LB LT0 wcw6|J sI>GHck2&) Y3u\NdF<4AI,A\ǩz!nJv`qES4P'وH&gj N81'* =5;&%n]ɫr'+|Tr8p O76dRg=ԗ`@$3~+bLDf)$dR\DŒ{jY0o.\+cJE*Ќ&%T(P#dxɵɖvrJʰ8RSrOȟ#Lz>.- Lp% .Np&mQJkٽ!"EjHΟ*ʩ6̡,(r$w8+:9VX,]V)Ot1817K(e^$1 -2@ 3Oyj8:˰.q88`s:G5W:>jkϘ)1t`1SMi-%|ByQ $`AduDQ@A@A̖ T18 GP@y]+BKWzQPpK(`%2K 1ĿXK4uReT{bw@>msfKX1 PP (JOI*xрBfz0|ǜre\3 "zTO6 A%'NqHڥmEi)2ҝf|ʼE+bmYYɟ!w&! !@!I66̚oLS IHh2W8g1 GV>hl/ ߩ|\[_Xt AI0*MKIW`7elV֜2)\}KQ80&,lRjTT3ú.ӶH~óR@I&[>ܽsZ3`%KETYڗh9Q\XݦW ]1wcP<8CagSaƢs]l>QY08!5 WZ z 3=3f__y;A@A@A@zenH *Mn 9 0ui: )) TvHWI3V 'uWuMeBERC|$bIx씨nE8ʿH,eFk.B+ *o(*3H(JkwMl;gK*yd$Mc'邦+Ygvkx je}uۧ䫖d [i}Xh(HL;>UT\'zL9E6Q *p foX_E'ۧ>%( H4M`/6w$K?zKI>٭Z-ƉR.ZBR0C}eY$LB2sRj9}AAAAAAAAAE{lir .@ UMIu  2-KZZԗI+:bL R7eGSd\)K)$0k8w( du>n%j4͕*ΎLN,'UTw0   Subsurface-4.0.2/Documentation/images/icons/predator.jpg000066400000000000000000000255231226345450700233510ustar00rootroot00000000000000JFIF ( %!1!%)+0..?83,7(-.+  ,% $,-/,,,,,,,,0,,/-,-,-,-,,,..,-,,4,,,,,/,,,,,,,,,,,,U !1"AQa2Tq#3BRrSb$CUstd%45c8!1AQa"q23R#4Bbr ?4@@@@@@@@@@@@@@@{s~(p2%HҀ/2ڧu?a9}wP|_j3ڧu?9}wP 3ڧux̥@'|_j3ڧux@'|_j3گu?9}wP 3'u?9}wP g/N!{D4x( Q82[۔mϸPPPz")jS 1Njx;7mdQ9?k֧Af- ̧̛oБr#@2&O1)ӧ Ǔ̱]Oi<I_}g.lf<_.(e;y/K"c47Tߘ渿 _6A\_f~/P׃l9oaFV^\>[Z稪H THv% 2hd4)-s免Rl\+Vedb Qy$V"\ͱ6#Ɏf+% 1]}yJt/bYiiٲ3eu*^S-SU2BHA%#(s:z; R]ݝA]3H);.,BH,&-ОSDx/s~T }6JMlDJUfTO05De~+pT:RsRo?o3AF,oDR iJA;H"gY"\ 86y$A6 H&Q\JHetapC) XPPwhpLq꬧6)L+#d,5`Th\Ų1 bwmҵ2n?P5!J%;t?u-aků"Q#lAR eX4{~ 􉄲<*=tXR5\Deɘ0P77rl}%ÏnhF؉i9FMe]@RE@i&k.m8$e]: -{ؑ0TDkX;mW3ld#⦂y=: D3?JMг}:5&`EX!Fv\J-véԀmͪmѲOhqC]`nhMG_ 8S& &>=HrKPq*_je&gxi>!,`̷,@ ބ6Sȁ/]=biK`tpwPH `74}gax|~/T4BhnV]wyJNԒwVp7VͲ<~5%ӹ#mm;*q\PrZqGU$ep~ n= u,Ζ4l%ery;j3q־]Te5^}ۋI4̅o!8b_^W)WNWMFr-+޽8y {m08u: l9*'fRUpnѴXm,JĎ-GϖnTmij\'䯦:/椌Vʤ!@T@_RZ}UJ ig{2ǖn %&zm5ҿQqn)[噜r2[Ac9 ^U"0~y).oV^I Y/ƱVI&{QJRiʾ q5ݷMyСeAPDI\jIIE=<m߽/iX̟k7#%?ym 9 Œ# {[t*((QᡭٿWb[x'>ݗ}=^E{멺*Ւ `WR)k3(6"XT2x\|V:p-ra,i\NM7DkZo^!m\ZÜj*?ۢ.*R{^ݷGQs2_EkZ.k'밸8G -=52rGeqɫ^H~,S?ͨߩ5Wr{7e,ЍsE{lπfɔ2܂Y[:GU|LyUGqr$]uS-4b¹BA X-sqd%.]1X)rSum{|,pָlsgKsOA~&=m *5eһoE,ŗ5ac3t^Raccu"G*@QZlI uR3X v+M&qT^ƊVY S~⠗]ïYqxU?i4vZ$߾ש sF鯉 XY*(g>QzKY/tJ((I᭿l碑-u?祈Krmǿ{@I&<"K#W[Ea4]lOMtmK̑.^01FQy*\(.]<՜x]eUw㩔x=eUwR2M1c$rr彷o}U-U5婳+UMim,{8LNrn;ja- 0rSKo/ԏt}X5Ǧqi;%XUٳNK\c+,vJ.g$5mF\-#u9 ]c^Y'kG;d̻Tuqp2YÏ+snbyKE ar鮝/g49dStNLXk:8٬orn:,N/[oK4];׽qvՒ[^_-Rs3fk}8xcWDZףk%S>)WyנWA,x<#"\.$N+b9 FkGz?Dګ-ک[l@&. _5\.ozC9a_ma~zYU*^x>*!vep\[?Ir]YS?׷*ku4ܱʵ VǖI J rF6x~|SGSzgR (( o\'i$(w?9EwPnJI4r|Tkt +'&h嘥K_}j3{U5?d\$jN1$1@AH>7??Lj<)x006爼K:6d4ync^~W<hkFwnkT3c6⪕ӦY!Y䑈lSDb -L8OÇ5$knsf05$R[.`%kXKq^m_c0NQQGZEAVbqRKo\ݤjY%)szGŪ88#)nƕ|mIT98"/Iwz~EY:#.mk1vms詵֏g**9&E'Uwmom"c#̯ϙM]m sGj<+Ok_>zH"IؘP.NoF:>cv&* C8I6"k\{7g!Z6̡Cn}ls^oOD5I/@% %e\I;T7z/@ @ހ ~ P{Fo.GTɛï{ZXU{)*~Mdo=l]%ú`~yd+t~c㱌7JP D*Xe`e"w(.xP̸,kŒ`$K1 O"ےE4'SJm"5$x z@Cf'}PPPPPP?EA#hA4 dvqHp /c+ɏ?k WMWg,j@V*;@@a?[j-I8Ԡ/@0[zh @@@@@@|Qmm;h Tс N ê*5yf-Ce(DԐ@@p |(B>€XX~I左Ư@#=ހJV‰)9G(kQK1Mg|rg+պE7eG꬜ άk`Pqyq3]Zn4Is[qVO]4Iջ0[39Q bè]~k?"nW<4l_B|ٯ[*d<þzEuk[}NYCި%V}~ =2VHe {`$YgrJÉbsJh8>a#hYA2{oo7}u9)[SI7E忽* */rȬzut&::fSu M&6I2e*s.kXO$1ISrh%Oޛ$˄@H:]`Nkf%,/ay%&֗$̟Fm{]IG "ڀlW^J>x)}:d1iv^[+fI7#A@ MrX9$lVɗ<<^_~NT3FGx ۸s$Vz)rv(gP ((<ŷ4|Yy;LzTHEݵK44q[A1gޓDCH-1<aICV1'0:v$xr6I0)eI֍f;KC U`Z"$>U~Mv=6NH6oE~,h.lI'WFL9l١st;"5ԓ2`:w؎l|L$OF|yxUnu쑌M duPeUy'xb8~Xa}]޽~[/f${.D06^[*{*3juDqO uz&%,SHrݞ6y YIkthefc5&o޸މ:FJbLlwVS&8,,c۳K5U%c rεL[zhrˁë-[֖- [ww>%o_k[ByL*]/U |%^/ #lI>(fwV \`m׭__gT{4ri}W穲%綵KͱA.-ö8_pa28}9ݥ\\-j_.SmO|]~P1M(~?%=ھ,42sqk985k_؟z&b cIe_ԣkHkXr tdq.(eզnxЌ=DqAPa{N0?Kʯ]} |u91#]w?= wsy;wp{P[A|h\|SkʭY,b@@x}/0ڳSIt4sVf.u4" yZTG#Tv$qbs2 `C^lx)ڄm.wu5]Q>D>"7gg e[ߘ0|H.\M$R/ge$+M-yk3Y6$nkҌTRK*)ElRHcM ԦH,p{5Eڰ4n#A$ʐ;|۱:*V*Wf*롯q ( dy'/ysĹAЃ^w20xtvy_͎&ͽRw] I**""r0sP;m,0<8Nmeunt (K2;U/h)a@@%n D$&tFK`~ye&lk~6\+(hѢ| '+7\S8+T5cz{5'ACE/_ᦣAs/_ᦣA3'jPZHzNezȨnJqlyJwt*w#a'jPhc?OwPu>R@g_K>yG=_}蔬F8=  Kv%I'eGހqrPK36_E :^E听6eZFMŬ-j4Q,<D0Oͣ$ lfMYjVJ;\PPɶM+HB8[Cb t:c8ђpn0h s&ڑS"MU#Wfb.|`)H}vFu-"3%/ \ M-߯ͨSي.ag^QǦ6ײd]JC KM0DIf$e):0.$[e p5#]0J:`8\%Y6?IR/ql9=9TNfskduj((nxUԫeab:7}`zUN(5i.DUVDUf2aVYls\N$$+ݯV*%Mp{χE"q7؁y#:!R,,A9'vˆ57(7*n7F$ya鬞=MM5)xKqetMRo}׿Mх)٭@3G0%Ri|'d|:$ e}SD?&ΉA}#BcYֽ(YC E RAPPP?0;zp_K9 dZ2[PPP@h@5A()WoƤi 8/Gcj(㗽Ri@EP€nJ%3 ]B M^4#A@^PPPP !5ՌobYGαQ<픂A4zAހ/@!4JE@ Jq^ O'X`BnFgÛ "#]ȊР _j+`hϤu?p2h/@=o A ,]#Ss@]~B>hMc 4TY!UP4lnl89U/@ =#06c)UHޭ@u ^ (dl}mykv9u'g~Pv9uxa/@MOħg ~*,?~ǴpȦN.XشMleal5P#!쓺"crO/?A~O;I:PGgZd:PtpF_ѯ1| T\Ƿ(2[UhY|FDү6+Rc,8˩ Bh*_d & 9F{|7tA6íK*%r@AOk ڝu$+=':kU@;B<y]Ib{! 0i\J[.\[.ST޿Ø~m/o L͒w=+o1v[qG1eqMݵDxg;-"$Dv2N^tN#b$-mfTN |*S#oLUl _Y8EVy!`3ʁJRJT&*q0ȑ/FI8hCÐ="Ayy㙪RN{<>TOipw"b;O!߻|TI'đ1HB4ZyUkMm!,+J+KrvmTg2=zm5%/\m+?U}3>$Ѵ'=GAwڔ6YVFAʯ+t;%Ҡ :zU.ܜM|n)P}:OL{iXI'@HAS-Er[! jk[ 0>A8/ .^~:h((!E>lVh;GqNܝǎ}X ֧V([n;H"ĨegBɔ_Qr3Ǽʿ# qižKEr¤aMbltոkU4*iXIh=\-mfݍ bxIp7{j떙ۇV kvwzCz4 R R ^XmN97$z+R8K냡 'D+R8+AtDXϩ;ᐠ¿pƗasFpm<I/ \wGWy>hoa6°C(q9RcɈEprP>*q<Қu!HPȤ5yXrb[#+ZziDD\-Sr ̫ 7srC^ڵ\.Oû-#sI#3x<+jD쬴vH`fz)@k!Ɓ!l1XOctÄ$p+N ŽAuWڃ$3īP< O@)@)@)A[!86 E1ܑ>'v|*y+ H eAE"GՉLU =^vqhǺ98ʆ[}GZ ҝivh7䡘U%*|/LSݦ~3"Cv[&MFi?xua0e:O2Y/F7"l2᭳wf}*'x+.5$׆(nZGXLz5> 3]tm4d)ky2O^?QX%bok/tidJ떽7aȷ;rZ Ԇƹ vO1i7p2.KHXwa&pu"#YN E)@)@)@)@)@)ASubsurface-4.0.2/Documentation/images/icons/warning2.png000066400000000000000000000204031226345450700232540ustar00rootroot00000000000000PNG  IHDRdYGdp pHYs  tIME 6gE IDATx}i]WyZ> !@$*ҝN( a*NM5C``ce MlȖeɶdIYeKzӛpse;6X[.s9goXwDIEyFRڇCy 3zA' RHݸG;w[vq/ɓNMFY#,A\28sgwf.hԀK=/| ^|+;Q eI:&vd+Qݿ?m_)0@<>C{sS "yMGo_=o=xy0 ,&~V~bKo=FPn~kv^2u p tˁۀl\s!Fv^v I-a޽x:C~#MQqi+.;r'H w σ=,SPjU `IS9@c2 /(Uv۷胧NbiEjvͪkVZXrnQ[VoܸMo"ke:.` 3;7./?1,,k~jrq, B8rT$I3]_>syrFJ{.t'r~br8˜^f&w_9r j|d;.xW<ŕ+d$HK_`0êb~uwC"DIcJA[;?z'ۀh\[IV@zIZ-OMPx w `e{w~ BWL"h4)R剉x`a*T[[7Ee ?Ȍ<,V=&3&20Aef"IJ{PI? 5%bE޴~7~&xE@@UL0 '\r K49ɉDs) =w]]d]d/b?\ J3`T~#.!'8'a~Xls8 sÍo9]8+GvI3OIxO)[HqdW,o|N*ԯ.wriǎ;?3b<NY36K"vV$, H Cྉ3_l(ńM}-or:gT*Y~M,A,q˕8_M fW {flMR0;G䞬 ;vSH`dHgtwbb bi%*#剔/&k'>_ @/C_UAJr zCǥ`f8dD?{K,@y~P-&mm|t`U"=J2=~k;(K]E!鲃fSw{͌h/f~%#ֿV)@y c]8&lCp(J(tLg_ ~l :淽m4;c>W!l']u9ZLrB4 !ȫZauYl xc)vUE`Wop[.&7ŭ_ :qfbr <\;Փ;xwznݶѪ$:m4Z6wNL\4}܆XV[sl]ۦ@/8 9aeR|]P~j* DĻ{QLng1n<ׄ p17v83 ,ݺq8P%`UD$sZrG3[[* p!=yj: #s=} ybV=2`jsי+5poնD 5Qg5V΁;KT}A=Q]˃.aò`[ˆ~I%;3^Y/{)^ z8 uaAK rsPm& 8@;Ţ=^:w1osG͞D =D5%XUB4U!<;-(T1hYGLn~+$6,c_bX8eZxw#؅w!1}4" ƙڳ [S3 ўhqy@@yqѹarݣOtޏ,QJnsHm[Je`Uϰ 4CH/4z7qmL`[baFSjQ=Z UOu炓wX$hȪ·s ` TddVm;6r i_ =N4XXw,dR5K5ND] Y*e&X-{!AfeOO&}7߼ % 3R~_.ϿL*{,L2$~]4IU@ Ux> 2S$TWD0pW p>8]T$3rD+3܆[6g(0=!i'.&*36᠄Zt ?Xfd#MNG3XՉ7mH3#gYE9<3^{v ,w{\I [뎥%8;ipf#Jw[ '< v'z87blH I wlOd J:m &[7V49VAW}p>4$OY)̍$PӶc_O=W|E)m.cMpyO|܁'.qK3z}wCHd歐,%tz?0f%2>f Xcjhp*:bI3ٙl@c[Mc~<0r@ s9,CjW06+T3-2l\B lGHqcX)z o<89Kfl~79dݎiPNlfF|~ \qSoI6u#f&@yܦhA3%YVql)[oFt? e!#n68_ܒMCV@l.[S `_cC;pׇ?rp@%BFJ"INQ u8?k6tȍ O@}{Szk-pqϑuͯz}> XXRMנǽ58/X@ܣe)Bra{䗆Hҵ Mg+N "-FjUMCV -&w̷!w%>Z4Ε['>*Zo]䄇^pjl`޷LO.{x%G#}o= 0vN/LeP 3% [_V!3b)5<@4TfrTxE6(a3=lJ܁;/Ie4)IE @T+KWڨuC$!Vi#Y[%aeuTE4E0ɀ%NItݺe =b>J;g?}sϞ߀{5SlG͘Oݕd(9\ɼ y"0ɤA6f 1M"I&pC?xro/OO{U=4w-B}Wzs2QT%V̈́@GB ( aAQaDf,|wnrwgC{$Gf5r$Xw66K C-C,Vܕe|5L<d 8KB%AޟEMPsOfc-_`@;%(Zf4,kln8 Ũ~|_^1F,xPˍy.zJ+9F$CLȼ$>MB%RJuIBCpX/.Pwu|S>F XʖhAe~]^H<޺a!-k{(E7/]Z:s[CDZ @,j/vZ yN&:z_H*ʋ<:*GN䀭qc+22 .rrTļRԞFt"~^q9fxA۶/}ǐ3OCn*13pɿJ̛R`">7 _5Ovo۶K_z{;Z!{;Qw}+z vP><YFG[rQpYRhD;+&ѵl=2X11scA#y*$!YDD&iTI6Db􀓀_mh aUK>j+pFFI,b9 4a_\xiOp Uc W_=0WNXS^⭥'`ق{ ;~?C#`}Ӷ׵M)H#E8Xw,OH=K ي@>_`tdj.wӛu<& FiՓ+Gy͖g;wS{cc{( ֙^cZm{iqxɹ\ڟ<蕚,j5@\9kx(LStR*mQ#⤓cRa({X]ˣʣKGINȎ$wTݤ&hl9 ' HsS{qnpaJ[2,NǛ,ϐK3IivFWPTʔi1(FQ+<[nS*M)scl%n6ȑ>}I?B(N0d~eÜ-ndH5/`F:,C)Z0#+5߻UĺJ 5{F KTF9L 1FtJtQ3RZ(a7: uf4 Mwh` 0[lqzM?>Xgn8>hn3AYB9b3p} = `yr3$w97 GĈX̶RAtWy:KS̫?"p$0"8 X#vX!/ X7@Sp6dHSnw T*,3W'qƕK.w fVa6_gB|ZG+K(ݥU p4#0 qm$u)Q6P/;ZKo{ GoTx͕=/dLԦG?+^yϕ0`,Y~GC51OYȴ& R+L)"Нyq<X1KX9~`mǿ&.p%xyjJ!˜Ulm?1 B8sGwƯO=$Zt[myPUinyV5/'"0~.,q9v|ogoڣc]/,׭WJ\|dFq<["סNQNvΥȳ8]TRkY K% J&@1RbrHH̖ 974V@ "8ifi .0ЖcW b#A KA-k 0#9U$hU#wh'*E1Ł|C2b`lؿa { @Y!KH4뤿ŵd,YsO#܈/7`xϩr1ƂesLzaa i~nlH}lrPhTɵt9 $0V'ǡCRǥX#ds1DqA6/PGP;«xlӚ&C:$Ԡx(%=#LΑ6ݩ:V%Y O>"ceњUR*TP˺{.C;V .ڞtӔ) wNw᎒rΣ Q""ࠡT$0 W+WeXvcc085^g,ϷRZj/TV,c)l^%33#Ĵܓli/54|TٗA7wqV߇:LMKM[ƹhl@7\>)4ci֡m3ف#tj UC֜~B}9` I[=0=Djp:ʵZy^yG~2ăL,d^w{'6C]_:|C#}AkGSZz%69QZuY^+v<"EqZ"]J^e=:V,=s/UA] [TJ/5'~r `X Ȓd'_ @u1nk`::Rp*{:dC} ~eG4>ZA3:fh~ T)/#sc;={gǴ.㈴gmX7aXԡ⸡yO^ƃk A~^?.Zҗ*Y=[m_ra8¡}}|ulyMW ]_Mzdls`J5׼=H .4+gIDAT̂ùngw^z`WC!Jyw=ඌ7}IoQ1F+3e-;hh4-黇jO}gCho~QI1W:u݊'bݩ& gCIENDB`Subsurface-4.0.2/Documentation/images/main_window.jpg000066400000000000000000002053641226345450700227340ustar00rootroot00000000000000JFIFHHC     "" $(4,$&1'-=-157:::#+?D?8C49:7C 7%%77777777777777777777777777777777777777777777777777 V 򩼸Q.VYRQr:KB Rx(b;/9lK粇xՏNscرHV0@PФEm9e _~^k9ΓsЀ%ʑP`/=hK fH  3 O*ԉv2N|ڈ F<ꘕ-e@#hdyXH*IP@@ yi$j,[R jbU*TK - >z{7IIHLyoxHLu0ZZr5t@3^x;%`DkU z:MD@j &ᾮHL5ZU"-d42(Z3PZ@OMgˊ[IIm2ĪlFUr*Briy-7˯I @Hy{Mi,@bg+ .j ,PVYiysbߵݐB\xͣtIHLL2Q^6:e:3 WH$- 眼HMD,kY cPiUrw+$ͶkMP-ϜozG.} 13ԅZ+ZJl e'3\=9 959i&Dvkcuh$P+8k,$$,G|/g[$fo@IV +Qjlz- I|t)bHH@bg[ФiYyƶsZ.LZ.$XgM$$R6]s1f+x2P `9ljB 1vKCÙ/B,Vld q\MR,TtVzt:J.k >>m EW4c|zs&6(u5ǧ=X6މ5NyL䌡s|}:.P"F骀>zg3Y:ڂ S3#КҠsL{ZRlҵSZ+,E OrgVMM$֮I[x[eݗN/Mji{4ԽizVZA4Oм}zdhT$bAyfPpABK?1h.˚s'cDmUcƺߟŚijVZhx#:Kc,=)Ҹ«]M@ &~g8et7\ucӡ8`_E]եQ ExZ2* @ GLshڒRT5#[ҷ4/PlTD,I}Z<"hPRew3厀1>D()u"j5͖GeSEImТ'Y};mVJԚUPB$O?OLuQR͕ HX,g(N"f\K"(4J ~=>O2%YΜŎXns%u+ӧZjk(XI{zBέ`*Lq,xuγK}b=>ot69ؽͬ >O0[2 "qt?rIROP!RD$t$Pe* .b׮tFm/9dlb\|ԷyͧG:,G1V%TZdyxqD1 %I.'LOoͥTY5ы0̓#C폼Pr,AL=A@(A(X,HGMě1^\#Ш?nOyǧ8RlBУgeĊu,G1'HΆZS7<,\kMKD%yn@`R&X7"1Y$Mc@fTD^Фbyx9[LҰU9x} -WY$Ւ$MJ*<=r R4bH9::k@1YDlDe.ICn!|:t(UɨX$T'>ݶ8cƉ+sHRұ?vz4=`qglR*Si'pji&eĖcY:[6@VT@,(}hЬMr? jL~X0h @ IH~k3cU^DY.P͜g-FYQW $,(wh41+V5J˕TEtX;s3CAG1f*Sf2< N  $Jw^$P{heJS  gNNP<3$WYR}q(HEO<=myQC1k#sCtb< `pg(&1*ԱW?='CUH H:.Sj4$$ |z7\]xl @I(.} `.!"1 024A#$@3PBC*@_s l/hW 꺾2 VFG  SLfbieWՅC~!ϴK5%+JіX3-3y}f7ψB1{87ZTvM,E4L6OU`qU+ cٔɦТ 9M`UrfLə3&d̙3&d̙2fLəZv{;'%.֯7DqnY yOR+PuF#WKGyzl98[x\{8'Y~şgY8i8qO!ƞC<y4i8qO#ƞC<y4՟OmYE,f4YhD4YhUf5YMhEf5YW~85jF*l2&Dș"dL2&Dș"dL2&Dș"dL2&D_nq5[sv~IMgeu/wT#o='nώ'+6MՓ^a,`L 0&`L 0&`L 0&*&j{\ȝ\)+=\[ni:uI>8)[CUz{ZULZiY]T+{v$Iؓt&7IMnt&7IMnuf7Xx]m~GUHegbL|oe6ώ'gr;y\7~[ẓV $O}v|q?k\,MEI:SnªL2&Dș"dL2&Dț /ljWĶׄQώ'Z;18!Y@EJX^4mB30uV&hRWMMMMMMMMEE9J=`!,X[V-Ov@(VB>>J-ߐOģwtaxu# ۲R.f!Ы26 AUO ni3&fffffffca1ԙjY/ljjYn ggX'yYLTߍYe+p>>8[<4سt>X zUyyMr]]k%7v*e^WL[YK/ljm^rS>,׵Z~k g۳m (SMRjA*),uXZavB**,&5Ho6MimW rOElyeՋ_ZԴ$(!'gY7{ {V>6E NӿP3Y}RzDj-^97 ])[+vώ'񮶚~.*Zme7"ZKC/;ݶǬ_&QʨqRA=gzY=gOtOtOtx޲)U=nE.oSZM槡+W[uR3_ve/~ ~َ s^_+>8~?@0͌͌͌͌͌0H"l&Dț 2&DBDț 2&DL6a "\ώ'X9 ev/~8 k5fYk5fYk5fYk5fYǃ+===2dn"w"!ןlzCȍd]O/_0QcO/TO/TO/TN( =U:ff1~Y=eeKZ=iEO*k'/m~Mkc-[ rRO$aNRF^e? ~<\ٓ860WYvEM|bT-M~2?%[!~ɱ;uqo[eߏ.l&l&l&l&l&l&l&l&l&l&l&l&l&l&l&l& ޢ*dVU xmim36Mfiml{ Y.G&m6Mim6Min[=~&&0|Bc{*c??_bڍkTY [ zOؕ=zk_*kJӭ<xXuk]KXEvλ1Rylj3?CNO`x];N'e[iAmw[;m[qN۳v;.N!亏:<֞t:`%w;읗Nۧ}-۲mAmw[;%V;߇5?H08{*{AfffgdGԛ2gnfށ ݞəfmjt++`Ŭ` ųffvz%a3՟c8ߝ߇$~>,Ǵ~>|O+: H 7,AܛYnr+'=v[BX]l8fX;P&;k6|"ĻcmYIܸԴGn?Tb|?ϊ|}88yF:KmTDZ:5x_8l0f 뇯qТt)+ fA= AP 60f p %27?=)+e`3b`a@ ) (LK?0Ca2oU'3Q'~/ԋUGmǡڗj;DggnNs͝n<]H"Irʘww3 0\,}sB6nKdKie(U?tWim66M him6q6@im6Mim6KUdRY_ `Uޱ3~O} kp%;EWݕ[#5 l0|AŠm%jU<_8lZźV`A)mOיW Ơ(ū2>Jѧ$V5WhE=j5h:TXHi,u4"P4nP5fP@L\b= ՠ(NX5ٵR@UtگwY1EkS1E>۟nk5&~,ٰ O;3gצɫrf7brC΋݅ouzlP,\g CP]nB㥡ZC[,ON'W8 (ЌCɣ~(;]U55^-@DYS36z-T:_2RW b ZY?)Q|5Nn7#$]-wK/k[+H/Ai # 57{6-l6 ?%+Qy-]6;=|m lnA;v,c|_||Gǃ?/q?t{lEOxʰN1+hQmL'm;c&H:QW݇V))>'GρcE|~qŮP@fr:gYv^;Nsiһwx}ce6m=U*f[._\U H3DbǓ<`TE`o-A~OAg L`4k^ V!Z ARZ)ŭ,]3303 VtiV f>5WݟяO_}'_ ,f;leLt l&]ܛCgտ"N3lW lxZX{t/c:i֐m+eH:PA]d0XO*  7ug Y>M#c]fYk5fYk5f"eH̪vZq쫌[Yk5fYk5c0O1?siwٚjO!8662[(C~):Sn-ȵ{j4tk$ҺW&^8G끭jN,b Ҳ"Tkn޻I'oG_q ]&SO2glOO2a9NM/2myĝ;v$Iؓ'bNĝ;v$Iؓ;gul-uw[;gulq63c63c/wulw[;gulw[;gutwk&`L 0&`L 0&`L:j5NMST-2 !AQ01@P`"2ap3Bq?tc k8l +ݢmIU.(,Wһ:x=Jt4㧠I$sifARi_&.:O_~UKҟx\R]FMyIˤJAy^~ȯ%$fgzMrџ{USHidnMikMzE_g78)n7^g2e[ʷ9ns*ܿVlhqR4gjq\%2v33$W IM)>W{x:cbYY۩ETkM"/Z+>uOxȌOPjjXǒI'QQ}gG#ӥ- 2ro ]UÄs1s5Ob]9G-rչM1wEؿe$Whvrӱ˧cN.];v.SaNv9t?r*kBU1ծTCΚjqST2yH%8 qӗKiKzVڸڞ GJ`'iN] jvI,'I%K$I%yy̼^.o f, Ñe*8S߃k֫>5E^e^^nWSLXp}{ *6}}rGad9CG"LAɲG&D)e{og,q+SEJ’llaTX*VO{ogɲ96G}"hrlcdcdEȲ>c>Κ\*(åfdQ(BՕ$9Uj][w[-ĔA̢Qȣܦ[J+4M*Lt֛+vtQU)VDP㼐̅%TSP[TwR}_\emg[}BYco2Fd|x^$$ ~dթoXC)RSiSHnYH `Q%Q (ϦʚZRJ19j܂tFdfB.P].۷x2H.t|Wh"Ӄϋ"O28L^,^/Ixxxn|+I~@8e/?\`)cQI>|gCĔx B vv5p6 p<333AC!d2EtV6! 01A@P"Q2a`#BRq3?_MyۋWZO WU|nJpK<\˝$><1Z|QEQEŠEQD_|\?MS\o|!o,ٞ=$X_حa*o;I=F**ߑ*TAJIw5!(˲AE{/|n,'Fٳ.'^/15X}FRQV4T/4/|#%ȹ"m4LUfy.5aN5atbK,yܢ(WZ__}WL~L]5nG%'!cQjfOȾ.8Յ՘w/]xpÌ{|bK$&hTVK fN͎Rn5JHPq8$evU=Ķ'<g85]GefiJ/2k4R$iE%%r"Vٛ4Ff}=4a#,mY hšaə]_X[;{&/G/ܖI4E [3 0VJ{lI&D1$ǚq&(*8+KlV=g"ا {W?x(E2/}/C}3:3}Jy'ٌ߱̋-tǾMeFTeFDeFTeFU͕QJg}G[Ѣ%^|CuEtЇϓs1n譿?q:⺫b`C _O-iFR{|=QEQEQEQEQEQEQEQE,l[-ee*ʌN&M8q4iӉ>_=G_&Šv~Uo\HGٮ{_g]<>{^<|>;+QؽۏgqB,]_Q#Zfi3 lՙjԝYjb!3Zfŋ6^-X+[SBxfѭ3Zf!3ZfYFLCVfY0)=>3P_YE2L+Eљ;--7%H&ULMĹ&O4iInnS)[ORh[;>(}g֊ߊgFaMU ii:3S_K4iM eUFcf#- $!Q8|_\V`GoZ}X?CZ{(((&Qjf5;Imԓ%'JF#5YkfMj{F[-nn[77-G323D23*#2$L3Q#%"<Q--z);Gsg<e~oy\,3f,Gȍ4i"2&$($i#IQ$F}ۚ>Sș갰ىglƆ,n/V<\<}^W?Ebz(3f>ƆFz| t#G.o[όяt=/׆jeo\#|4}>e-OOjk,<8᪏}Hl-GN]ܢ?5sLΚEh/63iWO聕֞·Fbk_zKrF ORϵt0g%m.7.\2ٕp\p\p\p\p\p\sW+g|WѾS~+)o_7ʼ+(ѿ_hߊ/4o}7⾋_EFFW~Q~+(ѿVch||r\gOŒf3.{vGp3._EFFW~Q~(L. @pBAR+iL K(Ge9&% 8HٺQ[z{|1L>P/)Ė0f'VbCnV`4M|Ӧ*fa)?T[x$H.VgNJH[ww~}g )C:0`&AѲxYK|`oZ+uYb;EAz $H0`EdcV X+[e;LqABbԉ[`B t+!7S.6 |ZQm, yXw?ieЇ) 7Ķr+Jcso1u]2B/-Evf[6NͽYl?Y|#POe66Lhx2(jύDޞnSS[Qme~ ` YeeS~ҁ0"E U ,JB-Ѣ-Ѣ-Ѣ-Ѣ*-Ѣ-Ѣ-Ѣ-Ѣ+ thFthFthFthBoOQ6S^> XiGuyY6 >H#6aKY&ڥԌQ(wkOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWoN]D|VNS4OhRL^VTqoy+ҸqA8}ۈNA%Q6&HY,&[k`l7JԲ >; ;C͊?|hPG<`~Z0_dEQe#fN8ᆻ0B t-зBDM'#< 9xCgg-8a]w1SnWdIb ۪n}귛nyෂ x-DޞmaKH-k/c{)'^Pzt7+ #[P8@ tqQf5@}1mtI.lH6)SԔIȨp v+Gs Y\+0)i'?QoOS>aY8lîR+\ @O\y4J _E8e+h<%H2=DHi9}2YUckm^EcXtV:+Z*]Li{+EcXtV:+EcXtV:v7qY9NY)O[  q><@U{0 _8F\ӄCĪ2vK54~&LC FpR[s}K3RfNxƸ @0Exk++hY L -&Ht'D>g(Eh #db3z!hjMH,=-<2%lM̊V85c4xm{َtCxucf@D<RFV)!m|F vXrCY(nC xPVfe>3$et*S讁v $CpP>ÊB3{GP} Q$T|Ѣ9pz =EL?.G淮 :ҷJ+tҷJ+tҷJ73hNs^gܶ\v\&:s85QΫgz,q5%0e ,9\f+`GR0#&$[Ns[J (  `ŷ*'Q"3 R97Hi&ie+~SoOl(f 8@$+&#LW̱qc|l:*h2O7E3.ϒoIZ'fì-DQe;,t_혂= Q>Vɯ-DۍPnߤ;.dzF@5S7\jnaO4* = c>[nV[nV[nV[nV[=)3 WDrߌJM?T胰60nZq\&ރdU||?9z{YZe(eu=RyNh9s6~ 00)_?SX>3N  P-?,Hl7$sehy1kT>ZlVi*\rUʹW*\rUʹW*\rUʹW*\rUʹW*籽=Fן5淼[ߙoy5VyһU>aQ(~WW[k{_75`ȔX}ޞɗ ]rܮ.忄(k x++-ҷWrB˱GJǢV@bZ=j+ UaCzzx+]WjUڮv]WjUڮv]WjUڮ">鲛o#0? 7S-Dn rɭm( vRDix{Lffϋd'0!=L@٭F&8A'f[&Q 7X|d) lA?=f)Ops_ˈnRweTfs2mX}ޞţ!m'!O]\ො/z\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toOcYٟrt66{>+tҷJ+tҷJ+tҷJ+tҷJ+tҷJ+tҷJ+tҷJ+tҷJ+tV*XbUV*XbUV*XbUV*XbU[nT:urUʹWWW*\rUʹW*]]\rUʺW*\UrUʺ[\^I2{B(] wAwAwAwAw.(-[h]]Tw#8h_"S0j9$5@qqqqqqqqqqqqqqqqqqqqqqqqqqqqqq{:G vjñHFLJZTINty(Tx$ktX^@V1mPS9Q53te95Ui  d2b#0&P7Xf("SEv1>zQy(Xj>H|`~y0?eaq #zB<߼&fݯA>֎ef`oR;(@22,hsdlBˑOGehP 쭑c+Z99[=dlL۷ ;`n]'XXD.Xސp$ςctė>_kOU9[=GeSz}=P;:"v沎PޙE36@rSHo:e?™y-I$vDes1=%KA'fڨA&*~YeJ֜ ?JQnYwEh{l PU,CL3.69)5:.}dv`'aQ&Q&P1ZqSeݥtWrޜ@n&S5çsSb(,$ 9/#2?/%W`olUPQhP[{Tw跼~{Nj{+U9Eb ~qĶ(qC! k40p.>[ )n$ڲ[ʎQUߢoK-%䷼!h`n쪧O }9 8vh((킘׎Y' mCe30 9VB1Ǵ<D((ҝ`oc P>GZj8(; ī~P>|PdaAܧϔDyjcGal~ܧhb\f 't#P,B[seǚncyߪn lwkNϚedu*&=QYH2Gk,?e]Ok0%Mʤ!2BRPxqY3p#mjk ATT{sI7F3A-:bQgr=7 pǣ 7{5R!9ygo^FfG>@kUU[jU{az'77:@ EO0z LSr)6V-(L#ĢCaS0h!9)3΃V^ )mGX-IUme(?  N[Ng ,&7ў v` m~T?Qz &',?s8& g#Lgސ3GJT.6r0^2ͻX4|gUUdG1&-K7LsLn N%5Ov#˱0mdfL tfYQ>7xBI; 򩹆W/rB s Y[NKuݺ8fj&!yxa GīJv) b57 apd-n <"E&]5Uf,s*aіbV 4lȁgƿ˛)#fi&|v:x'eQT#Jo!Ċy:9'81ٽ`Ӣc1HpxʕBTMQls*[&z(DߴBxUN a?O40)m8PxM@s&n0nR3%8 i*HNӁ 32T?r5,8g t4To̲&LFæiגv&*@|NYm~U nQ$NJD51m .as9iKYŽ1oR^=y|SZbe-u8ɄKH˄DIOlx9O{0ƤB7%1dOH?躓>UGxXB0Q4삛,ee!XٰKDMV?[rX'-4ꛇ!d kB8p"_WH*J4LU&<#PjCw)  nnYO%WRxuM \"԰h@"/M6-ݳ> C5Ev5[G_Y=|UX5>ig!lN]KB5E f"PnPvT \hL-:jۢiN#2#MGd9yIjģ郘߲`M,vA{ -=ٺhջD [*6[6P[U){pׯ0|8)$;_Miʙke tvS<(Im"NڈౙƋ sHmXњ`uPL ݢf3^I.9lRe>(j6A ^ZO0an,> >H*4$Aؿ,~xHk_/h-iS "9CdY|UZ1 AY1a(9O=7aa} iœ5O Z˼? =^f_wum;[e""moKŀpC"ԲKQJ"@o*h2$ba,7>YϊŗU;A-PZ4ii6jYFFEV7E)مn?U2ZoU$#n$jD<*g7.4f%ͦ6760\,Xxk5WaN3l;Ai4K+Axp@ 䳙:38881PH4T F`qèE?c.kt 6%xQX&Ѝ0ƉT+f^8{BVC_ϳ& rTф"=ŀTDq``R?Gh r@Ô 64QX8V Ghrȧڬ `b" OSPQ& ((DMOXlP 2 }}$P ea ]U 6u)(wX2]:Y 9{LCP*eUc*:S:X qS(Fxiᧆxi'2@AXCvNJW8C(x'xL–#o@B$7Z rEڜ=qxlM&M­#3CŀIA'LLb`D_%T:bSa r"EM[1 ~NÉ1aENcȩdB\!Tp?}g:׶I%}.c+|MŁV@@qx %`-)MLDVj#;)JÿT)x(xwԥ/< "88 ЍLXP[} bOc2CH_Qbat#@#EkSXo(=I4擜sNsIi9'94擜sNsIi9'94擜sNsIi9'94擜sNsX=uM2T!mIpB."ޭ0]" A`,bQS%X!n<@]*sTh1 "D*.U3+,N"v1VXBu A_2B@K@hC@EEL\`h;` `Nh%@ ]>Xj @*.QF>,|#?R7 *ʘçR!#`1| 7|#BcGxG>2Gxz.*)DRJ`%RbB%2?`ᓤ5ac\ F&j@aE t, TO~wc˥{ƛɢ%d̠ $ `}YI#r, =PO 񦰈`$E_GyLYҒp4%dVW"""""""a.i #&*+P}^ VQ‡/uяlPng?aCЈAeB5aDɨ3Zeڑ@xEg>(Ƣcb0BRF[ &~X0e!er ')hJ 0Zd 87Xe1CJ)Y(@C"`V&R*G'# j% s_N^Ĺu)_Z*,yKuɁYgBR >1>خ0&Z @y UUfژjZKhLEqg*I(.ӗc2O%@ k]a #X8#Q7T&#Aw , S+@E-8VbZI XX^&/'7,iNiX‰Dms40,?X)CE+C g\XPrd u77q?A?A?A?AL{ d22@2 *c*QTP  LYx%t${P` +?EJ[ !PU e,#m}qxx @CGK'. ep Pp_DZC5XRk*4)Lt2=)KRUPYgl/#G(QQG#r1ڦH$.IT iBpݔ@IQ> XqB썔d8XG){OG(&z*pV9Dr#֑9DrgClޜ f'\&a% ]f:J 'A!r F23ҁCJ 0!J+4 h8, EJPj(*0X*"o7M&xD"o6DM&hD"Xl]>@" p&@ )9qe0U7Ac>я<}<~2u4+ˎy!XC%TZ BSma «[p00"'zrMG'A)JTQ 1l5n0ʢt,1&kG#(5%a$ K T4ZyE$){EҊ ƈ&J)P.'> :E7?KBSJt+M9ӊ\yM;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ;ͳ2%FQ`̣(6P}`@j fWD$Sx 2[HN(2(FrE>,tS jAxJ@(`S#nPبNcbY1 F* l=43wlyiXL0 TW: /5\d&lllllllllllllllwkܠ2|?~#9@J53g?H~g?H~#9@N~ žP(GXpq$>ifDBZ|c2OO_^TBu*pT<DŽ9_U,:P% B J(J (JbP% B$ -apbA<}? o)o)o)o)o)o)o)o) }m^_}&̒0S!Rċ-@^÷0C*2@̡R8:!,x@(AV_!*k JD}+vJoRt!7Nn9stӛ7Nn9stӛ7Nn9stӛ7Nn9stӛ7N\ "r2buYZa7Rʯ kz도"YcS~"*o;o;xwxwxwxwEMH((((((((((((((((((((((((((((((((()q "VN7I⛊n(/@ 64n)⛊n)⛊n)h5nqM7SqKn)[LbURn)yRn)@.6n)ZE\% RJpQEٔSw!)}MԠ[%"GL bG%2GJ!v/HZۄ @*N_;__'w}g7{g7;{6g ԇ֪Vq Um-HH2K* qqt2&8qp#ͯTq uDXZ/+~!=! wOǤ(%|I B$?B_kդp8RL hpiG/]q Xq BbL1%9>C '8 ts N@a@ 47{"58fM6J ~2s qkG7o9sx7o9sx7o9sx7o9sx nG >iga!G.$8HBEM@2\i3hQ4Մ"B!$it`&m ]ebbTP۔k,n>a`aJfiل,uvK9CτLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL0i9>Vb!^j8)F) @lq@9B %o`GؐzH} NG5%tG "I@pP@وp49 &/d8,.ʔ0&(BSXjFhR T\:MMe}EC4EJ١,RPFmkJ3S @`:US|5́*%(Y=~^5N0J`ɔ#͐sI9 Z@!!@amO6m!Fv $Eh ؀D"~%b:X o 0*8i$/m# DAaf- PS +8<^FU5^H@D7F5Um#ik)6y@@6m#i*α+0^fHQ.4H^VÌQl le8'R9;D`)2t%葁 qSpNFpNF6Q쏧pNaҭKD*\%RX.`FpXCML!-`/X|%@At/hPZa LPH1`3QVb: 9A+H*;h8:C% 4]9BaRr "" VMHH@!kh ,h nR1/OsEJXhqx̉I<}.lh8C kaOrUb&Q6@P@8gf_0Y!+*,yp(oyDYB a#D2M&| @ͫn1@WD{0c*4 1qcЄo q ꁾ2E\&a0i 8;hoTM =܌6j &!i,^k 8%\&`Nl'XJJBTYNTa_صBEaA&ЖBg0 m*vMR * 5@C)1) aOPxI6oyL0)#$U5}I]ʵBl *X3DIa8 _XqZ@/ Vw P\-@:㫃iv 0B IhD02!0TLA" 0 2R:.(a9ų._m:H*AGSt 5" G`%NMv $m8672J^qhV1e @(U%bGY2@d.aCDi H9S!obTZH! Eg26UhUѝbvFA7 D*6@k#B_+D*:ަqR/r)Zg Jjq .D+RRQhz+ۼ sarB Q#C .&5"CDHR l PdFV! efլH[Bo$(Qf$&5BF!4Nn\@cx&5H[R@&5(Lkh .YDM!,"kX1Ȁ7D&$j!|)2> %RH5E2׬Ю GZ5$<kAMb+..)[ #h `2A~aAVx+@N&#Qj\-#|K  @ffJ[3.CBW,AwCC<#*dIHA } 0:cT 5yBjޑHG kkU>3PUL@iPmѢXAS+#I c^©u@BPlБNT73P!ʀs@%DSep0T$4 @Eo@"k0 /("P:p: =ZlxTJog0j= q,aU0? cLs_#l鼇X .]\DLL6f>*I^0xn7XbM bhr忉Xw[e @6#0F+jU;e$| Cq㱁b,)*9q} H]m(( $@7E($HZ/\q .!7(ȰoS̉jO*U0h8F@ b,"Q`GZMY#B121$,ms1g3e0ƻap5EFIjP 9Jh+߱"J,(u01P8SV-gƈyAP-) /agf8Ggrp$s1̫l8 lc9@L=F$gLD# &A$ /Co+RlAqg1m+@#RbIf8=@; x"9F#ar *rD-b~PBNR+0$\N|]0EyT9F bp8lI ET*kg[udL6+Xr)U$5RMMOޒD' I%КC jY, 0ZGDTcQVLiDEhEQP〗CQG!MxRBe#4H! ,vHT Q#A&42Q0hN )uU *WyeQR8& $кHOiX$]PFh|1lx i:q0ZZiY3O _1uYEfX LR!{8bńZfS|0O~h $B:Ny!,#aҩ5:'%a2bl|u AaJԨc,Xa7rd^leB]PcЀ e(5j Y@' H: dGx @ 6J&C1*ʢVa(%$)GY '~C?m:7T녡 q(`8lq>A]`d£892m5H;WrCq^QB5 !`2" 4B. kgKpf Ң ];F 5T7)UjIY4jnPyzU+Meղr%(00sNP7+ڝ&P jia,ag";Ǥ9pk~7FqBRSH%b f%GjiĦrE`.'bTAyaXfUQ8i 8S% (g<'SqN)1ZVTTlJ^E]TB%3FS #k!SqN)8SqN)83c5oL )Y! (\ټ0w660*4B5_jk75/߄ :d<68@N,\a28 c5!E!Lp#r+We S 5I]UTS"ל4C;újG2`t =) nV4H42G  "]X*E% k1pFRPi |)%X=! H`:.Ppk}e !@( "> %t? PHDG! |B i{lHd"R\ l is66ll,\= ?`!@ "I`yΧO8u!`+?M?2D$I$I$I$(7ƻPr|`q33mI$I$$ $I$ T{dSʲq$I$I$pMͲ<AH@$8% "H$@a s70s$duJc[*V"F!(4dJ]dT av0] KOprWJnt :I8>)S~$b2?$d$I@$AaĀBmQ\AaF$I$I$I$@ >R,$3,$ 7q*2U tW_(\H$I A$I$д>`@| ݉I 7Ki mI xD4I;)Zkl$$8$I䒑lB-hZ  @$H@&dD4(ߔ-js}@w鸳[;Ye$ROA$I K)I$HYOWi!H&q9 J$> f~-$I4o"Ol$H4 O+!1AQa 0@qP`? 3w 7%/0=ʂ ͊R㣄g{qehqo! ]o[䏫]G1[w,k=͟ zb(.y/OИ#Ϭ,̟uI.w(K.Zwp ,+"^#8o+wwUર|#CBT{ÿHr&6$P(=AB {t}w B8F{_o0~. Xka  KH?Pdo13[e`syS~2B:~m #wwq_ϗZMwgəW[`>w}yN/K7-C[Ǘ.AvXW.0!nf*+k#<=9k wxޥ䂫(K& w>f< ſn_XnC&⇩ ,LT~9}MxGG2cNLH3Q>_~ S w0]`*=z Iާ+z̦S={+\{u'up }y D!k(5 hľC."/.^\}:U\,$HԨkb1`@Э_vTL`BaArEbw BNO~!OײoRCtpj7U*1]I'0IO>L"t~4;&7=~##O'(ouP),ԥ%>G8h={""2*DG4Dǔh"qW.` `bX.!]8pBV(cGtX;VNM۪s߬%עg8~&kPb2| AA#ApT43}ʅTn*5:JIn5(  J.A&GW .}Y@L.^G~P4߳A+d *Mӿ]cq T>b~fP>c*  jDzIh@.BPI4o1,y==`9 aw/jј9@'*恽4H(?'HMS/7}!/UҐا ^ *S3%K])/O99,.DH31a~K.horҺCWjXŋFh 8I(J a&ưhѣC#5&ZjMIWH E5/{_ߗ~%w_O>QۆA q0@cvLiGQN8i>j| U.[4Y,a{5Ra7dW0` 7a pI[?sswI;uIEۿ3 w8hH7G# (1 N%0]k^ l& B5`F "!F!PDpV8`R(@ W{ sLU3 ncw/zL[üL+!-8I"`X!`E.+a.H, "QXP`ԝ,^iS_j`#g*,nSӼW-5 ;0{=>\ 0 Eb`c\ff3xL# ! CtIyat'".\pߜ)*fF;pL9s]=+ ݭ𺂵yx.Y#<&n].h+3xH8`5 56bn]L"7u0f04I`#<$CH<L7c5g g实p{Č*jbN%I?^tR (z7MHH!@YwœҕM< 8kF fɜ)cu}"FBp K;B,@E/w'ϴ=Qf(8xLֺ:z }a狸M7?)Pj.!@3]B8J5@T;M*6|qҚu*RMa8f& !HvDg]opR0GWXK/[uvAp("Z,<B4hЙhLB^Xhw8-w>~2{֒/0QEhAJ~1D5|B&"- (H\tHDKui_.۬rLf3X̬f31 0V<{a` Dp>{t(+}&;EJZ !>{g{[cc'7(>_ /5h/{C V|} Q&81&0G4v0\hLƍѡ,.4sfiHȎbG{VF 2T!WC1[#lYW0Pؘf W(K$``B0㏈^*ZC {uqQYHp!°o.4q;Wj.W~C@b zEt%Ҭ#.,V@]c߿kxwxBD6#VH0]kYjEL$!$˺+0V ]`<!aLyJS ww Jnٜo?ɛx m JTjZn3&`XV&Ө B8TB$B"Dq`mQq(QEeqRo$4wJ>0ݽ?}㫔0?ـژN hc1ib(GEv!~~u|L a1>Lf<p4#HB #le(F6QBhM Dc1f3Yc1f3N.3c1f3c1f3c1f3c1f3c1f3+!1AQ aq0@P`?RƆ=tpȣy& 8էZtIXN:FpQ߱ԍ{1CRjdwAZɽQTKȕ|Zy"u"=Q![ThtØ(Gb] Dn~gX՚?Ԉ%"`a; k8 I*T5_eZdNMUIuMx3/$kܛpGR)uh:/gNbͼȦO1]7A\N K%dY,K%dY,K%dY,K%bo`R=v}:0Z`UK$su|>lXsaoy+L{g89׹oauvv;j$H *WF 7A0\AA4! !\L'_>ML'~Ͽ6W?{yEA4tɤ=[_TK~Rb}DFaKZkm9v-7o֋&׍ż-:8 KIclk]>H w7Qj.%Q`I/HwJ/bjkO#K(? Ϭ=Z t+jAldA#fwFQԵ!(Sڿ"an-!]r* ˾/A/Z*V!%V?/X"I,|%lb*9) Ura"Gd|׆@96܂?-Ea ه (8(PAAB *jUte_i:y~!Ɣ2[*Q8v r [5د*]O4QcM3(S 8ȆD2!eBOPїYor71v3nr?(7 Lv+nD )&=h6Qr3CKT8V4i5Cy~`5\&=ù"b4Xun;nϺeLOE|Wź ]~R>I"b*9Z_BlwVE?tǧ ^~0<q4|iBo=ռ!^ xk_9ViELVo躝^=(y~y,ǴCi5r*5AŹ4Puo*,K5FU|:r*JB`Li%q4"@r#fNcsW6n;uUgubF,QA>M纶UYCo^ 7;ҽEB˒r*D5+BN}IFp^{ǕX1S't?DMHX/z{TZ%)2]Ty鍹i,éDbC&i}D3x};O8*ưt~Zx"ˋ_MxOfţMLҩIhVq.V3)0`&d}+!6%Yl{zNU 6j$,(<bcK֫vI$TIG5TT=K7JI"3 ٌb)S۹{էM{D f 65ȩ$}u\5,nӕ$i l{yBt^C>m} % =WQߺM !n!a$b=cYk)R{terTֹ:3uBuO((Pr\[Rz-GeWZ_tˏf8Ĉب3!x FN 8{$')SNRahr)'75{C2h^JaU .6 cqak}sSqzu tT1Љdp,E=HCwF OX6JkI5]@̆[rȓY %VJCKN]*<1 |XӶ&DPAEe@_t Zb9krnW`PT-ڵ\`NEVGYb)n5]weK2i/We>qt# .'Z_I41XBG8FTbJ ڥ)\[PUY"MekmT"QMj7;I m750նTE] lf7 㒄9q-[0clUprQĨF឵G poG)xq%?=ȝԚO˼ W~~}-k?~%u4b -_2T%HF -bumbb:*j>)'QqQ|U%-!N}(, k3f8ڄ&ڛVs:+a\񠨩Z[Hj";T8U5P,uWcyj䅖c2b2bicd$#B 2!a$rτ6`1f3b; i6!n}'W;PzJ{㢟EBJhLhmԀq Q6"601z V8G R@!nO/Pӡ^N*_T.wRYZ%WJΩ*V^64Ny .&lg?#;&WQeo/s.zڨƥrOvɫ|ǎ D ji59k\~"ڿci2]$G5rtIiU츇7cJq8qE*Q uV 1URJ3Hm[JXҌ E-BDߖb+m5Ju̍)nNJ\zϑC#E lF2% le(QH!5ЩnerxT vVj޵B5G Zϯn]r*uɿ*\Uq|~|E"u)!QJjZ!OW2j*<&$ <+kOwL|mUp`FRIcD<+68ZisF?Zl!m[ `c$(r[fzpB78ELe}"™J M}1؄-BVLO >sĸX(#VCCqfع8oaNңƂLf;≮\S Y> k7Zsz Z7( @D ,HY8fV'iAAv96Zf,i:JSCkTe򴐱)\;9JbښU+J>_z[Rzǽ4F$&b-sbjc[0'!99 NBr)df18FY LYSqQGTqGt,{*!1QAaq 0@P?{r(~ @p+QCy*iWDJμy$(\8@-0/ *fei3 ֚J*08C}jPP\  Crf4-Y@1lC`ih-jT 9MszaVeiJ[. sUT[ A e\!@h*]aI-d^{2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2s-̷2sNHz1Zo2c6m +5x4 i?[= Ҭbȕ [QĸG^U@Ժ:TΎ-`ڤ(Qxąn ^%iJ-hC`=P2Rf;XKWԓW9ҢI)MqGue65Ҽ̩Tk;&16[]g2R]U 7ۂm+̯2+̯2+̯2+̯2+̯2+̯2+̯2+̯2+̯2+̯2+̯2+̯1 u@oMZv"=csl,(-P9:2ЉzfU]:̻YyDM]0ARbZ|iO1>b|:bՇJ4.tc?^Gaaaaaaaaaaaaaaaaaaaaaaaaaaaae  TGj =% ㄺ{ ) mzRꍠ"YoX&mfLH^C0\h*W6` Ȃ;wpJ@m &]!S(LI>)Y4 lO]Cg6W߭KEåۺ]gT[ᢳ6|ĭbo':"Pl# XT!T[ lL V@5CY+FX`* 4ˉV.h4}aD,e1bKʐqf=/b\lD:P4EM9:3"㥚e`)6{ 4Y)`4{hƵ:WUI`8;1łZz .wwwwwl^333,W>W+q\|>W+jȓQE,dN*ګV.{=bS_bj@ӎü8X9In̑g9Kh7C)?n!%w,s^1%)B5_Ձ qSN[ fH ф(u mAH49jqo&u9/tBح r'=ܹr.\qf\r.\qg9@ݱMp(cdC=%J bPIER7&[ V+dlyt1}/V/\bL!|GY^PH#̜Ę s8S;u,/hI[|ƫaP@P!X)t"(cPF6)fR,+ ^J(Af]uOki1r.\r̹r.\rt#OO&m0Pvܖf?+`e:8+&LA⑳bֺ |j<-hXhg}wѫM \qPl9 W>=܌tgJR*Yn+Rhb%pE:lZ 3Tf{9s{Y.\8e˗.\Y.\8e˘ EP0ؔsظ`qtV4Vw ꆅɼX(yx?vǁ=f~c̪f,l!ՏRInA,-Ls߹x8ȴȤM/vac&O 4!z#b QfsF iKz/cC]u:s5X*ѻЗAUR%eaqV V^S.Y̧$B-ǸZ MEWnJ5z 5r圑, '{^@6}1AVQZ7g .}*§§§§§§§§§§§§§§§§§§§§§§§§§§§§§_HDɫ.*2̺a"n])vShSvmWӽMjDM4Etd!~!GQB ]ɽyi\x|4pOyٟURzc6WYXB5xPNh{GDXjud]M٧m5T7Nb3[os Ps w,>"|D'O>"|D'O>"|D'OEhױ[wz伉xj*XeҴ7 WECcxdžT,:Z_{V}Nw5 ohﰸ+[W{]kzb P+ {Ͳuwh;uԹ *@nuQ* h]D1I%&ateˁ.U̚CVŕ|p+q&?SEiziP< ;31KB8Q~H٠* ʪ!S< qsDi 셥lkLOJG+nָƱfTV0^1Tx5IUAa!C$(0W1HKN/-(?/1dg WUc2z?{=Os'?{=Ox'?YL F\fW1{+"-Ю,P#v,Pd {&-sٵ[5  \ORr&{ J7vELlX4ퟸm-W4xtR6 CH +}^SK_^t㫶K-dK-dYΦsU A ›$ZN0`AiU` K-dK-dK-dK-d6g}~,A {9@7xYBμ.\"AvՂ}x>PrۋOV#}\vAtaA&gDul\1({4U![-aC7⨽)vǁ=f~)leqM䑐0eMEufֻ`ՙ }b0\83@8]m0$`ZYaΝ5Kq88ځ,; ;{cPݭsv[CG<%+.-ՁEw)a;P#eL$FeU.}#P0njN=0BJR݃ܬZXLg{]|Ffާ] _E&b S2`>$ٱ=˥.[N[y:ٷs4kǚ'^GMfecܿNխjYyPA/P<߻c?C H;rD[kT#f+= ZKC?cPP\EVijYMJdZƂ2Zt7yGSn\Tbb2 D(6Ϳo>q%i%0k~&,\YV[v}jҰJ`*@,?C><߻s?Co#% 8+w!"-4B%5#K)Bd7"zkj}CP4aͨ8PʨdT5cmV/Ru 9̲@[@^]T^-Xi[J[Jl:6LB'd!A2LӃ֯q*L kj=s2Z)x1dKoa̺•oExc; 'V̏CXzK^Dmt[^o?>Ϳo>&v4Rkvְb P 7]j @*#%5SOݹ}x?vǁ=f~u%r@/DQ䂈HkZvg\Zp.hzK(x R 4|>_.Gɣh4|>M"4T5dPj3 no EQ #J)LՒMAfa< ^`qY*pg3 +f4\Y1BqF:j҆|&ccWqkC]5x@iDh:+A#Ĭ8Nx_=ݝߪ_SwGCpG?>˞rݞ|,7ܡ,Mm!\ @QMST.,a=:sAMs7gT᳜31_Tst{I?|>{=c|>{=c|>{=c|>{=WP'}~/YYYYYb::*eM,/<^u[(ZX!u &p2G"HKj*%*(*(v iA QC.YYYYY|:edA\XBp}4~{,r\o C{v/FHMIi& h+h[Ы:Uw}+qy,^YfׁbJt<RM^-q T 5Y?R՘b*^%j!·j}nb t ^^BxK W7݇$|k%Xy9ܮgryM!QUa]S5]zQqƵ`Uu0& X';6c,q)m Mq}QYylSseu /Ylxvge@-Pp O?`;>o7x|>o7x|>o7x|>o7CU Z>">M(bQH .|?sTi91l/ɸb}W-ru5qb9x~3vynVpߪ ͠`[ VGY8`4X[ѳ5qEeV 9Xqz oQ4~{,hV#tpbt&N%Uo;iUY@Tك {a;YYYY&.....^޳޳޳޳>^޳޳޳ޱ%s]oqV非_<ƗQmoxUjc"aIYA1`, FeTȍdgl͎J"Eh{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{>{A3{G-%&q] :J_s+%}䯹6]ABvį?WJ_s+%}䯹?蚟1ۼ?WJ_s&4^J_s+%}` 2WJjD-^R"\fEw_sE!XeagDC|3~%p mD0ws qF1Eq8 wN\Tw@Iꕂ[q<Rko3T6ps2>eq#=Q2. ,dyf2K d4WUoz`3KIZЎnpE櫃-*P)q(+x_Cz ="UQT1jo_9_+ewf0Ck;4FbkT/e`j`AUZg7FrSQbMJ7LPi%#_bejd` ;iYn1Rr xK}pd@E˖㯄r7bض )OH3,jRJWCY:b1xtФN髏QhszŞ" hbm S UWY _Z`nެMubvØΑgo՞߫=V{~Yf[{~Ygoՙoo՞߫=V{~Ygo՞߫=V{~Yft r+}7dRTB-] 93ON!3{DvAJ Cm\\1ClRW!b!"} KPˏ n+0`C-?tb{lBͯx3RHQ]r֚ mW{4lUácΊ1%.^JP3 SBZ^f (KO->Z|iO->Z|iO->Z|iO->Z|_ԐY``DوlRI% 2SD!J0jeB.;׵)T@aqŃ<-h- ٕk3Jů!҅_xQjW9e8^K۫=sZ%]l%`"(ʜL^R)۰-tx*Vxsw(`X{:_HmtUHj% qy΋պnAWrh0GPٳ[0D݃ ,PL QyhD y1NI%ۓVKShCdk PelZMn?)f2MZ[5Ŀ u>q ۄ n΍ÓPJ̲hƲ6ҏ4 \v8Md,Ór7"Y -Ό WM[ nMO-`ga AEF`[E%EQ* Ƶj_dM%:!;.V0`Ж%F;.FVc)PN[n'OұĿ@r/ݫл/SIDrhQ>=DbH u ڬ1L$((]{n,n=av^-sC*E]vZVmVgv]Z݈!"wrZVno VZ3j`!@:!- FX$7"hpiڷUv$RU^iBUM-pl/ _.H% 9U}R!h^c5չ`*J{[+Wl|=dKtnGqT8 ]-X]"ޭ< $R_9^z n %f%'KTF'^Ѹ]R*&F[34˜ bB &ѕA?(Ъ;iNwҮ7ǶҠD)cD h+ ~ Vkp$ ),VzeU݅UuJ)5s*rV߿e-XPSԅuohy])nFdh(}znYP4]CdK֌(X dlvaDi9'w;hj Cm‹Q4⭮N_62Z*XDZopƻ/*~"Н߿ubt;ai_FHr=_5{.T )! ,w>+eR#uZ`:HEYKӬ5Xm&h$a.cB?%9bȮVXgMJ@*NO9NO8뒠 \Ri#.Ts[-s`x 3wm!!=D˯VX-,+BkHtJp@(l9% JryrygD8ֽ %^ ݅az;eq< | J/P9c XExe ^Jdh,:#.QrX@*Vq'5XvHEYnq )<)*d.%r~wBYo,[H d' b: gT]T`e Dh;e+@<0UڐjaB@&%{^"z@#=, PM|Է[Q ,1: pCC|5NeBtē@ -D7F0,!Ѥ%LKAl )pYo,&ݽFL%@؅[-啂P/P-x9. NIYJVK㣊ʕ>̩,]Z+fb"p#[̰6aIo,Kci`m6*6'QLf"$lv-h% )/kLa~cXir1k +dX*"xKy`ZX4M9 T6kJ6ATd.oՎcS){Vr܅p&{wP7$ -}?1&={ Ia-ma0=wJlYy\Ocq F nx5:۞1VQ啪7"UM*.YKiW={ z`@@Tm[286ܔ[y:*$TpH* :]Dr tXpt ݪFXOS{=:CZC=t XOa LoRէ#];jV&-s/V,Rc12؈0h qF@D-`ƺTFF}=-4l9B[2Udks~dE_ÊvI>сյ̬].!ITD T4-##n@pAFȋXOim[ VK%A nպܨԅn x *jՈT BG` p6g@#(l+T q%OZ6l*o%wAET6PZ/(c]R+R( Uۖ!z[E4"4d XbV*bfKh N!Ј|*<B);0L¿<;20fHy2d"u`H%Dq@p<2zX0qBmܤlt":Ěq"Bsrt|&@L[.Y f>v;(K븯lʕV>З>~`U,)S)NR`)S((b;B) h)S(34:(bT(Z>Q6Z Eؒzjxiz'0JB - ed)NR9Jr)S)NRyJr)B"I/.(7 y(V"eV'Ҭ4D/QŖoisU`gY"M^ObXFT N3%C!HHCcF eM`hW}%romhgv% )ŴVhmcMX8نd`\Ѵ Y25D"ݘ 6Mt+V,:7J+"!E1As(0WK2'xcQH hQ5KtD5ׁͅpUޡ_&QYzLC2v4fr DF:UwJsӯ!ZKJ3R l[8:PPmVk j[+5YdooCܹݖ* +De-R7Ph|-,sS;b1by4ElC$HJ`LITc7KaVnтJ0 JҸ‘T5iaTܾVZr ];)[A qKB[j=lh:&m%P#aـ.+0iP ^ZUK %XFuJ4Sqsm,ȲpP/t ;7p)-LeB@Ŵ(_x+٠i4QOfg%ݝUq*k5l-=n }㒸vtl Ò[-620ǥH bL\Um, SVаvn S%ӃZ#9aݎwc&Al^iS t[;`6%%X~"!I&@nOnК8=Hh[գ1Wne@c]N%ⱃ:v;F)z,HeGrDvY:0u=>z Ui24k O3YX[ P\ކ`V*s=eԱ<ʊ?Cjb#Gs"B0BN),xAEZ.(.1(10b$_S$>"|D p%Kӂ)&6cžeQU ]Zezt E%2SPZT^/]PfM&@ B]¾ YSYEUTMQQ`tIdn//GZZψaiHXWCU ʁw%8ê!(Q3vwl-h*|9lS"ҕ+P @eg]j =_BE4Vkrҽ@D:KH&^#ZjE/48).+eb87TBq+]Ἂh%E`a^%`-EWjW3,1C2@~zʝc;ض#KYAƉJ%}}??rMPΡ+= mLf[@GTѠ2 LJV= C7@-J2'K`EfEj֘UF",nX7VV2|#Rڢ /fE;oJf({-Zxjt[݇r.ɖ~OvⲰ47e&)K J6E6k!XiOe[m^ A.GSfѴ25f idkŋVx@imtV:1,WZTE%wRdc(G)$+C2՘B5wY~s?N@snWJE!X%j3 4(U1U6H \EټEE31M<)OxQhnYcysݕ5 _Y֓&cecZvbQclZfr, ]ebiўV1}?f\^q|@+uߕ%1|xS0Knvk@* |xStd=*?&[Xb]eljS ՂӅxS?{\L|RP<)L ]~#'Lw,"Az҉nu$E.* ]_{)8YV Ġ;hUVDY_cqa4 SqXEq䖪H'2˅ԷYd4KM.nN>Yh -3h,u:s 6d/we^T.e,y,!'h|+=J;-jk0N"VH@)|Q +j!jφ.&Xiimg7 )ayŵV[sA+U Z fM](^ұB*P *5! ؽ/8(t]NWAzT]U;XI_U_.j+nQġaTB- F2][z ̓YwqN4X8/+|15ڳ]}Qu# dLNHlD,Q~Kų]2|!kUpz:qV}Ȃ.eʉh5DYjuU3ƺW3+~t]^6'L"JkO؞6j{{u {{{{{{{` z{j[xZţh)UM%arJEt0])@5=J^@+Ljٷ7ԡ{{{V9e UrIC]_ F扵˛VvmkHZB)aogv6dA&`ݸ{+_BWr^Tfxh;~س!]L nހZ,2 &bhvrږN +OvYz> 9t{+`ƀR-Y*qq` *諺krK);#V\Rs)Bphٴ]ae,(U>v Qz$C; hۨVK.UnhE<3aL++i/,*%).+Kn\KN*L_ųaAᝑ5,cc~G~U4H&{KvUG%"Ћ]-_,9)Qp62#W[9e&I0;an-[ ]VaJ)pFJhN @GGS-9D?'''''g< !/7{8?{YWYrg37Ò5^b|7~f|,~(AYpgًܿrg_/{={bW!eHO&f]]S7OOCR|R|R?>)IIII!!1$IIh(=On'ۿ{w/(Subsurface-4.0.2/Documentation/user-manual.html.git000066400000000000000000004111761226345450700223530ustar00rootroot00000000000000

Banner

USER MANUAL

Manual authors: Jacco van Koll, Dirk Hohndel, Reinout Hoornweg, Linus Torvalds, Miika Turkia, Amit Chaudhuri, Jan Schubert, Willem Ferguson, Salvador Cuñat

Version 4.0.1, January 2014

Welcome as a user of Subsurface, an advanced dive logging programme with extensive infrastructure to describe, organise and interpret scuba and free dives. Subsurface binaries are available for Windows PCs (Win XP or later), Intel based Macs (OS/X) and many Linux distributions. Subsurface can be built for many more hardware platforms and software environments where Qt and libdivecomputer are available.

The scope of this document is the use of the Subsurface program. To install the software, consult the Downloads page on the Subsurface web site. Please discuss issues with this program by sending an email to our mailing list and report bugs at our bugtracker. For instructions on how to build the software and (if needed) its dependencies please consult the INSTALL file included with the source code.

Audience: Recreational Scuba Divers, Free Divers, Tec Divers, Professional Di vers

Table of Contents

1. Start Using the Program

The Subsurface window is usually divided into four panels and has a Main Menu (File Import Log View Filter Help) at the top of the window (for Windows and Linux) or the top of the screen (for Mac and Ubuntu Unity). The screen shots in this manual were taken on an Ubuntu system, so they don’t show the main menu as part of the Subsurface window. The four panels are:

1) The Dive List to the bottom left containing a list of all the dives in your dive log. You can select and highlight a dive on the dive list by clicking on it. In most situations you can also use the cursor up/down keys to switch between dives.

2) The Dive Map to the bottom right, showing your dive sites on a world map and centred on the site of the last selected dive.

3) The Dive Info to the top left, giving more detailed information on the selected dive, including some statistics for the selected dive or for all highlighted dive(s).

4) The Dive Profile to the top right, showing a graphical profile of the highlighted dive in the dive list.

You can drag the dividers between panels in order to change the size of any of the panels. Subsurface remembers the position of the dividers, so the next time Subsurface starts it uses the positions of the dividers when the program was executed previously.

If one dive is selected, the dive location, detailed information and profile of the selected dive are shown in the respective panels. On the other hand, if one highlights more than one dive the last highlighted dive is the selected dive, but summary data of all highlighted dives is shown in the Stats tab of the Dive Info panel.

The Main Window

You can determine which of the four panels you wish to see by selecting the View option on the main menu and which gives the user several choices of display:

All: show all four of the panels as in the screenshot above.

Divelist: Show only the Dive List.

Profile: Show only the Dive Profile of the selected dive.

Info: Show only the Dive Notes about the last selected dive and statistics for all highlighted dives.

Globe: Show only the world map, centred on the last selected dive.

Like many other functions that can be accessed via the Main Menu, these options can be triggered using keyboard shortcuts as well. The shortcuts for your system are shown with an underline in the menu entries. Since different Operating Systems and your chosen language may cause Subsurface to use different shortcut keys we won’t try to list them here in the user manual.

When you start the program for the first time, it shows no information at all. This is because the program doesn’t have any dive information available. In the following sections we will describe how to create a new logbook.

2. Creating a new logbook

Select File → New Logbook from the main menu. All existing dive data are cleared so that new information can be added. If there is unsaved data in an open logbook, Subsurface will ask you if you want to save the open logbook before a new logbook is created.

3. How to obtain dive information to store in your logbook

There are several ways to add dive information to your logbook:

  1. Enter dive information by hand. This is typically useful if the diver did not use a dive computer and dives were recorded in a written logbook.

  2. Import dive information directly from a dive computer if it is supported by Subsurface. The latest list of dive computers supported by Subsurface can be found at: Supported dive computers.

  3. Import dive information from another data base or file format. This is discussed in more detail below.

3.1. Entering dive information by hand

This is usually the approach for dives without a dive computer. The basic record of information within Subsurface is a dive. The most important information in a simple written dive logbook usually includes dive type, date, time, duration, depth, the names of your dive buddy and of the dive master or dive guide, and some remarks about the dive. Subsurface can store much more information than this for each dive. In order to add a dive to your dive log, select Log → Add Dive from the Main Menu. The program then shows three panels to enter information for a dive: two tabs in the Info panel (Dive Notes and Equipment), as well as the profile panel that displays a graphical profile of each dive. These panels are respectively marked A, B and C in the figure below. We will now consider each of the tabs used for data entry.

FIGURE: Add dive

3.1.1. Dive Notes

This panel contains the date, time and place information for a particular dive, environmental conditions, co-divers and buddies, as well as some descriptive information. The message in a blue box at the top of the panel indicates that you are in the process of adding information about your dive. If you click on the Dive Notes tab, the following fields are visible:

FIGURE: The Dive Notes tab

The Starttime field reflects the date and the time of the dive. By clicking the down-arrow on the right of that field you can display a calendar from which you can choose the correct date. The hour and minutes values can also be edited by clicking on each of them in the text box and by overtyping the information displayed.

Air and water temperatures: Type in the air and water temperatures during the dive into these fields to the right of the Starttime. You do not need to type in units of temperature: Subsurface supplies these automatically, you only need type the number. (The units selected in the Preferences will determine whether metric or imperial units are displayed)

Location: Here you enter the name of the dive site, e.g. "Tihany, Lake Balaton, Hungary". Auto completion of location names will make this easier when you frequently dive at the same sites.

Coordinates: The geographic coordinates of the dive site should be entered here. These can come from three sources:

  1. You can find the coordinates on the world map in the bottom right hand part of the Subsurface window. The map displays a green bar indicating "No location data - move the map and double-click to set the location". Upon a double-click at the appropriate place, the green bar disappears and the coordinates are stored.

  2. You can obtain the coordinates from the Subsurface Companion app if you have an Android device with GPS and you stored the coordinates of the dive site using that device. Click here for more information

  3. One can enter the coordinates by hand if they are known, using one of three formats with latitude followed by longitude:

    Degrees and decimal minutes, e.g: N30° 13.49760' , E30° 49.30788'
    Degrees minutes seconds, e.g. N30° 13' 29.8" , E30° 49' 1.5"
    Decimal degrees, e.g. 30.22496 , 30.821798

Southern hemisphere latitudes are given with a S, e.g. S30°, or with a negative value, e.g. -30.22496

Divemaster: Enter the name of the dive master or dive guide for this dive. Again, this field offers auto completion based on the list of dive masters in the current logbook.

Buddy: Enter the name(s) of the buddy / buddies who accompanied you on the dive. Auto completion based on the list of buddies in the current logbook is offered.

Suit: Enter the type of diving suit you used for the dive. Just as with the other items auto completion of the suit description is available.

Rating: Here you can provide a subjective overall rating of the dive on a 5-point scale by clicking the appropriate star on the rating scale.

Visibility: You can provide a rating of visibility during the dive on a 5-point scale by clicking the appropriate star.

Tags: You may enter tags here (separate them by commas) that describe the type of dive you performed. Examples of common tags are boat, drift, training, cave etc. Subsurface has many built-in tags. Auto completion is once again offered. For instance, if you typed cav, then the tags cave and cavern are shown for the user to choose from.

Notes: Type any additional information here.

The Save and Cancel buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there’s no need to use them until ALL other information has been added. Here is an example of a completed Dive Notes panel:

FIGURE: A completed Dive Notes tab

3.1.2. Equipment

The Equipment tab allows the user to enter information about the type of cylinder and gas used, as well as the weights used for a dive. The message in a blue box at the top of the panel:

Blue edit bar

indicates that you are in the process of adding equipment information for the dive. This is a highly interactive part of Subsurface and the information on cylinders and gases (entered here) determines the behaviour of the dive profile (top right-hand panel).

Cylinders: The cylinder information is entered through a dialogue that looks like this:

FIGURE:Initial cylinder dialogue

The + button at the top right allows you to add more cylinders for this dive. The dark dustbin icon on the left allows you to delete information for a cylinder.

Start by selecting a cylinder type. The AL80 cylinder is shown as the default cylinder type (you can change this default in the preferences if you usually dive with a different type of tank). If you wish to change the tank used on this dive, click on the AL80. This will bring up a dropdown list, accessible through a down-arrow:

FIGURE:The cylinder drop-down list button

Use the drop-down list to select the cylinder type you used for this dive. The Size of the cylinder as well as its working pressure (WorkPress) will auto matically be shown in the dialogue.

Now you need to indicate the starting pressure and the ending pressure of the gas used during your dive. The unit of pressure (metric/imperial) corresponds to the setting you chose in the preferences.

Finally you need to type in the gas mixture that you used. If you used air, you can enter 21% or leave the field blank. If you used nitrox or trimix, specify the percentage of oxygen and the percentage of helium. Leave any inappropriate fields empty. After typing the information for the cylinder then either press ENTER on the keyboard or click outside the cell that contains the cursor. Add information for any additional cylinders by using the + button at the top right hand. Here is an example of a complete description for a dive using two cylinders (air and EAN40):

FIGURE: a completed cylinder dive information table

Weights: Information about the weight system used during a dive can be entered using a dialogue very similar to that of the cylinder information. If you click the + button on the top right of the weights dialogue, the table looks like this:

FIGURE: The Weights dialogue

If you click on the Type field, a drop-down list becomes accessible through a down-arrow:

FIGURE: Weights type drop-down list button

Use the drop-down list to select your type of weight system. In the Weight field, type in the weight used during the dive. After typing the information for the weight system either press ENTER on the keyboard or click outside the cell that contains the cursor. It is possible to enter information for more than one weight system by adding an additional system using the + button on the top right hand. Weight systems can be deleted using the dustbin icon on the left hand. Here is an example of information for a dive with two types of weights: integrated and a weight belt:

FIGURE: A completed weights information table

You do NOT need to click the Save button before you have completed the dive profile.

3.1.3. Creating a Dive Profile

The Dive Profile (a graphical representation of the depth of your dive as a function of time) is indicated in the panel on the top right hand of the Subsurface window. When you manually add a dive to your logbook, Subsurface presents a default dive profile that you need to modify to best represent the dive being described:

FIGURE: Initial dive profile

Modifying the dive profile: When you move the cursor around the dive profile, its position is indicated by two red lines as shown below. The depth and time that the cursor represents are indicated, respectively on the left hand and bottom axes. The units (metric/imperial) on the axes are determined by the preference settings. The dive profile itself comprises several line segments demarcated by waypoints (white dots on the profile, as shown above). The default dive depth is 15m. If your dive depth was 21m then you need to drag the appropriate waypoints downwards to represent 21m. To add a waypoint, double-click on any line segment. To remove a waypoint, right-click on it and choose "Remove this point" from the context menu. You will also need to drag the waypoints to represent an accurate time duration for your dive. Below is a dive profile that represents a dive to 21m for 31 min., followed by a 3 minute safety stop at 5m.

FIGURE: Edited dive profile

Specifying the gas composition: The gas composition used is clearly indicated along the line segments of the dive profile. This defaults to the first gas mixture specified in the Equipment tab, which was air in the case of the profile illustrated above. The gas mixtures of segments of the dive profile can be edited. This is done by clicking on the gas description for a particular waypoint and selecting the appropriate choice from the context menu. Changing the gas for a waypoint affects the gas shown in the segment to the left of that waypoint. Note that only the gases defined in the Equipment tab appear in the context menu:

FIGURE: Gas composition context menu

Below is the profile of a dive to 21m for 31 min. with a switch from air to EAN40 on the ascent. In this case the first cylinder in the Equipment tab contained air and the second cylinder contained EAN40.

FIGURE: Completed dive profile

3.1.4. Saving the hand-entered dive information

The information entered in the Dive Notes tab, the Equipment tab as well as the Dive Profile can now be saved in your logbook by using the two buttons on the top right hand of the Dive Notes tab. If you click Save, the dive data are saved in the current logbook. If you click Cancel, the newly entered dive data are discarded. When you exit Subsurface it will prompt you to save the logbook with the new dive(s) on your computer.

3.2. Importing new dive information from your Dive Computer

3.2.1. Connecting and importing data from a dive computer.

The use of dive computers allows collecting a large amount of information about each dive, e.g. a detailed record of depth, durations, rates of ascent/descent and of gas partial pressures. Subsurface can capture this information and present it to you as part of the dive information. Subsurface can obtain dive information from a wide range of dive computers. The latest list of supported dive computers can be found at: Supported dive computers.

Warning Several dive computers consume more power when they are in their PC-Communication mode. This could drain your battery. We therefore recommend that you check if your dive computer is recharging when connected to the USB port of a PC. For example, several Suunto and Mares dive computers do not recharge through the USB connection. Please consult the manual of your dive computer if you are unsure if it will recharge or drain its batteries while connected to the USB port.

To import dive information from a dive computer to your computer with Subsurface, it is necessary that the two pieces of equipment must communicate. This involves setting up the communications port (or mount point) of the computer with Subsurface that communicates with the dive computer. In order to set up this communication, you need to find the appropriate information to instruct Subsurface where and how to import the dive information. Appendix A provides the technical information to help you achieve this for different operating systems and Appendix B has dive computer specific information.

Now it is time to hook up your dive computer to your PC:

  • Connect your interface cable to a free USB port (or set up the Infrared or Bluetooth connection as described later in this manual)

  • Put your dive computer into PC Communication mode. (You should consult the manual of your specific dive computer for your brand and type)

  • In Subsurface, from the Main Menu, select Import → Import From Dive Computer. The following dialogue appears:

FIGURE: Download dialogue 1

Dive computers tend to keep a certain number of dives in their memory, even though these dives have already been imported to Subsurface. For that reason Subsurface only imports dives that have not been uploaded before. This makes the download process faster on most dive computers and also saves battery power of your dive computer (at least for those not charging while connected via USB). If, for some reason, you wish to import ALL dives from the dive computer, even though some may already be in the logbook, you can tick the box labeled Force download of all dives.

  • The dialogue has two drop-down lists, Vendor and Dive Computer. On the vendor drop-down list select the make of your computer, e.g. Suunto, Oceanic, Uwatec, Mares. On the Dive Computer drop-down list, select the model name of your dive computer, e.g. D4 (Suunto), Veo200 (Oceanic), or Puck (Mares).

  • The Device or Mount Point drop-down list contains the USB or Bluetooth port name that Subsurface needs in order to communicate with your dive computer. Select the appropriate port name. Consult Appendix A and Appendix B for technical details to find the appropriate port information for your dive computer and, in some cases, how to do the correct settings to the operating system of your Subsurface computer.

  • Click the OK button.

  • If there is a problem in communicating with your dive computer, an error message will be shown, similar to this text: "Unable to open /dev/ttyUSB0 Mares (Puck Pro)", see the text in the box below.

Important Check the following: 1) Is the dive computer still in PC-communication or Upload mode? 2) Is the battery of the dive computer fully charged? If not then charge or replace the battery. 3) Is the cable faulty? Does the cable work perfectly using other software? Has it worked before, or is this the first time you are using the cable? 4) Consult Appendix A and make sure you specified the correct Mount Point (see above). If your Subsurface computer does not recognise the USB adaptor by showing an appropriate device name next to the Mount Point, then there is a possibility that the cable or USB adaptor is faulty. A faulty cable is the most common cause of communication failure between dive computer and Subsurface computer. It is also possible that your Subsurface computer is missing required drivers to interact with the download cable and connected dive computer.

If all the above points are in order and there is a failure to download the dive data, then perform a download with the following two check boxes checked in the download dialogue discussed above:

Save libdivecomputer logfile
Save libdivecomputer dumpfile

When checking each of these boxes, the user is prompted to select a folder to save the file into. The default folder is the one in which the Subsurface dive log is kept. After downloading, no dives are shown in the Dive List but two files are created in the folder selected above:

subsurface.log
subsurface.bin

Send these files to the Subsurface mail list: subsurface@hohndel.org and request that the files be analysed, providing your dive computer make and model as well as contextual information about the dives recorded on the dive computer.

  • With communication established, watch how your data is retrieved from your dive computer! Depending on your make of computer and/or number of dives, this could take some time. Please be patient. The Download dialogue shows a progress bar at the bottom of the dialogue (but for some dive computers the progress information could be inaccurate as we cannot determine until after all data was downloaded how much downloadable data there is):

FIGURE: Download dialogue 2

When download of the dive information is complete, all the imported dives appear in the Dive List, sorted by date and time. Disconnect and switch off the dive computer to conserve its battery power. If you select a particular dive, the Dive Profile panel shows an informative graph of dive depth against time for that particular dive.

3.2.2. Updating the dive information imported from your dive computer.

The information from your dive computer is not complete and you need to add more details in order to have a more complete record of your dives. To do this, use the Dive Notes and the Equipment tabs on the top left hand of the Subsurface window.

3.2.3. Dive Notes

The date and time of the dive, gas mixture and perhaps water temperature is shown as obtained from the dive computer, but you need to add some information by hand in order for a more complete dive record. The message in a blue box at the top of the panel indicates that you are in the process of adding information about a dive. If you click on the Dive Notes tab, the following fields are visible:

FIGURE: The Dive Notes tab

The Starttime field reflects the date and the time of the dive, as supplied by the dive computer. It should therefore not be necessary to edit this, but you could make changes by clicking the down-arrow on the right of that field to display a calendar from which you can choose the correct date. The hour and minutes values can also be edited by clicking on each of them in the text box and by overtyping the information displayed.

Air/water temperatures: Air and water temperatures during the dive are shown in these fields to the right of the Starttime. Many dive computers supply water temperature information and this field may therefore not require editing. If editing is required, you do not need to type in units of temperature: Subsurface supplies these automatically, only a number is required. (The units selected in the Preferences will determine whether metric or imperial units are displayed)

Location: Here type in text that describes the site where you did this dive, e.g. "Tihany, Lake Balaton, Hungary". Auto completion of location names will make this easier when you frequently dive at the same sites.

Coordinates: The geographic coordinates of the dive site should be entered here. These can come from three sources:

  1. You can find the coordinates on the world map in the bottom right hand part of the Subsurface window. The map displays a green bar indicating "No location data - move the map and double-click to set the location". Upon a double-click at the appropriate place, the green bar disappears and the coordinates are stored.

  2. You can obtain the coordinates from the Subsurface Companion app if you have an Android device with GPS and you stored the coordinates of the dive site using that device. Click here for more information

  3. One can enter the coordinates by hand if they are known, using one of three formats with latitude followed by longitude:

    Degrees and decimal minutes, e.g: N30° 13.49760' , E30° 49.30788'
    Degrees minutes seconds, e.g. N30° 13' 29.8" , E30° 49' 1.5"
    Decimal degrees, e.g. 30.22496 , 30.821798

Southern hemisphere latitudes are given with a S, e.g. S30°, or with a negative value, e.g. -30.22496.

Divemaster: Enter the name of the dive master or dive guide for this dive. Again, this field offers auto completion based on the list of dive masters in the current logbook.

Buddy: Enter the name(s) of the buddy / buddies who accompanied you on the dive. Auto completion based on the list of buddies in the current logbook is offered.

Suit: Enter the type of diving suit you used for the dive. Just as with the other items auto completion of the suit description is available.

Rating: Here you can provide a subjective overall rating of the dive on a 5-point scale by clicking the appropriate star on the rating scale.

Visibility: You can provide a rating of visibility during the dive on a 5-point scale by clicking the appropriate star.

Tags: You may enter tags here (separate them by commas) that describe the type of dive you performed. Examples of common tags are boat, drift, training, cave. Subsurface has many built-in tags. If you start to type a tag, the program will list the tags that correspond to your typing. For instance, if you typed cav, then the tags cave and cavern are shown for the user to choose from.

Notes: Type any additional information here.

The Save and Cancel buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there’s no need to use them until ALL other information has been added. Here is an example of a completed Dive Notes panel:

FIGURE: A completed Dive Notes tab

3.2.4. Equipment

The Equipment tab allows the user to enter information about the type of cylinder and gas you used, as well as the weights used for that dive. The message in a blue box at the top of the panel:

FIGURE: Blue edit bar

indicates that you are in the process of adding equipment information for the dive. This is a highly interactive part of Subsurface and the information on cylinders and gases (entered here) determines the behaviour of the dive profile (top right-hand panel).

Cylinders: The cylinder information is entered through a dialogue that looks like this:

FIGURE: Initial cylinder dialogue

In most cases Subsurface obtains the gas used from the dive computer and automatically inserts the gas composition(% oxygen) in the table. The + button at the top right allows you to add more cylinders for this dive. The dark dustbin icon on the left allows you to delete information for a cylinder.

Start by selecting a cylinder type. The AL80 cylinder is shown as the default cylinder type (you can change this default in the preferences if you usually dive with a different type of tank). If you wish to change the tank used on this dive, click on the AL80. This will bring up a drop-down list, accessible through a down-arrow:

FIGURE: The cylinder drop-down list button

Use the drop-down list to select the cylinder type you used for this dive. The Size of the cylinder as well as its working pressure (WorkPress) will automatically be shown in the dialogue.

Now you need to indicate the starting pressure and the ending pressure of the specified gas during your dive. The unit of pressure (metric/imperial) corresponds to the setting you chose in the preferences.

Finally you need to type in the gas mixture that you used. If you used air, you can enter 21% or leave the field blank. If you used nitrox or trimix, specify the percentage of oxygen and the percentage of helium. Leave any inappropriate fields empty. After typing the information for the cylinder either press ENTER on the keyboard or click outside the cell that contains the cursor. Add information for any additional cylinders by using the
button at the top right hand. Here is an example of a complete description for a dive using two cylinders (air and EAN40):

FIGURE: a completed cylinder dive information table

Weights: Information about the weight system used during a dive can be entered using a dialogue very similar to that of the cylinder information. If you click the + button on the top right of the weights dialogue, the table looks like this:

FIGURE:The Weights dialogue

If you click on the Type field, a drop-down list becomes accessible through a down-arrow:

FIGURE:Weights type drop-down list button

Use the drop-down list to select your type of weight system. In the Weight field, type in the weight used during the dive. After specifying the weight system either press ENTER on the keyboard or click outside the cell with the cursor. It is possible to enter information for more than one weight system by adding an additional system using the + button on the top right hand. Weight systems can be deleted using the dustbin icon on the left hand. Here is an example of information for a dive with two types of weights: integrated and a weight belt:

FIGURE: A completed weights information table

3.2.5. Saving the updated dive information

The information entered in the Dive Notes tab, the Equipment tab can be saved with all the other information of your dives in your logbook by using the two buttons on the top right hand of the Dive Notes tab. If you click Save, the dive data are saved. If you click Cancel, the newly entered dive data are deleted, although the dive profile obtained from the dive computer will be retained. When you exit Subsurface there is a final prompt to confirm that the new data should be saved.

3.3. Importing dive information from other digital data sources or other data formats

Maybe you have a lot of dives logged using other dive log software. You don’t have to type all information by hand into Subsurface, because you can probably import your divelog. Subsurface will import divelogs from a range of other dive log software. Some software is supported natively (e.g. divelogs.de, JDiveLog, MacDive, and Suunto DM4), for others you have to export your logbook to XML and then Subsurface can import that XML file (Suunto DM3, DivingLog). Subsurface can also import UDDF and UDCF files that are used by some divelog software and even some divecomputers like the Heinrichs & Weikamp DR5. Finally, for some divelog software we currently suggest to import your logbook first into a webservice like divelogs.de and then import them from there with Subsurface, as divelogs.de supports a few additional logbook formats that Subsurface currently cannot parse.

When importing dives, Subsurface tries to detect multiple records for the same dive and merges the information as best as it can. If there are no time zone issues (or other reasons that would cause the beginning time of the dives to be significantly different) Subsurface will not create duplicate entries.

3.3.1. Importing dives from Suunto Divemanager 3 (DM3)

Before you can start importing dives from Suunto Divemanager, you first have to export the dives you want to import. Subsurface does not import directly from the Suunto Divemanager log files. The following procedures can be used for Linux and Windows.

Export from Suunto Divemanager
  • Start Suunto Divemanager and log in with the name containing the logs

  • Do not start the import wizard to import dives from your computer.

  • In the navigation tree on the left side of the program-window, select your dives.

  • Within the list of dives, select the dives you would like to import later:

    • To select certain dives: hold ctrl and click the dive

    • To select all dives: Select the first dive, hold down shift and select the last dive

  • With the dives marked, use the program menu File → Export

  • The export pop-up will show

  • Within this pop-up, there is one field called Export Path.

    • Click the browse button next to the field Export Path

      • A file-manager like window pops up

      • Navigate to the directory where you want to store the Divelog.SDE file

      • Optionally change the name of the file you want to save

      • Click Save

    • You are back in the Export pop-up. Press the button Export

  • Your dives are now exported to the file Divelogs.SDE.

Reading Suunto Divemanager Export in Subsurface

The file Divelogs.SDE can now be opened (or imported) in Subsurface.

3.3.2. Importing dives from Suunto Divemanager 4 (DM4)

To import divelog from Suunto DM4, you need to locate the DM4 database where the dives are stored. You can either look for the original database or take a backup of the dives. Both methods are described here.

Locating the Suunto DM4 database
  • Start Suunto DM4

  • Select Help → About

  • Click Copy after text Copy log folder path to clipboard

  • Now open Windows Explorer

  • Paste the address to the path box at the top of the File Explorer

  • The database is called DM4.db

Backing up Suunto DM4
  • Start Suunto DM4

  • Select File - Create backup

  • From the file menu select the location and name for the backup, we’ll use DM4 in here with the default extension .bak

  • Click Save

  • Your dives are now exported to the file DM4.bak

Reading Suunto DM4 backup in Subsurface

Importing the logs from DM4 does not require any special steps. You just do the following:

  • Open the following menu File → Import File(s)

  • Browse your directories to the location where your DM4 backup is stored

  • Select the backup file you want to import and click Open

It is also possible to do the importing from command line:

subsurface MyDives.xml --import DM4.bak

3.3.3. Importing from Mares Dive Organiser V2.1

Mares Dive Organiser is a Windows application. The dive log is kept as a Microsoft SQL Compact Edition data base with a .SDF filename extension. The data base includes all Dive Organiser-registered divers on the particular computer and all Mares dive computers used. The safest way to obtain a copy of this data base is, within Dive Organiser, to select Database → Backup from the main menu and to back up the data base to your desk top. This creates a zipped file DiveOrganiserxxxxx.dbf. Rename the file to DiveOrganiserxxxxx.zip. Inside the zipped directory is a file DiveOrganiser.sdf. Extract it from the zipped folder to your Desktop.

Then use www.divelogs.de as a mechanism to extract the dive information from the file. Create a user account in divelogs.de , log into that web site, then select Import Logbook → Dive Organiser from the menu on the left hand side. Follow the instructions carefully to transfer the dive information from the Dive Organiser data base to divelogs.de.

Then follow the instructions below to import dives from divelogs.de to Subsurface.

3.3.4. Importing dives from divelogs.de

The import of dive information from divelogs.de is simple, using a single dialogue box. Select Import→Import form Divelogs.de from the Main Menu. This brings up a dialogue box (see figure on left [A] below). You need to enter a user-ID and password for divelogs.de into the appropriate fields. Then select the Download button. Download from divelogs.de starts immediately, evident on a progress bar in the dialogue box. At the and of the download, the successful status is indicated (see figure on the right [B], below). Select the Apply button. The imported dives appear in the Dive List panel.

FIGURE:Download from Divelogs.de

3.3.5. Importing dives from MacDive

Importing logs from MacDive is as easy as it gets. Do the following steps in Subsurface:

  • Open the following menu File - Import File(s)

  • Browse your directories to the location where your MacDive logs are stored

  • Select the log file(s) you want to import and click open

  • Click the OK button in the pop-up

After a few moments, you see your existing logs in Subsurface. Now you can edit your dives like explained in the section Updating the Dive Information.

Subsurface imports all the relevant dive information excluding the used equipment and diver name.

It is also possible to do the import from command line:

subsurface MyDives.xml --import MacDiveDives.xml

3.3.6. Importing dives from DivingLog 5.0

Before you can start importing dives from DivingLog you first have to export those dives. Unfortunately DivingLog XML files give us no indication on the preferences set on your system. So in order for Subsurface to be able to successfully import XML files from DivingLog you first need to make sure that your copy of DivingLog is configured to use the Metric system (you can easily change this in File → Preferences → Units and Language by clicking the Metric button). Then do the following:

  • In Divinglog open the File → Export → XML menu

  • Select the dives that you want to export

  • Click on the export button and select the filename

This file can now be opened in Subsurface (as described in the previous sections).

3.3.7. Importing dives from JDiveLog

JDiveLog stores its information in files with the extension of .jlb that contain all the information except images in XML format.

By using File → Import File(s) from the Main Menu you get a pop-up asking for the file name. To import your JDiveLog file(s) do the following:

  • Open File → Import File(s) on the menu

  • Browse your directories to the location where your *.jlb file is

  • Select your existing *.jlb file and click open

  • Click the OK button in the pop-up

After a few moments, you see your existing logs in Subsurface. Now you can edit your dives like explained in the section Updating the Dive Information.

Information that is imported from JDiveLog into the location field:

  • Extended dive location information

Information that is merged into the notes field:

  • Used amount of weight

  • Used type of suit

  • Used type of gloves

  • Type of dive

  • Dive activity

Alternatively, you can start Subsurface with the --import command line which will have the same effect:

subsurface MyDives.xml --import JDiveLogDives.jlb

will open your divelog (assuming that’s called MyDives.xml) and then import the dives from JdivelogDives.jlb. You can now save the combined divelog back as MyDives.xml.

3.3.8. Importing dives from Kenozooid

Kenozooid uses UDDF to store dives and is tested to work with Subsurface. Make sure you are not using compressed files when importing to Subsurface or uncompress them manually beforehand.

3.3.9. Importing UDDF Dives

Subsurface supports UDDF as a generic import format. Some attributes in your file may not get processed properly. Select Import→Import Files from the Main Menu. Then select the UDDF file to be imported.

3.3.10. Importing dives in CSV format

Sometimes dive computers export dive information as files with comma-separated variables (.CSV). For example, the APD Inspiration and Evolution closed circuit rebreather (CCR) systems export dive information in CSV format that normally contains information about a single dive only. These files can easily be imported into Subsurface. CSV files are normally organised into a single line that provides the titles of the data columns, followed by the data, one record per line. CSV files can be opened with a normal text editor. Here is a highly simplified and shortened example of a CSV file from an APD rebreather:

Dive Time (s)   Depth (m)       PPO2 - Setpoint (Bar)   PPO2 - C1 Cell 1 (Bar)  Ambient temp. (Celsius)
0       0.0     0.70    0.81    13.1
0       1.2     0.70    0.71    13.1
0       0.0     0.70    0.71    13.1
0       1.2     0.70    0.71    13.2
0       1.2     0.70    0.71    13.1
10      1.6     0.70    0.72    12.7
20      1.6     0.70    0.71    12.6
30      1.7     0.70    0.71    12.6
40      1.8     0.70    0.68    12.5
50      1.6     0.70    0.68    12.5
60      2.4     0.70    0.69    12.5
70      3.5     0.70    0.69    12.4
80      4.2     0.70    0.72    12.5
90      4.0     0.70    0.71    12.4

Note that each title may comprise more than one word, for instance Dive Time (s) in the above data example. Before being able to import the data to Subsurface one first needs to know:

  1. Which character separates the different colums within a single line of data? This field separator should be either a comma (,) or a TAB character. This could be determined by opening the file with a text editor. If it is commma-delimited, then the comma characters between the values are clearly visible. If no commas are evident, the file is probably TAB-delimited (i.e. it uses a TAB as a field separator, as in the above example).

  2. Which data columns need to be imported into Subsurface?. The Dive Time and Depth colums are always required. Open the file using a text editor and note the titles of the columns to be imported and their column positions. For instance for the above example:

    Time:           column 1
    Depth:          column 2
    Temperature:    column 5
    ppO2:           column 4

Armed with this information, the import into Subsurface is straightforward. Select Import→Import CSV from the main menu. The following dialogue appears:

FIGURE: CSV download dialogue

Specify the name of the CSV file or select it from the browser button on the right. There are pre-configured definitions for some dive computers, e.g. the APD rebreathers. If your dive computer is on this list, select it using the dropdown box labeled Pre-configured imports, click OK and the dive will be imported and listed in the Dive List tab of Subsurface.

If your dive computer is not on the pre-configured list, then select the Field Separator (TAB or comma) for your CSV file, using the appropriate dropdown list. Lastly, indicate which columns in the CSV file contain which data variables. For each data column used for import, check the appropriate check box and indicate in which column these data are found. For instance, the image above corresponds to the dialogue that would apply to the CSV data set described above the image. Having performed the column specification, select the OK button and the dive will be imported and listed in the Dive List tab of Subsurface.

3.4. Importing GPS coordinates with the Subsurface Companion app for mobile phones

If you have an Android device with GPS, you can obtain the coordinates of the place where you are diving and automatically pass them to your Subsurface divelog. To do this you need to:

3.4.1. Using the Subsurface companion app on your smartphone

On first use the app has three options:

  • Create a new account. Equivalent to registering in Subsurface companion page.

  • Retrieve an account. If you forgot your DIVERID you will receive an email to recover the number.

  • Use an existing account. You are prompted for your DIVERID. The app saves your DIVERID and does not ask for it again unless you use the Disconnect menu option (see below).

Now you’re ready to get a dive position and send it to the server. The Android display will look like the left hand image (A) below, but without any dive.

Touching the "+" icon on the top right to add a new dive site. You will be prompted for a place name (or asked to activate the GPS if it was turned off). The main screen shows a list of dive locations, each with place name, date and time. Some dives may have an arrow-up icon on the selection box to the left (see image B in the middle, below) indicating that they require upload to the server.

There are several ways to send dives to the server; the easiest is by simply selecting the dive. See middle image below (B):

FIGURE: Screen shots (A-C) of companion app

Touching the right arrow will send it to the server.

Important Be careful, the trash on the right means exactly what it is supposed to mean, it deletes the dive location(s).

The new dive points are now stored on the server and can be downloaded to the Subsurface dive log whenever you upload or add your dive to Subsurface. After a dive trip using the Companion app, all dive locations are ready to be saved on your Subsurface dive log (see below).

Settings on the Companion app

Selecting the Settings menu option results in the right hand image above ©.

Server and account
  • Web-service URL. This is predefined (http://api.hohndel.org/)

  • User ID. Obtained by registering as indicated above. The easiest way to introduce it is simply to copy and paste from the confirmation mail but, off course, you can type it each character at a time.

Synchronization
  • Synchronize on startup. If selected, dives in the Android device and those on the web service will synchronize each time you start the app.

  • Upload new dives. If selected, each time you add a dive location it will automatically be sent to the server.

Background service

Instead of entering a unique dive location, you can leave the service running in the background on your device, continuously collecting GPS locations.

The settings below define the behaviour of the service:

  • Min duration. In minutes. The app’ll try to get a position each X minutes until you stop it.

  • Min distance. In meters. Minimum distance between two position fixes.

  • Name template. The name the app will use when saving the position fixes.

Tip How does the background service work? Let’s assume we’ve set 5 minutes and 50 meters in the settings above, the app will fix a location, then another one each 5 minutes. If this 2nd (3rd, 4th …) location is within a radius of 50 meters from the previous one, it is not saved. After another 5 minutes there will be a new try, and so on. This way, if we are in a static position, we’ll only get one location fix, but if we travel we can have a trace of our journey.
Other
  • Mailing List. The mail box for Subsurface. You can send an email to the Subsurface mailing list.

  • Subsurface website. A link to the URL of Subsurface web

  • Version. Displays the current version of the companion app.

Here you can search your saved dive locations by the name or by date and hour.

Start service

Initiates the background service depending on the previously defined settings.

Disconnect

This is a badly named option. It disconnects your app from the server by resetting your ID in the app, showing the first screen where you can create an account, retrieve the ID for an existing one or use your own ID. Disconnecting is useful if you download the dive positions of another registered diver using your Android device.

Send all locations

This option sends all locations stored in the Android device to the server.

3.4.2. Downloading dive locations to your Subsurface divelog

You have to download dive(s) from a dive computer or enter dives manually into Subsurface before obtaining the GPS coordinates from the server. The download dialog can be reached via Ctrl+G or from the Subsurface Main Menu Import → Import GPS data from Subsurface Service, resulting in the image on the left (A), below. On first use the DIVERID text box will be blank. Provide the DIVERID. Then select the Download button and the download begins. When this is completed you see the screen on the right (B), below:

FIGURE: Downloading Companion app GPS data

Note that the Apply button is now active. Click on it to update the locations of the newly entered or uploaded dives in Subsurface which applies the coordinates and names you gave them for all the new dives that match the date-times of the uploaded GPS localities.

Note Features, issues and tips._ Since Subsurface matches GPS locations from the Android device and dive information from your dive computer based on date-time data, automatic assignment of GPS data to dives is dependent on agreement of date and time between these two devices. If there is a large difference between the time in your dive computer and the time in your Android device, Subsurface is unable to identify the dive that matches a location and nothing happens. Similar date-times may be not always be possible. A dirty hack is manually editing the date-time of a dive in Subsurface’s Dive List before downloading the GPS data and then to edit the date-time back again after downloading GPS data.

4. Obtaining more information about dives entered into the logbook

4.1. The Dive Info tab (for individual dives)

The Dive Info tab gives some summary information about a particular dive that has been selected in the Dive List. Useful information here includes the surface interval before the dive, the maximum and mean depths of the dive, the gas volume consumed, the surface air consumption (SAC) and the number oxygen toxicity units (OTU) incurred.

4.2. The Stats tab (for groups of dives)

The Stats tab gives summary statistics for more than one dive, assuming that more than one dive have been selected in the Dive List. Highlight more than one dive by the standard Ctrl-click or Shift-click of the mouse. If only one dive has been selected, figures pertaining to only that dive are given. This tab shows the number of dives selected, the total amount of dive time in these dives, as well as the minimum, maximum and mean for the dive duration, dive depth, water temperature and surface air consumption (SAC).

4.3. The Dive Profile

Typical dive profile

Of all the panels in Subsurface, the Dive Profile contains the most detailed information about each dive. The main item in the Dive profile is the graph of dive depth as a function of time. In addition to the obvious information of the depth it also shows the ascent and descent rate compared to the recommended speed of going up or down in the water column. This information is given using different colours:

Colour

Descent speed (m/min)

Ascent speed (m/min)

Red

> 30

> 18

Orange

18 - 30

9 - 18

Yellow

9 - 18

4 - 9

Light green

1.5 - 9

1.5 - 4

Dark green

< 1.5

< 1.5

The profile also includes depth readings for the peaks and troughs in the graph. Thus you should see the depth of the deepest point and other peaks. Mean depth is marked with a horizontal red line.

The air consumption graph displays the tank pressure and its change during the dive. The air consumption takes depth into account so that even when manually entering the start and end pressures the graph is not a straight line. Similarly to the depth graph the tank pressure gives you information about the momentary SAC rate (Surface Air Consumption – often also called RMV – Respiratory Minute Volume) when using an air integrated dive computer. Here the colour coding is not relative to some absolute values but relative to the average normalised air consumption during the dive. So areas that are red or orange indicate times of increased normalized air consumption while dark green reflects times when the diver was using less gas than average. The colour coding is obviously only possible when a tank sensor is connected and tank pressure readings during the dive are available.

Water temperature is displayed with its own blue line with temperature values placed adjacent to significant changes.

It is possible to zoom into the profile graph. This is done either by using the scroll wheel / scroll gesture of your mouse or trackpad. By default Subsurface always shows a profile area large enough for at least 30 minutes and 30m (100ft) – this way short or shallow dives are intuitively recognizable; something that free divers clearly won’t care about.

FIGURE: Measuring Bar

Measurements of depth differences can be achieved by using the button with two vertical bars at the right of the dive profile panel (see above figure, bottom right). Drag the red dots to the two points on the dive profile which you would like to measure. Information is given along the line connecting the two red dots.

The dive profile can include further information that is typically more interesting for tec divers. Enabling these is described in the section entitled Setting up Preferences. Basically you can include graphs of the partial pressures of O2, N2, and He during the dive as well as a calculated and dive computer reported deco ceilings (only visible for deep, long, or repetitive dives). The partial pressure graphs are added below the profile data, the calculated ceiling is shown as a green overlay on top of the dive profile. Above the profile the currently used gradient factors are shown (e.g. GF 35/75). Please note that these are NOT the gradient factors in use by the dive computer in question, but the gradient factors used by Subsurface to calculate deco obligations during the dive.

The graph can also include the dive computer reported ceiling (or more precisely, the first deco stop that the dive computer recorded – note that not all dive computers record this information and make it available for download; for example all of the Suunto dive computers fail to make this very useful data available to divelog software). Because of the differences in used algorithms and amount of data available (and factors taken into consideration) at the time of the calculation it is unlikely that both of these are the same; this can be true even if the same algorithm and gradient factors (see below) are used. It is also quite common that Subsurface calculates a ceiling for non-decompression dives when the dive computer stayed in non-deco mode during the whole dive (represented by the dark green section in the profile at the beginning of this section). This is caused by the fact that Subsurface’s calculations describe the deco obligation at that point in time during a dive, while dive computers usually take the upcoming ascent into account. During the ascent some excess Nitrogen (and possibly Helium) are already breathed off so even though the diver technically encountered a ceiling at depth, the dive still does not require an explicit deco stop. This feature allows dive computers to offer longer non-stop bottom time.

For a more detailed explanation of gradient factors, use the following links:

4.4. The Dive Profile context menu

The context menu for the Dive Profile is accessed by right-clicking while the mouse cursor is over the Dive Profile panel. The menu allows the creation of Bookmarks or Gas Change Event markers other than the ones that might have been imported from a Dive Computer. Markers are placed against the depth profile line and with the time of the event set by where the mouse cursor was when the right mouse button was initially clicked to bring up the menu. Gas Change events open a further selection of which gas is being switched to, the list based on the available gases defined in the Equipment Tab. By right-clicking while over an existing marker, the menu extends adding options to allow deletion of the marker or to allow all markers of that type to be hidden. Hidden events can be restored to view by selecteing Unhide all events from the context menu.

4.5. The Information Box

The Information box displays a large range of information pertaining to the dive profile. Normally the Information Box is located to the top left of the Dive Profile panel. If the mouse points outside of the Dive Profile panel, then only the top line of the Information Box is visible (see left-hand part of figure (A) below). The Information Box can be moved around in the Dive Profile panel by click-dragging it with the mouse so that it is not obstructing important detail. The position of the Information Box is saved and used again during subsequent dive analyses.

Figure: Information Box

The moment the mouse points inside the Dive Profile panel, it expands and shows many data items. In this situation, the data reflect the time point along the dive profile indicated by the mouse (see right-hand part of figure (B) above where the Information Box reflects the situation at the position of the cursor [arrow] in that image). Therefore, moving the cursor in the horizontal direction allows the Information Box to show information for any point along the dive profile. In this mode, the Information Box gives extensive statistics about depth, gas and ceiling characteristics of the particular dive. These include: Time period into the dive (indicated by a @), depth, cylinder pressure (P), temperature, ascent/descent rate, surface air consumption (SAC), oxygen partial pressure, maximum operating depth, effective air depth (EAD), effective narcotic depth (END), equivalent air density depth (EADD), decompression requirements at that instant in time (Deco), time to surface (TTS), the calculated ceiling, as well as the calculated ceiling for several Bühlmann tissue compartments.

5. Organising the logbook (Manipulating groups of dives)

5.1. The Dive List context menu

Many actions within Subsurface are dependent on a context menu that is used mostly to manipulate groups of dives. The context menu is found by selecting a dive or a group of dives and then right-clicking.

Figure: Context Menu

The context menu is used in many manipulations described below.

5.2. Renumbering the dives

Dives are normally numbered incrementally from non-recent dives (low sequence numbers) to recent dives (having the highest sequence numbers). The numbering of the dives is not always consistent. For instance, when non-recent dives are added to the dive list the numbering does not automatically follow on because of the dives that are more recent in date/time than the newly-added dive that has an older date/time. Therefore you sometimes may need to renumber the dives. This is performed by selecting (from the Main Menu) Log → Renumber. You are given a choice with respect to the lowest sequence number to be used. Completing this operation results in new sequence numbers (based on date/time) for the dives in the Dive List panel.

5.3. Grouping dives into trips and manipulating trips

If you dive regularly, the dive list can rapidly become very long. Subsurface can group dives into trips. It performs this by grouping dives that have date/times that are not separated in time by more than two days, thus creating a single heading for each diving trip represented in the dive log. Below is an ungrouped dive list (A, on the left) as well as a grouped dive list with several trips (B, on the right):

Figure: Grouping dives

Grouping into trips allows a rapid way of accessing individual dives without having to scan long lists of dives. In order to group the dives in a dive list, (from the Main Menu) select Log → Autogroup. The Dive List panel now shows only the titles for the trips.

5.3.1. Viewing the dives during a particular trip

Once when the dives have been grouped into trips, you can expand one or more trips by clicking the arrow-head on the left of each trip title. This expands the selected trip, revealing the individual dives performed during the trip.

5.3.2. Editing the title and associated information for a particular trip

Normally, in the dive list, minimal information is included in the trip title. You can add much more information about a trip by selecting its trip title from the dive list. This shows a Trip Notes tab in the Dive Notes panel. Here you can add or edit information about the date/time, the trip location and any other general comment about the trip as a whole (e.g. the dive company you dived with, the general weather during the trip). After entering this information, select Save from the buttons at the top right of the Trip Notes tab. The trip title in the Dive List panel should now reflect some of the edited information.

5.3.3. Collapsing or expanding dive information for different trips

If you right-click after selecting a particular trip in the dive list, the resulting context menu allows several possibilities to expand or collapse dives within trips. This includes expanding all trips, collapsing all trips and collapsing all trips except the selected one.

5.3.4. Merging dives from more than one trip into a single trip

When you right-click on a selected trip title in the Dive List panel, the context menu allows the merging of trips by either merging of the selected trip with the trip below or with the trip above.

5.3.5. Splitting a single trip into more than one trip

If a trip includes five dives, you can split this trip into two trips (trip 1: top 3 dives; trip 2: bottom 2 dives) by selecting and right-clicking the top three dives. The resulting context menu allows you to create a new trip by choosing the option Create new trip above. The top three dives are then grouped into a separate trip. See below, the selection and context menu on the left (A), the completed action on the right (B):

FIGURE: Split a trip into 2 trips

5.4. Manipulating single dives

5.4.1. Delete a dive from the dive log

Dives can be permanently deleted from the dive log by selecting and right-clicking them to bring up the context menu, and then selecting Delete dive(s). Typically this would apply to a case where you wish to delete workshop calibration dives of the dive computer or dives of extremely short duration.

You can unlink dives from the trip to which they belong. Select and right-click the dives to bring up the context menu. Then select Remove dive(s) from trip. The dives that have been unlinked now appear immediately above the trip to which they belonged.

5.4.3. Add a dive to the trip immediately above

Selected dives can be moved from the trip to which they belong and placed within the trip immediately above the currently active trip. Select and right-click the dives to bring up the context menu, then select Add dive(s) to trip immediately above.

5.4.4. Shift the start time of dive(s)

Sometimes it is necessary to adjust the start time of a dive. This may apply to situations where dives are performed in different time zones or when the dive computer has an erroneous time. Select and right-click the dive(s) to be adjusted. This brings up the context menu. Select Shift times. Specify the time (in hours and minutes) by which the dives should be adjusted and click on the option indicating whether the time adjustment should be forwards or backwards.

5.4.5. Merge dives into a single dive

Sometimes a dive is briefly interrupted, e.g. if a diver returns to the surface for a few minutes, resulting in two or more dives being recorded by the dive computer and appearing as different dives in the Dive List panel. You can merge these dives onto a single dive by selecting the appropriate dives and right-clicking them to bring up the context menu. Then select Merge selected dives. It may be necessary to edit the dive information in the Dive Notes panelto reflect events or conditions that apply to the merged dive. The figure below shows the depth profile two such dives that were merged:

Example: Merged dive

6. Exporting the dive log or parts of the dive log

A dive log can be saved in two formats:

  • Subsurface XML format. This is the native format used by Subsurface.

  • Universal Dive Data format (UDDF). See http://uddf.org for more information. UDDF is a generic format that enables communication among many dive computers and computer programs.

In order to save the WHOLE dive log (i.e. all trips and dives), select File from the Main menu. To save in Subsurface XML format, select File → Save as. To save in UDDF format, select File → Export UDDF.

In order to save only one or more dives or one or two trips, select the appropriate dives or trips in the Dive List panel. Then right-click the selected dives to bring up the context menu. To save in Subsurface XML format, select Save as from the context menu. To save in UDDF format, select Export as UDDF from the context menu.

7. Printing your dive log

Subsurface provides a simple interface to print your whole dive log or only a few selected dives, including dive profiles and other contextual information.

Before printing, two decisions are required:

  • Should the whole dive log be printed or only part of it? If only part of the dive log is required, then select the required dives from the Dive List panel.

  • What gas partial pressure information is required on the dive profile? Select the appropriate information from the Main Menu: File→Preferences→Graph.

Now you need to select the print options. To do this, select File→Print from the Main menu. The following dialogue appears (see the image on the left [A], below):

FIGURE: Print dialogue

Under Print type you need to select one of three options:

  • Print the Dive List. Do do this, select Table Print.

  • Print the full dive records (dive profiles and all other information) at 6 dives per printed page. To do this, select 6 dives per page.

  • Print the full dive records (dive profiles and all other information) at 2 dives per printed page. To do this, select 2 dives per page.

Under Print options you need to select:

  • Printing only the dives that have been selected from the dive list prior to activating the print dialogue, achieved by checking the box Print only selected dives.

  • Printing in colour, achieved by checking the box with Print in color.

The Ordering affects the layout of the page (or part of it) for each dive. The dive profile could be printed at the top of each dive, with the textual information underneath, or it could be printed with the textual information at the top with the dive profile underneath. Select the appropriate option in the print dialogue. See the image on the right (B), above which has a layout with text above the dive profile.

You can Preview the printed page by selecting the Preview button on the dialogue. After preview, changes to the options in the print dialogue can be made to give a layout that fits personal taste.

Now, select the Print button in the dialogue. This activates the regular print dialogue used by your operating system, allowing you to choose a printer and to set its properties. Remember to set the print resolution of the printer to an appropriate value by changing the printer properties. Finally, print the dives. Above on the right (B) is an example of the output for one particular dive.

8. Setting your Preferences for Subsurface

There are several settings within Subsurface that the user can specify. These are found when selecting File→Preferences. The settings are performed in four groups: Defaults, Units, Graph and Language. All four sections operate on the same principles: specify the settings you wish to change, then save these using the Apply button. After applying all the new settings you can leave the settings panel by selecting OK.

8.1. Defaults

There are four settings in the Defaults panel:

  • Lists and tables: Here you can specify the font type and font size of the Dive Table panel. By decreasing the font size of the Dive table, you can see more dives on a screen.

  • Dives: Here you need to specify the directory and file name of your electronic dive log book. This is a file with filename extension .xml. When launched, Subsurface will then automatically load the dive log book specified.

  • Display invalid: Dives can be marked as invalid (when you want to hide dives that you don’t consider valid dives, e.g. pool dives, but still want to keep them in the dive log). This controls whether those dives are displayed in the dive list.

  • Use Default cylinder: Here you can specify the default cylinder listed in the Equipment tab of the Dive Notes panel.

8.2. Units

Here you can choose between metric and imperial measures of depth, pressure, volume, temperature and mass. By selecting the Metric or Imperial radio button at the top, you can specify that all units are in the chosen measurement system . Alternatively, if you select the Personalise radio button, you can select a mixture with some measurements being metric while others are in imperial measures.

8.3. Graph

This panel allows two type of selections:

  • Show: Here you specify the amount of information that is shown as part of the dive profile:

    • Gas pressure graphs: Subsurface can display the pressures of the gases with which you dive. If you dive breathing air, then the only important gas is nitrogen. You can instruct Subsurface to plot the nitrogen pressure during your dive. If you dive breathing nitrox, then you can select a graph of both the nitrogen and oxygen pressures during your dive. If you dive with trimix or heliox, you can select the display of the helium pressure as well. For each of these graphs you can specify a threshold value on the right-hand side of the panel. If any of the graphs go above this threshold level, the graph is highlighted in red, indication that the threshold value has been exceeded (see figure below).

    • Ceiling: Ascent ceilings arise when a direct ascent to the surface exposes the diver to decompression sickness (DCS) and it is necessary to either ascend slower or to perform decompression stop(s) before ascending to the surface. Subsurface can indicate these ceilings above which the diver should not ascend at a particular point in time (see the green-shaded areas in the figure in the section on Dive Profiles) and in the figure below:

      • If you check Calculated ceiling, then a ceiling is shown if it exists for a particular dive (A in figure below)

      • If you check show all tissues, the ceiling is shown for the tissue compartments following the Bühlmann model (B in figure below).

      • If you check 3m increments, then the ceiling is indicated in 3m-increments (C in figure below).

      • If the dive computer itself calculates a ceiling and makes it available to Subsurface during upload of dives, this can be shown by checking Dive computer reported ceiling and it can be drawn in red by checking Draw ceiling red.

    • If a Maximum operating depth (MOD) or an Equivalent air depth (EAD) applies to a dive profile, these can be shown by checking the appropriate boxes.

    • If a Maximum partial pressure of oxygen (maxPPO2) applies to dives, then this can be specified in the appropriate text box. In addition, if a no-decompression limit (NDL) is to be shown in the info box, then check the appropriate box.

Figure: Ceiling with 3m resolution
  • Misc: Here you can set the gradient factors used while diving. GF_Low is the gradient factor at deep depths and GF_High is used just below the surface. At intermediate depths gradient factors between GF_Low and GF_High are used. Gradient factors add conservatism to the nitrogen exposure during a dive, in a similar way that many dive computers have a conservatism setting. The lower the value of a gradient factor, the more conservative the calculations are with respect to nitrogen loading and the deeper the ascent ceilings are. Gradient factors of 25/60 are considered conservative and values of 60/90 are considered harsh. Checking GFLow at max depth box causes GF_Low to be used at the deepest depth of a dive. For more information see:

8.4. Languages

A checkbox allows one to use the System Default language which in most cases will be the correct setting; with this Subsurface simply runs in the same language / country settings as the underlying OS. If this is for some reason undesirable you can uncheck this checkbox and pick a language / country combination from the list of included localizations.

9. Description of the Subsurface Main Menu items

This section describes the functions and operation of the items in the Main Menu of Subsurface. Several of the items below are links to sections of this manual dealing with the appropriate operations.

9.1. File

  • New Logbook - Close the currently open dive logbook and clear all dive information.

  • Open logbook - This opens the file manager in order to select a dive logbook to open.

  • Save - Save the dive logbook that is currently open.

  • Save as: - Save the current logbook or the currently selected dives within the present logbook under a different filename.

  • Close - Close the dive logbook that is currently open.

  • Export UDDF - Export the currently open dive logbook (or the selected dives in the logbook) in UDDF format.

  • Print - Print the currently open logbook.

  • Preferences - Set the Subsurface preferences.

  • Quit - Quit Subsurface.

9.2. Import

9.3. Log

  • Add Dive - Manually add a new dive to the Dive List panel.

  • Renumber - Renumber the dives listed in the Dive List panel.

  • Auto Group - Group the dives in the Dive List panel into dive trips.

  • Edit Device Names - Edit the names of dive computers.

9.4. View

  • All - View the four main Subsurface panels simmultaneously.

  • Dive List - View only the Dive List panel.

  • Profile - View only the Dive Profile panel.

  • Info - View only the Dive Notes panel.

  • Globe - View only the World Map panel.

  • Yearly Statistics - Display summary statistics about dives during the last year.

  • Prev DC - Switch to next dive computer.

  • Next DC - Switch to previous dive computer.

9.5. Filter

  • Select Events - This option is not implemented yet.

9.6. Help

  • About Subsurface - Show a panel with the version number of Subsurface as well as licensing information.

  • User Manual - Open a window showing this user manual.

10. APPENDIX A: Operating system specific information for importing dive information from a dive computer.

10.1. Make sure that your OS has the required drivers installed

Note The operating system of your desktop computer needs the appropriate drivers in order to communicate with your dive computer in whichever way your dive computer prefers (e.g. bluetooth, USB, infrared).
  • On Linux this means you need to have the correct kernel module loaded. Most distributions will do this automatically for you. Make sure you have read/write permissions to that port. On Ubuntu that could mean you should run the command following command in a terminal window:

    +sudo adduser+ [your_username] +dialout+
  • On Windows, the OS should offer to download the correct driver once you connect your dive computer to the USB port.

  • On a Mac you at times have to manually hunt for the correct driver. For example the correct driver for the Mares Puck devices can be found as Mac_OSX_VCP_Driver.zip at http://www.silabs.com/support/pages/support.aspx?ProductFamily=USB+Bridges

10.2. How to Find the Device Name for USB devices

Note When you connect your dive computer by using a USB connector, usually Subsurface will either propose a drop down list that contains the correct device name (or mount point for the Uemis Zurich), or it will disable the device select drop down if no device name is needed at all. In the rare cases where this doesn’t work here are some instructions on ways to find out what your device name is:
On Windows:

Simply try COM1, COM2, etc. The drop down list should contain all connected COM devices.

On MacOS:

The drop down box should find all connected dive computers.

On Linux:

Try the following:

  • Disconnect your USB cable of your dive computer

  • Open a terminal

  • Type the command: dmesg and press enter

  • Plug in your USB cable of your dive computer

  • Type the command: dmesg and press enter

Within your terminal you should see a message similar to this one:

usb 2-1.1: new full speed USB device number 14 using ehci_hcd
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for FTDI USB Serial Device
ftdi_sio 2-1.1:1.0: FTDI USB Serial Device converter detected
usb 2-1.1: Detected FT232BM
usb 2-1.1: Number of endpoints 2
usb 2-1.1: Endpoint 1 MaxPacketSize 64
usb 2-1.1: Endpoint 2 MaxPacketSize 64
usb 2-1.1: Setting MaxPacketSize 64
usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB3
usbcore: registered new interface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver

You see that in the third line from the bottom, the USB adapter is detected and is connected to ttyUSB3. Now you use this information in the import settings as /dev/ttyUSB3. Your dive computer interface is connected and you should be able to import your dives.

10.3. Setting up bluetooth enabled devices

Note For dive computers communicating through bluetooth like the Heinrichs Weikamp Frog or the Shearwater Predator and Petrel there is a different procedure to get the devices name to communicate with Subsurface. In general it consists of these steps:
  • enable bluetooth on your computer

  • pairing the device

Do not forget to set your divecomputer in Bluetooth or upload mode before Paring and Downloading logs. If you use a Shearwater Predator/Petrel just select Dive Log → Upload Log and wait until you see the Wait PC message.

On Windows:

Bluetooth is most likely already enabled. For pairing the device choose Control Panel→Bluetooth Devices→Add Wireless Device This should bring up a dialog showing your dive computer (in Bluetooth mode) and allowing to pair it. For bluetooth pairing of your dive computer refer to the manufacturer’s user guide. The dive computer should then show up in the list of Bluetooth devices and you may then right click on it and choose Properties→COM Ports to identify the port used for your dive computer. If there are several ports listed, use the one saying "Outgoing" instead of "Incoming".

For downloading to Subsurface, the drop down list should contain this COM port already. If not, enter it manually.

Note: If you have issues downloading from your dive computer in other software afterwards try to remove the pairing with your dive computer.

On MacOS:

Click on the Bluetooth symbol in the menu bar and select Set up Bluetooth Device…. Make sure that your dive computer is in upload mode; it should then show up in the list of devices. Select it and go through the pairing process. This step should only be needed once for initial setup.

Once the pairing is completed the correct device will be shown in the Device or Mount Point drop down in the Subsurface Import dialog.

On Linux

Ensure sure bluetooth is enabled on the Subsurface computer. On most common distributions this should be true out of the box. If not then depending on your system, running initd or systemd. This might be different and also involve loading modules specific to your hardware. In case your system is running systemd, manually run sudo systemctl start bluetooth.service to enable it, in case of initd, run something like sudo rc.config start bluetoothd or sudo /etc/init.d/bluetooth start.

Pairing should be straight forward. Using Gnome3 for instance will show a bluetooth icon in the upper right corner of your desktop where you select Set up New Device. This should show you a dialog where you are able to select your dive computer (in bluetooth mode) and pair it. If you have issues with PIN setting try manually setting 0000.

You may also use a manual approach by using such commands:

  • sudo hciconfig - shows the bluetooth devices available on your computer (not dive computer), most likely you will see a hci0, if not try sudo hcitool -a to see inactive devices and try to run sudo hciconfig hci0 up to bring them up

  • sudo hcitool scanning- use this to get a list of bluetooth enabled client devices, watch out for your dive computer and remember the MAC address shown there

  • sudo bluez-simple-agent hci0 10:00:E8:C4:BE:C4 - this will pair your dive computer with the bluetooth stack of your computer, copy/paste the MAC address from the output of hcitool scanning

Unfortunately on Linux binding to a communication device has to be done manually by running:

  • sudo rfcomm bind /dev/rfcomm0 10:00:E8:C4:BE:C4 - bind the dive computer to a communication device in your computer, in case rfcomm is already taken just use rfcomm1 or up, please copy/paste the MAC address from the output of hcitool scanning, the MAC shown in here will not work for you.

For downloading dives in Subsurface you have then to specify /dev/rfcomm0 as device name to use.

11. APPENDIX B: Dive Computer specific information for importing dive information.

11.1. Import from a Uemis Zurich

Note Things are very similar to a normal USB-connected dive computer when downloading dives from a Uemis Zurich dive computer (which certainly is one of the ones that DO recharge when connected to the USB port). The main difference is that you don’t enter a device name, but instead the location where the UEMISSDA file system is mounted once you connect the dive computer. On Windows this is a drive letter ( often E: or F:), on a Mac this is /Volumes/UEMISSDA and on Linux systems this differs depending on the distribution that you use. On Fedora it usually is /var/run/media/<your_username>/UEMISSDA. In all cases Subsurface should suggest the correct location in the drop down list.

Once you have selected this as device name you can download the dives from the Uemis Zurich. One technical issue with the Uemis Zurich download implementation (this is a firmware limitation, not a Subsurface issue) is that you cannot download more than about 40-50 dives without running out of memory on the SDA. This will usually only happen the very first time you download dives from the Uemis Zurich - normally when downloading at the end of a day or even after a dive trip, the capacity is sufficient. If Subsurface displays an error that the dive computer ran out of space the solution is straight forward. Disconnect the SDA, turn it off and on again, and reconnect it. You can now retry (or start a new download session) and the download will continue where it stopped the last time you tried. You may have to do this more than once, depending on how many dives you have stored on your dive computer.

At this point Subsurface downloads most of the information that is stored on the SDA, including information about dive spots and equipment. Buddy information is not yet downloaded.

11.2. Importing dives from Heinrichs Weikamp DR5

Note When mounted as a USB drive the Heinrichs Weikamp DR5 saves a single UDDF file for every dive. Mark all the dives you’d like to import or open. Note: The DR5 does not seem to store gradient factors nor deco information, so for Subsurface it is not possible to display them. Adjust the gradient factors in the Tec Settings in Subsurface to generate a deco overlay in the _ Subsurface_ Dive Profile panel to get deco displayed but please note that the deco calculated by Subsurface will most likely differ from the one displayed on the DR5.

11.3. Import from Shearwater Predator using bluetooth

Note Using a Shearwater Predator you may be able to pair Bluetooth but then encounter issues when downloading, showing errors like Slip RX: unexp. SLIP END on the Predator. This might also be seen, when using other dive log software and operating systems than Linux. We have no detailed idea about the source and how to fix this, but it is reported to be solved sometimes by one of these steps:
  • use the bluetooth dongle which came with the Shearwater Predator instead of the built-in one of your computer

  • switch to different bluetooth drivers for your hardware

  • switch off WiFi while using Bluetooth


Subsurface-4.0.2/Documentation/user-manual.txt000066400000000000000000002562401226345450700214430ustar00rootroot00000000000000// Subsurface 4.0.1 User Manual // ============================ // :author: Manual authors: Jacco van Koll, Dirk Hohndel, Reinout Hoornweg, // Linus Torvalds, Miika Turkia, Amit Chaudhuri, Jan Schubert, Willem // Ferguson, Salvador Cuñat // :revnumber: 4.0.1 // :revdate: December 2013 :icons: :toc: :toc-placement: manual :numbered: // :website: http://subsurface.hohndel.org image::images/Subsurface4Banner.png["Banner",align="center"] [big]#USER MANUAL# *Manual authors*: Jacco van Koll, Dirk Hohndel, Reinout Hoornweg, Linus Torvalds, Miika Turkia, Amit Chaudhuri, Jan Schubert, Willem Ferguson, Salvador Cuñat [blue]#_Version 4.0.1, January 2014_# Welcome as a user of _Subsurface_, an advanced dive logging programme with extensive infrastructure to describe, organise and interpret scuba and free dives. _Subsurface_ binaries are available for Windows PCs (Win XP or later), Intel based Macs (OS/X) and many Linux distributions. _Subsurface_ can be built for many more hardware platforms and software environments where Qt and libdivecomputer are available. The scope of this document is the use of the _Subsurface_ program. To install the software, consult the _Downloads_ page on the http://subsurface.hohndel.org/[_Subsurface_ web site]. Please discuss issues with this program by sending an email to mailto:subsurface@hohndel.org[our mailing list] and report bugs at http://trac.hohndel.org[our bugtracker]. For instructions on how to build the software and (if needed) its dependencies please consult the INSTALL file included with the source code. *Audience*: Recreational Scuba Divers, Free Divers, Tec Divers, Professional Divers toc::[] [[S_StartUsing]] Start Using the Program ----------------------- The _Subsurface_ window is usually divided into four panels and has a *Main Menu* (File Import Log View Filter Help) at the top of the window (for Windows and Linux) or the top of the screen (for Mac and Ubuntu Unity). The screen shots in this manual were taken on an Ubuntu system, so they don't show the main menu as part of the _Subsurface_ window. The four panels are: 1) The *Dive List* to the bottom left containing a list of all the dives in your dive log. You can select and highlight a dive on the dive list by clicking on it. In most situations you can also use the cursor up/down keys to switch between dives. 2) The *Dive Map* to the bottom right, showing your dive sites on a world map and centred on the site of the last selected dive. 3) The *Dive Info* to the top left, giving more detailed information on the selected dive, including some statistics for the selected dive or for all highlighted dive(s). 4) The *Dive Profile* to the top right, showing a graphical profile of the highlighted dive in the dive list. You can drag the dividers between panels in order to change the size of any of the panels. _Subsurface_ remembers the position of the dividers, so the next time _Subsurface_ starts it uses the positions of the dividers when the program was executed previously. If one dive is selected, the dive location, detailed information and profile of the _selected dive_ are shown in the respective panels. On the other hand, if one highlights more than one dive the last highlighted dive is the _selected dive_, but summary data of all _highlighted dives_ is shown in the *Stats* tab of the *Dive Info* panel. //^ [[S_ViewPanels]] image::images/main_window.jpg["The Main Window",align="center"] You can determine which of the four panels you wish to see by selecting the *View* option on the main menu and which gives the user several choices of display: *All*: show all four of the panels as in the screenshot above. *Divelist*: Show only the Dive List. *Profile*: Show only the Dive Profile of the selected dive. *Info*: Show only the Dive Notes about the last selected dive and statistics for all highlighted dives. *Globe*: Show only the world map, centred on the last selected dive. Like many other functions that can be accessed via the Main Menu, these options can be triggered using keyboard shortcuts as well. The shortcuts for your system are shown with an underline in the menu entries. Since different Operating Systems and your chosen language may cause _Subsurface_ to use different shortcut keys we won't try to list them here in the user manual. When you start the program for the first time, it shows no information at all. This is because the program doesn't have any dive information available. In the following sections we will describe how to create a new logbook. [[S_NewLogbook]] Creating a new logbook ---------------------- Select _File -> New Logbook_ from the main menu. All existing dive data are cleared so that new information can be added. If there is unsaved data in an open logbook, _Subsurface_ will ask you if you want to save the open logbook before a new logbook is created. [[S_GetInformation]] == How to obtain dive information to store in your logbook There are several ways to add dive information to your logbook: 1. Enter dive information by hand. This is typically useful if the diver did not use a dive computer and dives were recorded in a written logbook. 2. Import dive information directly from a dive computer if it is supported by _Subsurface_. The latest list of dive computers supported by _Subsurface_ can be found at: link:http://subsurface.hohndel.org/documentation/supported-dive-computers/[Supported dive computers]. 3. Import dive information from another data base or file format. This is discussed in more detail below. [[S_EnterData]] === Entering dive information by hand This is usually the approach for dives without a dive computer. The basic record of information within _Subsurface_ is a dive. The most important information in a simple written dive logbook usually includes dive type, date, time, duration, depth, the names of your dive buddy and of the dive master or dive guide, and some remarks about the dive. _Subsurface_ can store much more information than this for each dive. In order to add a dive to your dive log, select _Log -> Add Dive_ from the Main Menu. The program then shows three panels to enter information for a dive: two tabs in the *Info* panel (*Dive Notes* and *Equipment*), as well as the *profile* panel that displays a graphical profile of each dive. These panels are respectively marked [red]#A#, [red]#B# and [red]#C# in the figure below. We will now consider each of the tabs used for data entry. image::images/AddDive1.jpg["FIGURE: Add dive",align="center"] ==== Dive Notes This panel contains the date, time and place information for a particular dive, environmental conditions, co-divers and buddies, as well as some descriptive information. The message in a blue box at the top of the panel indicates that you are in the process of adding information about your dive. If you click on the *Dive Notes* tab, the following fields are visible: image::images/AddDive2.jpg["FIGURE: The Dive Notes tab",align="center"] The *Starttime* field reflects the date and the time of the dive. By clicking the down-arrow on the right of that field you can display a calendar from which you can choose the correct date. The hour and minutes values can also be edited by clicking on each of them in the text box and by overtyping the information displayed. *Air and water temperatures*: Type in the air and water temperatures during the dive into these fields to the right of the Starttime. You do not need to type in units of temperature: Subsurface supplies these automatically, you only need type the number. (The units selected in the 'Preferences' will determine whether metric or imperial units are displayed) *Location*: Here you enter the name of the dive site, e.g. "Tihany, Lake Balaton, Hungary". Auto completion of location names will make this easier when you frequently dive at the same sites. *Coordinates*: The geographic coordinates of the dive site should be entered here. These can come from three sources: a. You can find the coordinates on the world map in the bottom right hand part of the Subsurface window. The map displays a green bar indicating "No location data - move the map and double-click to set the location". Upon a double-click at the appropriate place, the green bar disappears and the coordinates are stored. b. You can obtain the coordinates from the _Subsurface_ Companion app if you have an Android device with GPS and you stored the coordinates of the dive site using that device. xref:S_Companion[Click here for more information] c. One can enter the coordinates by hand if they are known, using one of three formats with latitude followed by longitude: Degrees and decimal minutes, e.g: N30° 13.49760' , E30° 49.30788' Degrees minutes seconds, e.g. N30° 13' 29.8" , E30° 49' 1.5" Decimal degrees, e.g. 30.22496 , 30.821798 Southern hemisphere latitudes are given with a *S*, e.g. S30°, or with a negative value, e.g. -30.22496 *Divemaster*: Enter the name of the dive master or dive guide for this dive. Again, this field offers auto completion based on the list of dive masters in the current logbook. *Buddy*: Enter the name(s) of the buddy / buddies who accompanied you on the dive. Auto completion based on the list of buddies in the current logbook is offered. *Suit*: Enter the type of diving suit you used for the dive. Just as with the other items auto completion of the suit description is available. *Rating*: Here you can provide a subjective overall rating of the dive on a 5-point scale by clicking the appropriate star on the rating scale. *Visibility*: You can provide a rating of visibility during the dive on a 5-point scale by clicking the appropriate star. *Tags*: You may enter tags here (separate them by commas) that describe the type of dive you performed. Examples of common tags are boat, drift, training, cave etc. _Subsurface_ has many built-in tags. Auto completion is once again offered. For instance, if you typed +cav+, then the tags *cave* and *cavern* are shown for the user to choose from. *Notes*: Type any additional information here. The *Save* and *Cancel* buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there's no need to use them until ALL other information has been added. Here is an example of a completed Dive Notes panel: image::images/CompletedDiveInfo.jpg["FIGURE: A completed Dive Notes tab",align="center"] ==== Equipment The Equipment tab allows the user to enter information about the type of cylinder and gas used, as well as the weights used for a dive. The message in a blue box at the top of the panel: image::images/BlueEditBar.jpg["Blue edit bar",align="center"] indicates that you are in the process of adding equipment information for the dive. This is a highly interactive part of _Subsurface_ and the information on cylinders and gases (entered here) determines the behaviour of the dive profile (top right-hand panel). *Cylinders*: The cylinder information is entered through a dialogue that looks like this: image::images/CylinderDataEntry1.jpg["FIGURE:Initial cylinder dialogue",align="center"] The + button at the top right allows you to add more cylinders for this dive. The dark dustbin icon on the left allows you to delete information for a cylinder. Start by selecting a cylinder type. The AL80 cylinder is shown as the default cylinder type (you can change this default in the preferences if you usually dive with a different type of tank). If you wish to change the tank used on this dive, click on the AL80. This will bring up a dropdown list, accessible through a down-arrow: image::images/CylinderDataEntry2.jpg["FIGURE:The cylinder drop-down list button",align="center"] Use the drop-down list to select the cylinder type you used for this dive. The *Size* of the cylinder as well as its working pressure (*WorkPress*) will auto matically be shown in the dialogue. Now you need to indicate the starting pressure and the ending pressure of the gas used during your dive. The unit of pressure (metric/imperial) corresponds to the setting you chose in the preferences. Finally you need to type in the gas mixture that you used. If you used air, you can enter 21% or leave the field blank. If you used nitrox or trimix, specify the percentage of oxygen and the percentage of helium. Leave any inappropriate fields empty. After typing the information for the cylinder then either press _ENTER_ on the keyboard or click outside the cell that contains the cursor. Add information for any additional cylinders by using the + button at the top right hand. Here is an example of a complete description for a dive using two cylinders (air and EAN40): image::images/CylinderDataEntry3.jpg["FIGURE: a completed cylinder dive information table",align="center"] *Weights*: Information about the weight system used during a dive can be entered using a dialogue very similar to that of the cylinder information. If you click the + button on the top right of the weights dialogue, the table looks like this: image::images/WeightsDataEntry1.jpg["FIGURE: The Weights dialogue",align="center"] If you click on the *Type* field, a drop-down list becomes accessible through a down-arrow: image::images/WeightsDataEntry2.jpg["FIGURE: Weights type drop-down list button",align="center"] Use the drop-down list to select your type of weight system. In the *Weight* field, type in the weight used during the dive. After typing the information for the weight system either press _ENTER_ on the keyboard or click outside the cell that contains the cursor. It is possible to enter information for more than one weight system by adding an additional system using the + button on the top right hand. Weight systems can be deleted using the dustbin icon on the left hand. Here is an example of information for a dive with two types of weights: integrated and a weight belt: image::images/WeightsDataEntry3.jpg["FIGURE: A completed weights information table",align="center"] You do NOT need to click the _Save_ button before you have completed the dive profile. ==== Creating a Dive Profile The *Dive Profile* (a graphical representation of the depth of your dive as a function of time) is indicated in the panel on the top right hand of the _Subsurface_ window. When you manually add a dive to your logbook, _Subsurface_ presents a default dive profile that you need to modify to best represent the dive being described: image::images/DiveProfile1.jpg["FIGURE: Initial dive profile",align="center"] _Modifying the dive profile_: When you move the cursor around the dive profile, its position is indicated by two red lines as shown below. The depth and time that the cursor represents are indicated, respectively on the left hand and bottom axes. The units (metric/imperial) on the axes are determined by the *preference* settings. The dive profile itself comprises several line segments demarcated by waypoints (white dots on the profile, as shown above). The default dive depth is 15m. If your dive depth was 21m then you need to drag the appropriate waypoints downwards to represent 21m. To add a waypoint, double-click on any line segment. To remove a waypoint, right-click on it and choose "Remove this point" from the context menu. You will also need to drag the waypoints to represent an accurate time duration for your dive. Below is a dive profile that represents a dive to 21m for 31 min., followed by a 3 minute safety stop at 5m. image::images/DiveProfile2.jpg["FIGURE: Edited dive profile",align="center"] _Specifying the gas composition:_ The gas composition used is clearly indicated along the line segments of the dive profile. This defaults to the first gas mixture specified in the *Equipment* tab, which was air in the case of the profile illustrated above. The gas mixtures of segments of the dive profile can be edited. This is done by clicking on the gas description for a particular waypoint and selecting the appropriate choice from the context menu. Changing the gas for a waypoint affects the gas shown in the segment _to the left_ of that waypoint. Note that only the gases defined in the *Equipment* tab appear in the context menu: image::images/DiveProfile3.jpg["FIGURE: Gas composition context menu",align="center"] Below is the profile of a dive to 21m for 31 min. with a switch from air to EAN40 on the ascent. In this case the first cylinder in the *Equipment* tab contained air and the second cylinder contained EAN40. image::images/DiveProfile4.jpg["FIGURE: Completed dive profile",align="center"] ==== Saving the hand-entered dive information The information entered in the *Dive Notes* tab, the *Equipment* tab as well as the *Dive Profile* can now be saved in your logbook by using the two buttons on the top right hand of the Dive Notes tab. If you click _Save_, the dive data are saved in the current logbook. If you click _Cancel_, the newly entered dive data are discarded. When you exit _Subsurface_ it will prompt you to save the logbook with the new dive(s) on your computer. [[S_ImportDiveComputer]] === Importing new dive information from your Dive Computer ==== Connecting and importing data from a dive computer. The use of dive computers allows collecting a large amount of information about each dive, e.g. a detailed record of depth, durations, rates of ascent/descent and of gas partial pressures. _Subsurface_ can capture this information and present it to you as part of the dive information. _Subsurface_ can obtain dive information from a wide range of dive computers. The latest list of supported dive computers can be found at: link:http://subsurface.hohndel.org/documentation/supported-dive-computers/[Supported dive computers]. [icon="images/icons/warning2.png"] [WARNING] Several dive computers consume more power when they are in their PC-Communication mode. **This could drain your battery**. We therefore recommend that you check if your dive computer is recharging when connected to the USB port of a PC. For example, several Suunto and Mares dive computers do not recharge through the USB connection. Please consult the manual of your dive computer if you are unsure if it will recharge or drain its batteries while connected to the USB port. To import dive information from a dive computer to your computer with _Subsurface_, it is necessary that the two pieces of equipment must communicate. This involves setting up the communications port (or mount point) of the computer with _Subsurface_ that communicates with the dive computer. In order to set up this communication, you need to find the appropriate information to instruct _Subsurface_ where and how to import the dive information. *Appendix A* provides the technical information to help you achieve this for different operating systems and *Appendix B* has dive computer specific information. Now it is time to hook up your dive computer to your PC: - Connect your interface cable to a free USB port (or set up the Infrared or Bluetooth connection as described later in this manual) - Put your dive computer into PC Communication mode. (You should consult the manual of your specific dive computer for your brand and type) - In _Subsurface_, from the Main Menu, select _Import -> Import From Dive Computer_. The following dialogue appears: image::images/ImportFromDC1.jpg["FIGURE: Download dialogue 1",align="center"] Dive computers tend to keep a certain number of dives in their memory, even though these dives have already been imported to _Subsurface_. For that reason _Subsurface_ only imports dives that have not been uploaded before. This makes the download process faster on most dive computers and also saves battery power of your dive computer (at least for those not charging while connected via USB). If, for some reason, you wish to import ALL dives from the dive computer, even though some may already be in the logbook, you can tick the box labeled _Force download of all dives_. - The dialogue has two drop-down lists, *Vendor* and *Dive Computer*. On the *vendor* drop-down list select the make of your computer, e.g. Suunto, Oceanic, Uwatec, Mares. On the *Dive Computer* drop-down list, select the model name of your dive computer, e.g. D4 (Suunto), Veo200 (Oceanic), or Puck (Mares). - The *Device or Mount Point* drop-down list contains the USB or Bluetooth port name that _Subsurface_ needs in order to communicate with your dive computer. Select the appropriate port name. Consult *Appendix A* and *Appendix B* for technical details to find the appropriate port information for your dive computer and, in some cases, how to do the correct settings to the operating system of your _Subsurface_ computer. - Click the _OK_ button. - If there is a problem in communicating with your dive computer, an error message will be shown, similar to this text: "Unable to open /dev/ttyUSB0 Mares (Puck Pro)", see the text in the box below. **** [icon="images/icons/important.png"] [IMPORTANT] Check the following: 1) Is the dive computer still in PC-communication or Upload mode? 2) Is the battery of the dive computer fully charged? If not then charge or replace the battery. 3) Is the cable faulty? Does the cable work perfectly using other software? Has it worked before, or is this the first time you are using the cable? 4) Consult *Appendix A* and make sure you specified the correct Mount Point (see above). If your _Subsurface_ computer does not recognise the USB adaptor by showing an appropriate device name next to the Mount Point, then there is a possibility that the cable or USB adaptor is faulty. A faulty cable is the most common cause of communication failure between dive computer and _Subsurface_ computer. It is also possible that your _Subsurface_ computer is missing required drivers to interact with the download cable and connected dive computer. If all the above points are in order and there is a failure to download the dive data, then perform a download with the following two check boxes checked in the download dialogue discussed above: Save libdivecomputer logfile Save libdivecomputer dumpfile When checking each of these boxes, the user is prompted to select a folder to save the file into. The default folder is the one in which the _Subsurface_ dive log is kept. After downloading, no dives are shown in the *Dive List* but two files are created in the folder selected above: subsurface.log subsurface.bin Send these files to the _Subsurface_ mail list: _subsurface@hohndel.org_ and request that the files be analysed, providing your dive computer make and model as well as contextual information about the dives recorded on the dive computer. **** - With communication established, watch how your data is retrieved from your dive computer! Depending on your make of computer and/or number of dives, this could take some time. Please be patient. The _Download_ dialogue shows a progress bar at the bottom of the dialogue (but for some dive computers the progress information could be inaccurate as we cannot determine until after all data was downloaded how much downloadable data there is): image::images/ImportFromDC2.jpg["FIGURE: Download dialogue 2",align="center"] When download of the dive information is complete, all the imported dives appear in the Dive List, sorted by date and time. Disconnect and switch off the dive computer to conserve its battery power. If you select a particular dive, the Dive Profile panel shows an informative graph of dive depth against time for that particular dive. [[S_EditDiveInfo]] ==== Updating the dive information imported from your dive computer. The information from your dive computer is not complete and you need to add more details in order to have a more complete record of your dives. To do this, use the *Dive Notes* and the *Equipment* tabs on the top left hand of the _Subsurface_ window. ==== Dive Notes The date and time of the dive, gas mixture and perhaps water temperature is shown as obtained from the dive computer, but you need to add some information by hand in order for a more complete dive record. The message in a blue box at the top of the panel indicates that you are in the process of adding information about a dive. If you click on the *Dive Notes* tab, the following fields are visible: image::images/AddDive3.jpg["FIGURE: The Dive Notes tab",align="center"] The *Starttime* field reflects the date and the time of the dive, as supplied by the dive computer. It should therefore not be necessary to edit this, but you could make changes by clicking the down-arrow on the right of that field to display a calendar from which you can choose the correct date. The hour and minutes values can also be edited by clicking on each of them in the text box and by overtyping the information displayed. *Air/water temperatures*: Air and water temperatures during the dive are shown in these fields to the right of the Starttime. Many dive computers supply water temperature information and this field may therefore not require editing. If editing is required, you do not need to type in units of temperature: Subsurface supplies these automatically, only a number is required. (The units selected in the 'Preferences' will determine whether metric or imperial units are displayed) *Location*: Here type in text that describes the site where you did this dive, e.g. "Tihany, Lake Balaton, Hungary". Auto completion of location names will make this easier when you frequently dive at the same sites. *Coordinates*: The geographic coordinates of the dive site should be entered here. These can come from three sources: a. You can find the coordinates on the world map in the bottom right hand part of the Subsurface window. The map displays a green bar indicating "No location data - move the map and double-click to set the location". Upon a double-click at the appropriate place, the green bar disappears and the coordinates are stored. b. You can obtain the coordinates from the _Subsurface_ Companion app if you have an Android device with GPS and you stored the coordinates of the dive site using that device. xref:S_Companion[Click here for more information] c. One can enter the coordinates by hand if they are known, using one of three formats with latitude followed by longitude: Degrees and decimal minutes, e.g: N30° 13.49760' , E30° 49.30788' Degrees minutes seconds, e.g. N30° 13' 29.8" , E30° 49' 1.5" Decimal degrees, e.g. 30.22496 , 30.821798 Southern hemisphere latitudes are given with a *S*, e.g. S30°, or with a negative value, e.g. -30.22496. *Divemaster*: Enter the name of the dive master or dive guide for this dive. Again, this field offers auto completion based on the list of dive masters in the current logbook. *Buddy*: Enter the name(s) of the buddy / buddies who accompanied you on the dive. Auto completion based on the list of buddies in the current logbook is offered. *Suit*: Enter the type of diving suit you used for the dive. Just as with the other items auto completion of the suit description is available. *Rating*: Here you can provide a subjective overall rating of the dive on a 5-point scale by clicking the appropriate star on the rating scale. *Visibility*: You can provide a rating of visibility during the dive on a 5-point scale by clicking the appropriate star. *Tags*: You may enter tags here (separate them by commas) that describe the type of dive you performed. Examples of common tags are boat, drift, training, cave. _Subsurface_ has many built-in tags. If you start to type a tag, the program will list the tags that correspond to your typing. For instance, if you typed +cav+, then the tags *cave* and *cavern* are shown for the user to choose from. *Notes*: Type any additional information here. The *Save* and *Cancel* buttons are used to save all the information for tabs in the info panel and in the dive profile panel, so there's no need to use them until ALL other information has been added. Here is an example of a completed Dive Notes panel: image::images/CompletedDiveInfo.jpg["FIGURE: A completed Dive Notes tab",align="center"] ==== Equipment The Equipment tab allows the user to enter information about the type of cylinder and gas you used, as well as the weights used for that dive. The message in a blue box at the top of the panel: image::images/BlueEditBar.jpg["FIGURE: Blue edit bar",align="center"] indicates that you are in the process of adding equipment information for the dive. This is a highly interactive part of _Subsurface_ and the information on cylinders and gases (entered here) determines the behaviour of the dive profile (top right-hand panel). *Cylinders*: The cylinder information is entered through a dialogue that looks like this: image::images/CylinderDataEntry1.jpg["FIGURE: Initial cylinder dialogue",align="center"] In most cases _Subsurface_ obtains the gas used from the dive computer and automatically inserts the gas composition(% oxygen) in the table. The + button at the top right allows you to add more cylinders for this dive. The dark dustbin icon on the left allows you to delete information for a cylinder. Start by selecting a cylinder type. The AL80 cylinder is shown as the default cylinder type (you can change this default in the preferences if you usually dive with a different type of tank). If you wish to change the tank used on this dive, click on the AL80. This will bring up a drop-down list, accessible through a down-arrow: image::images/CylinderDataEntry2.jpg["FIGURE: The cylinder drop-down list button",align="center"] Use the drop-down list to select the cylinder type you used for this dive. The *Size* of the cylinder as well as its working pressure (*WorkPress*) will automatically be shown in the dialogue. Now you need to indicate the starting pressure and the ending pressure of the specified gas during your dive. The unit of pressure (metric/imperial) corresponds to the setting you chose in the preferences. Finally you need to type in the gas mixture that you used. If you used air, you can enter 21% or leave the field blank. If you used nitrox or trimix, specify the percentage of oxygen and the percentage of helium. Leave any inappropriate fields empty. After typing the information for the cylinder either press _ENTER_ on the keyboard or click outside the cell that contains the cursor. Add information for any additional cylinders by using the + button at the top right hand. Here is an example of a complete description for a dive using two cylinders (air and EAN40): image::images/CylinderDataEntry3.jpg["FIGURE: a completed cylinder dive information table",align="center"] *Weights*: Information about the weight system used during a dive can be entered using a dialogue very similar to that of the cylinder information. If you click the + button on the top right of the weights dialogue, the table looks like this: image::images/WeightsDataEntry1.jpg["FIGURE:The Weights dialogue",align="center"] If you click on the *Type* field, a drop-down list becomes accessible through a down-arrow: image::images/WeightsDataEntry2.jpg["FIGURE:Weights type drop-down list button",align="center"] Use the drop-down list to select your type of weight system. In the *Weight* field, type in the weight used during the dive. After specifying the weight system either press _ENTER_ on the keyboard or click outside the cell with the cursor. It is possible to enter information for more than one weight system by adding an additional system using the + button on the top right hand. Weight systems can be deleted using the dustbin icon on the left hand. Here is an example of information for a dive with two types of weights: integrated and a weight belt: image::images/WeightsDataEntry3.jpg["FIGURE: A completed weights information table",align="center"] ==== Saving the updated dive information The information entered in the *Dive Notes* tab, the *Equipment* tab can be saved with all the other information of your dives in your logbook by using the two buttons on the top right hand of the *Dive Notes* tab. If you click _Save_, the dive data are saved. If you click _Cancel_, the newly entered dive data are deleted, although the dive profile obtained from the dive computer will be retained. When you exit _Subsurface_ there is a final prompt to confirm that the new data should be saved. === Importing dive information from other digital data sources or other data formats [[S_ImportingAlienDiveLogs]] Maybe you have a lot of dives logged using other dive log software. You don't have to type all information by hand into _Subsurface_, because you can probably import your divelog. _Subsurface_ will import divelogs from a range of other dive log software. Some software is supported natively (e.g. divelogs.de, JDiveLog, MacDive, and Suunto DM4), for others you have to export your logbook to XML and then _Subsurface_ can import that XML file (Suunto DM3, DivingLog). _Subsurface_ can also import UDDF and UDCF files that are used by some divelog software and even some divecomputers like the Heinrichs & Weikamp DR5. Finally, for some divelog software we currently suggest to import your logbook first into a webservice like _divelogs.de_ and then import them from there with _Subsurface_, as divelogs.de supports a few additional logbook formats that _Subsurface_ currently cannot parse. When importing dives, _Subsurface_ tries to detect multiple records for the same dive and merges the information as best as it can. If there are no time zone issues (or other reasons that would cause the beginning time of the dives to be significantly different) _Subsurface_ will not create duplicate entries. [[S_ImportingDivesSuunto]] ==== Importing dives from *Suunto Divemanager 3 (DM3)* Before you can start importing dives from 'Suunto Divemanager', you first have to export the dives you want to import. _Subsurface_ does not import directly from the 'Suunto Divemanager' log files. The following procedures can be used for Linux and Windows. ===== Export from *Suunto Divemanager* - Start 'Suunto Divemanager' and log in with the name containing the logs - Do not start the import wizard to import dives from your computer. - In the navigation tree on the left side of the program-window, select your dives. - Within the list of dives, select the dives you would like to import later: * To select certain dives: hold 'ctrl' and click the dive * To select all dives: Select the first dive, hold down shift and select the last dive - With the dives marked, use the program menu 'File -> Export' - The export pop-up will show - Within this pop-up, there is one field called Export Path. * Click the browse button next to the field Export Path ** A file-manager like window pops up ** Navigate to the directory where you want to store the Divelog.SDE file ** Optionally change the name of the file you want to save ** Click 'Save' * You are back in the Export pop-up. Press the button 'Export' - Your dives are now exported to the file Divelogs.SDE. ===== Reading Suunto Divemanager Export in Subsurface The file Divelogs.SDE can now be opened (or imported) in _Subsurface_. [[S_ImportingDivesSuuntoDM4]] ==== Importing dives from *Suunto Divemanager 4 (DM4)* To import divelog from 'Suunto DM4', you need to locate the DM4 database where the dives are stored. You can either look for the original database or take a backup of the dives. Both methods are described here. ===== Locating the Suunto DM4 database * Start Suunto DM4 * Select 'Help -> About' * Click 'Copy' after text 'Copy log folder path to clipboard' * Now open Windows Explorer * Paste the address to the path box at the top of the File Explorer * The database is called DM4.db ===== Backing up Suunto DM4 * Start Suunto DM4 * Select 'File - Create backup' * From the file menu select the location and name for the backup, we'll use DM4 in here with the default extension .bak * Click 'Save' * Your dives are now exported to the file DM4.bak ===== Reading Suunto DM4 backup in _Subsurface_ Importing the logs from DM4 does not require any special steps. You just do the following: * Open the following menu 'File -> Import File(s)' * Browse your directories to the location where your DM4 backup is stored * Select the backup file you want to import and click 'Open' It is also possible to do the importing from command line: subsurface MyDives.xml --import DM4.bak ==== Importing from Mares Dive Organiser V2.1 Mares Dive Organiser is a Windows application. The dive log is kept as a Microsoft SQL Compact Edition data base with a .SDF filename extension. The data base includes all Dive Organiser-registered divers on the particular computer and all Mares dive computers used. The safest way to obtain a copy of this data base is, within Dive Organiser, to select Database -> Backup from the main menu and to back up the data base to your desk top. This creates a zipped file DiveOrganiserxxxxx.dbf. Rename the file to DiveOrganiserxxxxx.zip. Inside the zipped directory is a file _DiveOrganiser.sdf_. Extract it from the zipped folder to your Desktop. Then use _www.divelogs.de_ as a mechanism to extract the dive information from the file. Create a user account in divelogs.de , log into that web site, then select Import Logbook -> Dive Organiser from the menu on the left hand side. Follow the instructions carefully to transfer the dive information from the Dive Organiser data base to divelogs.de. Then follow the instructions below to import dives from divelogs.de to _Subsurface_. [[S_ImportingDivelogsDe]] ==== Importing dives from *divelogs.de* The import of dive information from _divelogs.de_ is simple, using a single dialogue box. Select _Import->Import form Divelogs.de_ from the Main Menu. This brings up a dialogue box (see figure on left [A] below). You need to enter a user-ID and password for _divelogs.de_ into the appropriate fields. Then select the _Download_ button. Download from _divelogs.de_ starts immediately, evident on a progress bar in the dialogue box. At the and of the download, the successful status is indicated (see figure on the right [B], below). Select the _Apply_ button. The imported dives appear in the *Dive List* panel. image::images/Divelogs1.jpg["FIGURE:Download from Divelogs.de",align="center"] ==== Importing dives from *MacDive* Importing logs from MacDive is as easy as it gets. Do the following steps in Subsurface: - Open the following menu _File - Import File(s)_ - Browse your directories to the location where your MacDive logs are stored - Select the log file(s) you want to import and click 'open' - Click the OK button in the pop-up After a few moments, you see your existing logs in _Subsurface_. Now you can edit your dives like explained in the section <>. _Subsurface_ imports all the relevant dive information excluding the used equipment and diver name. It is also possible to do the import from command line: subsurface MyDives.xml --import MacDiveDives.xml [[S_ImportingDivinglog]] ==== Importing dives from *DivingLog 5.0* Before you can start importing dives from _DivingLog_ you first have to export those dives. Unfortunately DivingLog XML files give us no indication on the preferences set on your system. So in order for _Subsurface_ to be able to successfully import XML files from DivingLog you first need to make sure that your copy of DivingLog is configured to use the Metric system (you can easily change this in 'File -> Preferences -> Units and Language' by clicking the 'Metric' button). Then do the following: - In Divinglog open the 'File -> Export -> XML' menu - Select the dives that you want to export - Click on the export button and select the filename This file can now be opened in _Subsurface_ (as described in the previous sections). [[S_ImportingDivesJDiveLog]] ==== Importing dives from *JDiveLog* JDiveLog stores its information in files with the extension of .jlb that contain all the information except images in XML format. By using _File -> Import File(s)_ from the Main Menu you get a pop-up asking for the file name. To import your JDiveLog file(s) do the following: - Open _File -> Import File(s)_ on the menu - Browse your directories to the location where your *.jlb file is - Select your existing *.jlb file and click 'open' - Click the OK button in the pop-up After a few moments, you see your existing logs in _Subsurface_. Now you can edit your dives like explained in the section <>. Information that is imported from JDiveLog into the *location* field: - Extended dive location information Information that is merged into the *notes* field: - Used amount of weight - Used type of suit - Used type of gloves - Type of dive - Dive activity Alternatively, you can start _Subsurface_ with the --import command line which will have the same effect: subsurface MyDives.xml --import JDiveLogDives.jlb will open your divelog (assuming that's called MyDives.xml) and then import the dives from JdivelogDives.jlb. You can now save the combined divelog back as MyDives.xml. [[S_Importingkenozooid]] ==== Importing dives from *Kenozooid* _Kenozooid_ uses UDDF to store dives and is tested to work with _Subsurface_. Make sure you are not using compressed files when importing to _Subsurface_ or uncompress them manually beforehand. [[S_ImportingUDDF]] ==== Importing UDDF Dives _Subsurface_ supports UDDF as a generic import format. Some attributes in your file may not get processed properly. Select _Import->Import Files_ from the Main Menu. Then select the UDDF file to be imported. [[S_ImportingCSV]] ==== Importing dives in CSV format Sometimes dive computers export dive information as files with _comma-separated variables_ (.CSV). For example, the APD Inspiration and Evolution closed circuit rebreather (CCR) systems export dive information in CSV format that normally contains information about a single dive only. These files can easily be imported into _Subsurface_. CSV files are normally organised into a single line that provides the titles of the data columns, followed by the data, one record per line. CSV files can be opened with a normal text editor. Here is a highly simplified and shortened example of a CSV file from an APD rebreather: Dive Time (s) Depth (m) PPO2 - Setpoint (Bar) PPO2 - C1 Cell 1 (Bar) Ambient temp. (Celsius) 0 0.0 0.70 0.81 13.1 0 1.2 0.70 0.71 13.1 0 0.0 0.70 0.71 13.1 0 1.2 0.70 0.71 13.2 0 1.2 0.70 0.71 13.1 10 1.6 0.70 0.72 12.7 20 1.6 0.70 0.71 12.6 30 1.7 0.70 0.71 12.6 40 1.8 0.70 0.68 12.5 50 1.6 0.70 0.68 12.5 60 2.4 0.70 0.69 12.5 70 3.5 0.70 0.69 12.4 80 4.2 0.70 0.72 12.5 90 4.0 0.70 0.71 12.4 Note that each title may comprise more than one word, for instance 'Dive Time (s)' in the above data example. Before being able to import the data to _Subsurface_ one first needs to know: a. Which character separates the different colums within a single line of data? This field separator should be either a comma (,) or a TAB character. This could be determined by opening the file with a text editor. If it is commma-delimited, then the comma characters between the values are clearly visible. If no commas are evident, the file is probably TAB-delimited (i.e. it uses a TAB as a field separator, as in the above example). b. Which data columns need to be imported into _Subsurface_?. The Dive Time and Depth colums are always required. Open the file using a text editor and note the titles of the columns to be imported and their column positions. For instance for the above example: Time: column 1 Depth: column 2 Temperature: column 5 ppO2: column 4 Armed with this information, the import into _Subsurface_ is straightforward. Select _Import->Import CSV_ from the main menu. The following dialogue appears: image::images/CSVDownload.jpg["FIGURE: CSV download dialogue",align="center"] Specify the name of the CSV file or select it from the browser button on the right. There are pre-configured definitions for some dive computers, e.g. the APD rebreathers. If your dive computer is on this list, select it using the dropdown box labeled _Pre-configured imports_, click _OK_ and the dive will be imported and listed in the *Dive List* tab of _Subsurface_. If your dive computer is not on the pre-configured list, then select the _Field Separator_ (TAB or comma) for your CSV file, using the appropriate dropdown list. Lastly, indicate which columns in the CSV file contain which data variables. For each data column used for import, check the appropriate check box and indicate in which column these data are found. For instance, the image above corresponds to the dialogue that would apply to the CSV data set described above the image. Having performed the column specification, select the _OK_ button and the dive will be imported and listed in the *Dive List* tab of _Subsurface_. [[S_Companion]] === Importing GPS coordinates with the Subsurface Companion app for mobile phones If you have an Android device with GPS, you can obtain the coordinates of the place where you are diving and automatically pass them to your Subsurface divelog. To do this you need to: - Register on the http://api.hohndel.org/login/[Subsurface companion web page]. You will receive a confirmation mail with instructions and a personal *DIVERID*, a long number that gives access to the companion app capabilities. - Download the app from https://play.google.com/store/apps/details?id=org.subsurface[Google Play Store] or from http://f-droid.org/repository/browse/?fdfilter=subsurface&fdid=org.subsurface[F-Droid]. ==== Using the Subsurface companion app on your smartphone On first use the app has three options: * _Create a new account._ Equivalent to registering in Subsurface companion page. * _Retrieve an account._ If you forgot your DIVERID you will receive an email to recover the number. * _Use an existing account._ You are prompted for your DIVERID. The app saves your DIVERID and does not ask for it again unless you use the _Disconnect_ menu option (see below). Now you're ready to get a dive position and send it to the server. The Android display will look like the left hand image (A) below, but without any dive. Touching the "+" icon on the top right to add a new dive site. You will be prompted for a place name (or asked to activate the GPS if it was turned off). The main screen shows a list of dive locations, each with place name, date and time. Some dives may have an arrow-up icon on the selection box to the left (see image B in the middle, below) indicating that they require upload to the server. There are several ways to send dives to the server; the easiest is by simply selecting the dive. See middle image below (B): image::images/Companion.jpg["FIGURE: Screen shots (A-C) of companion app",align="center"] Touching the right arrow will send it to the server. [icon="images/icons/important.png"] [IMPORTANT] Be careful, the trash on the right means exactly what it is supposed to mean, it deletes the dive location(s). The new dive points are now stored on the server and can be downloaded to the _Subsurface_ dive log whenever you upload or add your dive to _Subsurface_. After a dive trip using the Companion app, all dive locations are ready to be saved on your Subsurface dive log (see below). ===== Settings on the Companion app Selecting the _Settings_ menu option results in the right hand image above (C). ===== Server and account - _Web-service URL._ This is predefined (http://api.hohndel.org/) - _User ID._ Obtained by registering as indicated above. The easiest way to introduce it is simply to copy and paste from the confirmation mail but, off course, you can type it each character at a time. ===== Synchronization - _Synchronize on startup._ If selected, dives in the Android device and those on the web service will synchronize each time you start the app. - _Upload new dives._ If selected, each time you add a dive location it will automatically be sent to the server. ===== Background service Instead of entering a unique dive location, you can leave the service running in the background on your device, continuously collecting GPS locations. The settings below define the behaviour of the service: - _Min duration._ In minutes. The app'll try to get a position each X minutes until you stop it. - _Min distance._ In meters. Minimum distance between two position fixes. - _Name template._ The name the app will use when saving the position fixes. [icon="images/icons/info.jpg"] [TIP] _How does the background service work?_ Let's assume we've set 5 minutes and 50 meters in the settings above, the app will fix a location, then another one each 5 minutes. If this 2nd (3rd, 4th ...) location is within a radius of 50 meters from the previous one, it is not saved. After another 5 minutes there will be a new try, and so on. This way, if we are in a static position, we'll only get one location fix, but if we travel we can have a trace of our journey. ===== Other - _Mailing List._ The mail box for _Subsurface_. You can send an email to the Subsurface mailing list. - _Subsurface website._ A link to the URL of Subsurface web - _Version._ Displays the current version of the companion app. ===== Search Here you can search your saved dive locations by the name or by date and hour. ===== Start service Initiates the _background service_ depending on the previously defined settings. ===== Disconnect This is a badly named option. It disconnects your app from the server by resetting your ID in the app, showing the first screen where you can create an account, retrieve the ID for an existing one or use your own ID. Disconnecting is useful if you download the dive positions of another registered diver using your Android device. ===== Send all locations This option sends all locations stored in the Android device to the server. ==== Downloading dive locations to your Subsurface divelog You have to download dive(s) from a dive computer or enter dives manually into _Subsurface_ before obtaining the GPS coordinates from the server. The download dialog can be reached via _Ctrl+G_ or from the _Subsurface_ Main Menu _Import -> Import GPS data from Subsurface Service_, resulting in the image on the left (A), below. On first use the DIVERID text box will be blank. Provide the DIVERID. Then select the _Download_ button and the download begins. When this is completed you see the screen on the right (B), below: image::images/DownloadGPS.jpg["FIGURE: Downloading Companion app GPS data",align="center"] Note that the _Apply_ button is now active. Click on it to update the locations of the newly entered or uploaded dives in _Subsurface_ which applies the coordinates and names you gave them for all the new dives that match the date-times of the uploaded GPS localities. [icon="images/icons/info.jpg"] [NOTE] Features, issues and tips._ Since _Subsurface_ matches GPS locations from the Android device and dive information from your dive computer based on date-time data, automatic assignment of GPS data to dives is dependent on agreement of date and time between these two devices. If there is a large difference between the time in your dive computer and the time in your Android device, _Subsurface_ is unable to identify the dive that matches a location and nothing happens. Similar date-times may be not always be possible. A dirty hack is manually editing the date-time of a dive in Subsurface's Dive List _before_ downloading the GPS data and then to edit the date-time back again _after_ downloading GPS data. == Obtaining more information about dives entered into the logbook === The *Dive Info* tab (for individual dives) The Dive Info tab gives some summary information about a particular dive that has been selected in the *Dive List*. Useful information here includes the surface interval before the dive, the maximum and mean depths of the dive, the gas volume consumed, the surface air consumption (SAC) and the number oxygen toxicity units (OTU) incurred. === The *Stats* tab (for groups of dives) The Stats tab gives summary statistics for more than one dive, assuming that more than one dive have been selected in the *Dive List*. Highlight more than one dive by the standard Ctrl-click or Shift-click of the mouse. If only one dive has been selected, figures pertaining to only that dive are given. This tab shows the number of dives selected, the total amount of dive time in these dives, as well as the minimum, maximum and mean for the dive duration, dive depth, water temperature and surface air consumption (SAC). [[S_DiveProfile]] === The *Dive Profile* image::images/Profile2.png["Typical dive profile",align="center"] Of all the panels in _Subsurface_, the Dive Profile contains the most detailed information about each dive. The main item in the Dive profile is the graph of dive depth as a function of time. In addition to the obvious information of the depth it also shows the ascent and descent rate compared to the recommended speed of going up or down in the water column. This information is given using different colours: |==================== |*Colour*|*Descent speed (m/min)*|*Ascent speed (m/min)* |Red|> 30|> 18 |Orange|18 - 30|9 - 18 |Yellow|9 - 18|4 - 9 |Light green|1.5 - 9|1.5 - 4 |Dark green|< 1.5|< 1.5 |===================== The profile also includes depth readings for the peaks and troughs in the graph. Thus you should see the depth of the deepest point and other peaks. Mean depth is marked with a horizontal red line. The *air consumption* graph displays the tank pressure and its change during the dive. The air consumption takes depth into account so that even when manually entering the start and end pressures the graph is not a straight line. Similarly to the depth graph the tank pressure gives you information about the momentary SAC rate (Surface Air Consumption – often also called RMV – Respiratory Minute Volume) when using an air integrated dive computer. Here the colour coding is not relative to some absolute values but relative to the average normalised air consumption during the dive. So areas that are red or orange indicate times of increased normalized air consumption while dark green reflects times when the diver was using less gas than average. The colour coding is obviously only possible when a tank sensor is connected and tank pressure readings during the dive are available. *Water temperature* is displayed with its own blue line with temperature values placed adjacent to significant changes. It is possible to *zoom* into the profile graph. This is done either by using the scroll wheel / scroll gesture of your mouse or trackpad. By default _Subsurface_ always shows a profile area large enough for at least 30 minutes and 30m (100ft) – this way short or shallow dives are intuitively recognizable; something that free divers clearly won’t care about. image::images/MeasuringBar.png["FIGURE: Measuring Bar",align="center"] Measurements of *depth differences* can be achieved by using the button with two vertical bars at the right of the dive profile panel (see above figure, bottom right). Drag the red dots to the two points on the dive profile which you would like to measure. Information is given along the line connecting the two red dots. The dive profile can include further information that is typically more interesting for tec divers. Enabling these is described in the section entitled Setting up Preferences. Basically you can include graphs of the *partial pressures* of O2, N2, and He during the dive as well as a calculated and dive computer reported deco ceilings (only visible for deep, long, or repetitive dives). The partial pressure graphs are added below the profile data, the calculated ceiling is shown as a green overlay on top of the dive profile. Above the profile the currently used gradient factors are shown (e.g. GF 35/75). Please note that these are NOT the gradient factors in use by the dive computer in question, but the gradient factors used by _Subsurface_ to calculate deco obligations during the dive. The graph can also include the dive computer reported *ceiling* (or more precisely, the first deco stop that the dive computer recorded – note that not all dive computers record this information and make it available for download; for example all of the Suunto dive computers fail to make this very useful data available to divelog software). Because of the differences in used algorithms and amount of data available (and factors taken into consideration) at the time of the calculation it is unlikely that both of these are the same; this can be true even if the same algorithm and _gradient factors_ (see below) are used. It is also quite common that _Subsurface_ calculates a ceiling for non-decompression dives when the dive computer stayed in non-deco mode during the whole dive (represented by the [green]#dark green# section in the profile at the beginning of this section). This is caused by the fact that _Subsurface’s_ calculations describe the deco obligation at that point in time during a dive, while dive computers usually take the upcoming ascent into account. During the ascent some excess Nitrogen (and possibly Helium) are already breathed off so even though the diver technically encountered a ceiling at depth, the dive still does not require an explicit deco stop. This feature allows dive computers to offer longer non-stop bottom time. For a more detailed explanation of _gradient factors_, use the following links: - link:http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-values, by Erik Baker, 1988, _Immersed_ Vol. 3, No. 3.] - link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient factors for dummies, by Kevin Watts] === The Dive Profile context menu The context menu for the Dive Profile is accessed by right-clicking while the mouse cursor is over the Dive Profile panel. The menu allows the creation of Bookmarks or Gas Change Event markers other than the ones that might have been imported from a Dive Computer. Markers are placed against the depth profile line and with the time of the event set by where the mouse cursor was when the right mouse button was initially clicked to bring up the menu. Gas Change events open a further selection of which gas is being switched to, the list based on the available gases defined in the Equipment Tab. By right-clicking while over an existing marker, the menu extends adding options to allow deletion of the marker or to allow all markers of that type to be hidden. Hidden events can be restored to view by selecteing Unhide all events from the context menu. === The *Information Box* The Information box displays a large range of information pertaining to the dive profile. Normally the Information Box is located to the top left of the *Dive Profile* panel. If the mouse points outside of the *Dive Profile* panel, then only the top line of the Information Box is visible (see left-hand part of figure (A) below). The Information Box can be moved around in the *Dive Profile* panel by click-dragging it with the mouse so that it is not obstructing important detail. The position of the Information Box is saved and used again during subsequent dive analyses. image::images/InfoBox2.jpg["Figure: Information Box",align="center"] The moment the mouse points inside the *Dive Profile* panel, it expands and shows many data items. In this situation, the data reflect the time point along the dive profile indicated by the mouse (see right-hand part of figure (B) above where the Information Box reflects the situation at the position of the cursor [arrow] in that image). Therefore, moving the cursor in the horizontal direction allows the Information Box to show information for any point along the dive profile. In this mode, the Information Box gives extensive statistics about depth, gas and ceiling characteristics of the particular dive. These include: Time period into the dive (indicated by a @), depth, cylinder pressure (P), temperature, ascent/descent rate, surface air consumption (SAC), oxygen partial pressure, maximum operating depth, effective air depth (EAD), effective narcotic depth (END), equivalent air density depth (EADD), decompression requirements at that instant in time (Deco), time to surface (TTS), the calculated ceiling, as well as the calculated ceiling for several Bühlmann tissue compartments. == Organising the logbook (Manipulating groups of dives) === The Dive List context menu Many actions within _Subsurface_ are dependent on a context menu that is used mostly to manipulate groups of dives. The context menu is found by selecting a dive or a group of dives and then right-clicking. image::images/ContextMenu.png["Figure: Context Menu",align="center"] The context menu is used in many manipulations described below. [[S_Renumber]] === Renumbering the dives Dives are normally numbered incrementally from non-recent dives (low sequence numbers) to recent dives (having the highest sequence numbers). The numbering of the dives is not always consistent. For instance, when non-recent dives are added to the dive list the numbering does not automatically follow on because of the dives that are more recent in date/time than the newly-added dive that has an older date/time. Therefore you sometimes may need to renumber the dives. This is performed by selecting (from the Main Menu) _Log -> Renumber_. You are given a choice with respect to the lowest sequence number to be used. Completing this operation results in new sequence numbers (based on date/time) for the dives in the *Dive List* panel. [[S_Group]] === Grouping dives into trips and manipulating trips If you dive regularly, the dive list can rapidly become very long. _Subsurface_ can group dives into _trips_. It performs this by grouping dives that have date/times that are not separated in time by more than two days, thus creating a single heading for each diving trip represented in the dive log. Below is an ungrouped dive list (A, on the left) as well as a grouped dive list with several trips (B, on the right): image::images/Group2.jpg["Figure: Grouping dives",align="center"] Grouping into trips allows a rapid way of accessing individual dives without having to scan long lists of dives. In order to group the dives in a dive list, (from the Main Menu) select _Log -> Autogroup_. The *Dive List* panel now shows only the titles for the trips. ==== Viewing the dives during a particular trip Once when the dives have been grouped into trips, you can expand one or more trips by clicking the arrow-head on the left of each trip title. This expands the selected trip, revealing the individual dives performed during the trip. ==== Editing the title and associated information for a particular trip Normally, in the dive list, minimal information is included in the trip title. You can add much more information about a trip by selecting its trip title from the dive list. This shows a *Trip Notes* tab in the *Dive Notes* panel. Here you can add or edit information about the date/time, the trip location and any other general comment about the trip as a whole (e.g. the dive company you dived with, the general weather during the trip). After entering this information, select *Save* from the buttons at the top right of the *Trip Notes* tab. The trip title in the *Dive List* panel should now reflect some of the edited information. ==== Collapsing or expanding dive information for different trips If you right-click after selecting a particular trip in the dive list, the resulting context menu allows several possibilities to expand or collapse dives within trips. This includes expanding all trips, collapsing all trips and collapsing all trips except the selected one. ==== Merging dives from more than one trip into a single trip When you right-click on a selected trip title in the *Dive List* panel, the context menu allows the merging of trips by either merging of the selected trip with the trip below or with the trip above. ==== Splitting a single trip into more than one trip If a trip includes five dives, you can split this trip into two trips (trip 1: top 3 dives; trip 2: bottom 2 dives) by selecting and right-clicking the top three dives. The resulting context menu allows you to create a new trip by choosing the option *Create new trip above*. The top three dives are then grouped into a separate trip. See below, the selection and context menu on the left (A), the completed action on the right (B): image::images/SplitDive3a.jpg["FIGURE: Split a trip into 2 trips",align="center"] === Manipulating single dives ==== Delete a dive from the dive log Dives can be permanently deleted from the dive log by selecting and right-clicking them to bring up the context menu, and then selecting *Delete dive(s)*. Typically this would apply to a case where you wish to delete workshop calibration dives of the dive computer or dives of extremely short duration. ==== Unlink a dive from a trip You can unlink dives from the trip to which they belong. Select and right-click the dives to bring up the context menu. Then select *Remove dive(s) from trip*. The dives that have been unlinked now appear immediately above the trip to which they belonged. ==== Add a dive to the trip immediately above Selected dives can be moved from the trip to which they belong and placed within the trip immediately above the currently active trip. Select and right-click the dives to bring up the context menu, then select *Add dive(s) to trip immediately above*. ==== Shift the start time of dive(s) Sometimes it is necessary to adjust the start time of a dive. This may apply to situations where dives are performed in different time zones or when the dive computer has an erroneous time. Select and right-click the dive(s) to be adjusted. This brings up the context menu. Select *Shift times*. Specify the time (in hours and minutes) by which the dives should be adjusted and click on the option indicating whether the time adjustment should be forwards or backwards. ==== Merge dives into a single dive Sometimes a dive is briefly interrupted, e.g. if a diver returns to the surface for a few minutes, resulting in two or more dives being recorded by the dive computer and appearing as different dives in the *Dive List* panel. You can merge these dives onto a single dive by selecting the appropriate dives and right-clicking them to bring up the context menu. Then select *Merge selected dives*. It may be necessary to edit the dive information in the *Dive Notes* panelto reflect events or conditions that apply to the merged dive. The figure below shows the depth profile two such dives that were merged: image::images/MergedDive.png["Example: Merged dive",align="center"] [[S_ExportLog]] == Exporting the dive log or parts of the dive log A dive log can be saved in two formats: * _Subsurface_ XML format. This is the native format used by _Subsurface_. * Universal Dive Data format (UDDF). See http://uddf.org for more information. UDDF is a generic format that enables communication among many dive computers and computer programs. In order to save the WHOLE dive log (i.e. all trips and dives), select *File* from the Main menu. To save in _Subsurface_ XML format, select _File -> Save as_. To save in UDDF format, select _File -> Export UDDF_. In order to save only one or more dives or one or two trips, select the appropriate dives or trips in the *Dive List* panel. Then right-click the selected dives to bring up the context menu. To save in _Subsurface_ XML format, select _Save as_ from the context menu. To save in UDDF format, select _Export as UDDF_ from the context menu. [[S_PrintDivelog]] == Printing your dive log _Subsurface_ provides a simple interface to print your whole dive log or only a few selected dives, including dive profiles and other contextual information. Before printing, two decisions are required: - Should the whole dive log be printed or only part of it? If only part of the dive log is required, then select the required dives from the *Dive List* panel. - What gas partial pressure information is required on the dive profile? Select the appropriate information from the Main Menu: _File->Preferences->Graph_. Now you need to select the print options. To do this, select _File->Print_ from the Main menu. The following dialogue appears (see the image on the left [A], below): image::images/PrintDivelog.jpg["FIGURE: Print dialogue",align="center"] Under _Print type_ you need to select one of three options: - Print the Dive List. Do do this, select _Table Print_. - Print the full dive records (dive profiles and all other information) at 6 dives per printed page. To do this, select _6 dives per page_. - Print the full dive records (dive profiles and all other information) at 2 dives per printed page. To do this, select _2 dives per page_. Under _Print options_ you need to select: - Printing only the dives that have been selected from the dive list prior to activating the print dialogue, achieved by checking the box _Print only selected dives_. - Printing in colour, achieved by checking the box with _Print in color_. The _Ordering_ affects the layout of the page (or part of it) for each dive. The dive profile could be printed at the top of each dive, with the textual information underneath, or it could be printed with the textual information at the top with the dive profile underneath. Select the appropriate option in the print dialogue. See the image on the right (B), above which has a layout with text above the dive profile. You can _Preview_ the printed page by selecting the _Preview_ button on the dialogue. After preview, changes to the options in the print dialogue can be made to give a layout that fits personal taste. Now, select the _Print_ button in the dialogue. This activates the regular print dialogue used by your operating system, allowing you to choose a printer and to set its properties. Remember to set the print resolution of the printer to an appropriate value by changing the printer properties. Finally, print the dives. Above on the right (B) is an example of the output for one particular dive. [[S_Preferences]] == Setting your *Preferences* for _Subsurface_ There are several settings within _Subsurface_ that the user can specify. These are found when selecting _File->Preferences_. The settings are performed in four groups: *Defaults*, *Units*, *Graph* and *Language*. All four sections operate on the same principles: specify the settings you wish to change, then save these using the *Apply* button. After applying all the new settings you can leave the settings panel by selecting *OK*. === Defaults There are four settings in the *Defaults* panel: ** *Lists and tables*: Here you can specify the font type and font size of the Dive Table panel. By decreasing the font size of the Dive table, you can see more dives on a screen. ** *Dives*: Here you need to specify the directory and file name of your electronic dive log book. This is a file with filename extension .xml. When launched, _Subsurface_ will then automatically load the dive log book specified. ** *Display invalid*: Dives can be marked as invalid (when you want to hide dives that you don't consider valid dives, e.g. pool dives, but still want to keep them in the dive log). This controls whether those dives are displayed in the dive list. ** *Use Default cylinder*: Here you can specify the default cylinder listed in the *Equipment* tab of the *Dive Notes* panel. === Units Here you can choose between metric and imperial measures of depth, pressure, volume, temperature and mass. By selecting the Metric or Imperial radio button at the top, you can specify that all units are in the chosen measurement system . Alternatively, if you select the *Personalise* radio button, you can select a mixture with some measurements being metric while others are in imperial measures. === Graph This panel allows two type of selections: * *Show*: Here you specify the amount of information that is shown as part of the dive profile: ** Gas pressure graphs: _Subsurface_ can display the pressures of the gases with which you dive. If you dive breathing air, then the only important gas is nitrogen. You can instruct _Subsurface_ to plot the nitrogen pressure during your dive. If you dive breathing nitrox, then you can select a graph of both the nitrogen and oxygen pressures during your dive. If you dive with trimix or heliox, you can select the display of the helium pressure as well. For each of these graphs you can specify a threshold value on the right-hand side of the panel. If any of the graphs go above this threshold level, the graph is highlighted in red, indication that the threshold value has been exceeded (see figure below). ** Ceiling: Ascent ceilings arise when a direct ascent to the surface exposes the diver to decompression sickness (DCS) and it is necessary to either ascend slower or to perform decompression stop(s) before ascending to the surface. _Subsurface_ can indicate these ceilings above which the diver should not ascend at a particular point in time (see the green-shaded areas in the figure in the section on <>) and in the figure below: *** If you check *Calculated ceiling*, then a ceiling is shown if it exists for a particular dive (*A* in figure below) *** If you check *show all tissues*, the ceiling is shown for the tissue compartments following the Bühlmann model (*B* in figure below). *** If you check *3m increments*, then the ceiling is indicated in 3m-increments (*C* in figure below). *** If the dive computer itself calculates a ceiling and makes it available to _Subsurface_ during upload of dives, this can be shown by checking *Dive computer reported ceiling* and it can be drawn in red by checking *Draw ceiling red*. ** If a _Maximum operating depth (MOD)_ or an _Equivalent air depth (EAD)_ applies to a dive profile, these can be shown by checking the appropriate boxes. ** If a _Maximum partial pressure of oxygen (maxPPO2)_ applies to dives, then this can be specified in the appropriate text box. In addition, if a _no-decompression limit (NDL)_ is to be shown in the *info* box, then check the appropriate box. image::images/Ceilings.png["Figure: Ceiling with 3m resolution",align="center"] * *Misc*: Here you can set the _gradient factors_ used while diving. GF_Low is the gradient factor at deep depths and GF_High is used just below the surface. At intermediate depths gradient factors between GF_Low and GF_High are used. Gradient factors add conservatism to the nitrogen exposure during a dive, in a similar way that many dive computers have a conservatism setting. The lower the value of a gradient factor, the more conservative the calculations are with respect to nitrogen loading and the deeper the ascent ceilings are. Gradient factors of 25/60 are considered conservative and values of 60/90 are considered harsh. Checking *GFLow at max depth* box causes GF_Low to be used at the deepest depth of a dive. For more information see: ** http://www.tek-dive.com/portal/upload/M-Values.pdf[Understanding M-values by Erik Baker, , _Immersed_ Vol. 3, No. 3.] ** link:http://www.rebreatherworld.com/general-and-new-to-rebreather-articles/5037-gradient-factors-for-dummies.html[Gradient factors for dummies, by Kevin Watts] === Languages A checkbox allows one to use the _System Default_ language which in most cases will be the correct setting; with this _Subsurface_ simply runs in the same language / country settings as the underlying OS. If this is for some reason undesirable you can uncheck this checkbox and pick a language / country combination from the list of included localizations. == Description of the Subsurface Main Menu items This section describes the functions and operation of the items in the Main Menu of Subsurface. Several of the items below are links to sections of this manual dealing with the appropriate operations. === File - <> - Close the currently open dive logbook and clear all dive information. - _Open logbook_ - This opens the file manager in order to select a dive logbook to open. - _Save_ - Save the dive logbook that is currently open. - _Save as_: - Save the current logbook or the currently selected dives within the present logbook under a different filename. - _Close_ - Close the dive logbook that is currently open. - <> - Export the currently open dive logbook (or the selected dives in the logbook) in UDDF format. - <> - Print the currently open logbook. - <> - Set the _Subsurface_ preferences. - _Quit_ - Quit _Subsurface_. === Import - <> - Import dive information from a dive computer. - <> - Import dive information from a file in UDDF or in another _Subsurface_-compatible format. - _Import CSV_ - Import dive information from a data file in CSV format. - <> - Load GPS coordinates from the _Subsurface_ mobile phone app. - <> - Import dive information from _www.Divelogs.de_. === Log - <> - Manually add a new dive to the *Dive List* panel. - <> - Renumber the dives listed in the *Dive List* panel. - <> - Group the dives in the *Dive List* panel into dive trips. - _Edit Device Names_ - Edit the names of dive computers. === View - <> - View the four main _Subsurface_ panels simmultaneously. - <> - View only the *Dive List* panel. - <> - View only the *Dive Profile* panel. - <> - View only the *Dive Notes* panel. - <> - View only the *World Map* panel. - _Yearly Statistics_ - Display summary statistics about dives during the last year. - _Prev DC_ - Switch to next dive computer. - _Next DC_ - Switch to previous dive computer. === Filter - _Select Events_ - This option is not implemented yet. === Help - _About Subsurface_ - Show a panel with the version number of _Subsurface_ as well as licensing information. - _User Manual_ - Open a window showing this user manual. == APPENDIX A: Operating system specific information for importing dive information from a dive computer. === Make sure that your OS has the required drivers installed [icon="images/icons/drivers.jpg"] [NOTE] The operating system of your desktop computer needs the appropriate drivers in order to communicate with your dive computer in whichever way your dive computer prefers (e.g. bluetooth, USB, infrared). * On Linux this means you need to have the correct kernel module loaded. Most distributions will do this automatically for you. Make sure you have read/write permissions to that port. On Ubuntu that could mean you should run the command following command in a terminal window: +sudo adduser+ [your_username] +dialout+ * On Windows, the OS should offer to download the correct driver once you connect your dive computer to the USB port. * On a Mac you at times have to manually hunt for the correct driver. For example the correct driver for the Mares Puck devices can be found as Mac_OSX_VCP_Driver.zip at http://www.silabs.com/support/pages/support.aspx?ProductFamily=USB+Bridges [[S_HowFindDeviceName]] === How to Find the Device Name for USB devices [icon="images/icons/usb.jpg"] [NOTE] When you connect your dive computer by using a USB connector, usually _Subsurface_ will either propose a drop down list that contains the correct device name (or mount point for the Uemis Zurich), or it will disable the device select drop down if no device name is needed at all. In the rare cases where this doesn't work here are some instructions on ways to find out what your device name is: .On Windows: Simply try COM1, COM2, etc. The drop down list should contain all connected COM devices. .On MacOS: The drop down box should find all connected dive computers. .On Linux: Try the following: - Disconnect your USB cable of your dive computer - Open a terminal - Type the command: 'dmesg' and press enter - Plug in your USB cable of your dive computer - Type the command: 'dmesg' and press enter Within your terminal you should see a message similar to this one: usb 2-1.1: new full speed USB device number 14 using ehci_hcd usbcore: registered new interface driver usbserial USB Serial support registered for generic usbcore: registered new interface driver usbserial_generic usbserial: USB Serial Driver core USB Serial support registered for FTDI USB Serial Device ftdi_sio 2-1.1:1.0: FTDI USB Serial Device converter detected usb 2-1.1: Detected FT232BM usb 2-1.1: Number of endpoints 2 usb 2-1.1: Endpoint 1 MaxPacketSize 64 usb 2-1.1: Endpoint 2 MaxPacketSize 64 usb 2-1.1: Setting MaxPacketSize 64 usb 2-1.1: FTDI USB Serial Device converter now attached to ttyUSB3 usbcore: registered new interface driver ftdi_sio ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver You see that in the third line from the bottom, the USB adapter is detected and is connected to +ttyUSB3+. Now you use this information in the import settings as +/dev/ttyUSB3+. Your dive computer interface is connected and you should be able to import your dives. [[S_HowFindBluetoothDeviceName]] === Setting up bluetooth enabled devices [icon="images/icons/bluetooth.jpg"] [NOTE] For dive computers communicating through bluetooth like the Heinrichs Weikamp Frog or the Shearwater Predator and Petrel there is a different procedure to get the devices name to communicate with _Subsurface_. In general it consists of these steps: * enable bluetooth on your computer * pairing the device Do not forget to set your divecomputer in Bluetooth or upload mode before Paring and Downloading logs. If you use a Shearwater Predator/Petrel just select _Dive Log -> Upload Log_ and wait until you see the _Wait PC_ message. .On Windows: Bluetooth is most likely already enabled. For pairing the device choose Control Panel->Bluetooth Devices->Add Wireless Device This should bring up a dialog showing your dive computer (in Bluetooth mode) and allowing to pair it. For bluetooth pairing of your dive computer refer to the manufacturer's user guide. The dive computer should then show up in the list of Bluetooth devices and you may then right click on it and choose Properties->COM Ports to identify the port used for your dive computer. If there are several ports listed, use the one saying "Outgoing" instead of "Incoming". For downloading to _Subsurface_, the drop down list should contain this COM port already. If not, enter it manually. Note: If you have issues downloading from your dive computer in other software afterwards try to remove the pairing with your dive computer. .On MacOS: Click on the Bluetooth symbol in the menu bar and select 'Set up Bluetooth Device...'. Make sure that your dive computer is in upload mode; it should then show up in the list of devices. Select it and go through the pairing process. This step should only be needed once for initial setup. Once the pairing is completed the correct device will be shown in the 'Device or Mount Point' drop down in the _Subsurface_ *Import* dialog. .On Linux Ensure sure bluetooth is enabled on the _Subsurface_ computer. On most common distributions this should be true out of the box. If not then depending on your system, running +initd+ or +systemd+. This might be different and also involve loading modules specific to your hardware. In case your system is running +systemd+, manually run +sudo systemctl start bluetooth.service+ to enable it, in case of +initd+, run something like +sudo rc.config start bluetoothd+ or +sudo /etc/init.d/bluetooth start+. Pairing should be straight forward. Using Gnome3 for instance will show a bluetooth icon in the upper right corner of your desktop where you select 'Set up New Device'. This should show you a dialog where you are able to select your dive computer (in bluetooth mode) and pair it. If you have issues with PIN setting try manually setting '0000'. You may also use a manual approach by using such commands: * +sudo hciconfig+ - shows the bluetooth devices available on your computer (not dive computer), most likely you will see a hci0, if not try 'sudo hcitool -a' to see inactive devices and try to run 'sudo hciconfig hci0 up' to bring them up * +sudo hcitool scanning+- use this to get a list of bluetooth enabled client devices, watch out for your dive computer and remember the MAC address shown there * +sudo bluez-simple-agent hci0 10:00:E8:C4:BE:C4+ - this will pair your dive computer with the bluetooth stack of your computer, copy/paste the MAC address from the output of 'hcitool scanning' Unfortunately on Linux binding to a communication device has to be done manually by running: * +sudo rfcomm bind /dev/rfcomm0 10:00:E8:C4:BE:C4+ - bind the dive computer to a communication device in your computer, in case rfcomm is already taken just use rfcomm1 or up, please copy/paste the MAC address from the output of 'hcitool scanning', the MAC shown in here will not work for you. For downloading dives in Subsurface you have then to specify +/dev/rfcomm0+ as device name to use. == APPENDIX B: Dive Computer specific information for importing dive information. [[S_ImportUemis]] === Import from a Uemis Zurich [icon="images/icons/iumis.jpg"] [NOTE] Things are very similar to a normal USB-connected dive computer when downloading dives from a Uemis Zurich dive computer (which certainly is one of the ones that DO recharge when connected to the USB port). The main difference is that you don't enter a device name, but instead the location where the UEMISSDA file system is mounted once you connect the dive computer. On Windows this is a drive letter ( often 'E:' or 'F:'), on a Mac this is '/Volumes/UEMISSDA' and on Linux systems this differs depending on the distribution that you use. On Fedora it usually is '/var/run/media//UEMISSDA'. In all cases _Subsurface_ should suggest the correct location in the drop down list. Once you have selected this as device name you can download the dives from the Uemis Zurich. One technical issue with the Uemis Zurich download implementation (this is a firmware limitation, not a _Subsurface_ issue) is that you cannot download more than about 40-50 dives without running out of memory on the SDA. This will usually only happen the very first time you download dives from the Uemis Zurich - normally when downloading at the end of a day or even after a dive trip, the capacity is sufficient. If _Subsurface_ displays an error that the dive computer ran out of space the solution is straight forward. Disconnect the SDA, turn it off and on again, and reconnect it. You can now retry (or start a new download session) and the download will continue where it stopped the last time you tried. You may have to do this more than once, depending on how many dives you have stored on your dive computer. At this point _Subsurface_ downloads most of the information that is stored on the SDA, including information about dive spots and equipment. Buddy information is not yet downloaded. [[S_ImportingDR5]] === Importing dives from Heinrichs Weikamp DR5 [icon="images/icons/HW_DR5.jpg"] [NOTE] When mounted as a USB drive the Heinrichs Weikamp DR5 saves a single UDDF file for every dive. Mark all the dives you'd like to import or open. Note: The DR5 does not seem to store gradient factors nor deco information, so for _Subsurface_ it is not possible to display them. Adjust the gradient factors in the Tec Settings in _Subsurface_ to generate a deco overlay in the _ Subsurface_ *Dive Profile* panel to get deco displayed but please note that the deco calculated by _Subsurface_ will most likely differ from the one displayed on the DR5. === Import from Shearwater Predator using bluetooth [icon="images/icons/predator.jpg"] [NOTE] Using a Shearwater Predator you may be able to pair Bluetooth but then encounter issues when downloading, showing errors like _Slip RX: unexp. SLIP END_ on the Predator. This might also be seen, when using other dive log software and operating systems than Linux. We have no detailed idea about the source and how to fix this, but it is reported to be solved sometimes by one of these steps: * use the bluetooth dongle which came with the Shearwater Predator instead of the built-in one of your computer * switch to different bluetooth drivers for your hardware * switch off WiFi while using Bluetooth Subsurface-4.0.2/INSTALL000066400000000000000000000207121226345450700146620ustar00rootroot00000000000000Building Subsurface from Source =============================== Subsurface uses a few open source libraries and frameworks to do its job. The most important ones include libdivecomputer, Qt4, Marble (more precisely libmarble; this is what causes the need for Qt4 as Marble as of the time of this writing hasn't been ported to Qt5, yet), libxml2, libxslt, libsqlite3, and libzip. Below are instructions for building Subsurface under some popular Linux distributions, for building Subsurface using Homebrew on a Mac, and for cross-building Subsurface for Windows. The lack of a working package management system for Windows makes it really painful to build Subsurface natively under Windows, we have some hints how to do so here as well. Build options for Subsurface ---------------------------- The following options are recognized when passed to qmake: -config debug Create a debug build -config release Create a release build The default depends on how Qt was built. V=1 Disable the "silent" build mode LIBDCDEVEL=1 Search for libdivecomputer in ../libdivecomputer INCLUDEPATH+=xxx Add xxx to the include paths to the compiler (pass the actual path, without -I) LIBS+=xxx Add xxx to the linker flags. -l and -L options are recognized. The INCLUDEPATH and LIBS options are useful to tell the buildsystem about non-standard installation paths for the dependencies (such as Marble). They can be repeated as often as needed, or multiple arguments can be passed on the same switch, separated by a space. For example: qmake LIBS+="-L$HOME/marble/lib -L$HOME/libdivecomputer/lib" \ INCLUDEPATH+="$HOME/marble/include $HOME/libdivecomputer/include" Building Subsurface 4 under Linux --------------------------------- On Fedora you need qt-devel, marble-devel, libzip-devel, libxml2-devel, libxslt-devel, libsqlite3x-devel, libudev-devel. If you are going to compile libdivecomputer, you need libusb-devel, too. On Debian style distributions you can install the required development packages by running (once Qt version of subsurface is available in your distribution) $ sudo apt-get build-dep subsurface If you want to install the required packages individually instead you need libqt4-dev, qt4-qmake, libxml2-dev, libxslt1-dev, zlib1g-dev, libzip-dev, libmarble-dev, libsqlite3-dev, libqtwebkit-dev (and libusb-1.0-0-dev if you're going to compile libdivecomputer). Unfortunately the marble version in Debian stable (and possibly Ubuntu) appears to be missing essential header files used in Subsurface. We hack around this right now by including this header file but that of course causes potential version conflicts. To compile libdivecomputer: $ git clone git://git.libdivecomputer.org/libdivecomputer $ cd libdivecomputer $ git checkout release-0.4 $ autoreconf --install $ ./configure --disable-shared $ make $ sudo make install To compile Subsurface: $ git clone git://subsurface.hohndel.org/subsurface.git $ cd subsurface $ qmake # qmake-qt4 on some flavors of Linux $ make $ sudo make install [optionally, add: prefix=/usr/local] Note: on Fedora qmake will appear as qmake-qt4 Building the Qt version under MacOSX ------------------------------------ 1) Install Homebrew $ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)" 2) Install needed dependencies $ brew install asciidoc libzip qt sqlite cmake libusb pkg-config 3) Make the brew version of sqlite the default $ brew link --force sqlite 4) Install Marble $ mkdir -p ~/src/marble/build $ git clone -b 4.11.2 git://anongit.kde.org/marble ~/src/marble/sources $ cd ~/src/marble/build $ cmake -DCMAKE_BUILD_TYPE=Debug -DQTONLY=TRUE -DCMAKE_INSTALL_PREFIX=/usr/local ../sources - or - $ cmake -DCMAKE_BUILD_TYPE=Release -DQTONLY=TRUE -DCMAKE_INSTALL_PREFIX=/usr/local ../sources $ cd src/lib $ make -j4 $ install_name_tool -id /usr/local/lib/`echo libmarblewidget.??.dylib` libmarblewidget.dylib $ cp *dylib /usr/local/lib/ $ mkdir -p /usr/local/include/marble $ cd ../../../sources/src/lib $ cp $(find . -name '*.h') /usr/local/include/marble/ 5) Install Libdivecomputer $ brew install automake libtool $ cd ~/src $ git clone git://git.libdivecomputer.org/libdivecomputer $ cd libdivecomputer $ git checkout release-0.4 $ autoreconf --install $ ./configure --disable-shared $ make $ make install 6) Compile Subsurface $ cd ~/src $ git clone git://subsurface.hohndel.org/subsurface.git $ cd subsurface $ qmake $ make $ make install_mac_bundle After the above is done, Subsurface will be installed to /Applications. Another option is to create a .dmg for distribution: $ qmake $ make $ make mac-create-dmg NOTES: macdeployqt assumes that the plugins are located "next" to the frameworks. The frameworks are linked from /usr/local/lib - but the plugins are not in /usr/local/plugins. The easiest workaround is to create a symbolic link from /usr/local/plugins to /usr/local/Cellar/qt/4.8.5/plugins (or whatever version of Qt you have built earlier). Cross-building Subsurface on Linux for Windows ---------------------------------------------- Subsurface builds nicely with MinGW - the official builds are done as cross builds under Linux (currently on Fedora 19). A shell script to do that (plus the .nsi file to create the installer with makensis) are included in the packaging/windows directory. The best way to get libdivecomputer to build appears to be $ mkdir -p ~/src $ git clone git://git.libdivecomputer.org/libdivecomputer ~/src/libdivecomputer $ cd ~/src/libdivecomputer $ git checkout release-0.4 $ mingw32-configure --disable-shared $ mingw32-make $ sudo mingw32-make install To compile Marble, use: $ mkdir -p ~/src/marble/build $ git clone -b v4.11.2 git://anongit.kde.org/marble ~/src/marble/sources $ cd ~/src/marble/build $ mingw32-cmake -DCMAKE_BUILD_TYPE=Debug -DQTONLY=TRUE ../sources - or - $ mingw32-cmake -DCMAKE_BUILD_TYPE=Release -DQTONLY=TRUE ../sources $ mingw32-make -j4 $ mingw32-make install To compile Subsurface, use: $ mkdir -p ~/src/subsurface $ git clone git://subsurface.hohndel.org/subsurface.git ~/src/subsurface $ cd ~/src/subsurface $ packaging/windows/mingw-make.sh $ packaging/windows/mingw-make.sh install $ packaging/windows/mingw-make.sh installer The last step assumes that you have a link from packaging/windows/dll to the correct directory in your MinGW installation. On my machine that is /usr/i686-w64-mingw32/sys-root/mingw/bin Similarly, the paths used in packaging/windows/mingw-make.sh may need to be adjusted according to your distributions layout Building Subsurface on Windows ------------------------------ 1) Install msys-git: http://msysgit.github.io Tools part of MSYS are required for building Subsurface, while you also need Git to be upstream and contribute to the project. Make sure that the msys/bin (or git/bin) folder is in PATH. 2) Install Qt http://qt-project.org/downloads Subsurface is currently built against Qt 4.8.5. 3) Install a MinGW toolchain https://docs.google.com/open?id=0B4D8x6CJEmtuczdiQklwMEs4RUU Qt 4.8.5 comes without a compiler and you will have to download it from a separate location. Other compiler may work, but there are no guaranties for that. Make sure that the mingw/bin folder is in PATH. 4) Install Libdivecomputer Use similar steps to the previous section, without the sudo command. 5) Install CMake (required for building Marble): http://www.cmake.org/cmake/resources/software.html Make sure that the cmake/bin folder is in PATH. 5) Download and build Marble http://marble.kde.org/sources.php http://techbase.kde.org/Projects/Marble/WindowsCompiling#Compiling_Marble_using_MingW Make sure you build both the Debug and Release versions. 6) Install pkg-config http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/pkg-config_0.26-1_win32.zip pkg-config depends on DLL files such as libglib-2.0-0.dll and has to be in PATH, so it's best that you copy the executable to msys/bin. 7) Install other dependencies Subsurface also depends on the following libraries: * libxml2 http://www.xmlsoft.org/downloads.html * libxslt http://xmlsoft.org/XSLT/ * libusb-1.0 http://sourceforge.net/apps/trac/libusb-win32/wiki * zlib http://www.zlib.net/ * libzip http://www.nih.at/libzip/ Once you have the libraries, create .pc files (pkg-config) for them and place the files in a folder that is indicated by the PKG_CONFIG_PATH environment variable - e.g. PKG_CONFIG_PATH=c:\msys\pkg-config To build subsurface, use: $ git clone git://subsurface.hohndel.org/subsurface.git $ cd subsurface $ qmake $ make $ make install $ make installer Subsurface-4.0.2/README000066400000000000000000000115251226345450700145130ustar00rootroot00000000000000 This is the README file for Subsurface 4.0.2 After the release of Subsurface 3.1 the Subsurface developer team decided to make a major change in the development direction of the project. We switched to Qt as our UI toolkit and slowly, step by step replaced all the Gtk with corresponding Qt code. This caused lots of changes, from adding C++ to the list of programming languages used, to switching build systems to qmake, to refactoring the tightly interwoven UI and logic code that we had up until 3.1. The vast majority of this work was done by just a handful of people with Tomaz Canabrava carrying the biggest part of the load. As we had hoped, the switch to Qt brought us many new active developers and the Qt community has been extremely helpful supporting us when we ran into trouble. At this stage the Qt version has by and large reached functional parity with version 3.1; two notable features are missing: the filter by event type and the dive planner. The user experience and look and feel on the other hand far surpass what was available in 3.1. As always in a massive rewrite like this, there are still a small handful of known bugs and issues - please check ReleaseNotes.txt and our bug tracker at trac.hohndel.org. The latest public version is Subsurface 4.0.2, released in January of 2014. License: GPLv2 Subsurface can be found at http://subsurface.hohndel.org You can get the sources to the latest development version from the git repository: git clone git://subsurface.hohndel.org/subsurface.git . You can also browse the sources via gitweb at git.hohndel.org If you want the latest release (instead of the bleeding edge development version) you can either get this via git checkout v4.0.2 (or whatever the last release is) if you have already cloned the git repository as shown above or you can get a tar ball from http://subsurface.hohndel.org/downloads/Subsurface-4.0.2.tgz Basic Usage: ============ Install and start from the desktop, or you can run it locally from the build directory: $ ./subsurface You can give a data file as command line argument, or (once you have set this up in the Preferences) Subsurface picks a default file for you when started from the desktop or without an argument. If you have a dive computer supported by libdivecomputer, you can just select "Import from Divecomputer" from the "Import" menu, select which dive computer you have (and where it is connected if you need to), and hit "OK". The latest list of supported dive computers can be found in the file SupportedDivecomputers.txt Much more detailed end user instructions can be found from inside Subsurface by selecting Help (typically F1). When building from source this is also available as Documentation/user-manual.html Contributing: ============= There is a mailing list for developers: subsurface@hohndel.org Go to http://lists.hohndel.org/cgi-bin/mailman/listinfo/subsurface to subscribe. If you want to contribute code, please either send signed-off patches or a pull request with signed-off commits. If you don't sign off on them, we will not accept them. This means adding a line that says "Signed-off-by: Name " at the end of each commit, indicating that you wrote the code and have the right to pass it on as an open source patch. See: http://gerrit.googlecode.com/svn/documentation/2.0/user-signedoffby.html Also, please write good git commit messages. A good commit message looks like this: Header line: explaining the commit in one line Body of commit message is a few lines of text, explaining things in more detail, possibly giving some background about the issue being fixed, etc etc. The body of the commit message can be several paragraphs, and please do proper word-wrap and keep columns shorter than about 74 characters or so. That way "git log" will show things nicely even when it's indented. Reported-by: whoever-reported-it Signed-off-by: Your Name where that header line really should be meaningful, and really should be just one line. That header line is what is shown by tools like gitk and shortlog, and should summarize the change in one readable line of text, independently of the longer explanation. A bit of Subsurface history: ============================ In fall of 2011, when a forced lull in kernel development gave him an opportunity to start on a new endeavor, Linus Torvalds decided to tackle his frustration with the lack of decent divelog software on Linux. Subsurface is the result of the work of him and a team of developers since then. It now supports Linux, Windows and MacOS and allows data import from a large number of dive computers and several existing divelog programs. It provides advanced visualization of the key information provided by a modern dive computer and allows the user to track a wide variety of data about their diving. In fall of 2012 Dirk Hohndel took over as maintainer of Subsurface Subsurface-4.0.2/ReleaseNotes.txt000066400000000000000000000257141226345450700167720ustar00rootroot00000000000000 Subsurface 4.0.2 ================ The Subsurface developer team is proud to announce the release of the next minor update of Subsurface. Subsurface is an open source divelog program that runs on Windows, Mac and Linux. With Subsurface the user can download dive information directly from a large number of supported dive computers. Subsurface is able to track single- and multi-tank dives using air, Nitrox or TriMix. It displays a dive profile with all related information including air consumption and alarms. It also allows logging of information like weights and exposure protection used, dive masters and dive buddies, and enables the user to rate dives and provide additional dive notes. With Subsurface the user can track dive locations including GPS coordinates (which can also be conveniently entered using a map interface). Subsurface calculates a wide variety of statistics of the user's diving and keeps track of information like the user's SAC rate, partial pressures of O2, N2 and He, calculated deco information, and many more. Subsurface allows the user to print out a detailed log book including dive profiles and other relevant information. The program is localized in about 20 languages and well supported by an active developer community. One of the major strengths of Subsurface is its support of a wide range of dive computers (most common dive computers are supported with the help of libdivecomputer); a detailed list is in the SupportedDivecomputers.txt file. Subsurface can also import existing dive logs from several sources including MacDive, Suunto DM3/DM4, JDiveLog and divelogs.de. Another strength is its ability to visualize the depth profile (and, if available, the tank pressure curve) in very innovative ways that give the user additional information on relative velocity (and momentary air consumption) during the dive through the coloring of the graphs. New in version 4.0.2 (compared to Subsurface 4.0.1): ---------------------------------------------------- - fixed potential crash when importing dive data without dive computer model information - improve parsing of equipment data; this now accepts localized units as well as input in units that are not the display units (so if you run Subsurface in metric, but went diving in a place where weights are in US Pounds (lbs), you can now enter the weight in lbs and Subsurface does the right thing) - fix temperature conversion when downloading data from Uemis SDA - improve autocompletion to always be case insensitive - improve selection handling in the dive list - include event data in libdivecomputer dump - improve profiles generated for dives with no depth samples and no average depth New in version 4.0.1 (compared to Subsurface 4.0): -------------------------------------------------- - fixed several bugs handling non-ASCII text both in dive info text fields as well as in Windows file names - added support for generating libdivecomputer log and dump files - many improvements for import and export of other file formats - XSLT files are built-in as resources, avoiding issues with not finding them - support more GPS coordinate formats - fixed several bugs around editing of manually entered dives - fixed several bugs with entering data for weights and tanks - increase the number of tracked weight systems to 6 - fixed font setting in preferences - improved look and feel when running dark themes - support older versions of Mac OS/X with default DMG (>= 10.5) - enable https in Windows binaries New in version 4.0 (compared to Subsurface 3.1): ------------------------------------------------ With version 4.0 the Subsurface team switched to a different UI toolkit. This caused the need to do a complete rewrite of a large chunk of the Subsurface code base. We decided to keep much of the logic and core of the existing code around, but used the opportunity for quite a bit of cleanup and many improvements. The basic concepts are the same, most of the basic features are the same, but trying to create a concise list of changes that summarizes the more than 1600 commits that have gone in since version 3.1 seems a daunting task. Here are some of the highlights: - new map widget with a spinning globe to visualize dive locations - much more "native" look and feel under Windows and Mac - ability to edit dives "in place": simply click on an entry in the Dive Notes or Equipment tabs to start editing - more data about each dive is presented in the Dive Notes and can be edited without separate dialogs and without having to go through context menues - graphical editor for dive profiles for manually added dives - better information overlay for the dive profile - addition of a "ruler" tool in the profile window that allows measuring of many properties between two points in the profile - better tag system with both predefined user-specified free text tags - better integration with divelogs.de (upload & download support) - ability to show the user manual from within the application without a life internet connection and without opening the manual in an external browser window - better statistics (with per-trip statistics available) Known issues: - Filter->Select Events is not implemented - Dive planner has been disabled for now - https support for divelogs.de on Windows is disabled New in version 3.1 (compared to Subsurface 3.0.2): -------------------------------------------------- - track tags for dives (things like 'boat', 'shore', 'deep', etc) - enable filtering by tags - ability to modify events from a context menu in the dive profile (this includes the ability to add gaschange events) - direct export / upload to the divelogs.de online logbook - import of Suunto DM4 files - improved printout formatting and printer dialog - support for color printing - dive planning: add option for last stop at 6m/20ft - added support for Heinrichs Weikamp OSTC3 and Suunto DX - native support for the Shearwater Petrel (much faster download) - various bug fixes New in version 3.0.2 (compared to Subsurface 3.0.1): ---------------------------------------------------- This update was mainly triggered by a bug in the handling of pO2 values read from CCR / rebreather dive computers. This bug can lead to incorrect data being stored in the Subsurface XML file. Installing Subsurface 3.0.2 and re-downloading the dives will correct the incorrect data. In order to re-download the dives connect your dive computer (this should only affect people with certain tec dive computers like the Shearwater Petrel or Predator that store pO2 values read from a pO2 sensor in their dive log), open the download dialog, check the box "Force download of all dives" and download your dives. After you save your data file the correct pO2 data should be stored in the samples. If you are using one of those dive computers, have saved data files with Subsurface 3.0 or 3.0.1 and have since deleted those dives from your dive computers, please contact the developers as we also have an experimental script that should be able to fix incorrect XML files - but re-downloading the data is the much more reliable way to address this issue. In addition to this bug fix, 3.0.2 brings a number of other improvements: - A Portuguese localization of Subsurface was added. - Subsurface now remembers its window size and pane layout the next time it is started. - Several importers for data for third party dive software were improved. - Dives from the Heinrichs & Weikamp DR5 and from kenozooid can now be imported into Subsurface. - A crash with localized versions of Subsurface on Mac was resolved. - The map provider for the GPS maps is now configurable. - The layout of some dialog boxes was changed to improve usability on small screens. - It is now easier to edit date and time of existing dives (and you can now edit duration, maximum and average depth for dives that were manually entered). - Several small bugs were addressed. New in version 3.0.1 (compared to Subsurface 3.0): -------------------------------------------------- - Several bug fixes for importing log files from other divelog software; especially imports from DivingLog should work much better now, but also new importer functions for UDDF and UDCF - Fixes for SAC calculation and gas volume estimates at high pressures (air and nitrox are NOT ideal gases in the physics sense) - Added Help link to the online user manual - Improved the user manual - random other bug fixes New in version 3.0 (compared to Subsurface 2.1): ------------------------------------------------ - Many new divecomputers supported, bugfixes for existing divecomputers - Cressi Leonardo, Seemann XP5, Mares Matrix, Mares Puck Pro, Mares Nemo Wide 2, Shearwater Petrel, Shearwater Predator, Aeris A300 AI, Hollis DG03 - significant improvements for the Heinrichs Weiskamp OSTC - Significantly improved selection of divecomputers for direct download - Map display of GPS locations of dives and ability to enter and edit those - Improved automatic dive numbering - Data overlay for profile plot (with additional statistics information) - Zoom function for profile plot - Dive planner - Improved printing support - Improved dive trip handling - Support for downloading dives from multiple computers (so for example both your main and your backup computer) - Added ability to import existing divelogs from Suunto DM3 (no manual unpacking needed anymore), MacDive and divelogs.de - Lots of features to make tec divers happy: - Experimental deco calculation with optional display of a calculated ceiling (Buhlmann ZH16 with gradient factors) - Display of deco information from some divecomputers that support this - TriMix support - CCR support (fixed or variable setpoint, on dive computers that support this) - Optional pO2, pN2 and pHe graphs - CNS tracking for supported divecomputers - Lots of bug fixes License: GPLv2 Subsurface can be found at http://subsurface.hohndel.org At the time of the 3.1 release subsurface supports the following dive computers: Atomics Aquatics Cobalt Cressi / Zeagle / Mares Edy, Nemo Sport N2iTiON3 Leonardo Mares Nemo, Nemo Excel, Nemo Apneist,... Puck, Puck Air, Nemo Air, Nemo Wide,... Darwin, Darwin Air, M1, M2, Airlab Icon HD, Icon HD Net Ready, Nemo Wide 2 Oceanic / Aeris / Sherwood / Hollis / Genesis / Seemann / Tusa (Pelagic) VT Pro, Versa Pro, Pro Plus 2, Wisdom, Atmos 2, Atmos AI, Atmos Elite,... Veo 250, XP5, Veo 180Nx, XR2, React Pro, React Pro White, DG02, Insight,... Atom 2.0, VT3, Datamask, Geo, Geo 2.0, Veo 2.0, Veo 3.0, Pro Plus 2.1, Pro Plus 3, Compumask, Elite T3, Epic, Manta, IQ-900 (Zen), IQ-950 (Zen Air), IQ-750 (Element II),... Heinrichs Weikamp OSTC, OSTC Mk.2, OSTC 2N, OSTC3 Frog Reefnet Sensus Sensus Pro Sensus Ultra Shearwater Predator, Petrel Suunto Solution Eon, Solution Alpha and Solution Nitrox/Vario Vyper, Cobra, Vytec, Vytec DS, D3, Spyder, Gekko, Mosquito, Stinger, Zoop Vyper2, Cobra2, Cobra3, Vyper Air and HelO2 DX, D9, D6, D4, D9tx, D6i and D4i Uemis Zurich Uwatec Aladin Memo Mouse Smart, Galileo (infraread) Zeagle N2iTiON 3 Subsurface-4.0.2/SupportedDivecomputers.html000066400000000000000000000050751226345450700212630ustar00rootroot00000000000000
Aeris
  • Atmos 2, A300 AI, Atmos AI, Atmos AI 2, Compumask, Elite, Elite T3, Elite T3, Epic, Epic, F10, Manta, XR-2
Apeks
  • Quantum X
Atomic Aquatics
  • Cobalt
Cressi
  • Edy, Leonardo
DiveRite
  • NiTek Trio
Genesis
  • React Pro, React Pro White
Heinrichs Weikamp
  • DR5, Frog, OSTC, OSTC 2N, OSTC 3, OSTC Mk2
Hollis
  • DG03
Mares
  • Darwin, Darwin Air, Icon HD, Icon HD Net Ready, M1, M2, Matrix, Nemo, Nemo Air, Nemo Apneist, Nemo Excel, Nemo Steel, Nemo Titanium, Nemo Wide, Nemo Wide 2, Puck, Puck 2, Puck Air, Puck Pro
Oceanic
  • Atom 1.0, Atom 2.0, Atom 3.0, Atom 3.1, Datamask, Geo, Geo 2.0, OC1, OC1, OC1, OCi, OCS, Pro Plus 2, Pro Plus 2.1, Pro Plus 3, Veo 1.0, Veo 180, Veo 2.0, Veo 200, Veo 250, Veo 3.0, Versa Pro, VT 4.1, VT Pro, VT3, VT4
Reefnet
  • Sensus, Sensus Pro, Sensus Ultra
Seemann
  • XP5
Shearwater
  • Petrel, Predator
Sherwood
  • Amphos, Insight, Insight 2, Wisdom, Wisdom 2, Wisdom 3
Subgear
  • XP Air, XP-10
Suunto
  • Cobra, Cobra 2, Cobra 3, D3, D4, D4i, D6, D6i, D9, D9tx, DX, Eon, Gekko, HelO2, Mosquito, Solution, Solution Alpha, Solution Nitrox, Spyder, Stinger, Vyper, Vyper 2, Vyper Air, Vytec, Zoop
Tusa
  • Element II (IQ-750), Zen (IQ-900), Zen Air (IQ-950)
Uemis
  • Zürich
Uwatec
  • Aladin 2G, Aladin 2G, Aladin Air Twin, Aladin Air Z, Aladin Air Z Nitrox, Aladin Air Z O2, Aladin Prime, Aladin Pro, Aladin Pro Ultra, Aladin Sport Plus, Aladin Tec, Aladin Tec 2G, Galileo Luna, Galileo Sol, Galileo Terra, Galileo Trimix, Memomouse, Smart Com, Smart Pro, Smart Tec, Smart Z
xDeep
  • Black
Zeagle
  • N2iTiON3
Subsurface-4.0.2/SupportedDivecomputers.txt000066400000000000000000000027361226345450700211370ustar00rootroot00000000000000Aeris: Atmos 2, A300 AI, Atmos AI, Atmos AI 2, Compumask, Elite, Elite T3, Elite T3, Epic, Epic, F10, Manta, XR-2 Apeks: Quantum X Atomic Aquatics: Cobalt Cressi: Edy, Leonardo DiveRite: NiTek Trio Genesis: React Pro, React Pro White Heinrichs Weikamp: DR5, Frog, OSTC, OSTC 2N, OSTC 3, OSTC Mk2 Hollis: DG03 Mares: Darwin, Darwin Air, Icon HD, Icon HD Net Ready, M1, M2, Matrix, Nemo, Nemo Air, Nemo Apneist, Nemo Excel, Nemo Steel, Nemo Titanium, Nemo Wide, Nemo Wide 2, Puck, Puck 2, Puck Air, Puck Pro Oceanic: Atom 1.0, Atom 2.0, Atom 3.0, Atom 3.1, Datamask, Geo, Geo 2.0, OC1, OC1, OC1, OCi, OCS, Pro Plus 2, Pro Plus 2.1, Pro Plus 3, Veo 1.0, Veo 180, Veo 2.0, Veo 200, Veo 250, Veo 3.0, Versa Pro, VT 4.1, VT Pro, VT3, VT4 Reefnet: Sensus, Sensus Pro, Sensus Ultra Seemann: XP5 Shearwater: Petrel, Predator Sherwood: Amphos, Insight, Insight 2, Wisdom, Wisdom 2, Wisdom 3 Subgear: XP Air, XP-10 Suunto: Cobra, Cobra 2, Cobra 3, D3, D4, D4i, D6, D6i, D9, D9tx, DX, Eon, Gekko, HelO2, Mosquito, Solution, Solution Alpha, Solution Nitrox, Spyder, Stinger, Vyper, Vyper 2, Vyper Air, Vytec, Zoop Tusa: Element II (IQ-750), Zen (IQ-900), Zen Air (IQ-950) Uemis: Zürich Uwatec: Aladin 2G, Aladin 2G, Aladin Air Twin, Aladin Air Z, Aladin Air Z Nitrox, Aladin Air Z O2, Aladin Prime, Aladin Pro, Aladin Pro Ultra, Aladin Sport Plus, Aladin Tec, Aladin Tec 2G, Galileo Luna, Galileo Sol, Galileo Terra, Galileo Trimix, Memomouse, Smart Com, Smart Pro, Smart Tec, Smart Z xDeep: Black Zeagle: N2iTiON3Subsurface-4.0.2/cochran.c000066400000000000000000000177011226345450700154160ustar00rootroot00000000000000#include #include #include #include #include #include #include "dive.h" #include "file.h" #define DON /* * The Cochran file format is designed to be annoying to read. It's roughly: * * 0x00000: room for 65534 4-byte words, giving the starting offsets * of the dives themselves. * * 0x3fff8: the size of the file + 1 * 0x3ffff: 0 (high 32 bits of filesize? Bogus: the offsets into the file * are 32-bit, so it can't be a large file anyway) * * 0x40000: "block 0": the decoding block. The first byte is some random * value (0x46 in the files I have access to), the next 200+ bytes or so * are the "scrambling array" that needs to be added into the file * contents to make sense of them. * * The descrambling array seems to be of some random size which is likely * determinable from the array somehow, the two test files I have it as * 230 bytes and 234 bytes respectively. */ static unsigned int partial_decode(unsigned int start, unsigned int end, const unsigned char *decode, unsigned offset, unsigned mod, const unsigned char *buf, unsigned int size, unsigned char *dst) { unsigned i, sum = 0; for (i = start ; i < end; i++) { unsigned char d = decode[offset++]; if (i >= size) break; if (offset == mod) offset = 0; d += buf[i]; if (dst) dst[i] = d; sum += d; } return sum; } /* * The decode buffer size can be figured out by simply trying our the * decode: we expect that the scrambled contents are largely random, and * thus tend to have half the bits set. Summing over the bytes is going * to give an average of 0x80 per byte. * * The decoded array is mostly full of zeroes, so the sum is lower. * * Works for me. */ static int figure_out_modulus(const unsigned char *decode, const unsigned char *dive, unsigned int size) { int mod, best = -1; unsigned int min = ~0u; if (size < 0x1000) return best; for (mod = 50; mod < 300; mod++) { unsigned int sum; sum = partial_decode(0, 0x0fff, decode, 1, mod, dive, size, NULL); if (sum < min) { min = sum; best = mod; } } return best; } #define hexchar(n) ("0123456789abcdef"[(n)&15]) static int show_line(unsigned offset, const unsigned char *data, unsigned size, int show_empty) { unsigned char bits; int i, off; char buffer[120]; if (size > 16) size = 16; bits = 0; memset(buffer, ' ', sizeof(buffer)); off = sprintf(buffer, "%06x ", offset); for (i = 0; i < size; i++) { char *hex = buffer + off + 3*i; char *asc = buffer + off + 50 + i; unsigned char byte = data[i]; hex[0] = hexchar(byte>>4); hex[1] = hexchar(byte); bits |= byte; if (byte < 32 || byte > 126) byte = '.'; asc[0] = byte; asc[1] = 0; } if (bits) { puts(buffer); return 1; } if (show_empty) puts("..."); return 0; } static void cochran_debug_write(const char *filename, const unsigned char *data, unsigned size) { int i, show = 1; for (i = 0; i < size; i += 16) show = show_line(i, data + i, size - i, show); } static void parse_cochran_header(const char *filename, const unsigned char *decode, unsigned mod, const unsigned char *in, unsigned size) { char *buf = malloc(size); /* Do the "null decode" using a one-byte decode array of '\0' */ partial_decode(0 , 0x0b14, "", 0, 1, in, size, buf); /* * The header scrambling is different form the dive * scrambling. Oh yay! */ partial_decode(0x010e, 0x0b14, decode, 0, mod, in, size, buf); partial_decode(0x0b14, 0x1b14, decode, 0, mod, in, size, buf); partial_decode(0x1b14, 0x2b14, decode, 0, mod, in, size, buf); partial_decode(0x2b14, 0x3b14, decode, 0, mod, in, size, buf); partial_decode(0x3b14, 0x5414, decode, 0, mod, in, size, buf); partial_decode(0x5414, size, decode, 0, mod, in, size, buf); printf("\n%s, header\n\n", filename); cochran_debug_write(filename, buf, size); free(buf); } /* * Cochran export files show that depths seem to be in * quarter feet (rounded up to tenths). * * Temperature seems to be exported in Fahrenheit. * * Cylinder pressure seems to be in multiples of 4 psi. * * The data seems to be some byte-stream where the pattern * appears to be that the two high bits indicate type of * data. * * For '00', the low six bits seem to be positive * values with a distribution towards zero, probably depth * deltas. '0 0' exists, but is very rare ("surface"?). 63 * exists, but is rare. * * For '01', the low six bits seem to be a signed binary value, * with the most common being 0, and 1 and -1 (63) being the * next most common values. * * NOTE! Don's CAN data is different. It shows the reverse pattern * for 00 and 01 above: 00 looks like signed data, with 01 looking * like unsigned data. * * For '10', there seems to be another positive value distribution, * but unlike '00' the value 0 is common, and I see examples of 63 * too ("overflow"?) and a spike at '7'. * * Again, Don's data is different. * * The values for '11' seem to be some exception case. Possibly * overflow handling, possibly warning events. It doesn't have * any clear distribution: values 0, 1, 16, 33, 35, 48, 51, 55 * and 63 are common. * * For David and Don's data, '01' is the most common, with '00' * and '10' not uncommon. '11' is two orders of magnitude less * common. * * For Alex, '00' is the most common, with 01 about a third as * common, and 02 a third of that. 11 is least common. * * There clearly are variations in the format here. And Alex has * a different data offset than Don/David too (see the #ifdef DON). * Christ. Maybe I've misread the patterns entirely. */ static void cochran_profile_write(const unsigned char *buf, int size) { int i; for (i = 0; i < size; i++) { unsigned char c = buf[i]; printf("%d %d\n", c >> 6, c & 0x3f); } } static void parse_cochran_dive(const char *filename, int dive, const unsigned char *decode, unsigned mod, const unsigned char *in, unsigned size) { char *buf = malloc(size); #ifdef DON unsigned int offset = 0x4a14; #else unsigned int offset = 0x4b14; #endif /* * The scrambling has odd boundaries. I think the boundaries * match some data structure size, but I don't know. They were * discovered the same way we dynamically discover the decode * size: automatically looking for least random output. * * The boundaries are also this confused "off-by-one" thing, * the same way the file size is off by one. It's as if the * cochran software forgot to write one byte at the beginning. */ partial_decode(0 , 0x0fff, decode, 1, mod, in, size, buf); partial_decode(0x0fff, 0x1fff, decode, 0, mod, in, size, buf); partial_decode(0x1fff, 0x2fff, decode, 0, mod, in, size, buf); partial_decode(0x2fff, 0x48ff, decode, 0, mod, in, size, buf); /* * This is not all the descrambling you need - the above are just * what appears to be the fixed-size blocks. The rest is also * scrambled, but there seems to be size differences in the data, * so this just descrambles part of it: */ partial_decode(0x48ff, offset, decode, 0, mod, in, size, buf); partial_decode(offset, size, decode, 0, mod, in, size, buf); printf("\n%s, dive %d\n\n", filename, dive); cochran_debug_write(filename, buf, size); cochran_profile_write(buf + offset, size - offset); free(buf); } int try_to_open_cochran(const char *filename, struct memblock *mem, GError **error) { unsigned int i; unsigned int mod; unsigned int *offsets, dive1, dive2; unsigned char *decode = mem->buffer + 0x40001; if (mem->size < 0x40000) return 0; offsets = mem->buffer; dive1 = offsets[0]; dive2 = offsets[1]; if (dive1 < 0x40000 || dive2 < dive1 || dive2 > mem->size) return 0; mod = figure_out_modulus(decode, mem->buffer + dive1, dive2 - dive1); parse_cochran_header(filename, decode, mod, mem->buffer + 0x40000, dive1 - 0x40000); for (i = 0; i < 65534; i++) { dive1 = offsets[i]; dive2 = offsets[i+1]; if (dive2 < dive1) break; if (dive2 > mem->size) break; parse_cochran_dive(filename, i+1, decode, mod, mem->buffer + dive1, dive2 - dive1); } exit(0); } Subsurface-4.0.2/color.h000066400000000000000000000054741226345450700151300ustar00rootroot00000000000000#ifndef COLORS_H #define COLORS_H /* The colors are named by picking the closest match from http://chir.ag/projects/name-that-color */ #include // Greens #define CAMARONE1 QColor::fromRgbF( 0.0, 0.4, 0.0, 1 ) #define FUNGREEN1 QColor::fromRgbF( 0.0, 0.4, 0.2, 1 ) #define FUNGREEN1_HIGH_TRANS QColor::fromRgbF( 0.0, 0.4, 0.2, 0.25 ) #define KILLARNEY1 QColor::fromRgbF( 0.2, 0.4, 0.2, 1 ) #define APPLE1 QColor::fromRgbF( 0.2, 0.6, 0.2, 1 ) #define APPLE1_MED_TRANS QColor::fromRgbF( 0.2, 0.6, 0.2, 0.5 ) #define APPLE1_HIGH_TRANS QColor::fromRgbF( 0.2, 0.6, 0.2, 0.25 ) #define LIMENADE1 QColor::fromRgbF( 0.4, 0.8, 0.0, 1 ) #define ATLANTIS1 QColor::fromRgbF( 0.4, 0.8, 0.2, 1 ) #define ATLANTIS2 QColor::fromRgbF( 0.6, 0.8, 0.2, 1 ) #define RIOGRANDE1 QColor::fromRgbF( 0.8, 0.8, 0.0, 1 ) #define EARLSGREEN1 QColor::fromRgbF( 0.8, 0.8, 0.2, 1 ) #define FORESTGREEN1 QColor::fromRgbF( 0.1, 0.5, 0.1, 1 ) // Reds #define PERSIANRED1 QColor::fromRgbF( 0.8, 0.2, 0.2, 1 ) #define TUSCANY1 QColor::fromRgbF( 0.8, 0.4, 0.2, 1 ) #define PIRATEGOLD1 QColor::fromRgbF( 0.8, 0.5, 0.0, 1 ) #define HOKEYPOKEY1 QColor::fromRgbF( 0.8, 0.6, 0.2, 1 ) #define CINNABAR1 QColor::fromRgbF( 0.9, 0.3, 0.2, 1 ) #define REDORANGE1 QColor::fromRgbF( 1.0, 0.2, 0.2, 1 ) #define REDORANGE1_HIGH_TRANS QColor::fromRgbF( 1.0, 0.2, 0.2, 0.25 ) #define REDORANGE1_MED_TRANS QColor::fromRgbF( 1.0, 0.2, 0.2, 0.5 ) #define RED1_MED_TRANS QColor::fromRgbF( 1.0, 0.0, 0.0, 0.5 ) #define RED1 QColor::fromRgbF( 1.0, 0.0, 0.0, 1 ) // Monochromes #define BLACK1 QColor::fromRgbF( 0.0, 0.0, 0.0, 1 ) #define BLACK1_LOW_TRANS QColor::fromRgbF( 0.0, 0.0, 0.0, 0.75 ) #define BLACK1_HIGH_TRANS QColor::fromRgbF( 0.0, 0.0, 0.0, 0.25 ) #define TUNDORA1_MED_TRANS QColor::fromRgbF( 0.3, 0.3, 0.3, 0.5 ) #define MERCURY1_MED_TRANS QColor::fromRgbF( 0.9, 0.9, 0.9, 0.5 ) #define CONCRETE1_LOWER_TRANS QColor::fromRgbF( 0.95, 0.95, 0.95, 0.9 ) #define WHITE1_MED_TRANS QColor::fromRgbF( 1.0, 1.0, 1.0, 0.5 ) #define WHITE1 QColor::fromRgbF( 1.0, 1.0, 1.0, 1 ) // Blues #define GOVERNORBAY2 QColor::fromRgbF( 0.2, 0.2, 0.7, 1 ) #define GOVERNORBAY1_MED_TRANS QColor::fromRgbF( 0.2, 0.2, 0.8, 0.5 ) #define ROYALBLUE2 QColor::fromRgbF( 0.2, 0.2, 0.9, 1 ) #define ROYALBLUE2_LOW_TRANS QColor::fromRgbF( 0.2, 0.2, 0.9, 0.75 ) // Yellows / BROWNS #define SPRINGWOOD1 QColor::fromRgbF( 0.95, 0.95, 0.9, 1 ) #define BROOM1_LOWER_TRANS QColor::fromRgbF( 1.0, 1.0, 0.1, 0.9 ) #define PEANUT QColor::fromRgbF( 0.5, 0.2, 0.1, 1.0 ) #define PEANUT_MED_TRANS QColor::fromRgbF( 0.5, 0.2, 0.1, 0.5 ) // Magentas #define MEDIUMREDVIOLET1_HIGHER_TRANS QColor::fromRgbF( 0.7, 0.2, 0.7, 0.1 ) #endif Subsurface-4.0.2/deco.c000066400000000000000000000245221226345450700147120ustar00rootroot00000000000000/* calculate deco values * based on Bühlmann ZHL-16b * based on an implemention by heinrichs weikamp for the DR5 * the original file was given to Subsurface under the GPLv2 * by Matthias Heinrichs * * The implementation below is a fairly complete rewrite since then * (C) Robert C. Helling 2013 and released under the GPLv2 * * add_segment() - add at the given pressure, breathing gasmix * deco_allowed_depth() - ceiling based on lead tissue, surface pressure, 3m increments or smooth * set_gf() - set Buehlmann gradient factors * clear_deco() * cache_deco_state() * restore_deco_state() * dump_tissues() */ #include #include #include "dive.h" //! Option structure for Buehlmann decompression. struct buehlmann_config { double satmult; //! safety at inert gas accumulation as percentage of effect (more than 100). double desatmult; //! safety at inert gas depletion as percentage of effect (less than 100). unsigned int last_deco_stop_in_mtr; //! depth of last_deco_stop. double gf_high; //! gradient factor high (at surface). double gf_low; //! gradient factor low (at bottom/start of deco calculation). double gf_low_position_min; //! gf_low_position below surface_min_shallow. bool gf_low_at_maxdepth; //! if TRUE, gf_low applies at max depth instead of at deepest ceiling. }; struct buehlmann_config buehlmann_config = { 1.0, 1.01, 0, 0.75, 0.35, 2.0, FALSE }; const double buehlmann_N2_a[] = {1.1696, 1.0, 0.8618, 0.7562, 0.62, 0.5043, 0.441, 0.4, 0.375, 0.35, 0.3295, 0.3065, 0.2835, 0.261, 0.248, 0.2327}; const double buehlmann_N2_b[] = {0.5578, 0.6514, 0.7222, 0.7825, 0.8126, 0.8434, 0.8693, 0.8910, 0.9092, 0.9222, 0.9319, 0.9403, 0.9477, 0.9544, 0.9602, 0.9653}; const double buehlmann_N2_t_halflife[] = {5.0, 8.0, 12.5, 18.5, 27.0, 38.3, 54.3, 77.0, 109.0, 146.0, 187.0, 239.0, 305.0, 390.0, 498.0, 635.0}; const double buehlmann_N2_factor_expositon_one_second[] = { 2.30782347297664E-003, 1.44301447809736E-003, 9.23769302935806E-004, 6.24261986779007E-004, 4.27777107246730E-004, 3.01585140931371E-004, 2.12729727268379E-004, 1.50020603047807E-004, 1.05980191127841E-004, 7.91232600646508E-005, 6.17759153688224E-005, 4.83354552742732E-005, 3.78761777920511E-005, 2.96212356654113E-005, 2.31974277413727E-005, 1.81926738960225E-005}; const double buehlmann_He_a[] = { 1.6189, 1.383 , 1.1919, 1.0458, 0.922 , 0.8205, 0.7305, 0.6502, 0.595 , 0.5545, 0.5333, 0.5189, 0.5181, 0.5176, 0.5172, 0.5119}; const double buehlmann_He_b[] = {0.4770, 0.5747, 0.6527, 0.7223, 0.7582, 0.7957, 0.8279, 0.8553, 0.8757, 0.8903, 0.8997, 0.9073, 0.9122, 0.9171, 0.9217, 0.9267}; const double buehlmann_He_t_halflife[] = {1.88, 3.02, 4.72, 6.99, 10.21, 14.48, 20.53, 29.11, 41.20, 55.19, 70.69, 90.34, 115.29, 147.42, 188.24, 240.03}; const double buehlmann_He_factor_expositon_one_second[] = { 6.12608039419837E-003, 3.81800836683133E-003, 2.44456078654209E-003, 1.65134647076792E-003, 1.13084424730725E-003, 7.97503165599123E-004, 5.62552521860549E-004, 3.96776399429366E-004, 2.80360036664540E-004, 2.09299583354805E-004, 1.63410794820518E-004, 1.27869320250551E-004, 1.00198406028040E-004, 7.83611475491108E-005, 6.13689891868496E-005, 4.81280465299827E-005}; #define WV_PRESSURE 0.0627 // water vapor pressure in bar #define DECO_STOPS_MULTIPLIER_MM 3000.0 double tissue_n2_sat[16]; double tissue_he_sat[16]; int ci_pointing_to_guiding_tissue; double gf_low_pressure_this_dive; #define TISSUE_ARRAY_SZ sizeof(tissue_n2_sat) double tolerated_by_tissue[16]; static double tissue_tolerance_calc(const struct dive *dive) { int ci = -1; double tissue_inertgas_saturation, buehlmann_inertgas_a, buehlmann_inertgas_b; double ret_tolerance_limit_ambient_pressure = 0.0; double gf_high = buehlmann_config.gf_high; double gf_low = buehlmann_config.gf_low; double surface = get_surface_pressure_in_mbar(dive, TRUE) / 1000.0; for (ci = 0; ci < 16; ci++) { double tolerated; tissue_inertgas_saturation = tissue_n2_sat[ci] + tissue_he_sat[ci]; buehlmann_inertgas_a = ((buehlmann_N2_a[ci] * tissue_n2_sat[ci]) + (buehlmann_He_a[ci] * tissue_he_sat[ci])) / tissue_inertgas_saturation; buehlmann_inertgas_b = ((buehlmann_N2_b[ci] * tissue_n2_sat[ci]) + (buehlmann_He_b[ci] * tissue_he_sat[ci])) / tissue_inertgas_saturation; /* tolerated = (tissue_inertgas_saturation - buehlmann_inertgas_a) * buehlmann_inertgas_b; */ if (!buehlmann_config.gf_low_at_maxdepth) { double lowest_ceiling = (buehlmann_inertgas_b * tissue_inertgas_saturation - gf_low * buehlmann_inertgas_a * buehlmann_inertgas_b) / ((1.0 - buehlmann_inertgas_b) * gf_low + buehlmann_inertgas_b); if (lowest_ceiling > gf_low_pressure_this_dive) gf_low_pressure_this_dive = lowest_ceiling; } tolerated = (-buehlmann_inertgas_a * buehlmann_inertgas_b * (gf_high * gf_low_pressure_this_dive - gf_low * surface) - (1.0 - buehlmann_inertgas_b) * (gf_high - gf_low) * gf_low_pressure_this_dive * surface + buehlmann_inertgas_b * (gf_low_pressure_this_dive - surface) * tissue_inertgas_saturation) / (-buehlmann_inertgas_a * buehlmann_inertgas_b * (gf_high - gf_low) + (1.0 - buehlmann_inertgas_b)*(gf_low * gf_low_pressure_this_dive - gf_high * surface) + buehlmann_inertgas_b * (gf_low_pressure_this_dive - surface)); tolerated_by_tissue[ci] = tolerated; if (tolerated > ret_tolerance_limit_ambient_pressure) { ci_pointing_to_guiding_tissue = ci; ret_tolerance_limit_ambient_pressure = tolerated; } } return ret_tolerance_limit_ambient_pressure; } /* add period_in_seconds at the given pressure and gas to the deco calculation */ double add_segment(double pressure, const struct gasmix *gasmix, int period_in_seconds, int ccpo2, const struct dive *dive) { int ci; int fo2 = get_o2(gasmix), fhe = get_he(gasmix); double ppn2 = (pressure - WV_PRESSURE) * (1000 - fo2 - fhe) / 1000.0; double pphe = (pressure - WV_PRESSURE) * fhe / 1000.0; if (buehlmann_config.gf_low_at_maxdepth && pressure > gf_low_pressure_this_dive) gf_low_pressure_this_dive = pressure; if (ccpo2) { /* CC */ double rel_o2_amb, f_dilutent; rel_o2_amb = ccpo2 / pressure / 1000; f_dilutent = (1 - rel_o2_amb) / (1 - fo2 / 1000.0); if (f_dilutent < 0) { /* setpoint is higher than ambient pressure -> pure O2 */ ppn2 = 0.0; pphe = 0.0; } else if (f_dilutent < 1.0) { ppn2 *= f_dilutent; pphe *= f_dilutent; } } if (period_in_seconds == 1) { /* one second interval during dive */ for (ci = 0; ci < 16; ci++) { if (ppn2 - tissue_n2_sat[ci] > 0) tissue_n2_sat[ci] += buehlmann_config.satmult * (ppn2 - tissue_n2_sat[ci]) * buehlmann_N2_factor_expositon_one_second[ci]; else tissue_n2_sat[ci] += buehlmann_config.desatmult * (ppn2 - tissue_n2_sat[ci]) * buehlmann_N2_factor_expositon_one_second[ci]; if (pphe - tissue_he_sat[ci] > 0) tissue_he_sat[ci] += buehlmann_config.satmult * (pphe - tissue_he_sat[ci]) * buehlmann_He_factor_expositon_one_second[ci]; else tissue_he_sat[ci] += buehlmann_config.desatmult * (pphe - tissue_he_sat[ci]) * buehlmann_He_factor_expositon_one_second[ci]; } } else { /* all other durations */ for (ci = 0; ci < 16; ci++) { if (ppn2 - tissue_n2_sat[ci] > 0) tissue_n2_sat[ci] += buehlmann_config.satmult * (ppn2 - tissue_n2_sat[ci]) * (1 - pow(2.0,(- period_in_seconds / (buehlmann_N2_t_halflife[ci] * 60)))); else tissue_n2_sat[ci] += buehlmann_config.desatmult * (ppn2 - tissue_n2_sat[ci]) * (1 - pow(2.0,(- period_in_seconds / (buehlmann_N2_t_halflife[ci] * 60)))); if (pphe - tissue_he_sat[ci] > 0) tissue_he_sat[ci] += buehlmann_config.satmult * (pphe - tissue_he_sat[ci]) * (1 - pow(2.0,(- period_in_seconds / (buehlmann_He_t_halflife[ci] * 60)))); else tissue_he_sat[ci] += buehlmann_config.desatmult * (pphe - tissue_he_sat[ci]) * (1 - pow(2.0,(- period_in_seconds / (buehlmann_He_t_halflife[ci] * 60)))); } } return tissue_tolerance_calc(dive); } #ifdef DECO_CALC_DEBUG void dump_tissues() { int ci; printf("N2 tissues:"); for (ci = 0; ci < 16; ci++) printf(" %6.3e", tissue_n2_sat[ci]); printf("\nHe tissues:"); for (ci = 0; ci < 16; ci++) printf(" %6.3e", tissue_he_sat[ci]); printf("\n"); } #endif void clear_deco(double surface_pressure) { int ci; for (ci = 0; ci < 16; ci++) { tissue_n2_sat[ci] = (surface_pressure - WV_PRESSURE) * N2_IN_AIR / 1000; tissue_he_sat[ci] = 0.0; } gf_low_pressure_this_dive = surface_pressure + buehlmann_config.gf_low_position_min; } void cache_deco_state(double tissue_tolerance, char **cached_datap) { char *data = *cached_datap; if (!data) { data = malloc(2 * TISSUE_ARRAY_SZ + 2 * sizeof(double) + sizeof(int)); *cached_datap = data; } memcpy(data, tissue_n2_sat, TISSUE_ARRAY_SZ); data += TISSUE_ARRAY_SZ; memcpy(data, tissue_he_sat, TISSUE_ARRAY_SZ); data += TISSUE_ARRAY_SZ; memcpy(data, &gf_low_pressure_this_dive, sizeof(double)); data += sizeof(double); memcpy(data, &tissue_tolerance, sizeof(double)); data += sizeof(double); memcpy(data, &ci_pointing_to_guiding_tissue, sizeof(int)); } double restore_deco_state(char *data) { double tissue_tolerance; memcpy(tissue_n2_sat, data, TISSUE_ARRAY_SZ); data += TISSUE_ARRAY_SZ; memcpy(tissue_he_sat, data, TISSUE_ARRAY_SZ); data += TISSUE_ARRAY_SZ; memcpy(&gf_low_pressure_this_dive, data, sizeof(double)); data += sizeof(double); memcpy(&tissue_tolerance, data, sizeof(double)); data += sizeof(double); memcpy(&ci_pointing_to_guiding_tissue, data, sizeof(int)); return tissue_tolerance; } unsigned int deco_allowed_depth(double tissues_tolerance, double surface_pressure, struct dive *dive, bool smooth) { unsigned int depth; double pressure_delta; /* Avoid negative depths */ pressure_delta = tissues_tolerance > surface_pressure ? tissues_tolerance - surface_pressure : 0.0; depth = rel_mbar_to_depth(pressure_delta * 1000, dive); if (!smooth) depth = ceil(depth / DECO_STOPS_MULTIPLIER_MM) * DECO_STOPS_MULTIPLIER_MM; if (depth > 0 && depth < buehlmann_config.last_deco_stop_in_mtr * 1000) depth = buehlmann_config.last_deco_stop_in_mtr * 1000; return depth; } void set_gf(short gflow, short gfhigh, bool gf_low_at_maxdepth) { if (gflow != -1) buehlmann_config.gf_low = (double)gflow / 100.0; if (gfhigh != -1) buehlmann_config.gf_high = (double)gfhigh / 100.0; buehlmann_config.gf_low_at_maxdepth = gf_low_at_maxdepth; } Subsurface-4.0.2/deco.h000066400000000000000000000002721226345450700147130ustar00rootroot00000000000000#ifndef DECO_H #define DECO_H #ifdef __cplusplus extern "C" { #endif extern double tolerated_by_tissue[]; extern double buehlmann_N2_t_halflife[]; #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/descriptor3.tsv000066400000000000000000000077631226345450700166430ustar00rootroot00000000000000Aeris Atmos 2 OCEANIC_VTPRO Aeris A300 AI OCEANIC_ATOM2 Aeris Atmos AI OCEANIC_VTPRO Aeris Atmos AI 2 OCEANIC_ATOM2 Aeris Compumask OCEANIC_ATOM2 Aeris Elite OCEANIC_VTPRO Aeris Elite T3 OCEANIC_ATOM2 Aeris Elite T3 OCEANIC_ATOM2 Aeris Epic OCEANIC_ATOM2 Aeris Epic OCEANIC_ATOM2 Aeris F10 OCEANIC_ATOM2 Aeris Manta OCEANIC_ATOM2 Aeris XR-2 OCEANIC_VEO250 Apeks Quantum X ZEAGLE_N2ITION3 Atomic Aquatics Cobalt ATOMICS_COBALT Cressi Edy CRESSI_EDY Cressi Leonardo CRESSI_LEONARDO DiveRite NiTek Trio ZEAGLE_N2ITION3 Genesis React Pro OCEANIC_VEO250 Genesis React Pro White OCEANIC_ATOM2 Heinrichs Weikamp DR5 SUBSURFACE Heinrichs Weikamp Frog HW_FROG Heinrichs Weikamp OSTC HW_OSTC Heinrichs Weikamp OSTC 2N HW_OSTC Heinrichs Weikamp OSTC 3 HW_OSTC3 Heinrichs Weikamp OSTC Mk2 HW_OSTC Hollis DG03 OCEANIC_ATOM2 Mares Darwin MARES_DARWIN Mares Darwin Air MARES_DARWIN Mares Icon HD MARES_ICONHD Mares Icon HD Net Ready MARES_ICONHD Mares M1 MARES_DARWIN Mares M2 MARES_DARWIN Mares Matrix MARES_ICONHD Mares Nemo MARES_NEMO Mares Nemo Air MARES_PUCK Mares Nemo Apneist MARES_NEMO Mares Nemo Excel MARES_NEMO Mares Nemo Steel MARES_NEMO Mares Nemo Titanium MARES_NEMO Mares Nemo Wide MARES_PUCK Mares Nemo Wide 2 MARES_ICONHD Mares Puck MARES_PUCK Mares Puck 2 MARES_ICONHD Mares Puck Air MARES_PUCK Mares Puck Pro MARES_ICONHD Oceanic Atom 1.0 OCEANIC_ATOM2 Oceanic Atom 2.0 OCEANIC_ATOM2 Oceanic Atom 3.0 OCEANIC_ATOM2 Oceanic Atom 3.1 OCEANIC_ATOM2 Oceanic Datamask OCEANIC_ATOM2 Oceanic Geo OCEANIC_ATOM2 Oceanic Geo 2.0 OCEANIC_ATOM2 Oceanic OC1 OCEANIC_ATOM2 Oceanic OC1 OCEANIC_ATOM2 Oceanic OC1 OCEANIC_ATOM2 Oceanic OCi OCEANIC_ATOM2 Oceanic OCS OCEANIC_ATOM2 Oceanic Pro Plus 2 OCEANIC_VTPRO Oceanic Pro Plus 2.1 OCEANIC_ATOM2 Oceanic Pro Plus 3 OCEANIC_ATOM2 Oceanic Veo 1.0 OCEANIC_ATOM2 Oceanic Veo 180 OCEANIC_VEO250 Oceanic Veo 2.0 OCEANIC_ATOM2 Oceanic Veo 200 OCEANIC_VEO250 Oceanic Veo 250 OCEANIC_VEO250 Oceanic Veo 3.0 OCEANIC_ATOM2 Oceanic Versa Pro OCEANIC_VTPRO Oceanic VT 4.1 OCEANIC_ATOM2 Oceanic VT Pro OCEANIC_VTPRO Oceanic VT3 OCEANIC_ATOM2 Oceanic VT4 OCEANIC_ATOM2 Reefnet Sensus REEFNET_SENSUS Reefnet Sensus Pro REEFNET_SENSUSPRO Reefnet Sensus Ultra REEFNET_SENSUSULTRA Seemann XP5 OCEANIC_VEO250 Shearwater Petrel SHEARWATER_PETREL Shearwater Predator SHEARWATER_PREDATOR Sherwood Amphos OCEANIC_ATOM2 Sherwood Insight OCEANIC_VEO250 Sherwood Insight 2 OCEANIC_ATOM2 Sherwood Wisdom OCEANIC_VTPRO Sherwood Wisdom 2 OCEANIC_ATOM2 Sherwood Wisdom 3 OCEANIC_ATOM2 Subgear XP Air UWATEC_SMART Subgear XP-10 UWATEC_SMART Suunto Cobra SUUNTO_VYPER Suunto Cobra 2 SUUNTO_VYPER2 Suunto Cobra 3 SUUNTO_VYPER2 Suunto D3 SUUNTO_VYPER Suunto D4 SUUNTO_D9 Suunto D4i SUUNTO_D9 Suunto D6 SUUNTO_D9 Suunto D6i SUUNTO_D9 Suunto D9 SUUNTO_D9 Suunto D9tx SUUNTO_D9 Suunto DX SUUNTO_D9 Suunto Eon SUUNTO_EON Suunto Gekko SUUNTO_VYPER Suunto HelO2 SUUNTO_VYPER2 Suunto Mosquito SUUNTO_VYPER Suunto Solution SUUNTO_SOLUTION Suunto Solution Alpha SUUNTO_EON Suunto Solution Nitrox SUUNTO_EON Suunto Spyder SUUNTO_VYPER Suunto Stinger SUUNTO_VYPER Suunto Vyper SUUNTO_VYPER Suunto Vyper 2 SUUNTO_VYPER2 Suunto Vyper Air SUUNTO_VYPER2 Suunto Vytec SUUNTO_VYPER Suunto Zoop SUUNTO_VYPER Tusa Element II (IQ-750) OCEANIC_ATOM2 Tusa Zen (IQ-900) OCEANIC_ATOM2 Tusa Zen Air (IQ-950) OCEANIC_ATOM2 Uemis Zürich SUBSURFACE Uwatec Aladin 2G UWATEC_SMART Uwatec Aladin 2G UWATEC_SMART Uwatec Aladin Air Twin UWATEC_ALADIN Uwatec Aladin Air Z UWATEC_ALADIN Uwatec Aladin Air Z Nitrox UWATEC_ALADIN Uwatec Aladin Air Z O2 UWATEC_ALADIN Uwatec Aladin Prime UWATEC_SMART Uwatec Aladin Pro UWATEC_ALADIN Uwatec Aladin Pro Ultra UWATEC_ALADIN Uwatec Aladin Sport Plus UWATEC_ALADIN Uwatec Aladin Tec UWATEC_SMART Uwatec Aladin Tec 2G UWATEC_SMART Uwatec Galileo Luna UWATEC_SMART Uwatec Galileo Sol UWATEC_SMART Uwatec Galileo Terra UWATEC_SMART Uwatec Galileo Trimix UWATEC_SMART Uwatec Memomouse UWATEC_MEMOMOUSE Uwatec Smart Com UWATEC_SMART Uwatec Smart Pro UWATEC_SMART Uwatec Smart Tec UWATEC_SMART Uwatec Smart Z UWATEC_SMART xDeep Black SUBSURFACE Zeagle N2iTiON3 ZEAGLE_N2ITION3 Subsurface-4.0.2/device.c000066400000000000000000000117601226345450700152370ustar00rootroot00000000000000#include #include "dive.h" #include "device.h" /* * Good fake dive profiles are hard. * * "depthtime" is the integral of the dive depth over * time ("area" of the dive profile). We want that * area to match the average depth (avg_d*max_t). * * To do that, we generate a 6-point profile: * * (0, 0) * (t1, max_d) * (t2, max_d) * (t3, d) * (t4, d) * (max_t, 0) * * with the same ascent/descent rates between the * different depths. * * NOTE: avg_d, max_d and max_t are given constants. * The rest we can/should play around with to get a * good-looking profile. * * That six-point profile gives a total area of: * * (max_d*max_t) - (max_d*t1) - (max_d-d)*(t4-t3) * * And the "same ascent/descent rates" requirement * gives us (time per depth must be same): * * t1 / max_d = (t3-t2) / (max_d-d) * t1 / max_d = (max_t-t4) / d * * We also obviously require: * * 0 <= t1 <= t2 <= t3 <= t4 <= max_t * * Let us call 'd_frac = d / max_d', and we get: * * Total area must match average depth-time: * * (max_d*max_t) - (max_d*t1) - (max_d-d)*(t4-t3) = avg_d*max_t * max_d*(max_t-t1-(1-d_frac)*(t4-t3)) = avg_d*max_t * max_t-t1-(1-d_frac)*(t4-t3) = avg_d*max_t/max_d * t1+(1-d_frac)*(t4-t3) = max_t*(1-avg_d/max_d) * * and descent slope must match ascent slopes: * * t1 / max_d = (t3-t2) / (max_d*(1-d_frac)) * t1 = (t3-t2)/(1-d_frac) * * and * * t1 / max_d = (max_t-t4) / (max_d*d_frac) * t1 = (max_t-t4)/d_frac * * In general, we have more free variables than we have constraints, * but we can aim for certain basics, like a good ascent slope. */ static int fill_samples(struct sample *s, int max_d, int avg_d, int max_t, double slope, double d_frac) { double t_frac = max_t*(1-avg_d/(double)max_d); int t1 = max_d / slope; int t4 = max_t - t1*d_frac; int t3 = t4-(t_frac-t1)/(1-d_frac); int t2 = t3-t1*(1-d_frac); if (t1 < 0 || t1 > t2 || t2 > t3 || t3 > t4 || t4 > max_t) return 0; s[1].time.seconds = t1; s[1].depth.mm = max_d; s[2].time.seconds = t2; s[2].depth.mm = max_d; s[3].time.seconds = t3; s[3].depth.mm = max_d * d_frac; s[4].time.seconds = t4; s[4].depth.mm = max_d * d_frac; return 1; } /* we have no average depth; instead of making up a random average depth * we should assume either a PADI recrangular profile (for short and/or * shallow dives) or more reasonably a six point profile with a 3 minute * safety stop at 5m */ static void fill_samples_no_avg(struct sample *s, int max_d, int max_t, double slope) { // shallow or short dives are just trapecoids based on the given slope if (max_d < 10000 || max_t < 600) { s[1].time.seconds = max_d / slope; s[1].depth.mm = max_d; s[2].time.seconds = max_t - max_d / slope; s[2].depth.mm = max_d; } else { s[1].time.seconds = max_d / slope; s[1].depth.mm = max_d; s[2].time.seconds = max_t - max_d / slope - 180; s[2].depth.mm = max_d; s[3].time.seconds = max_t - 5000 / slope - 180; s[3].depth.mm = 5000; s[4].time.seconds = max_t - 5000 / slope; s[4].depth.mm = 5000; } } struct divecomputer* fake_dc(struct divecomputer* dc) { static struct sample fake[6]; static struct divecomputer fakedc; fakedc = (*dc); fakedc.sample = fake; fakedc.samples = 6; /* The dive has no samples, so create a few fake ones */ int max_t = dc->duration.seconds; int max_d = dc->maxdepth.mm; int avg_d = dc->meandepth.mm; memset(fake, 0, sizeof(fake)); fake[5].time.seconds = max_t; if (!max_t || !max_d) return &fakedc; /* * We want to fake the profile so that the average * depth ends up correct. However, in the absense of * a reasonable average, let's just make something * up. Note that 'avg_d == max_d' is _not_ a reasonable * average. * We explicitly treat avg_d == 0 differently */ if (avg_d == 0) { /* we try for a sane slope, but bow to the insanity of * the user supplied data */ fill_samples_no_avg(fake, max_d, max_t, MAX(2.0 * max_d / max_t, 5000.0 / 60)); if(fake[3].time.seconds == 0) { // just a 4 point profile fakedc.samples = 4; fake[3].time.seconds = max_t; } return &fakedc; } if (avg_d < max_d / 10 || avg_d >= max_d) { avg_d = (max_d+10000)/3; if (avg_d > max_d) avg_d = max_d * 2 / 3; } if (!avg_d) avg_d = 1; /* * Ok, first we try a basic profile with a specific ascent * rate (5 meters per minute) and d_frac (1/3). */ if (fill_samples(fake, max_d, avg_d, max_t, 5000.0 / 60, 0.33)) return &fakedc; /* * Ok, assume that didn't work because we cannot make the * average come out right because it was a quick deep dive * followed by a much shallower region */ if (fill_samples(fake, max_d, avg_d, max_t, 10000.0 / 60, 0.10)) return &fakedc; /* * Uhhuh. That didn't work. We'd need to find a good combination that * satisfies our constraints. Currently, we don't, we just give insane * slopes. */ if (fill_samples(fake, max_d, avg_d, max_t, 10000.0, 0.01)) return &fakedc; /* Even that didn't work? Give up, there's something wrong */ return &fakedc; } Subsurface-4.0.2/device.h000066400000000000000000000007401226345450700152400ustar00rootroot00000000000000#ifndef DEVICE_INFO_H #define DEVICE_INFO_H #ifdef __cplusplus #include "dive.h" extern "C" { #endif extern struct divecomputer *fake_dc(struct divecomputer* dc); extern void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname); extern void call_for_each_dc(FILE *f, void (*callback)(FILE *, const char *, uint32_t, const char *, const char *, const char *)); #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/display.h000066400000000000000000000031411226345450700154440ustar00rootroot00000000000000#ifndef DISPLAY_H #define DISPLAY_H #ifdef __cplusplus extern "C" { #endif #define SCALE_SCREEN 1.0 #define SCALE_PRINT (1.0 / get_screen_dpi()) extern double get_screen_dpi(void); /* Plot info with smoothing, velocity indication * and one-, two- and three-minute minimums and maximums */ struct plot_info { int nr; int maxtime; int meandepth, maxdepth; int minpressure, maxpressure; int mintemp, maxtemp; double endtempcoord; double maxpp; bool has_ndl; struct plot_data *entry; }; /* * handy datastructure to keep all of our scaling data in one place */ struct graphics_context { int printer; double maxx, maxy; double leftx, rightx; double topy, bottomy; unsigned int maxtime; struct plot_info pi; }; typedef enum { SC_SCREEN, SC_PRINT } scale_mode_t; extern struct divecomputer *select_dc(struct divecomputer *main); extern void get_plot_details(struct graphics_context *gc, int time, char *buf, int bufsize); struct options { enum { PRETTY, TABLE, TWOPERPAGE } type; int print_selected; int color_selected; bool notes_up; int profile_height, notes_height, tanks_height; }; extern char zoomed_plot, dc_number; extern unsigned int amount_selected; extern int is_default_dive_computer_device(const char *); extern int is_default_dive_computer(const char *, const char *); typedef void (*device_callback_t) (const char *name, void *userdata); int enumerate_devices (device_callback_t callback, void *userdata); extern const char *default_dive_computer_vendor; extern const char *default_dive_computer_product; extern const char *default_dive_computer_device; #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/dive.c000066400000000000000000001454161226345450700147350ustar00rootroot00000000000000/* dive.c */ /* maintains the internal dive list structure */ #include #include #include #include "gettext.h" #include "dive.h" #include "planner.h" struct tag_entry *g_tag_list = NULL; static const char* default_tags[] = { QT_TRANSLATE_NOOP("gettextFromC", "boat"), QT_TRANSLATE_NOOP("gettextFromC", "shore"), QT_TRANSLATE_NOOP("gettextFromC", "drift"), QT_TRANSLATE_NOOP("gettextFromC", "deep"), QT_TRANSLATE_NOOP("gettextFromC", "cavern") , QT_TRANSLATE_NOOP("gettextFromC", "ice"), QT_TRANSLATE_NOOP("gettextFromC", "wreck"), QT_TRANSLATE_NOOP("gettextFromC", "cave"), QT_TRANSLATE_NOOP("gettextFromC", "altitude"), QT_TRANSLATE_NOOP("gettextFromC", "pool"), QT_TRANSLATE_NOOP("gettextFromC", "lake"), QT_TRANSLATE_NOOP("gettextFromC", "river"), QT_TRANSLATE_NOOP("gettextFromC", "night"), QT_TRANSLATE_NOOP("gettextFromC", "fresh"), QT_TRANSLATE_NOOP("gettextFromC", "student"), QT_TRANSLATE_NOOP("gettextFromC", "instructor"), QT_TRANSLATE_NOOP("gettextFromC", "photo"), QT_TRANSLATE_NOOP("gettextFromC", "video"), QT_TRANSLATE_NOOP("gettextFromC", "deco") }; void add_event(struct divecomputer *dc, int time, int type, int flags, int value, const char *name) { struct event *ev, **p; unsigned int size, len = strlen(name); size = sizeof(*ev) + len + 1; ev = malloc(size); if (!ev) return; memset(ev, 0, size); memcpy(ev->name, name, len); ev->time.seconds = time; ev->type = type; ev->flags = flags; ev->value = value; p = &dc->events; /* insert in the sorted list of events */ while (*p && (*p)->time.seconds <= time) p = &(*p)->next; ev->next = *p; *p = ev; remember_event(name); } int get_pressure_units(unsigned int mb, const char **units) { int pressure; const char* unit; struct units *units_p = get_units(); switch (units_p->pressure) { case PASCAL: pressure = mb * 100; unit = translate("gettextFromC","pascal"); break; case BAR: default: pressure = (mb + 500) / 1000; unit = translate("gettextFromC","bar"); break; case PSI: pressure = mbar_to_PSI(mb); unit = translate("gettextFromC","psi"); break; } if (units) *units = unit; return pressure; } double get_temp_units(unsigned int mk, const char **units) { double deg; const char *unit; struct units *units_p = get_units(); if (units_p->temperature == FAHRENHEIT) { deg = mkelvin_to_F(mk); unit = UTF8_DEGREE "F"; } else { deg = mkelvin_to_C(mk); unit = UTF8_DEGREE "C"; } if (units) *units = unit; return deg; } double get_volume_units(unsigned int ml, int *frac, const char **units) { int decimals; double vol; const char *unit; struct units *units_p = get_units(); switch (units_p->volume) { case LITER: default: vol = ml / 1000.0; unit = translate("gettextFromC","l"); decimals = 1; break; case CUFT: vol = ml_to_cuft(ml); unit = translate("gettextFromC","cuft"); decimals = 2; break; } if (frac) *frac = decimals; if (units) *units = unit; return vol; } unsigned int units_to_depth(double depth) { if (get_units()->length == METERS) return rint(depth * 1000); return feet_to_mm(depth); } double get_depth_units(unsigned int mm, int *frac, const char **units) { int decimals; double d; const char *unit; struct units *units_p = get_units(); switch (units_p->length) { case METERS: default: d = mm / 1000.0; unit = translate("gettextFromC","m"); decimals = d < 20; break; case FEET: d = mm_to_feet(mm); unit = translate("gettextFromC","ft"); decimals = 0; break; } if (frac) *frac = decimals; if (units) *units = unit; return d; } double get_vertical_speed_units(unsigned int mms, int *frac, const char **units) { double d; const char *unit; const struct units *units_p = get_units(); const double time_factor = units_p->vertical_speed_time == MINUTES ? 60.0 : 1.0; switch (units_p->length) { case METERS: default: d = mms / 1000.0 * time_factor; unit = translate("gettextFromC",(units_p->vertical_speed_time == MINUTES) ? "m/min" : "m/s"); break; case FEET: d = mm_to_feet(mms) * time_factor; unit = translate("gettextFromC",(units_p->vertical_speed_time == MINUTES) ? "ft/min" : "ft/s"); break; } if (frac) *frac = d < 10; if (units) *units = unit; return d; } double get_weight_units(unsigned int grams, int *frac, const char **units) { int decimals; double value; const char* unit; struct units *units_p = get_units(); if (units_p->weight == LBS) { value = grams_to_lbs(grams); unit = translate("gettextFromC","lbs"); decimals = 0; } else { value = grams / 1000.0; unit = translate("gettextFromC","kg"); decimals = 1; } if (frac) *frac = decimals; if (units) *units = unit; return value; } struct dive *alloc_dive(void) { struct dive *dive; dive = malloc(sizeof(*dive)); if (!dive) exit(1); memset(dive, 0, sizeof(*dive)); taglist_init(&(dive->tag_list)); return dive; } /* only copies events from the first dive computer */ void copy_events(struct dive *s, struct dive *d) { struct event *ev; if (!s || !d) return; ev = s->dc.events; d->dc.events = NULL; while (ev != NULL) { add_event(&d->dc, ev->time.seconds, ev->type, ev->flags, ev->value, ev->name); ev = ev->next; } } void copy_cylinders(struct dive *s, struct dive *d) { int i; if (!s || !d) return; for (i = 0; i < MAX_CYLINDERS; i++) d->cylinder[i] = s->cylinder[i]; } void copy_samples(struct dive *s, struct dive *d) { /* instead of carefully copying them one by one and calling add_sample * over and over again, let's just copy the whole blob */ if (!s || !d) return; int nr = s->dc.samples; d->dc.samples = nr; d->dc.sample = malloc(nr * sizeof(struct sample)); if (d->dc.sample) memcpy(d->dc.sample, s->dc.sample, nr * sizeof(struct sample)); } struct sample *prepare_sample(struct divecomputer *dc) { if (dc) { int nr = dc->samples; int alloc_samples = dc->alloc_samples; struct sample *sample; if (nr >= alloc_samples) { struct sample *newsamples; alloc_samples = (alloc_samples * 3)/2 + 10; newsamples = realloc(dc->sample, alloc_samples * sizeof(struct sample)); if (!newsamples) return NULL; dc->alloc_samples = alloc_samples; dc->sample = newsamples; } sample = dc->sample + nr; memset(sample, 0, sizeof(*sample)); return sample; } return NULL; } void finish_sample(struct divecomputer *dc) { dc->samples++; } /* * So when we re-calculate maxdepth and meandepth, we will * not override the old numbers if they are close to the * new ones. * * Why? Because a dive computer may well actually track the * max depth and mean depth at finer granularity than the * samples it stores. So it's possible that the max and mean * have been reported more correctly originally. * * Only if the values calculated from the samples are clearly * different do we override the normal depth values. * * This considers 1m to be "clearly different". That's * a totally random number. */ static void update_depth(depth_t *depth, int new) { if (new) { int old = depth->mm; if (abs(old - new) > 1000) depth->mm = new; } } static void update_temperature(temperature_t *temperature, int new) { if (new) { int old = temperature->mkelvin; if (abs(old - new) > 1000) temperature->mkelvin = new; } } /* * Calculate how long we were actually under water, and the average * depth while under water. * * This ignores any surface time in the middle of the dive. */ static void fixup_dc_duration(struct divecomputer *dc) { int duration, i; int lasttime, lastdepth, depthtime; duration = 0; lasttime = 0; lastdepth = 0; depthtime = 0; for (i = 0; i < dc->samples; i++) { struct sample *sample = dc->sample + i; int time = sample->time.seconds; int depth = sample->depth.mm; /* We ignore segments at the surface */ if (depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) { duration += time - lasttime; depthtime += (time - lasttime)*(depth+lastdepth)/2; } lastdepth = depth; lasttime = time; } if (duration) { dc->duration.seconds = duration; dc->meandepth.mm = (depthtime + duration/2) / duration; } } void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc, int *mean, int *duration) { int i; int depthtime[MAX_CYLINDERS] = {0,}; int lasttime = 0, lastdepth = 0; int idx = 0; for (i = 0; i < MAX_CYLINDERS; i++) mean[i] = duration[i] = 0; struct event *ev = get_next_event(dc->events, "gaschange"); if (!ev) { // special case - no gas changes mean[0] = dc->meandepth.mm; duration[0] = dc->duration.seconds; return; } for (i = 0; i < dc->samples; i++) { struct sample *sample = dc->sample + i; int time = sample->time.seconds; int depth = sample->depth.mm; if (ev && time >= ev->time.seconds) { idx = get_cylinder_index(dive, ev); ev = get_next_event(ev->next, "gaschange"); } /* We ignore segments at the surface */ if (depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) { duration[idx] += time - lasttime; depthtime[idx] += (time - lasttime) * (depth + lastdepth) / 2; } lastdepth = depth; lasttime = time; } for (i = 0; i < MAX_CYLINDERS; i++) { if (duration[i]) mean[i] = (depthtime[i] + duration[i] / 2) / duration[i]; } } static void fixup_pressure(struct dive *dive, struct sample *sample) { unsigned int pressure, index; cylinder_t *cyl; pressure = sample->cylinderpressure.mbar; if (!pressure) return; index = sample->sensor; /* FIXME! sensor -> cylinder mapping? */ if (index >= MAX_CYLINDERS) return; cyl = dive->cylinder + index; if (!cyl->sample_start.mbar) cyl->sample_start.mbar = pressure; cyl->sample_end.mbar = pressure; } static void update_min_max_temperatures(struct dive *dive, temperature_t temperature) { if (temperature.mkelvin) { if (!dive->maxtemp.mkelvin || temperature.mkelvin > dive->maxtemp.mkelvin) dive->maxtemp = temperature; if (!dive->mintemp.mkelvin || temperature.mkelvin < dive->mintemp.mkelvin) dive->mintemp = temperature; } } /* * At high pressures air becomes less compressible, and * does not follow the ideal gas law any more. * * This tries to correct for that, becoming the same * as to_ATM() at lower pressures. * * THIS IS A ROUGH APPROXIMATION! The real numbers will * depend on the exact gas mix and temperature. */ double surface_volume_multiplier(pressure_t pressure) { double bar = pressure.mbar / 1000.0; if (bar > 200) bar = 0.00038*bar*bar + 0.51629*bar + 81.542; return bar_to_atm(bar); } int gas_volume(cylinder_t *cyl, pressure_t p) { return cyl->type.size.mliter * surface_volume_multiplier(p); } int wet_volume(double cuft, pressure_t p) { return cuft_to_l(cuft) * 1000 / surface_volume_multiplier(p); } /* * If the cylinder tank pressures are within half a bar * (about 8 PSI) of the sample pressures, we consider it * to be a rounding error, and throw them away as redundant. */ static int same_rounded_pressure(pressure_t a, pressure_t b) { return abs(a.mbar - b.mbar) <= 500; } static void sanitize_gasmix(struct gasmix *mix) { unsigned int o2, he; o2 = mix->o2.permille; he = mix->he.permille; /* Regular air: leave empty */ if (!he) { if (!o2) return; /* 20.8% to 21% O2 is just air */ if (is_air(o2, he)) { mix->o2.permille = 0; return; } } /* Sane mix? */ if (o2 <= 1000 && he <= 1000 && o2+he <= 1000) return; fprintf(stderr, "Odd gasmix: %u O2 %u He\n", o2, he); memset(mix, 0, sizeof(*mix)); } /* * See if the size/workingpressure looks like some standard cylinder * size, eg "AL80". */ static void match_standard_cylinder(cylinder_type_t *type) { double cuft; int psi, len; const char *fmt; char buffer[40], *p; /* Do we already have a cylinder description? */ if (type->description) return; cuft = ml_to_cuft(type->size.mliter); cuft *= surface_volume_multiplier(type->workingpressure); psi = to_PSI(type->workingpressure); switch (psi) { case 2300 ... 2500: /* 2400 psi: LP tank */ fmt = "LP%d"; break; case 2600 ... 2700: /* 2640 psi: LP+10% */ fmt = "LP%d"; break; case 2900 ... 3100: /* 3000 psi: ALx tank */ fmt = "AL%d"; break; case 3400 ... 3500: /* 3442 psi: HP tank */ fmt = "HP%d"; break; case 3700 ... 3850: /* HP+10% */ fmt = "HP%d+"; break; default: return; } len = snprintf(buffer, sizeof(buffer), fmt, (int) (cuft+0.5)); p = malloc(len+1); if (!p) return; memcpy(p, buffer, len+1); type->description = p; } /* * There are two ways to give cylinder size information: * - total amount of gas in cuft (depends on working pressure and physical size) * - physical size * * where "physical size" is the one that actually matters and is sane. * * We internally use physical size only. But we save the workingpressure * so that we can do the conversion if required. */ static void sanitize_cylinder_type(cylinder_type_t *type) { double volume_of_air, volume; /* If we have no working pressure, it had *better* be just a physical size! */ if (!type->workingpressure.mbar) return; /* No size either? Nothing to go on */ if (!type->size.mliter) return; if (xml_parsing_units.volume == CUFT) { /* confusing - we don't really start from ml but millicuft !*/ volume_of_air = cuft_to_l(type->size.mliter); /* milliliters at 1 atm: "true size" */ volume = volume_of_air / surface_volume_multiplier(type->workingpressure); type->size.mliter = volume + 0.5; } /* Ok, we have both size and pressure: try to match a description */ match_standard_cylinder(type); } static void sanitize_cylinder_info(struct dive *dive) { int i; for (i = 0; i < MAX_CYLINDERS; i++) { sanitize_gasmix(&dive->cylinder[i].gasmix); sanitize_cylinder_type(&dive->cylinder[i].type); } } /* some events should never be thrown away */ static bool is_potentially_redundant(struct event *event) { if (!strcmp(event->name, "gaschange")) return FALSE; if (!strcmp(event->name, "bookmark")) return FALSE; if (!strcmp(event->name, "heading")) return FALSE; return TRUE; } /* match just by name - we compare the details in the code that uses this helper */ static struct event *find_previous_event(struct divecomputer *dc, struct event *event) { struct event *ev = dc->events; struct event *previous = NULL; if (!event->name) return NULL; while (ev && ev != event) { if (ev->name && !strcmp(ev->name, event->name)) previous = ev; ev = ev->next; } return previous; } static void fixup_surface_pressure(struct dive *dive) { struct divecomputer *dc; int sum = 0, nr = 0; for_each_dc(dive, dc) { if (dc->surface_pressure.mbar) { sum += dc->surface_pressure.mbar; nr++; } } if (nr) dive->surface_pressure.mbar = (sum + nr/2)/nr; } static void fixup_water_salinity(struct dive *dive) { struct divecomputer *dc; int sum = 0, nr = 0; for_each_dc(dive, dc) { if (dc->salinity) { sum += dc->salinity; nr++; } } if (nr) dive->salinity = (sum + nr/2)/nr; } static void fixup_meandepth(struct dive *dive) { struct divecomputer *dc; int sum = 0, nr = 0; for_each_dc(dive, dc) { if (dc->meandepth.mm) { sum += dc->meandepth.mm; nr++; } } if (nr) dive->meandepth.mm = (sum + nr / 2) / nr; } static void fixup_duration(struct dive *dive) { struct divecomputer *dc; int duration = 0; for_each_dc(dive, dc) duration = MAX(duration, dc->duration.seconds); dive->duration.seconds = duration; } /* * What do the dive computers say the water temperature is? * (not in the samples, but as dc property for dcs that support that) */ unsigned int dc_watertemp(struct divecomputer *dc) { int sum = 0, nr = 0; do { if (dc->watertemp.mkelvin) { sum += dc->watertemp.mkelvin; nr++; } } while ((dc = dc->next) != NULL); if (!nr) return 0; return (sum + nr / 2) / nr; } static void fixup_watertemp(struct dive *dive) { if (!dive->watertemp.mkelvin) dive->watertemp.mkelvin = dc_watertemp(&dive->dc); } /* * What do the dive computers say the air temperature is? */ unsigned int dc_airtemp(struct divecomputer *dc) { int sum = 0, nr = 0; do { if (dc->airtemp.mkelvin) { sum += dc->airtemp.mkelvin; nr++; } } while ((dc = dc->next) != NULL); if (!nr) return 0; return (sum + nr / 2) / nr; } static void fixup_airtemp(struct dive *dive) { if (!dive->airtemp.mkelvin) dive->airtemp.mkelvin = dc_airtemp(&dive->dc); } /* zero out the airtemp in the dive structure if it was just created by * running fixup on the dive. keep it if it had been edited by hand */ static void un_fixup_airtemp(struct dive *a) { if (a->airtemp.mkelvin && a->airtemp.mkelvin == dc_airtemp(&a->dc)) a->airtemp.mkelvin = 0; } /* * events are stored as a linked list, so the concept of * "consecutive, identical events" is somewhat hard to * implement correctly (especially given that on some dive * computers events are asynchronous, so they can come in * between what would be the non-constant sample rate). * * So what we do is that we throw away clearly redundant * events that are fewer than 61 seconds apart (assuming there * is no dive computer with a sample rate of more than 60 * seconds... that would be pretty pointless to plot the * profile with) * * We first only mark the events for deletion so that we * still know when the previous event happened. */ static void fixup_dc_events(struct divecomputer *dc) { struct event *event; event = dc->events; while (event) { struct event *prev; if (is_potentially_redundant(event)) { prev = find_previous_event(dc, event); if (prev && prev->value == event->value && prev->flags == event->flags && event->time.seconds - prev->time.seconds < 61) event->deleted = TRUE; } event = event->next; } event = dc->events; while (event) { if (event->next && event->next->deleted) { struct event *nextnext = event->next->next; free(event->next); event->next = nextnext; } else { event = event->next; } } } static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc) { int i, j; double depthtime = 0; int lasttime = 0; int lastindex = -1; int maxdepth = dc->maxdepth.mm; int mintemp = 0; int lastdepth = 0; int lasttemp = 0, lastpressure = 0; int pressure_delta[MAX_CYLINDERS] = {INT_MAX, }; /* Fixup duration and mean depth */ fixup_dc_duration(dc); update_min_max_temperatures(dive, dc->watertemp); for (i = 0; i < dc->samples; i++) { struct sample *sample = dc->sample + i; int time = sample->time.seconds; int depth = sample->depth.mm; int temp = sample->temperature.mkelvin; int pressure = sample->cylinderpressure.mbar; int index = sample->sensor; if (index == lastindex) { /* Remove duplicate redundant pressure information */ if (pressure == lastpressure) sample->cylinderpressure.mbar = 0; /* check for simply linear data in the samples +INT_MAX means uninitialized, -INT_MAX means not linear */ if (pressure_delta[index] != -INT_MAX && lastpressure) { if (pressure_delta[index] == INT_MAX) { pressure_delta[index] = abs(pressure - lastpressure); } else { int cur_delta = abs(pressure - lastpressure); if (cur_delta && abs(cur_delta - pressure_delta[index]) > 150) { /* ok the samples aren't just a linearisation * between start and end */ pressure_delta[index] = -INT_MAX; } } } } lastindex = index; lastpressure = pressure; if (depth > SURFACE_THRESHOLD) { if (depth > maxdepth) maxdepth = depth; } fixup_pressure(dive, sample); if (temp) { /* * If we have consecutive identical * temperature readings, throw away * the redundant ones. */ if (lasttemp == temp) sample->temperature.mkelvin = 0; else lasttemp = temp; if (!mintemp || temp < mintemp) mintemp = temp; } update_min_max_temperatures(dive, sample->temperature); depthtime += (time - lasttime) * (lastdepth + depth) / 2; lastdepth = depth; lasttime = time; if (sample->cns > dive->maxcns) dive->maxcns = sample->cns; } /* if all the samples for a cylinder have pressure data that * is basically equidistant throw out the sample cylinder pressure * information but make sure we still have a valid start and end * pressure * this happens when DivingLog decides to linearalize the * pressure between beginning and end and for strange reasons * decides to put that in the sample data as if it came from * the dive computer; we don't want that (we'll visualize with * constant SAC rate instead) * WARNING WARNING - I have only seen this in single tank dives * --- maybe I should try to create a multi tank dive and see what * --- divinglog does there - but the code right now is only tested * --- for the single tank case */ for (j = 0; j < MAX_CYLINDERS; j++) { if (abs(pressure_delta[j]) != INT_MAX) { cylinder_t *cyl = dive->cylinder + j; for (i = 0; i < dc->samples; i++) if (dc->sample[i].sensor == j) dc->sample[i].cylinderpressure.mbar = 0; if (! cyl->start.mbar) cyl->start.mbar = cyl->sample_start.mbar; if (! cyl->end.mbar) cyl->end.mbar = cyl->sample_end.mbar; cyl->sample_start.mbar = 0; cyl->sample_end.mbar = 0; } } update_temperature(&dc->watertemp, mintemp); update_depth(&dc->maxdepth, maxdepth); if (maxdepth > dive->maxdepth.mm) dive->maxdepth.mm = maxdepth; fixup_dc_events(dc); } struct dive *fixup_dive(struct dive *dive) { int i; struct divecomputer *dc; sanitize_cylinder_info(dive); dive->maxcns = dive->cns; for_each_dc(dive, dc) fixup_dive_dc(dive, dc); fixup_water_salinity(dive); fixup_surface_pressure(dive); fixup_meandepth(dive); fixup_duration(dive); fixup_watertemp(dive); fixup_airtemp(dive); for (i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = dive->cylinder + i; add_cylinder_description(&cyl->type); if (same_rounded_pressure(cyl->sample_start, cyl->start)) cyl->start.mbar = 0; if (same_rounded_pressure(cyl->sample_end, cyl->end)) cyl->end.mbar = 0; } for (i = 0; i < MAX_WEIGHTSYSTEMS; i++) { weightsystem_t *ws = dive->weightsystem + i; add_weightsystem_description(ws); } return dive; } /* Don't pick a zero for MERGE_MIN() */ #define MERGE_MAX(res, a, b, n) res->n = MAX(a->n, b->n) #define MERGE_MIN(res, a, b, n) res->n = (a->n)?(b->n)?MIN(a->n, b->n):(a->n):(b->n) #define MERGE_TXT(res, a, b, n) res->n = merge_text(a->n, b->n) #define MERGE_NONZERO(res, a, b, n) res->n = a->n ? a->n : b->n static struct sample *add_sample(struct sample *sample, int time, struct divecomputer *dc) { struct sample *p = prepare_sample(dc); if (p) { *p = *sample; p->time.seconds = time; finish_sample(dc); } return p; } /* * This is like add_sample(), but if the distance from the last sample * is excessive, we add two surface samples in between. * * This is so that if you merge two non-overlapping dives, we make sure * that the time in between the dives is at the surface, not some "last * sample that happened to be at a depth of 1.2m". */ static void merge_one_sample(struct sample *sample, int time, struct divecomputer *dc) { int last = dc->samples-1; if (last >= 0) { static struct sample surface; struct sample *prev = dc->sample + last; int last_time = prev->time.seconds; int last_depth = prev->depth.mm; /* * Only do surface events if the samples are more than * a minute apart, and shallower than 5m */ if (time > last_time + 60 && last_depth < 5000) { add_sample(&surface, last_time+20, dc); add_sample(&surface, time - 20, dc); } } add_sample(sample, time, dc); } /* * Merge samples. Dive 'a' is "offset" seconds before Dive 'b' */ static void merge_samples(struct divecomputer *res, struct divecomputer *a, struct divecomputer *b, int offset) { int asamples = a->samples; int bsamples = b->samples; struct sample *as = a->sample; struct sample *bs = b->sample; /* * We want a positive sample offset, so that sample * times are always positive. So if the samples for * 'b' are before the samples for 'a' (so the offset * is negative), we switch a and b around, and use * the reverse offset. */ if (offset < 0) { offset = -offset; asamples = bsamples; bsamples = a->samples; as = bs; bs = a->sample; } for (;;) { int at, bt; struct sample sample; if (!res) return; at = asamples ? as->time.seconds : -1; bt = bsamples ? bs->time.seconds + offset : -1; /* No samples? All done! */ if (at < 0 && bt < 0) return; /* Only samples from a? */ if (bt < 0) { add_sample_a: merge_one_sample(as, at, res); as++; asamples--; continue; } /* Only samples from b? */ if (at < 0) { add_sample_b: merge_one_sample(bs, bt, res); bs++; bsamples--; continue; } if (at < bt) goto add_sample_a; if (at > bt) goto add_sample_b; /* same-time sample: add a merged sample. Take the non-zero ones */ sample = *bs; if (as->depth.mm) sample.depth = as->depth; if (as->temperature.mkelvin) sample.temperature = as->temperature; if (as->cylinderpressure.mbar) sample.cylinderpressure = as->cylinderpressure; if (as->sensor) sample.sensor = as->sensor; if (as->cns) sample.cns = as->cns; if (as->po2) sample.po2 = as->po2; if (as->ndl.seconds) sample.ndl = as->ndl; if (as->stoptime.seconds) sample.stoptime = as->stoptime; if (as->stopdepth.mm) sample.stopdepth = as->stopdepth; if (as->in_deco) sample.in_deco = TRUE; merge_one_sample(&sample, at, res); as++; bs++; asamples--; bsamples--; } } static char *merge_text(const char *a, const char *b) { char *res; if (!a && !b) return NULL; if (!a || !*a) return b ? strdup(b) : NULL; if (!b || !*b) return strdup(a); if (!strcmp(a,b)) return a ? strdup(a) : NULL; res = malloc(strlen(a) + strlen(b) + 32); if (!res) return (char *)a; sprintf(res, translate("gettextFromC","(%s) or (%s)"), a, b); return res; } #define SORT(a,b,field) \ if (a->field != b->field) return a->field < b->field ? -1 : 1 static int sort_event(struct event *a, struct event *b) { SORT(a,b,time.seconds); SORT(a,b,type); SORT(a,b,flags); SORT(a,b,value); return strcmp(a->name, b->name); } static void merge_events(struct divecomputer *res, struct divecomputer *src1, struct divecomputer *src2, int offset) { struct event *a, *b; struct event **p = &res->events; /* Always use positive offsets */ if (offset < 0) { struct divecomputer *tmp; offset = -offset; tmp = src1; src1 = src2; src2 = tmp; } a = src1->events; b = src2->events; while (b) { b->time.seconds += offset; b = b->next; } b = src2->events; while (a || b) { int s; if (!b) { *p = a; break; } if (!a) { *p = b; break; } s = sort_event(a, b); /* Pick b */ if (s > 0) { *p = b; p = &b->next; b = b->next; continue; } /* Pick 'a' or neither */ if (s < 0) { *p = a; p = &a->next; } a = a->next; continue; } } /* Pick whichever has any info (if either). Prefer 'a' */ static void merge_cylinder_type(cylinder_type_t *src, cylinder_type_t *dst) { if (!dst->size.mliter) dst->size.mliter = src->size.mliter; if (!dst->workingpressure.mbar) dst->workingpressure.mbar = src->workingpressure.mbar; if (!dst->description) { dst->description = src->description; src->description = NULL; } } static void merge_cylinder_mix(struct gasmix *src, struct gasmix *dst) { if (!dst->o2.permille) *dst = *src; } static void merge_cylinder_info(cylinder_t *src, cylinder_t *dst) { merge_cylinder_type(&src->type, &dst->type); merge_cylinder_mix(&src->gasmix, &dst->gasmix); MERGE_MAX(dst, dst, src, start.mbar); MERGE_MIN(dst, dst, src, end.mbar); } static void merge_weightsystem_info(weightsystem_t *res, weightsystem_t *a, weightsystem_t *b) { if (!a->weight.grams) a = b; *res = *a; } static int gasmix_distance(const struct gasmix *a, const struct gasmix *b) { int a_o2 = get_o2(a), b_o2 = get_o2(b); int a_he = get_he(a), b_he = get_he(b); int delta_o2 = a_o2 - b_o2, delta_he = a_he - b_he; delta_he = delta_he*delta_he; delta_o2 = delta_o2*delta_o2; return delta_he + delta_o2; } static int find_cylinder_match(cylinder_t *cyl, cylinder_t array[], unsigned int used) { int i; int best = -1, score = INT_MAX; if (cylinder_nodata(cyl)) return -1; for (i = 0; i < MAX_CYLINDERS; i++) { const cylinder_t *match; int distance; if (used & (1<gasmix, &match->gasmix); if (distance >= score) continue; best = i; score = distance; } return best; } /* Force an initial gaschange event to the (old) gas #0 */ static void add_initial_gaschange(struct dive *dive, struct divecomputer *dc) { struct event *ev = get_next_event(dc->events, "gaschange"); if (ev && ev->time.seconds < 30) return; /* Old starting gas mix */ add_gas_switch_event(dive, dc, 0, 0); } static void dc_cylinder_renumber(struct dive *dive, struct divecomputer *dc, int mapping[]) { int i; /* Did the first gas get remapped? Add gas switch event */ if (mapping[0] > 0) add_initial_gaschange(dive, dc); /* Remap the sensor indexes */ for (i = 0; i < dc->samples; i++) { struct sample *s = dc->sample+i; int sensor; if (!s->cylinderpressure.mbar) continue; sensor = mapping[s->sensor]; if (sensor >= 0) s->sensor = sensor; } } /* * If the cylinder indexes change (due to merging dives or deleting * cylinders in the middle), we need to change the indexes in the * dive computer data for this dive. * * Also note that we assume that the initial cylinder is cylinder 0, * so if that got renamed, we need to create a fake gas change event */ static void cylinder_renumber(struct dive *dive, int mapping[]) { struct divecomputer *dc; dc = &dive->dc; do { dc_cylinder_renumber(dive, dc, mapping); } while ((dc = dc->next) != NULL); } /* * Merging cylinder information is non-trivial, because the two dive computers * may have different ideas of what the different cylinder indexing is. * * Logic: take all the cylinder information from the preferred dive ('a'), and * then try to match each of the cylinders in the other dive by the gasmix that * is the best match and hasn't been used yet. */ static void merge_cylinders(struct dive *res, struct dive *a, struct dive *b) { int i, renumber = 0; int mapping[MAX_CYLINDERS]; unsigned int used = 0; /* Copy the cylinder info raw from 'a' */ memcpy(res->cylinder, a->cylinder, sizeof(res->cylinder)); memset(a->cylinder, 0, sizeof(a->cylinder)); for (i = 0; i < MAX_CYLINDERS; i++) { int j; cylinder_t *cyl = b->cylinder + i; j = find_cylinder_match(cyl, res->cylinder, used); mapping[i] = j; if (j < 0) continue; used |= 1 << j; merge_cylinder_info(cyl, res->cylinder+j); /* If that renumbered the cylinders, fix it up! */ if (i != j) renumber = 1; } if (renumber) cylinder_renumber(b, mapping); } static void merge_equipment(struct dive *res, struct dive *a, struct dive *b) { int i; merge_cylinders(res, a, b); for (i = 0; i < MAX_WEIGHTSYSTEMS; i++) merge_weightsystem_info(res->weightsystem+i, a->weightsystem + i, b->weightsystem + i); } static void merge_airtemps(struct dive *res, struct dive *a, struct dive *b) { un_fixup_airtemp(a); un_fixup_airtemp(b); MERGE_NONZERO(res, a, b, airtemp.mkelvin); } /* * When merging two dives, this picks the trip from one, and removes it * from the other. * * The 'next' dive is not involved in the dive merging, but is the dive * that will be the next dive after the merged dive. */ static void pick_trip(struct dive *res, struct dive *pick) { tripflag_t tripflag = pick->tripflag; dive_trip_t *trip = pick->divetrip; res->tripflag = tripflag; add_dive_to_trip(res, trip); } /* * Pick a trip for a dive */ static void merge_trip(struct dive *res, struct dive *a, struct dive *b) { dive_trip_t *atrip, *btrip; /* * The larger tripflag is more relevant: we prefer * take manually assigned trips over auto-generated * ones. */ if (a->tripflag > b->tripflag) goto pick_a; if (a->tripflag < b->tripflag) goto pick_b; /* Otherwise, look at the trip data and pick the "better" one */ atrip = a->divetrip; btrip = b->divetrip; if (!atrip) goto pick_b; if (!btrip) goto pick_a; if (!atrip->location) goto pick_b; if (!btrip->location) goto pick_a; if (!atrip->notes) goto pick_b; if (!btrip->notes) goto pick_a; /* * Ok, so both have location and notes. * Pick the earlier one. */ if (a->when < b->when) goto pick_a; goto pick_b; pick_a: b = a; pick_b: pick_trip(res, b); } #if CURRENTLY_NOT_USED /* * Sample 's' is between samples 'a' and 'b'. It is 'offset' seconds before 'b'. * * If 's' and 'a' are at the same time, offset is 0, and b is NULL. */ static int compare_sample(struct sample *s, struct sample *a, struct sample *b, int offset) { unsigned int depth = a->depth.mm; int diff; if (offset) { unsigned int interval = b->time.seconds - a->time.seconds; unsigned int depth_a = a->depth.mm; unsigned int depth_b = b->depth.mm; if (offset > interval) return -1; /* pick the average depth, scaled by the offset from 'b' */ depth = (depth_a * offset) + (depth_b * (interval - offset)); depth /= interval; } diff = s->depth.mm - depth; if (diff < 0) diff = -diff; /* cut off at one meter difference */ if (diff > 1000) diff = 1000; return diff*diff; } /* * Calculate a "difference" in samples between the two dives, given * the offset in seconds between them. Use this to find the best * match of samples between two different dive computers. */ static unsigned long sample_difference(struct divecomputer *a, struct divecomputer *b, int offset) { int asamples = a->samples; int bsamples = b->samples; struct sample *as = a->sample; struct sample *bs = b->sample; unsigned long error = 0; int start = -1; if (!asamples || !bsamples) return 0; /* * skip the first sample - this way we know can always look at * as/bs[-1] to look at the samples around it in the loop. */ as++; bs++; asamples--; bsamples--; for (;;) { int at, bt, diff; /* If we run out of samples, punt */ if (!asamples) return INT_MAX; if (!bsamples) return INT_MAX; at = as->time.seconds; bt = bs->time.seconds + offset; /* b hasn't started yet? Ignore it */ if (bt < 0) { bs++; bsamples--; continue; } if (at < bt) { diff = compare_sample(as, bs-1, bs, bt - at); as++; asamples--; } else if (at > bt) { diff = compare_sample(bs, as-1, as, at - bt); bs++; bsamples--; } else { diff = compare_sample(as, bs, NULL, 0); as++; bs++; asamples--; bsamples--; } /* Invalid comparison point? */ if (diff < 0) continue; if (start < 0) start = at; error += diff; if (at - start > 120) break; } return error; } /* * Dive 'a' is 'offset' seconds before dive 'b' * * This is *not* because the dive computers clocks aren't in sync, * it is because the dive computers may "start" the dive at different * points in the dive, so the sample at time X in dive 'a' is the * same as the sample at time X+offset in dive 'b'. * * For example, some dive computers take longer to "wake up" when * they sense that you are under water (ie Uemis Zurich if it was off * when the dive started). And other dive computers have different * depths that they activate at, etc etc. * * If we cannot find a shared offset, don't try to merge. */ static int find_sample_offset(struct divecomputer *a, struct divecomputer *b) { int offset, best; unsigned long max; /* No samples? Merge at any time (0 offset) */ if (!a->samples) return 0; if (!b->samples) return 0; /* * Common special-case: merging a dive that came from * the same dive computer, so the samples are identical. * Check this first, without wasting time trying to find * some minimal offset case. */ best = 0; max = sample_difference(a, b, 0); if (!max) return 0; /* * Otherwise, look if we can find anything better within * a thirty second window.. */ for (offset = -30; offset <= 30; offset++) { unsigned long diff; diff = sample_difference(a, b, offset); if (diff > max) continue; best = offset; max = diff; } return best; } #endif /* * Are a and b "similar" values, when given a reasonable lower end expected * difference? * * So for example, we'd expect different dive computers to give different * max depth readings. You might have them on different arms, and they * have different pressure sensors and possibly different ideas about * water salinity etc. * * So have an expected minimum difference, but also allow a larger relative * error value. */ static int similar(unsigned long a, unsigned long b, unsigned long expected) { if (a && b) { unsigned long min, max, diff; min = a; max = b; if (a > b) { min = b; max = a; } diff = max - min; /* Smaller than expected difference? */ if (diff < expected) return 1; /* Error less than 10% or the maximum */ if (diff*10 < max) return 1; } return 0; } /* * Match two dive computer entries against each other, and * tell if it's the same dive. Return 0 if "don't know", * positive for "same dive" and negative for "definitely * not the same dive" */ int match_one_dc(struct divecomputer *a, struct divecomputer *b) { /* Not same model? Don't know if matching.. */ if (!a->model || !b->model) return 0; if (strcasecmp(a->model, b->model)) return 0; /* Different device ID's? Don't know */ if (a->deviceid != b->deviceid) return 0; /* Do we have dive IDs? */ if (!a->diveid || !b->diveid) return 0; /* * If they have different dive ID's on the same * dive computer, that's a definite "same or not" */ return a->diveid == b->diveid ? 1 : -1; } /* * Match every dive computer against each other to see if * we have a matching dive. * * Return values: * -1 for "is definitely *NOT* the same dive" * 0 for "don't know" * 1 for "is definitely the same dive" */ static int match_dc_dive(struct divecomputer *a, struct divecomputer *b) { do { struct divecomputer *tmp = b; do { int match = match_one_dc(a, tmp); if (match) return match; tmp = tmp->next; } while (tmp); a = a->next; } while (a); return 0; } /* * Do we want to automatically try to merge two dives that * look like they are the same dive? * * This happens quite commonly because you download a dive * that you already had, or perhaps because you maintained * multiple dive logs and want to load them all together * (possibly one of them was imported from another dive log * application entirely). * * NOTE! We mainly look at the dive time, but it can differ * between two dives due to a few issues: * * - rounding the dive date to the nearest minute in other dive * applications * * - dive computers with "relative datestamps" (ie the dive * computer doesn't actually record an absolute date at all, * but instead at download-time syncronizes its internal * time with real-time on the downloading computer) * * - using multiple dive computers with different real time on * the same dive * * We do not merge dives that look radically different, and if * the dates are *too* far off the user will have to join two * dives together manually. But this tries to handle the sane * cases. */ static int likely_same_dive(struct dive *a, struct dive *b) { int match, fuzz = 20 * 60; /* Don't try to merge dives in different trips */ if (a->divetrip && b->divetrip && a->divetrip != b->divetrip) return 0; /* * Do some basic sanity testing of the values we * have filled in during 'fixup_dive()' */ if (!similar(a->maxdepth.mm, b->maxdepth.mm, 1000) || (a->meandepth.mm && b->meandepth.mm && !similar(a->meandepth.mm, b->meandepth.mm, 1000)) || !similar(a->duration.seconds, b->duration.seconds, 5*60)) return 0; /* See if we can get an exact match on the dive computer */ match = match_dc_dive(&a->dc, &b->dc); if (match) return match > 0; /* * Allow a time difference due to dive computer time * setting etc. Check if they overlap. */ fuzz = MAX(a->duration.seconds, b->duration.seconds) / 2; if (fuzz < 60) fuzz = 60; return ((a->when <= b->when + fuzz) && (a->when >= b->when - fuzz)); } /* * This could do a lot more merging. Right now it really only * merges almost exact duplicates - something that happens easily * with overlapping dive downloads. */ struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded) { if (likely_same_dive(a, b)) return merge_dives(a, b, 0, prefer_downloaded); return NULL; } static void free_events(struct event *ev) { while (ev) { struct event *next = ev->next; free(ev); ev = next; } } static void free_dc(struct divecomputer *dc) { free(dc->sample); if (dc->model) free((void *)dc->model); free_events(dc->events); free(dc); } static int same_event(struct event *a, struct event *b) { if (a->time.seconds != b->time.seconds) return 0; if (a->type != b->type) return 0; if (a->flags != b->flags) return 0; if (a->value != b->value) return 0; return !strcmp(a->name, b->name); } static int same_sample(struct sample *a, struct sample *b) { if (a->time.seconds != b->time.seconds) return 0; if (a->depth.mm != b->depth.mm) return 0; if (a->temperature.mkelvin != b->temperature.mkelvin) return 0; if (a->cylinderpressure.mbar != b->cylinderpressure.mbar) return 0; return a->sensor == b->sensor; } static int same_dc(struct divecomputer *a, struct divecomputer *b) { int i; struct event *eva, *evb; i = match_one_dc(a, b); if (i) return i > 0; if (a->when && b->when && a->when != b->when) return 0; if (a->samples != b->samples) return 0; for (i = 0; i < a->samples; i++) if (!same_sample(a->sample+i, b->sample+i)) return 0; eva = a->events; evb = b->events; while (eva && evb) { if (!same_event(eva, evb)) return 0; eva = eva->next; evb = evb->next; } return eva == evb; } static int might_be_same_device(struct divecomputer *a, struct divecomputer *b) { /* No dive computer model? That matches anything */ if (!a->model || !b->model) return 1; /* Otherwise at least the model names have to match */ if (strcasecmp(a->model, b->model)) return 0; /* No device ID? Match */ if (!a->deviceid || !b->deviceid) return 1; return a->deviceid == b->deviceid; } static void remove_redundant_dc(struct divecomputer *dc, int prefer_downloaded) { do { struct divecomputer **p = &dc->next; /* Check this dc against all the following ones.. */ while (*p) { struct divecomputer *check = *p; if (same_dc(dc, check) || (prefer_downloaded && might_be_same_device(dc, check))) { *p = check->next; check->next = NULL; free_dc(check); continue; } p = &check->next; } /* .. and then continue down the chain, but we */ prefer_downloaded = 0; dc = dc->next; } while (dc); } static void clear_dc(struct divecomputer *dc) { memset(dc, 0, sizeof(*dc)); } static struct divecomputer *find_matching_computer(struct divecomputer *match, struct divecomputer *list) { struct divecomputer *p; while ((p = list) != NULL) { list = list->next; if (might_be_same_device(match, p)) break; } return p; } static void copy_dive_computer(struct divecomputer *res, struct divecomputer *a) { *res = *a; res->model = a->model ? strdup(a->model) : NULL; res->samples = res->alloc_samples = 0; res->sample = NULL; res->events = NULL; res->next = NULL; } /* * Join dive computers with a specific time offset between * them. * * Use the dive computer ID's (or names, if ID's are missing) * to match them up. If we find a matching dive computer, we * merge them. If not, we just take the data from 'a'. */ static void interleave_dive_computers(struct divecomputer *res, struct divecomputer *a, struct divecomputer *b, int offset) { do { struct divecomputer *match; copy_dive_computer(res, a); match = find_matching_computer(a, b); if (match) { merge_events(res, a, match, offset); merge_samples(res, a, match, offset); } else { res->sample = a->sample; res->samples = a->samples; res->events = a->events; a->sample = NULL; a->samples = 0; a->events = NULL; } a = a->next; if (!a) break; res->next = calloc(1, sizeof(struct divecomputer)); res = res->next; } while (res); } /* * Join dive computer information. * * If we have old-style dive computer information (no model * name etc), we will prefer a new-style one and just throw * away the old. We're assuming it's a re-download. * * Otherwise, we'll just try to keep all the information, * unless the user has specified that they prefer the * downloaded computer, in which case we'll aggressively * try to throw out old information that *might* be from * that one. */ static void join_dive_computers(struct divecomputer *res, struct divecomputer *a, struct divecomputer *b, int prefer_downloaded) { struct divecomputer *tmp; if (a->model && !b->model) { *res = *a; clear_dc(a); return; } if (b->model && !a->model) { *res = *b; clear_dc(b); return; } *res = *a; clear_dc(a); tmp = res; while (tmp->next) tmp = tmp->next; tmp->next = calloc(1, sizeof(*tmp)); *tmp->next = *b; clear_dc(b); remove_redundant_dc(res, prefer_downloaded); } int taglist_get_tagstring(struct tag_entry *tag_list, char *buffer, int len) { int i = 0; struct tag_entry *tmp; tmp = tag_list->next; memset(buffer, 0, len); while(tmp != NULL) { int newlength = strlen(tmp->tag->name); if (i > 0) newlength += 2; if ((i+newlength) < len) { if (i > 0) { strcpy(buffer+i, ", "); strcpy(buffer+i+2, tmp->tag->name); } else { strcpy(buffer, tmp->tag->name); } } else { return i; } i += newlength; tmp = tmp->next; } return i; } struct divetag *taglist_get_tag(struct tag_entry *tag_list, const char *tag) { struct tag_entry *tmp; tmp = tag_list->next; while(tmp != NULL) { if (tmp->tag != NULL) { if (strcmp(tmp->tag->name, tag) == 0) return tmp->tag; else tmp = tmp->next; } } return NULL; } static inline void taglist_free_divetag(struct divetag *tag) { if (tag->name != NULL) free(tag->name); if (tag->source != NULL) free(tag->source); free(tag); } /* Add a tag to the tag_list, keep the list sorted */ static struct divetag *taglist_add_divetag(struct tag_entry *tag_list, struct divetag *tag) { struct tag_entry *tmp, *last; last = tag_list; tmp = tag_list->next; while(1) { if (tmp == NULL || strcmp(tmp->tag->name, tag->name) > 0) { /* Insert in front of it */ last->next = malloc(sizeof(struct tag_entry)); last->next->next = tmp; last->next->tag = tag; return last->next->tag; } else if (strcmp(tmp->tag->name, tag->name) == 0) { /* Already in list */ return tmp->tag; } else { last = tmp; tmp = tmp->next; } } } struct divetag *taglist_add_tag(struct tag_entry *tag_list, const char *tag) { int i = 0, is_default_tag = 0; struct divetag *ret_tag, *new_tag; const char *translation; new_tag = malloc(sizeof(struct divetag)); for (i=0; iname = malloc(strlen(translation)+1); memcpy(new_tag->name, translation, strlen(translation)+1); new_tag->source = malloc(strlen(tag)+1); memcpy(new_tag->source, tag, strlen(tag)+1); } else { new_tag->source = NULL; new_tag->name = malloc(strlen(tag)+1); memcpy(new_tag->name, tag, strlen(tag)+1); } /* Try to insert new_tag into g_tag_list if we are not operating on it */ if (tag_list != g_tag_list) { ret_tag = taglist_add_divetag(g_tag_list, new_tag); /* g_tag_list already contains new_tag, free the duplicate */ if (ret_tag != new_tag) taglist_free_divetag(new_tag); ret_tag = taglist_add_divetag(tag_list, ret_tag); } else { ret_tag = taglist_add_divetag(tag_list, new_tag); if (ret_tag != new_tag) taglist_free_divetag(new_tag); } return ret_tag; } void taglist_init(struct tag_entry **tag_list) { *tag_list = malloc(sizeof(struct tag_entry)); (*tag_list)->next = NULL; (*tag_list)->tag = NULL; } /* Clear everything but the first element */ void taglist_clear(struct tag_entry *tag_list) { struct tag_entry *current_tag_entry, *next; current_tag_entry = tag_list->next; while (current_tag_entry != NULL) { next = current_tag_entry->next; free(current_tag_entry); current_tag_entry = next; } tag_list->next = NULL; } /* Merge src1 and src2, write to *dst */ static void taglist_merge(struct tag_entry *dst, struct tag_entry *src1, struct tag_entry *src2) { struct tag_entry *current_tag_entry; current_tag_entry = src1->next; while (current_tag_entry != NULL) { taglist_add_divetag(dst, current_tag_entry->tag); current_tag_entry = current_tag_entry->next; } current_tag_entry = src2->next; while (current_tag_entry != NULL) { taglist_add_divetag(dst, current_tag_entry->tag); current_tag_entry = current_tag_entry->next; } } void taglist_init_global() { int i; taglist_init(&g_tag_list); for(i=0; idownloaded && !b->downloaded) { struct dive *tmp = a; a = b; b = tmp; } if (prefer_downloaded && b->downloaded) dl = b; res->when = dl ? dl->when : a->when; res->selected = a->selected || b->selected; merge_trip(res, a, b); MERGE_NONZERO(res, a, b, latitude.udeg); MERGE_NONZERO(res, a, b, longitude.udeg); MERGE_TXT(res, a, b, location); MERGE_TXT(res, a, b, notes); MERGE_TXT(res, a, b, buddy); MERGE_TXT(res, a, b, divemaster); MERGE_MAX(res, a, b, rating); MERGE_TXT(res, a, b, suit); MERGE_MAX(res, a, b, number); MERGE_NONZERO(res, a, b, cns); MERGE_NONZERO(res, a, b, visibility); taglist_merge(res->tag_list, a->tag_list, b->tag_list); merge_equipment(res, a, b); merge_airtemps(res, a, b); if (dl) { /* If we prefer downloaded, do those first, and get rid of "might be same" computers */ join_dive_computers(&res->dc, &dl->dc, &a->dc, 1); } else if (offset) interleave_dive_computers(&res->dc, &a->dc, &b->dc, offset); else join_dive_computers(&res->dc, &a->dc, &b->dc, 0); fixup_dive(res); return res; } struct dive *find_dive_including(timestamp_t when) { int i; struct dive *dive; /* binary search, anyone? Too lazy for now; * also we always use the duration from the first divecomputer * could this ever be a problem? */ for_each_dive(i, dive) { if (dive->when <= when && when <= dive->when + dive->duration.seconds) return dive; } return NULL; } bool dive_within_time_range(struct dive *dive, timestamp_t when, timestamp_t offset) { return when - offset <= dive->when && dive->when + dive->duration.seconds <= when + offset; } /* find the n-th dive that is part of a group of dives within the offset around 'when'. * How is that for a vague definition of what this function should do... */ struct dive *find_dive_n_near(timestamp_t when, int n, timestamp_t offset) { int i, j = 0; struct dive *dive; for_each_dive(i, dive) { if (dive_within_time_range(dive, when, offset)) if (++j == n) return dive; } return NULL; } void shift_times(const timestamp_t amount) { int i; struct dive *dive; for_each_dive (i, dive) { if (!dive->selected) continue; dive->when += amount; } } Subsurface-4.0.2/dive.h000066400000000000000000000561251226345450700147400ustar00rootroot00000000000000#ifndef DIVE_H #define DIVE_H #include #include #include #include #include /* Windows has no MIN/MAX macros - so let's just roll our own */ #define MIN(x, y) ({ \ typeof(x) _min1 = (x); \ typeof(y) _min2 = (y); \ (void) (&_min1 == &_min2); \ _min1 < _min2 ? _min1 : _min2; }) #define MAX(x, y) ({ \ typeof(x) _max1 = (x); \ typeof(y) _max2 = (y); \ (void) (&_max1 == &_max2); \ _max1 > _max2 ? _max1 : _max2; }) #include #include #include "sha1.h" #ifdef __cplusplus extern "C" { #else #if __STDC_VERSION__ >= 199901L #include #ifndef TRUE #define TRUE true #endif #ifndef FALSE #define FALSE false #endif #else typedef int bool; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #endif #endif #define O2_IN_AIR 209 // permille #define N2_IN_AIR 781 #define O2_DENSITY 1429 // mg/Liter #define N2_DENSITY 1251 #define HE_DENSITY 179 #define SURFACE_PRESSURE 1013 // mbar #define SURFACE_PRESSURE_STRING "1013" #define ZERO_C_IN_MKELVIN 273150 // mKelvin /* Salinity is expressed in weight in grams per 10l */ #define SEAWATER_SALINITY 10300 #define FRESHWATER_SALINITY 10000 /* * Some silly typedefs to make our units very explicit. * * Also, the units are chosen so that values can be expressible as * integers, so that we never have FP rounding issues. And they * are small enough that converting to/from imperial units doesn't * really matter. * * We also strive to make '0' a meaningless number saying "not * initialized", since many values are things that may not have * been reported (eg cylinder pressure or temperature from dive * computers that don't support them). But sometimes -1 is an even * more explicit way of saying "not there". * * Thus "millibar" for pressure, for example, or "millikelvin" for * temperatures. Doing temperatures in celsius or fahrenheit would * make for loss of precision when converting from one to the other, * and using millikelvin is SI-like but also means that a temperature * of '0' is clearly just a missing temperature or cylinder pressure. * * Also strive to use units that can not possibly be mistaken for a * valid value in a "normal" system without conversion. If the max * depth of a dive is '20000', you probably didn't convert from mm on * output, or if the max depth gets reported as "0.2ft" it was either * a really boring dive, or there was some missing input conversion, * and a 60-ft dive got recorded as 60mm. * * Doing these as "structs containing value" means that we always * have to explicitly write out those units in order to get at the * actual value. So there is hopefully little fear of using a value * in millikelvin as Fahrenheit by mistake. * * We don't actually use these all yet, so maybe they'll change, but * I made a number of types as guidelines. */ typedef int64_t timestamp_t; typedef struct { int seconds; } duration_t; typedef struct { int mm; } depth_t; typedef struct { int mbar; } pressure_t; typedef struct { int mkelvin; } temperature_t; typedef struct { int mliter; } volume_t; typedef struct { int permille; } fraction_t; typedef struct { int grams; } weight_t; typedef struct { int udeg; } degrees_t; struct gasmix { fraction_t o2; fraction_t he; }; typedef struct { volume_t size; pressure_t workingpressure; const char *description; /* "LP85", "AL72", "AL80", "HP100+" or whatever */ } cylinder_type_t; typedef struct { cylinder_type_t type; struct gasmix gasmix; pressure_t start, end, sample_start, sample_end; depth_t depth; } cylinder_t; typedef struct { weight_t weight; const char *description; /* "integrated", "belt", "ankle" */ } weightsystem_t; extern int get_pressure_units(unsigned int mb, const char **units); extern double get_depth_units(unsigned int mm, int *frac, const char **units); extern double get_volume_units(unsigned int ml, int *frac, const char **units); extern double get_temp_units(unsigned int mk, const char **units); extern double get_weight_units(unsigned int grams, int *frac, const char **units); extern double get_vertical_speed_units(unsigned int mms, int *frac, const char **units); extern unsigned int units_to_depth(double depth); static inline double grams_to_lbs(int grams) { return grams / 453.6; } static inline int lbs_to_grams(double lbs) { return lbs * 453.6 + 0.5; } static inline double ml_to_cuft(int ml) { return ml / 28316.8466; } static inline double cuft_to_l(double cuft) { return cuft * 28.3168466; } static inline double mm_to_feet(int mm) { return mm * 0.00328084; } static inline unsigned long feet_to_mm(double feet) { return feet * 304.8 + 0.5; } static inline int to_feet(depth_t depth) { return mm_to_feet(depth.mm) + 0.5; } static inline double mkelvin_to_C(int mkelvin) { return (mkelvin - ZERO_C_IN_MKELVIN) / 1000.0; } static inline double mkelvin_to_F(int mkelvin) { return mkelvin * 9 / 5000.0 - 459.670; } static inline unsigned long F_to_mkelvin(double f) { return (f-32) * 1000 / 1.8 + ZERO_C_IN_MKELVIN + 0.5; } static inline unsigned long C_to_mkelvin(double c) { return c * 1000 + ZERO_C_IN_MKELVIN + 0.5; } static inline double psi_to_bar(double psi) { return psi / 14.5037738; } static inline long psi_to_mbar(double psi) { return psi_to_bar(psi)*1000 + 0.5; } static inline int to_PSI(pressure_t pressure) { return pressure.mbar * 0.0145037738 + 0.5; } static inline double bar_to_atm(double bar) { return bar / SURFACE_PRESSURE * 1000; } /* Volume in mliter of a cylinder at pressure 'p' */ extern int gas_volume(cylinder_t *cyl, pressure_t p); extern int wet_volume(double cuft, pressure_t p); static inline int mbar_to_PSI(int mbar) { pressure_t p = {mbar}; return to_PSI(p); } static inline int get_o2(const struct gasmix *mix) { return mix->o2.permille ? : O2_IN_AIR; } static inline int get_he(const struct gasmix *mix) { return mix->he.permille; } static inline bool is_air(int o2, int he) { return (he == 0) && (o2 == 0 || ((o2 >= O2_IN_AIR - 1) && (o2 <= O2_IN_AIR + 1))); } /* Linear interpolation between 'a' and 'b', when we are 'part'way into the 'whole' distance from a to b */ static inline int interpolate(int a, int b, int part, int whole) { /* It is doubtful that we actually need floating point for this, but whatever */ double x = (double) a * (whole - part) + (double) b * part; return rint(x / whole); } struct sample { duration_t time; depth_t depth; temperature_t temperature; pressure_t cylinderpressure; int sensor; /* Cylinder pressure sensor index */ duration_t ndl; duration_t stoptime; depth_t stopdepth; bool in_deco; int cns; int po2; }; struct divetag { /* * The name of the divetag. If a translation is available, name contains * the translated tag */ char *name; /* * If a translation is available, we write the original tag to source. * This enables us to write a non-localized tag to the xml file. */ char *source; }; struct tag_entry { struct divetag *tag; struct tag_entry *next; }; /* * divetags are only stored once, each dive only contains * a list of tag_entries which then point to the divetags * in the global g_tag_list */ extern struct tag_entry *g_tag_list; struct divetag *taglist_add_tag(struct tag_entry *tag_list, const char *tag); /* * Writes all divetags in tag_list to buffer, limited by the buffer's (len)gth. * Returns the characters written */ int taglist_get_tagstring(struct tag_entry *tag_list, char *buffer, int len); void taglist_init(struct tag_entry **tag_list); void taglist_clear(struct tag_entry *tag_list); void taglist_init_global(); /* * Events are currently pretty meaningless. This is * just based on the random data that libdivecomputer * gives us. I'm not sure what a real "architected" * event model would actually look like, but right * now you can associate a list of events with a dive, * and we'll do something about it. */ struct event { struct event *next; duration_t time; int type, flags, value; bool deleted; char name[]; }; /* * NOTE! The deviceid and diveid are model-specific *hashes* of * whatever device identification that model may have. Different * dive computers will have different identifying data, it could * be a firmware number or a serial ID (in either string or in * numeric format), and we do not care. * * The only thing we care about is that subsurface will hash * that information the same way. So then you can check the ID * of a dive computer by comparing the hashes for equality. * * A deviceid or diveid of zero is assumed to be "no ID". */ struct divecomputer { timestamp_t when; duration_t duration, surfacetime; depth_t maxdepth, meandepth; temperature_t airtemp, watertemp; pressure_t surface_pressure; int salinity; // kg per 10000 l const char *model; uint32_t deviceid, diveid; int samples, alloc_samples; struct sample *sample; struct event *events; struct divecomputer *next; }; #define MAX_CYLINDERS (8) #define MAX_WEIGHTSYSTEMS (6) #define W_IDX_PRIMARY 0 #define W_IDX_SECONDARY 1 typedef enum { TF_NONE, NO_TRIP, IN_TRIP, ASSIGNED_TRIP, NUM_TRIPFLAGS } tripflag_t; typedef struct dive_trip { timestamp_t when; char *location; char *notes; struct dive *dives; int nrdives; int index; unsigned expanded:1, selected:1, autogen:1, fixup:1; struct dive_trip *next; } dive_trip_t; /* List of dive trips (sorted by date) */ extern dive_trip_t *dive_trip_list; struct dive { int number; tripflag_t tripflag; dive_trip_t *divetrip; struct dive *next, **pprev; int selected; bool downloaded; timestamp_t when; char *location; char *notes; char *divemaster, *buddy; int rating; degrees_t latitude, longitude; int visibility; /* 0 - 5 star rating */ cylinder_t cylinder[MAX_CYLINDERS]; weightsystem_t weightsystem[MAX_WEIGHTSYSTEMS]; char *suit; int sac, otu, cns, maxcns; /* Calculated based on dive computer data */ temperature_t mintemp, maxtemp, watertemp, airtemp; depth_t maxdepth, meandepth; pressure_t surface_pressure; duration_t duration; int salinity; // kg per 10000 l struct tag_entry *tag_list; struct divecomputer dc; }; static inline int dive_has_gps_location(struct dive *dive) { return dive->latitude.udeg || dive->longitude.udeg; } static inline void copy_gps_location(struct dive *from, struct dive *to) { if (from && to) { to->latitude.udeg = from->latitude.udeg; to->longitude.udeg = from->longitude.udeg; } } static inline int get_surface_pressure_in_mbar(const struct dive *dive, bool non_null) { int mbar = dive->surface_pressure.mbar; if (!mbar && non_null) mbar = SURFACE_PRESSURE; return mbar; } /* Pa = N/m^2 - so we determine the weight (in N) of the mass of 10m * of water (and use standard salt water at 1.03kg per liter if we don't know salinity) * and add that to the surface pressure (or to 1013 if that's unknown) */ static inline int calculate_depth_to_mbar(int depth, pressure_t surface_pressure, int salinity) { double specific_weight; int mbar = surface_pressure.mbar; if (!mbar) mbar = SURFACE_PRESSURE; if (!salinity) salinity = SEAWATER_SALINITY; specific_weight = salinity / 10000.0 * 0.981; mbar += depth / 10.0 * specific_weight + 0.5; return mbar; } static inline int depth_to_mbar(int depth, struct dive *dive) { return calculate_depth_to_mbar(depth, dive->surface_pressure, dive->salinity); } /* for the inverse calculation we use just the relative pressure * (that's the one that some dive computers like the Uemis Zurich * provide - for the other models that do this libdivecomputer has to * take care of this, but the Uemis we support natively */ static inline int rel_mbar_to_depth(int mbar, struct dive *dive) { int cm; double specific_weight = 1.03 * 0.981; if (dive->dc.salinity) specific_weight = dive->dc.salinity / 10000.0 * 0.981; /* whole mbar gives us cm precision */ cm = mbar / specific_weight + 0.5; return cm * 10; } #define SURFACE_THRESHOLD 750 /* somewhat arbitrary: only below 75cm is it really diving */ /* this is a global spot for a temporary dive structure that we use to * be able to edit a dive without unintended side effects */ extern struct dive edit_dive; extern short autogroup; /* random threashold: three days without diving -> new trip * this works very well for people who usually dive as part of a trip and don't * regularly dive at a local facility; this is why trips are an optional feature */ #define TRIP_THRESHOLD 3600*24*3 #define UNGROUPED_DIVE(_dive) ((_dive)->tripflag == NO_TRIP) #define DIVE_IN_TRIP(_dive) ((_dive)->tripflag == IN_TRIP || (_dive)->tripflag == ASSIGNED_TRIP) #define DIVE_NEEDS_TRIP(_dive) ((_dive)->tripflag == TF_NONE) extern void add_dive_to_trip(struct dive *, dive_trip_t *); extern void delete_single_dive(int idx); extern void add_single_dive(int idx, struct dive *dive); extern void insert_trip(dive_trip_t **trip); /* * We keep our internal data in well-specified units, but * the input and output may come in some random format. This * keeps track of those units. */ /* turns out in Win32 PASCAL is defined as a calling convention */ #ifdef WIN32 #undef PASCAL #endif struct units { enum { METERS, FEET } length; enum { LITER, CUFT } volume; enum { BAR, PSI, PASCAL } pressure; enum { CELSIUS, FAHRENHEIT, KELVIN } temperature; enum { KG, LBS } weight; enum { SECONDS, MINUTES } vertical_speed_time; }; /* * We're going to default to SI units for input. Yes, * technically the SI unit for pressure is Pascal, but * we default to bar (10^5 pascal), which people * actually use. Similarly, C instead of Kelvin. * And kg instead of g. */ #define SI_UNITS { \ .length = METERS, \ .volume = LITER, \ .pressure = BAR, \ .temperature = CELSIUS, \ .weight = KG, \ .vertical_speed_time = MINUTES \ } #define IMPERIAL_UNITS { \ .length = FEET, \ .volume = CUFT, \ .pressure = PSI, \ .temperature = FAHRENHEIT, \ .weight = LBS, \ .vertical_speed_time = MINUTES \ } extern const struct units SI_units, IMPERIAL_units; extern struct units xml_parsing_units; extern struct units *get_units(void); extern int verbose, quit; struct dive_table { int nr, allocated, preexisting; struct dive **dives; }; extern struct dive_table dive_table; extern int selected_dive; #define current_dive (get_dive(selected_dive)) #define current_dc (get_dive_dc(current_dive, dc_number)) static inline struct dive *get_gps_location(int nr, struct dive_table *table) { if (nr >= table->nr || nr < 0) return NULL; return table->dives[nr]; } static inline struct dive *get_dive(int nr) { if (nr >= dive_table.nr || nr < 0) return NULL; return dive_table.dives[nr]; } static inline struct divecomputer *get_dive_dc(struct dive *dive, int nr) { struct divecomputer *dc = NULL; if (nr >= 0) dc = &dive->dc; while (nr-- > 0) dc = dc->next; return dc; } /* * Iterate over each dive, with the first parameter being the index * iterator variable, and the second one being the dive one. * * I don't think anybody really wants the index, and we could make * it local to the for-loop, but that would make us requires C99. */ #define for_each_dive(_i,_x) \ for ((_i) = 0; ((_x) = get_dive(_i)) != NULL; (_i)++) #define for_each_dc(_dive,_dc) \ for (_dc = &_dive->dc; _dc; _dc = _dc->next) #define for_each_gps_location(_i,_x) \ for ((_i) = 0; ((_x) = get_gps_location(_i, &gps_location_table)) != NULL; (_i)++) static inline struct dive *get_dive_by_diveid(uint32_t diveid, uint32_t deviceid) { int i; struct dive *dive; for_each_dive(i, dive) { struct divecomputer *dc = &dive->dc; do { if (dc->diveid == diveid && dc->deviceid == deviceid) return dive; } while ((dc = dc->next) != NULL); } return NULL; } extern struct dive *find_dive_including(timestamp_t when); extern bool dive_within_time_range(struct dive *dive, timestamp_t when, timestamp_t offset); struct dive *find_dive_n_near(timestamp_t when, int n, timestamp_t offset); /* Check if two dive computer entries are the exact same dive (-1=no/0=maybe/1=yes) */ extern int match_one_dc(struct divecomputer *a, struct divecomputer *b); extern void parse_xml_init(void); extern void parse_xml_buffer(const char *url, const char *buf, int size, struct dive_table *table, const char **params, char **error); extern void parse_xml_exit(void); extern void set_filename(const char *filename, bool force); extern int parse_dm4_buffer(const char *url, const char *buf, int size, struct dive_table *table, char **error); extern void parse_file(const char *filename, char **error); extern void parse_csv_file(const char *filename, int time, int depth, int temp, int po2f, int cnsf, int stopdepthf, int sepidx, char **error); extern void save_dives(const char *filename); extern void save_dives_logic(const char *filename, bool select_only); extern void save_dive(FILE *f, struct dive *dive); extern void export_dives_uddf(const char *filename, const bool selected); extern int subsurface_open(const char *path, int oflags, mode_t mode); extern FILE *subsurface_fopen(const char *path, const char *mode); extern void *subsurface_opendir(const char *path); extern struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp); extern int subsurface_zip_close(struct zip *zip); extern void shift_times(const timestamp_t amount); extern xsltStylesheetPtr get_stylesheet(const char *name); extern timestamp_t utc_mktime(struct tm *tm); extern void utc_mkdate(timestamp_t, struct tm *tm); extern struct dive *alloc_dive(void); extern void record_dive(struct dive *dive); extern struct sample *prepare_sample(struct divecomputer *dc); extern void finish_sample(struct divecomputer *dc); extern void sort_table(struct dive_table *table); extern struct dive *fixup_dive(struct dive *dive); extern unsigned int dc_airtemp(struct divecomputer *dc); extern unsigned int dc_watertemp(struct divecomputer *dc); extern struct dive *merge_dives(struct dive *a, struct dive *b, int offset, bool prefer_downloaded); extern struct dive *try_to_merge(struct dive *a, struct dive *b, bool prefer_downloaded); extern void renumber_dives(int nr); extern void copy_events(struct dive *s, struct dive *d); extern void copy_cylinders(struct dive *s, struct dive *d); extern void copy_samples(struct dive *s, struct dive *d); extern void fill_default_cylinder(cylinder_t *cyl); extern void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int time, int idx); extern void add_event(struct divecomputer *dc, int time, int type, int flags, int value, const char *name); extern void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc, int *mean, int *duration); extern int get_cylinder_index(struct dive *dive, struct event *ev); /* UI related protopypes */ // extern void report_error(GError* error); extern void add_cylinder_description(cylinder_type_t *); extern void add_weightsystem_description(weightsystem_t *); extern void remember_event(const char *eventname); #if WE_DONT_USE_THIS /* this is a missing feature in Qt - selecting which events to display */ extern int evn_foreach(void (*callback)(const char *, bool *, void *), void *data); #endif /* WE_DONT_USE_THIS */ extern void clear_events(void); extern void set_dc_nickname(struct dive *dive); extern void set_autogroup(bool value); extern int total_weight(struct dive *); #define DIVE_ERROR_PARSE 1 #define DIVE_ERROR_PLAN 2 const char *weekday(int wday); const char *monthname(int mon); #define UTF8_DEGREE "\xc2\xb0" #define UTF8_DELTA "\xce\x94" #define UTF8_UPWARDS_ARROW "\xE2\x86\x91" #define UTF8_DOWNWARDS_ARROW "\xE2\x86\x93" #define UTF8_AVERAGE "\xc3\xb8" #define UCS4_DEGREE 0xb0 #define UTF8_SUBSCRIPT_2 "\xe2\x82\x82" #define UTF8_WHITESTAR "\xe2\x98\x86" #define UTF8_BLACKSTAR "\xe2\x98\x85" #define ZERO_STARS UTF8_WHITESTAR UTF8_WHITESTAR UTF8_WHITESTAR UTF8_WHITESTAR UTF8_WHITESTAR #define ONE_STARS UTF8_BLACKSTAR UTF8_WHITESTAR UTF8_WHITESTAR UTF8_WHITESTAR UTF8_WHITESTAR #define TWO_STARS UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_WHITESTAR UTF8_WHITESTAR UTF8_WHITESTAR #define THREE_STARS UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_WHITESTAR UTF8_WHITESTAR #define FOUR_STARS UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_WHITESTAR #define FIVE_STARS UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_BLACKSTAR UTF8_BLACKSTAR extern const char *star_strings[]; extern const char *existing_filename; extern void subsurface_command_line_init(int *, char ***); extern void subsurface_command_line_exit(int *, char ***); #define FRACTION(n,x) ((unsigned)(n)/(x)),((unsigned)(n)%(x)) extern double add_segment(double pressure, const struct gasmix *gasmix, int period_in_seconds, int setpoint, const struct dive *dive); extern void clear_deco(double surface_pressure); extern void dump_tissues(void); extern unsigned int deco_allowed_depth(double tissues_tolerance, double surface_pressure, struct dive *dive, bool smooth); extern void set_gf(short gflow, short gfhigh, bool gf_low_at_maxdepth); extern void cache_deco_state(double, char **datap); extern double restore_deco_state(char *data); struct divedatapoint { int time; unsigned int depth; int o2; int he; int po2; bool entered; struct divedatapoint *next; }; struct diveplan { timestamp_t when; int lastdive_nr; int surface_pressure; /* mbar */ int bottomsac; /* ml/min */ int decosac; /* ml/min */ short gflow; short gfhigh; struct divedatapoint *dp; }; struct divedatapoint *plan_add_segment(struct diveplan *diveplan, int duration, int depth, int o2, int he, int po2); void get_gas_string(int o2, int he, char *buf, int len); struct divedatapoint *create_dp(int time_incr, int depth, int o2, int he, int po2); void dump_plan(struct diveplan *diveplan); void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, bool add_deco, const char **error_string_p); void delete_single_dive(int idx); struct event *get_next_event(struct event *event, char *name); /* these structs holds the information that * describes the cylinders / weight systems. * they are global variables initialized in equipment.c * used to fill the combobox in the add/edit cylinder * dialog */ struct tank_info_t { const char *name; int cuft, ml, psi, bar; }; extern struct tank_info_t tank_info[100]; struct ws_info_t { const char *name; int grams; }; extern struct ws_info_t ws_info[100]; extern bool cylinder_nodata(cylinder_t *cyl); extern bool cylinder_none(void *_data); extern bool weightsystem_none(void *_data); extern bool no_weightsystems(weightsystem_t *ws); extern bool weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2); extern void remove_cylinder(struct dive *dive, int idx); extern void remove_weightsystem(struct dive *dive, int idx); /* * String handling. */ #define STRTOD_NO_SIGN 0x01 #define STRTOD_NO_DOT 0x02 #define STRTOD_NO_COMMA 0x04 #define STRTOD_NO_EXPONENT 0x08 extern double strtod_flags(const char *str, const char **ptr, unsigned int flags); #define STRTOD_ASCII (STRTOD_NO_COMMA) #define ascii_strtod(str,ptr) strtod_flags(str,ptr,STRTOD_ASCII) #ifdef __cplusplus } #endif extern weight_t string_to_weight(const char *str); extern depth_t string_to_depth(const char *str); extern pressure_t string_to_pressure(const char *str); extern volume_t string_to_volume(const char *str, pressure_t workp); extern fraction_t string_to_fraction(const char *str); #include "pref.h" #endif /* DIVE_H */ Subsurface-4.0.2/divelist.c000066400000000000000000000566601226345450700156330ustar00rootroot00000000000000/* divelist.c */ /* core logic for the dive list - * accessed through the following interfaces: * * dive_trip_t *dive_trip_list; * unsigned int amount_selected; * void dump_selection(void) * dive_trip_t *find_trip_by_idx(int idx) * int trip_has_selected_dives(dive_trip_t *trip) * void get_dive_gas(struct dive *dive, int *o2_p, int *he_p, int *o2low_p) * int total_weight(struct dive *dive) * int get_divenr(struct dive *dive) * double init_decompression(struct dive *dive) * void update_cylinder_related_info(struct dive *dive) * void dump_trip_list(void) * dive_trip_t *find_matching_trip(timestamp_t when) * void insert_trip(dive_trip_t **dive_trip_p) * void remove_dive_from_trip(struct dive *dive) * void add_dive_to_trip(struct dive *dive, dive_trip_t *trip) * dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) * void autogroup_dives(void) * void delete_single_dive(int idx) * void add_single_dive(int idx, struct dive *dive) * void merge_two_dives(struct dive *a, struct dive *b) * void select_dive(int idx) * void deselect_dive(int idx) * void mark_divelist_changed(int changed) * int unsaved_changes() * void remove_autogen_trips() */ #include #include #include #include #include #include #include "gettext.h" #include #include #include #include "dive.h" #include "divelist.h" #include "display.h" static short dive_list_changed = FALSE; short autogroup = FALSE; dive_trip_t *dive_trip_list; unsigned int amount_selected; #if DEBUG_SELECTION_TRACKING void dump_selection(void) { int i; struct dive *dive; printf("currently selected are %u dives:", amount_selected); for_each_dive(i, dive) { if (dive->selected) printf(" %d", i); } printf("\n"); } #endif void set_autogroup(bool value) { /* if we keep the UI paradigm, this needs to toggle * the checkbox on the autogroup menu item */ autogroup = value; } dive_trip_t *find_trip_by_idx(int idx) { dive_trip_t *trip = dive_trip_list; if (idx >= 0) return NULL; idx = -idx; while (trip) { if (trip->index == idx) return trip; trip = trip->next; } return NULL; } int trip_has_selected_dives(dive_trip_t *trip) { struct dive *dive; for (dive = trip->dives; dive; dive = dive->next) { if (dive->selected) return 1; } return 0; } /* * Get "maximal" dive gas for a dive. * Rules: * - Trimix trumps nitrox (highest He wins, O2 breaks ties) * - Nitrox trumps air (even if hypoxic) * These are the same rules as the inter-dive sorting rules. */ void get_dive_gas(struct dive *dive, int *o2_p, int *he_p, int *o2low_p) { int i; int maxo2 = -1, maxhe = -1, mino2 = 1000; for (i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = dive->cylinder + i; struct gasmix *mix = &cyl->gasmix; int o2 = mix->o2.permille; int he = mix->he.permille; struct divecomputer *dc = &dive->dc; int used = 0; int first_gas_explicit = 0; while (dc) { struct event *event = dc->events; while (event) { if (event->value) { if (event->name && !strcmp(event->name, "gaschange")) { unsigned int event_he = event->value >> 16; unsigned int event_o2 = event->value & 0xffff; if (event->time.seconds < 30) first_gas_explicit = 1; if (is_air(o2, he)) { if (is_air(event_o2 * 10, event_he * 10)) used = 1; } else { if (he == event_he*10 && o2 == event_o2*10) used = 1; } } } event = event->next; } dc = dc->next; } /* Unless explicity set, the first gas to use has index 0 */ if (i == 0 && !first_gas_explicit) used = 1; if (!used) continue; if (cylinder_none(cyl)) continue; if (!o2) o2 = O2_IN_AIR; if (o2 < mino2) mino2 = o2; if (he > maxhe) goto newmax; if (he < maxhe) continue; if (o2 <= maxo2) continue; newmax: maxhe = he; maxo2 = o2; } /* All air? Show/sort as "air"/zero */ if (!maxhe && maxo2 == O2_IN_AIR && mino2 == maxo2) maxo2 = mino2 = 0; *o2_p = maxo2; *he_p = maxhe; *o2low_p = mino2; } int total_weight(struct dive *dive) { int i, total_grams = 0; if (dive) for (i=0; i< MAX_WEIGHTSYSTEMS; i++) total_grams += dive->weightsystem[i].weight.grams; return total_grams; } static int active_o2(struct dive *dive, struct divecomputer *dc, duration_t time) { int o2permille = dive->cylinder[0].gasmix.o2.permille; struct event *event = dc->events; if (!o2permille) o2permille = O2_IN_AIR; for (event = dc->events; event; event = event->next) { if (event->time.seconds > time.seconds) break; if (strcmp(event->name, "gaschange")) continue; o2permille = 10*(event->value & 0xffff); } return o2permille; } /* calculate OTU for a dive - this only takes the first divecomputer into account */ static int calculate_otu(struct dive *dive) { int i; double otu = 0.0; struct divecomputer *dc = &dive->dc; for (i = 1; i < dc->samples; i++) { int t; int po2; struct sample *sample = dc->sample + i; struct sample *psample = sample - 1; t = sample->time.seconds - psample->time.seconds; if (sample->po2) { po2 = sample->po2; } else { int o2 = active_o2(dive, dc, sample->time); po2 = o2 / 1000.0 * depth_to_mbar(sample->depth.mm, dive); } if (po2 >= 500) otu += pow((po2 - 500) / 1000.0, 0.83) * t / 30.0; } return otu + 0.5; } /* calculate CNS for a dive - this only takes the first divecomputer into account */ int const cns_table[][3] = { /* po2, Maximum Single Exposure, Maximum 24 hour Exposure */ {1600, 45 * 60, 150 * 60}, {1500, 120 * 60, 180 * 60}, {1400, 150 * 60, 180 * 60}, {1300, 180 * 60, 210 * 60}, {1200, 210 * 60, 240 * 60}, {1100, 240 * 60, 270 * 60}, {1000, 300 * 60, 300 * 60}, { 900, 360 * 60, 360 * 60}, { 800, 450 * 60, 450 * 60}, { 700, 570 * 60, 570 * 60}, { 600, 720 * 60, 720 * 60} }; /* this only gets called if dive->maxcns == 0 which means we know that * none of the divecomputers has tracked any CNS for us * so we calculated it "by hand" */ static int calculate_cns(struct dive *dive) { int i, j, divenr; double cns = 0.0; struct divecomputer *dc = &dive->dc; struct dive *prev_dive; timestamp_t endtime; /* shortcut */ if (dive->cns) return dive->cns; /* * Do we start with a cns loading from a previous dive? * Check if we did a dive 12 hours prior, and what cns we had from that. * Then apply ha 90min halftime to see whats left. */ divenr = get_divenr(dive); if (divenr) { prev_dive = get_dive(divenr -1 ); if (prev_dive) { endtime = prev_dive->when + prev_dive->duration.seconds; if (dive->when < (endtime + 3600 * 12)) { cns = calculate_cns(prev_dive); cns = cns * 1/pow(2, (dive->when - endtime) / (90.0 * 60.0)); } } } /* Caclulate the cns for each sample in this dive and sum them */ for (i = 1; i < dc->samples; i++) { int t; int po2; struct sample *sample = dc->sample + i; struct sample *psample = sample - 1; t = sample->time.seconds - psample->time.seconds; if (sample->po2) { po2 = sample->po2; } else { int o2 = active_o2(dive, dc, sample->time); po2 = o2 / 1000.0 * depth_to_mbar(sample->depth.mm, dive); } /* Find what table-row we should calculate % for */ for (j = 1; j < sizeof(cns_table)/(sizeof(int) * 3); j++) if (po2 > cns_table[j][0]) break; j--; cns += ((double)t)/((double)cns_table[j][1]) * 100; } /* save calculated cns in dive struct */ dive->cns = cns; return dive->cns; } /* * Return air usage (in liters). */ static double calculate_airuse(struct dive *dive) { int airuse = 0; int i; for (i = 0; i < MAX_CYLINDERS; i++) { pressure_t start, end; cylinder_t *cyl = dive->cylinder + i; start = cyl->start.mbar ? cyl->start : cyl->sample_start; end = cyl->end.mbar ? cyl->end : cyl->sample_end; airuse += gas_volume(cyl, start) - gas_volume(cyl, end); } return airuse / 1000.0; } /* this only uses the first divecomputer to calculate the SAC rate */ static int calculate_sac(struct dive *dive) { struct divecomputer *dc = &dive->dc; double airuse, pressure, sac; int duration, meandepth; airuse = calculate_airuse(dive); if (!airuse) return 0; duration = dc->duration.seconds; if (!duration) return 0; meandepth = dc->meandepth.mm; if (!meandepth) return 0; /* Mean pressure in ATM (SAC calculations are in atm*l/min) */ pressure = (double) depth_to_mbar(meandepth, dive) / SURFACE_PRESSURE; sac = airuse / pressure * 60 / duration; /* milliliters per minute.. */ return sac * 1000; } /* for now we do this based on the first divecomputer */ static void add_dive_to_deco(struct dive *dive) { struct divecomputer *dc = &dive->dc; int i; if (!dc) return; for (i = 1; i < dc->samples; i++) { struct sample *psample = dc->sample + i - 1; struct sample *sample = dc->sample + i; int t0 = psample->time.seconds; int t1 = sample->time.seconds; int j; for (j = t0; j < t1; j++) { int depth = interpolate(psample->depth.mm, sample->depth.mm, j - t0, t1 - t0); (void) add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[sample->sensor].gasmix, 1, sample->po2, dive); } } } int get_divenr(struct dive *dive) { int i; struct dive *d; for_each_dive(i, d) if (d == dive) return i; return -1; } static struct gasmix air = { .o2.permille = O2_IN_AIR }; /* take into account previous dives until there is a 48h gap between dives */ double init_decompression(struct dive *dive) { int i, divenr = -1; unsigned int surface_time; timestamp_t when, lasttime = 0; bool deco_init = FALSE; double tissue_tolerance, surface_pressure; tissue_tolerance = surface_pressure = get_surface_pressure_in_mbar(dive, TRUE) / 1000.0; if (!dive) return 0.0; divenr = get_divenr(dive); when = dive->when; i = divenr; while (i && --i) { struct dive* pdive = get_dive(i); /* we don't want to mix dives from different trips as we keep looking * for how far back we need to go */ if (dive->divetrip && pdive->divetrip != dive->divetrip) continue; if (!pdive || pdive->when > when || pdive->when + pdive->duration.seconds + 48 * 60 * 60 < when) break; when = pdive->when; lasttime = when + pdive->duration.seconds; } while (++i < divenr) { struct dive* pdive = get_dive(i); /* again skip dives from different trips */ if (dive->divetrip && dive->divetrip != pdive->divetrip) continue; surface_pressure = get_surface_pressure_in_mbar(pdive, TRUE) / 1000.0; if (!deco_init) { clear_deco(surface_pressure); deco_init = TRUE; #if DECO_CALC_DEBUG & 2 dump_tissues(); #endif } add_dive_to_deco(pdive); #if DECO_CALC_DEBUG & 2 printf("added dive #%d\n", pdive->number); dump_tissues(); #endif if (pdive->when > lasttime) { surface_time = pdive->when - lasttime; lasttime = pdive->when + pdive->duration.seconds; tissue_tolerance = add_segment(surface_pressure, &air, surface_time, 0, dive); #if DECO_CALC_DEBUG & 2 printf("after surface intervall of %d:%02u\n", FRACTION(surface_time,60)); dump_tissues(); #endif } } /* add the final surface time */ if (lasttime && dive->when > lasttime) { surface_time = dive->when - lasttime; surface_pressure = get_surface_pressure_in_mbar(dive, TRUE) / 1000.0; tissue_tolerance = add_segment(surface_pressure, &air, surface_time, 0, dive); #if DECO_CALC_DEBUG & 2 printf("after surface intervall of %d:%02u\n", FRACTION(surface_time,60)); dump_tissues(); #endif } if (!deco_init) { surface_pressure = get_surface_pressure_in_mbar(dive, TRUE) / 1000.0; clear_deco(surface_pressure); #if DECO_CALC_DEBUG & 2 printf("no previous dive\n"); dump_tissues(); #endif } return tissue_tolerance; } void update_cylinder_related_info(struct dive *dive) { if (dive != NULL) { dive->sac = calculate_sac(dive); dive->otu = calculate_otu(dive); if (dive->maxcns == 0) dive->maxcns = calculate_cns(dive); } } #define MAX_NITROX_STRING 80 #define UTF8_ELLIPSIS "\xE2\x80\xA6" /* callers needs to free the string */ char *get_nitrox_string(struct dive *dive) { int o2, he, o2low; char *buffer = malloc(MAX_NITROX_STRING); if (buffer) { get_dive_gas(dive, &o2, &he, &o2low); o2 = (o2 + 5) / 10; he = (he + 5) / 10; o2low = (o2low + 5) / 10; if (he) snprintf(buffer, MAX_NITROX_STRING, "%d/%d", o2, he); else if (o2) if (o2 == o2low) snprintf(buffer, MAX_NITROX_STRING, "%d", o2); else snprintf(buffer, MAX_NITROX_STRING, "%d" UTF8_ELLIPSIS "%d", o2low, o2); else strcpy(buffer, translate("gettextFromC","air")); } return buffer; } /* * helper functions for dive_trip handling */ #ifdef DEBUG_TRIP void dump_trip_list(void) { dive_trip_t *trip; int i=0; timestamp_t last_time = 0; for (trip = dive_trip_list; trip; trip = trip->next) { struct tm tm; utc_mkdate(trip->when, &tm); if (trip->when < last_time) printf("\n\ndive_trip_list OUT OF ORDER!!!\n\n\n"); printf("%s trip %d to \"%s\" on %04u-%02u-%02u %02u:%02u:%02u (%d dives - %p)\n", trip->autogen ? "autogen " : "", ++i, trip->location, tm.tm_year + 1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, trip->nrdives, trip); last_time = trip->when; } printf("-----\n"); } #endif /* this finds the last trip that at or before the time given */ dive_trip_t *find_matching_trip(timestamp_t when) { dive_trip_t *trip = dive_trip_list; if (!trip || trip->when > when) { #ifdef DEBUG_TRIP printf("no matching trip\n"); #endif return NULL; } while (trip->next && trip->next->when <= when) trip = trip->next; #ifdef DEBUG_TRIP { struct tm tm; utc_mkdate(trip->when, &tm); printf("found trip %p @ %04d-%02d-%02d %02d:%02d:%02d\n", trip, tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); } #endif return trip; } /* insert the trip into the dive_trip_list - but ensure you don't have * two trips for the same date; but if you have, make sure you don't * keep the one with less information */ void insert_trip(dive_trip_t **dive_trip_p) { dive_trip_t *dive_trip = *dive_trip_p; dive_trip_t **p = &dive_trip_list; dive_trip_t *trip; struct dive *divep; /* Walk the dive trip list looking for the right location.. */ while ((trip = *p) != NULL && trip->when < dive_trip->when) p = &trip->next; if (trip && trip->when == dive_trip->when) { if (! trip->location) trip->location = dive_trip->location; if (! trip->notes) trip->notes = dive_trip->notes; divep = dive_trip->dives; while (divep) { add_dive_to_trip(divep, trip); divep = divep->next; } *dive_trip_p = trip; } else { dive_trip->next = trip; *p = dive_trip; } #ifdef DEBUG_TRIP dump_trip_list(); #endif } static void delete_trip(dive_trip_t *trip) { dive_trip_t **p, *tmp; assert(!trip->dives); /* Remove the trip from the list of trips */ p = &dive_trip_list; while ((tmp = *p) != NULL) { if (tmp == trip) { *p = trip->next; break; } p = &tmp->next; } /* .. and free it */ if (trip->location) free(trip->location); if (trip->notes) free(trip->notes); free(trip); } void find_new_trip_start_time(dive_trip_t *trip) { struct dive *dive = trip->dives; timestamp_t when = dive->when; while ((dive = dive->next) != NULL) { if (dive->when < when) when = dive->when; } trip->when = when; } void remove_dive_from_trip(struct dive *dive, short was_autogen) { struct dive *next, **pprev; dive_trip_t *trip = dive->divetrip; if (!trip) return; /* Remove the dive from the trip's list of dives */ next = dive->next; pprev = dive->pprev; *pprev = next; if (next) next->pprev = pprev; dive->divetrip = NULL; if (was_autogen) dive->tripflag = TF_NONE; else dive->tripflag = NO_TRIP; assert(trip->nrdives > 0); if (!--trip->nrdives) delete_trip(trip); else if (trip->when == dive->when) find_new_trip_start_time(trip); } void add_dive_to_trip(struct dive *dive, dive_trip_t *trip) { if (dive->divetrip == trip) return; assert(trip->when); remove_dive_from_trip(dive, FALSE); trip->nrdives++; dive->divetrip = trip; dive->tripflag = ASSIGNED_TRIP; /* Add it to the trip's list of dives*/ dive->next = trip->dives; if (dive->next) dive->next->pprev = &dive->next; trip->dives = dive; dive->pprev = &trip->dives; if (dive->when && trip->when > dive->when) trip->when = dive->when; } dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive) { dive_trip_t *dive_trip = calloc(sizeof(dive_trip_t),1); dive_trip->when = dive->when; if (dive->location) dive_trip->location = strdup(dive->location); insert_trip(&dive_trip); dive->tripflag = IN_TRIP; add_dive_to_trip(dive, dive_trip); return dive_trip; } /* * Walk the dives from the oldest dive, and see if we can autogroup them */ void autogroup_dives(void) { int i; struct dive *dive, *lastdive = NULL; for_each_dive(i, dive) { dive_trip_t *trip; if (dive->divetrip) { lastdive = dive; continue; } if (!DIVE_NEEDS_TRIP(dive)) { lastdive = NULL; continue; } /* Do we have a trip we can combine this into? */ if (lastdive && dive->when < lastdive->when + TRIP_THRESHOLD) { dive_trip_t *trip = lastdive->divetrip; add_dive_to_trip(dive, trip); if (dive->location && !trip->location) trip->location = strdup(dive->location); lastdive = dive; continue; } lastdive = dive; trip = create_and_hookup_trip_from_dive(dive); trip->autogen = 1; } #ifdef DEBUG_TRIP dump_trip_list(); #endif } /* this implements the mechanics of removing the dive from the table, * but doesn't deal with updating dive trips, etc */ void delete_single_dive(int idx) { int i; struct dive *dive = get_dive(idx); if (!dive) return; /* this should never happen */ remove_dive_from_trip(dive, FALSE); if (dive->selected) deselect_dive(idx); for (i = idx; i < dive_table.nr - 1; i++) dive_table.dives[i] = dive_table.dives[i+1]; dive_table.dives[--dive_table.nr] = NULL; /* free all allocations */ free(dive->dc.sample); if (dive->location) free((void *)dive->location); if (dive->notes) free((void *)dive->notes); if (dive->divemaster) free((void *)dive->divemaster); if (dive->buddy) free((void *)dive->buddy); if (dive->suit) free((void *)dive->suit); if (dive->tag_list) { taglist_clear(dive->tag_list); /* Remove head of list */ free((void *)dive->tag_list); } free(dive); } void add_single_dive(int idx, struct dive *dive) { int i; dive_table.nr++; if (dive->selected) amount_selected++; for (i = idx; i < dive_table.nr ; i++) { struct dive *tmp = dive_table.dives[i]; dive_table.dives[i] = dive; dive = tmp; } } bool consecutive_selected() { struct dive *d; int i; bool consecutive = TRUE; bool firstfound = FALSE; bool lastfound = FALSE; if (amount_selected == 0 || amount_selected == 1) return TRUE; for_each_dive(i, d) { if (d->selected) { if (!firstfound) firstfound = TRUE; else if (lastfound) consecutive = FALSE; } else if (firstfound) { lastfound = TRUE; } } return consecutive; } struct dive *merge_two_dives(struct dive *a, struct dive *b) { struct dive *res; int i,j; if (!a || !b) return NULL; i = get_divenr(a); j = get_divenr(b); res = merge_dives(a, b, b->when - a->when, FALSE); if (!res) return NULL; add_single_dive(i, res); delete_single_dive(i+1); delete_single_dive(j); mark_divelist_changed(TRUE); return res; } void select_dive(int idx) { struct dive *dive = get_dive(idx); if (dive) { /* never select an invalid dive that isn't displayed */ if (!dive->selected) { dive->selected = 1; amount_selected++; } selected_dive = idx; } } void deselect_dive(int idx) { struct dive *dive = get_dive(idx); if (dive && dive->selected) { dive->selected = 0; if (amount_selected) amount_selected--; if (selected_dive == idx && amount_selected > 0) { /* pick a different dive as selected */ while (--selected_dive >= 0) { dive = get_dive(selected_dive); if (dive && dive->selected) return; } selected_dive = idx; while (++selected_dive < dive_table.nr) { dive = get_dive(selected_dive); if (dive && dive->selected) return; } } if (amount_selected == 0) selected_dive = -1; } } void mark_divelist_changed(int changed) { dive_list_changed = changed; } int unsaved_changes() { return dive_list_changed; } void remove_autogen_trips() { int i; struct dive *dive; for_each_dive(i, dive) { dive_trip_t *trip = dive->divetrip; if (trip && trip->autogen) remove_dive_from_trip(dive, TRUE); } } /* * When adding dives to the dive table, we try to renumber * the new dives based on any old dives in the dive table. * * But we only do it if: * * - there are no dives in the dive table * * OR * * - the last dive in the old dive table was numbered * * - all the new dives are strictly at the end (so the * "last dive" is at the same location in the dive table * after re-sorting the dives. * * - none of the new dives have any numbers * * This catches the common case of importing new dives from * a dive computer, and gives them proper numbers based on * your old dive list. But it tries to be very conservative * and not give numbers if there is *any* question about * what the numbers should be - in which case you need to do * a manual re-numbering. */ static void try_to_renumber(struct dive *last, int preexisting) { int i, nr; /* * If the new dives aren't all strictly at the end, * we're going to expect the user to do a manual * renumbering. */ if (preexisting && get_dive(preexisting-1) != last) return; /* * If any of the new dives already had a number, * we'll have to do a manual renumbering. */ for (i = preexisting; i < dive_table.nr; i++) { struct dive *dive = get_dive(i); if (dive->number) return; } /* * Ok, renumber.. */ if (last) nr = last->number; else nr = 0; for (i = preexisting; i < dive_table.nr; i++) { struct dive *dive = get_dive(i); dive->number = ++nr; } } void process_dives(bool is_imported, bool prefer_imported) { int i; int preexisting = dive_table.preexisting; struct dive *last; /* check if we need a nickname for the divecomputer for newly downloaded dives; * since we know they all came from the same divecomputer we just check for the * first one */ if (preexisting < dive_table.nr && dive_table.dives[preexisting]->downloaded) set_dc_nickname(dive_table.dives[preexisting]); else /* they aren't downloaded, so record / check all new ones */ for (i = preexisting; i < dive_table.nr; i++) set_dc_nickname(dive_table.dives[i]); /* This does the right thing for -1: NULL */ last = get_dive(preexisting-1); sort_table(&dive_table); for (i = 1; i < dive_table.nr; i++) { struct dive **pp = &dive_table.dives[i-1]; struct dive *prev = pp[0]; struct dive *dive = pp[1]; struct dive *merged; /* only try to merge overlapping dives - or if one of the dives has * zero duration (that might be a gps marker from the webservice) */ if (prev->duration.seconds && dive->duration.seconds && prev->when + prev->duration.seconds < dive->when) continue; merged = try_to_merge(prev, dive, prefer_imported); if (!merged) continue; /* careful - we might free the dive that last points to. Oops... */ if (last == prev || last == dive) last = merged; /* Redo the new 'i'th dive */ i--; add_single_dive(i, merged); delete_single_dive(i+1); delete_single_dive(i+1); } /* make sure no dives are still marked as downloaded */ for (i = 1; i < dive_table.nr; i++) dive_table.dives[i]->downloaded = FALSE; if (is_imported) { /* If there are dives in the table, are they numbered */ if (!last || last->number) try_to_renumber(last, preexisting); /* did we add dives to the dive table? */ if (preexisting != dive_table.nr) mark_divelist_changed(TRUE); } } Subsurface-4.0.2/divelist.h000066400000000000000000000024141226345450700156240ustar00rootroot00000000000000#ifndef DIVELIST_H #define DIVELIST_H #ifdef __cplusplus extern "C" { #endif struct dive; extern void update_cylinder_related_info(struct dive *); extern void mark_divelist_changed(int); extern int unsaved_changes(void); extern void remove_autogen_trips(void); extern double init_decompression(struct dive * dive); /* divelist core logic functions */ extern void process_dives(bool imported, bool prefer_imported); extern char *get_nitrox_string(struct dive *dive); extern dive_trip_t *find_trip_by_idx(int idx); extern int trip_has_selected_dives(dive_trip_t *trip); extern void get_dive_gas(struct dive *dive, int *o2_p, int *he_p, int *o2low_p); extern int get_divenr(struct dive *dive); extern dive_trip_t *find_matching_trip(timestamp_t when); extern void remove_dive_from_trip(struct dive *dive, short was_autogen); extern dive_trip_t *create_and_hookup_trip_from_dive(struct dive *dive); extern void autogroup_dives(void); extern struct dive *merge_two_dives(struct dive *a, struct dive *b); extern bool consecutive_selected(); extern void select_dive(int idx); extern void deselect_dive(int idx); void find_new_trip_start_time(dive_trip_t *trip); #ifdef DEBUG_TRIP extern void dump_selection(void); extern void dump_trip_list(void); #endif #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/dives/000077500000000000000000000000001226345450700147415ustar00rootroot00000000000000Subsurface-4.0.2/dives/Dive_2013-02-02-1614.xml000066400000000000000000000102301226345450700200420ustar00rootroot0000000000000000boat name2600011.999999404907220000015265001.40538700331.40205110150354063580538702635721922.441Notes are here52000uCYDADYhAwBQGwMA3hQDAF4NAwCcBgMApvwCAOT1AgCu7wIAhuoCACLlAgBU4AIAGNsCAMLWAgBS0wIA1M4CAHDJAgAAxgIAaMICANa9AgBiuQIAhrgCAMa0AgCargIAvqgCABqnAgAQogIAVp0CAFqZAgBKlQIAjpICAHiPAgA4iQIAaIYCABiBAgBIfgIARnsCAJ54AgCKcwIAXG8CACpqAgB4ZwIAuGMCAJxhAgBoXgIASFsCAG5YAgCuVAIAGlICAFBOAgBiSwIAhEcCANxEAgAIQQIArD0CAEo7AgByNgIApjQCAB4wAgAOLAIAAikCADImAgCAIwIA3h8CAAAcAgBsGQIATBYCALARAgAmDwIA+AoCAFoIAgDgBAIALgICAPr+AQAa/QEAYPgBAFT1AQBI8gEAlu8BAHDtAQBm6AEAluUBAALjAQDW4QEAOt0BAPzZAQB81wEA2NUBADrTAQDc0QEAANEBAMjMAQBsyQEAvMQBAOLBAQDqvgEAiLwBAOa4AQBmtgEA8LMBAGKwAQBSrAEAjKkBANqmAQCkpQEAiqEBAD6dAQAwnAEAiJkBAIaWAQBikgEAYI8BAEqMAQB0igEAZIYBADSEAQDSgQEAUn8BAEx7AQBAeAEAenUBAKpyAQC4bgEATGwBADpqAQA4ZwEADmQBADRhAQAsXwEAWFsBAIhYAQByVQEAlFEBAIxPAQCoTAEAiEkBAHJGAQBIQwEAiD8BAGI9AQAAOwEALDcBAO4zAQA8MQEAaC0BAIgrAQDmJwEAMCQBAGAhAQAwHwEAMh0BAEoZAQBiFQEAXBEBANwOAQA2CgEAhAcBAFoEAQAwAQEATP4AABL8AACi+AAA0vUAACDzAABu8AAA3u4AAP7sAAAy6wAA/ucAAErnAADA2gAAgtwAAIjbAAAw2QAABNgAAPzVAABi1AAAQNMAAG7SAAA=21.88heuxP/YolEC4HvVA9ig8QfYohkFcj6ZBFK6pQbger0EpXK1BmpmtQWZmsEEfha9BAACsQY/CqUFI4apBMzOrQQrXrUEfhatBheurQT0KqUHXo6pB7FGwQa5Hs0H2KLBBj8KtQXsUqkG4HqdBzcyoQYXrqUFI4aJBMzOhQexRoEGamZ9BZmacQUjhmkFSuJRB7FGQQVyPjEGamYlBPQqFQcP1iEHsUYhBMzOJQVyPiEEUroVB9iiIQXsUhkGkcINB4XqGQZqZh0HheohB4XqGQXsUiEGPwolBSOGGQcP1iEFxPYpB9iiIQcP1iEHD9YZBZmaIQcP1ikFSuIpBj8KLQZqZi0HD9YpBj8KHQT0Kh0FxPYhBKVyJQUjhiEE9ColBw/WIQexRiEFI4YZBCteHQUjhhkFI4YZBFK6HQSlciUGF64VBmpmJQXsUikGF64lB4XqKQTMzi0GkcItBpHCLQaRwi0GamYtBH4WLQeF6iEFSuIRBCteHQT0Kh0GuR4VBMzOFQXsUhkEAAIpBAACIQVK4hEGPwoNBUriEQcP1hEEK14dBUriKQVK4ikHsUYpBexSKQQAAikG4HotB9iiIQcP1hkEAAIZBexSEQXE9hkGkcIdBuB6FQc3MgkFSuIZBpHCHQSlch0EUrodBheuHQRSuh0Fcj4RBXI+AQTMzf0GF64FBPQqDQSlchUFI4YRBKVyJQYXriUGuR4tBmpmLQZqZiUGPwodBmpmLQXsUikHNzIpBmpmNQeF6iEHNzIhBheuHQY/CiUF7FIhB4XqKQbgei0GkcItB16OGQfYohEFSuIRBheuDQexRgEHNzHhB4XpwQUjhYkF7FE5B4XpAQT0KM0EfhSdBhesRQeF69ECuR9lA16PAQD0Kr0AfhatAFK6vQIXrqUBcj6pAheupQMP1qECPwp1A9iicQPYolEAAAHBA9igsQNej8D8=200Vyper Air20400612206520282013-02-02T16:14:085280HBwcHBwbGxsbGxoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGho=AAAAAAAAAAAAAAAAQwUAALANAACnDwAA0SMAAL9EAACbOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA514.5Subsurface-4.0.2/dives/Test.csv000066400000000000000000000032131226345450700163740ustar00rootroot00000000000000Dive Time (s) Depth (m) PPO2 - Setpoint (Bar) PPO2 - C1 Cell 1 (Bar) PPO2 - C1 Cell 2 (Bar) PPO2 - C1 Cell 3 (Bar) PPO2 - C1 Measured (Bar) PPO2 - C2 Cell 1 (Bar) PPO2 - C2 Cell 2 (Bar) PPO2 - C2 Cell 3 (Bar) PPO2 - C2 Measured (Bar) C1 Battery 1 (Volts) C1 Battery 2 (Volts) C2 Battery 1 (Volts) C2 Battery 2 (Volts) Ambient Temp. (Celcius) OTU Exposure (%) CNS Exposure (%) Deco Ceiling (m) Gradient Factor 0 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 19.00 0 0 0 0 60 2.5 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 120 4.5 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 180 5.0 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 240 5.5 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 300 5.0 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 360 5.5 0 0 0 0 0 0 0 0 0 0 0 0 0 17.00 0 0 0 0 420 7.0 0 0 0 0 0 0 0 0 0 0 0 0 0 17.00 0 0 0 0 480 9.0 0 0 0 0 0 0 0 0 0 0 0 0 0 17.00 0 0 0 0 540 11.5 0 0 0 0 0 0 0 0 0 0 0 0 0 16.00 0 0 0 0 600 11.5 0 0 0 0 0 0 0 0 0 0 0 0 0 16.00 0 0 0 0 660 12.5 0 0 0 0 0 0 0 0 0 0 0 0 0 16.00 0 0 0 0 720 13.5 0 0 0 0 0 0 0 0 0 0 0 0 0 16.00 0 0 0 0 780 16.0 0 0 0 0 0 0 0 0 0 0 0 0 0 15.00 0 0 0 0 840 17.0 0 0 0 0 0 0 0 0 0 0 0 0 0 15.00 0 0 0 0 900 18.0 0 0 0 0 0 0 0 0 0 0 0 0 0 15.00 0 0 0 0 960 18.5 0 0 0 0 0 0 0 0 0 0 0 0 0 15.00 0 0 0 0 1020 20.0 0 0 0 0 0 0 0 0 0 0 0 0 0 15.00 0 0 0 0 1080 18.5 0 0 0 0 0 0 0 0 0 0 0 0 0 15.00 0 0 0 0 1140 16.0 0 0 0 0 0 0 0 0 0 0 0 0 0 16.00 0 0 0 0 1200 10.5 0 0 0 0 0 0 0 0 0 0 0 0 0 17.00 0 0 0 0 1260 5.0 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 1320 4.0 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 1380 2.0 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 1440 1.5 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 1460 0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 18.00 0 0 0 0 Subsurface-4.0.2/dives/TestAPDLogViewer.csv000066400000000000000000001165061226345450700205570ustar00rootroot00000000000000Dive Time (s) Depth (m) PPO2 - Setpoint (Bar) PPO2 - C1 Cell 1 (Bar) PPO2 - C1 Cell 2 (Bar) PPO2 - C1 Cell 3 (Bar) PPO2 - C1 Measured (Bar) PPO2 - C2 Cell 1 (Bar) PPO2 - C2 Cell 2 (Bar) PPO2 - C2 Cell 3 (Bar) PPO2 - C2 Measured (Bar) C1 Battery 1 (Volts) C1 Battery 2 (Volts) C2 Battery 1 (Volts) C2 Battery 2 (Volts) Ambient Temp. (Celcius) OTU Exposure (%) CNS Exposure (%) Deco Ceiling (m) Gradient Factor 0 0.0 0.70 0.81 0.84 0.76 0.82 0.81 0.84 0.77 0.82 5.35 5.47 5.33 5.47 19.80 0.0 0.0 0.0 0.00 0 1.2 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 19.80 0.0 0.0 0.0 0.00 0 0.0 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 19.80 0.0 0.0 0.0 0.00 0 1.2 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 0.00 0 1.2 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 85.00 10 1.6 0.70 0.72 0.72 0.70 0.72 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 85.00 20 1.6 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 85.00 30 1.7 0.70 0.71 0.69 0.68 0.69 0.71 0.69 0.69 0.69 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 85.00 40 1.8 0.70 0.68 0.66 0.64 0.68 0.68 0.66 0.65 0.66 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 85.00 50 1.6 0.70 0.68 0.66 0.64 0.68 0.68 0.66 0.65 0.66 5.28 5.47 5.25 5.47 16.20 0.0 0.0 0.0 85.00 60 2.4 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 15.80 0.0 0.0 0.0 85.00 70 3.5 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.69 0.69 5.28 5.47 5.25 5.47 15.80 0.0 0.0 0.0 85.00 80 4.2 0.70 0.72 0.70 0.70 0.70 0.72 0.70 0.70 0.70 5.28 5.47 5.25 5.47 15.80 0.0 0.0 0.0 85.00 90 4.0 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.68 0.70 5.28 5.47 5.25 5.47 15.80 0.0 0.0 0.0 85.00 100 4.3 0.70 0.65 0.63 0.62 0.63 0.67 0.63 0.63 0.63 5.28 5.47 5.25 5.47 15.80 0.0 0.0 0.0 85.00 110 4.4 0.70 0.71 0.67 0.66 0.67 0.71 0.67 0.67 0.67 5.28 5.47 5.25 5.47 15.80 0.0 0.0 0.0 85.00 120 4.5 0.70 0.69 0.67 0.66 0.67 0.69 0.67 0.67 0.67 5.28 5.47 5.25 5.47 15.40 0.0 0.0 0.0 85.00 130 4.9 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.69 0.69 5.28 5.47 5.25 5.47 15.40 0.0 0.0 0.0 85.00 140 4.5 0.70 0.71 0.69 0.68 0.69 0.71 0.69 0.68 0.69 5.28 5.47 5.25 5.47 15.40 0.0 0.0 0.0 85.00 150 4.2 0.70 0.71 0.69 0.67 0.68 0.71 0.69 0.68 0.69 5.28 5.47 5.25 5.47 15.40 0.0 0.0 0.0 85.00 160 4.5 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.68 0.70 5.28 5.47 5.25 5.47 15.40 0.0 0.0 0.0 85.00 170 4.8 0.70 0.72 0.72 0.70 0.72 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 15.40 0.0 0.0 0.0 85.00 180 4.8 0.70 0.69 0.67 0.66 0.67 0.69 0.67 0.67 0.67 5.28 5.47 5.25 5.47 15.20 0.0 0.0 0.0 85.00 190 4.6 0.70 0.68 0.67 0.66 0.68 0.68 0.67 0.67 0.67 5.28 5.47 5.25 5.47 15.20 0.0 0.0 0.0 85.00 200 4.9 0.70 0.69 0.67 0.66 0.67 0.69 0.67 0.67 0.67 5.28 5.47 5.25 5.47 15.20 0.0 0.0 0.0 85.00 210 4.9 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 15.20 0.0 0.0 0.0 85.00 220 5.1 0.70 0.69 0.70 0.68 0.69 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 15.20 0.0 0.0 0.0 85.00 230 5.0 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 15.20 0.0 0.0 0.0 85.00 240 5.3 0.70 0.72 0.72 0.70 0.72 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 14.90 0.0 0.0 0.0 85.00 250 5.6 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 14.90 0.0 0.0 0.0 85.00 260 5.6 0.70 0.68 0.66 0.66 0.66 0.68 0.66 0.67 0.68 5.28 5.47 5.25 5.47 14.90 0.0 0.0 0.0 85.00 270 5.2 0.70 0.68 0.67 0.66 0.68 0.68 0.67 0.67 0.67 5.28 5.47 5.25 5.47 14.90 0.0 0.0 0.0 85.00 280 4.9 0.70 0.69 0.67 0.66 0.67 0.69 0.67 0.67 0.67 5.28 5.47 5.25 5.47 14.90 0.0 0.0 0.0 85.00 290 4.9 0.70 0.69 0.67 0.66 0.67 0.69 0.67 0.67 0.67 5.28 5.47 5.25 5.47 14.90 0.0 0.0 0.0 85.00 300 4.7 0.70 0.68 0.67 0.67 0.67 0.68 0.69 0.67 0.69 5.28 5.47 5.25 5.47 14.70 0.0 0.0 0.0 85.00 310 4.9 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 14.70 0.0 0.0 0.0 85.00 320 4.9 0.70 0.68 0.67 0.67 0.67 0.68 0.67 0.68 0.68 5.28 5.47 5.25 5.47 14.70 0.0 0.0 0.0 85.00 330 5.2 0.70 0.71 0.70 0.68 0.70 0.71 0.69 0.69 0.69 5.28 5.47 5.25 5.47 14.70 0.0 0.0 0.0 85.00 340 5.6 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 14.70 0.0 0.0 0.0 85.00 350 5.6 0.70 1.20 1.25 1.18 1.19 1.20 1.25 1.19 1.19 5.28 5.47 5.25 5.47 14.70 0.0 0.0 0.0 85.00 360 5.6 0.70 1.44 1.46 1.43 1.44 1.44 1.46 1.44 1.44 5.28 5.47 5.25 5.47 14.60 1.0 1.0 0.0 85.00 370 5.4 0.70 1.41 1.41 1.41 1.41 1.41 1.41 1.43 1.41 5.28 5.47 5.25 5.47 14.60 1.0 1.0 0.0 85.00 380 5.8 0.70 0.61 0.58 0.63 0.62 0.62 0.58 0.64 0.63 5.28 5.47 5.25 5.47 14.60 1.0 1.0 0.0 85.00 390 6.0 0.70 0.85 0.81 0.78 0.80 0.85 0.81 0.79 0.80 5.28 5.47 5.25 5.47 14.60 1.0 1.0 0.0 85.00 400 6.3 0.70 0.74 0.73 0.73 0.73 0.74 0.73 0.74 0.74 5.28 5.47 5.25 5.47 14.60 1.0 1.0 0.0 85.00 410 6.6 0.70 0.75 0.74 0.73 0.75 0.75 0.74 0.74 0.74 5.28 5.47 5.25 5.47 14.60 1.0 1.0 0.0 85.00 420 6.9 0.70 0.75 0.74 0.73 0.75 0.75 0.74 0.74 0.74 5.28 5.47 5.25 5.47 14.40 1.0 1.0 0.0 85.00 430 7.3 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 14.40 1.0 1.0 0.0 85.00 440 7.5 0.70 0.71 0.70 0.70 0.70 0.69 0.70 0.70 0.70 5.28 5.47 5.25 5.47 14.40 1.0 1.0 0.0 85.00 450 8.1 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 14.40 1.0 1.0 0.0 85.00 460 8.8 0.70 0.72 0.70 0.70 0.70 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 14.40 1.0 1.0 0.0 85.00 470 8.7 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.69 0.69 5.28 5.47 5.25 5.47 14.40 1.0 1.0 0.0 85.00 480 8.8 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 14.10 1.0 1.0 0.0 85.00 490 9.1 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.69 0.69 5.28 5.47 5.25 5.47 14.10 1.0 1.0 0.0 85.00 500 9.3 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 14.10 1.0 1.0 0.0 85.00 510 8.9 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 14.10 1.0 1.0 0.0 85.00 520 9.2 0.70 0.68 0.66 0.66 0.66 0.68 0.66 0.67 0.68 5.28 5.47 5.25 5.47 14.10 1.0 1.0 0.0 85.00 530 10.3 0.70 0.74 0.72 0.71 0.71 0.74 0.73 0.70 0.73 5.28 5.47 5.25 5.47 14.10 1.0 1.0 0.0 85.00 540 11.4 0.70 0.72 0.73 0.71 0.72 0.72 0.73 0.72 0.72 5.28 5.47 5.25 5.47 13.60 1.0 1.0 0.0 85.00 550 11.9 0.70 0.72 0.73 0.72 0.72 0.72 0.73 0.72 0.72 5.28 5.47 5.25 5.47 13.60 1.0 1.0 0.0 85.00 560 12.0 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 13.60 1.0 1.0 0.0 85.00 570 11.9 0.70 0.69 0.69 0.70 0.69 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 13.60 1.0 1.0 0.0 85.00 580 11.6 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 13.60 1.0 1.0 0.0 85.00 590 11.6 0.70 0.72 0.72 0.70 0.72 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 13.60 1.0 1.0 0.0 85.00 600 11.4 0.70 0.67 0.66 0.66 0.66 0.67 0.66 0.67 0.67 5.28 5.47 5.25 5.47 13.00 1.0 2.0 0.0 85.00 610 11.8 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 13.00 1.0 2.0 0.0 85.00 620 12.3 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 13.00 1.0 2.0 0.0 85.00 630 12.2 0.70 0.68 0.67 0.67 0.67 0.68 0.67 0.68 0.68 5.28 5.47 5.25 5.47 13.00 1.0 2.0 0.0 85.00 640 12.4 0.70 0.71 0.69 0.68 0.69 0.71 0.69 0.69 0.69 5.28 5.47 5.25 5.47 13.00 1.0 2.0 0.0 85.00 650 12.8 0.70 0.69 0.69 0.67 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 13.00 1.0 2.0 0.0 85.00 660 12.6 0.70 0.71 0.70 0.68 0.70 0.71 0.70 0.69 0.71 5.28 5.47 5.25 5.47 12.30 1.0 2.0 0.0 85.00 670 12.7 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.68 0.69 5.28 5.47 5.25 5.47 12.30 1.0 2.0 0.0 85.00 680 12.8 0.70 0.68 0.67 0.67 0.67 0.68 0.67 0.68 0.68 5.28 5.47 5.25 5.47 12.30 1.0 2.0 0.0 85.00 690 12.6 0.70 0.71 0.69 0.68 0.69 0.71 0.69 0.69 0.69 5.28 5.47 5.25 5.47 12.30 1.0 2.0 0.0 85.00 700 12.8 0.70 0.72 0.72 0.70 0.72 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 12.30 1.0 2.0 0.0 85.00 710 13.0 0.70 0.72 0.72 0.70 0.72 0.72 0.72 0.70 0.72 5.28 5.47 5.25 5.47 12.30 1.0 2.0 0.0 85.00 720 13.3 0.70 0.69 0.69 0.68 0.69 0.69 0.69 0.69 0.69 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 730 13.4 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 740 13.8 0.70 0.71 0.72 0.70 0.71 0.71 0.72 0.70 0.71 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 750 14.6 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 750 14.6 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 750 14.6 0.70 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 752 14.6 1.30 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 753 14.6 1.30 0.71 0.70 0.70 0.70 0.71 0.70 0.70 0.70 5.28 5.47 5.25 5.47 11.60 2.0 2.0 0.0 85.00 760 15.5 1.30 0.92 0.91 0.87 0.92 0.92 0.91 0.87 0.92 5.28 5.45 5.25 5.45 11.60 2.0 2.0 0.0 85.00 769 15.5 1.30 0.92 0.91 0.87 0.92 0.92 0.91 0.87 0.92 5.28 5.45 5.25 5.45 11.60 2.0 2.0 0.0 85.00 770 15.8 1.30 1.34 1.34 1.28 1.34 1.34 1.34 1.30 1.34 5.20 5.45 5.20 5.45 11.60 2.0 2.0 0.0 85.00 780 16.2 1.30 1.07 1.06 1.04 1.06 1.07 1.06 1.04 1.06 5.20 5.45 5.20 5.45 10.80 2.0 2.0 0.0 85.00 790 16.1 1.30 1.27 1.23 1.22 1.23 1.27 1.23 1.22 1.23 5.20 5.45 5.20 5.45 10.80 2.0 2.0 0.0 85.00 800 16.1 1.30 1.37 1.35 1.32 1.36 1.37 1.35 1.32 1.36 5.20 5.45 5.20 5.45 10.80 2.0 2.0 0.0 85.00 810 16.7 1.30 1.23 1.19 1.19 1.19 1.24 1.20 1.21 1.21 5.20 5.45 5.20 5.45 10.80 2.0 2.0 0.0 85.00 820 16.8 1.30 1.31 1.29 1.29 1.29 1.31 1.29 1.30 1.31 5.20 5.45 5.20 5.45 10.80 2.0 2.0 0.0 85.00 830 17.0 1.30 1.34 1.33 1.32 1.34 1.34 1.33 1.34 1.34 5.20 5.45 5.20 5.45 10.80 2.0 2.0 0.0 85.00 840 17.2 1.30 1.31 1.30 1.29 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 9.90 2.0 3.0 0.0 85.00 850 17.4 1.30 1.31 1.31 1.31 1.31 1.31 1.31 1.32 1.31 5.20 5.45 5.20 5.45 9.90 2.0 3.0 0.0 85.00 860 17.4 1.30 1.30 1.30 1.29 1.30 1.30 1.30 1.31 1.30 5.20 5.45 5.20 5.45 9.90 2.0 3.0 0.0 85.00 870 17.6 1.30 1.28 1.29 1.28 1.28 1.30 1.29 1.30 1.30 5.20 5.45 5.20 5.45 9.90 2.0 3.0 0.0 85.00 880 17.7 1.30 1.31 1.29 1.29 1.29 1.31 1.29 1.30 1.31 5.20 5.45 5.20 5.45 9.90 2.0 3.0 0.0 85.00 890 17.9 1.30 1.34 1.31 1.31 1.31 1.34 1.31 1.32 1.31 5.20 5.45 5.20 5.45 9.90 2.0 3.0 0.0 85.00 900 17.9 1.30 1.31 1.30 1.31 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 9.20 3.0 3.0 0.0 85.00 910 18.2 1.30 1.32 1.31 1.32 1.32 1.32 1.31 1.32 1.32 5.20 5.45 5.20 5.45 9.20 3.0 3.0 0.0 85.00 920 17.8 1.30 1.31 1.30 1.31 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 9.20 3.0 3.0 0.0 85.00 930 18.1 1.30 1.31 1.29 1.29 1.29 1.31 1.29 1.30 1.31 5.20 5.45 5.20 5.45 9.20 3.0 3.0 0.0 85.00 940 18.1 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 9.20 3.0 3.0 0.0 85.00 950 17.9 1.30 1.32 1.30 1.29 1.29 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 9.20 3.0 3.0 0.0 85.00 960 18.4 1.30 1.31 1.29 1.29 1.29 1.31 1.29 1.31 1.31 5.20 5.45 5.20 5.45 8.60 3.0 4.0 0.0 85.00 970 18.8 1.30 1.34 1.31 1.32 1.31 1.34 1.31 1.32 1.31 5.20 5.45 5.20 5.45 8.60 3.0 4.0 0.0 85.00 980 19.2 1.30 1.32 1.31 1.32 1.32 1.32 1.31 1.32 1.32 5.20 5.45 5.20 5.45 8.60 3.0 4.0 0.0 85.00 990 19.3 1.30 1.31 1.30 1.31 1.31 1.31 1.30 1.32 1.31 5.20 5.45 5.20 5.45 8.60 3.0 4.0 0.0 85.00 1000 19.3 1.30 1.31 1.30 1.31 1.31 1.31 1.30 1.32 1.31 5.20 5.45 5.20 5.45 8.60 3.0 4.0 0.0 85.00 1010 19.4 1.30 1.31 1.29 1.29 1.29 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 8.60 3.0 4.0 0.0 85.00 1020 19.8 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.32 1.32 5.20 5.45 5.20 5.45 8.20 4.0 4.0 0.0 85.00 1030 20.1 1.30 1.32 1.31 1.32 1.32 1.32 1.31 1.32 1.32 5.20 5.45 5.20 5.45 8.20 4.0 4.0 0.0 85.00 1040 20.3 1.30 1.30 1.27 1.28 1.27 1.30 1.27 1.28 1.27 5.20 5.45 5.20 5.45 8.20 4.0 4.0 0.0 85.00 1050 20.4 1.30 1.31 1.29 1.28 1.29 1.31 1.29 1.30 1.31 5.20 5.45 5.20 5.45 8.20 4.0 4.0 0.0 85.00 1060 20.7 1.30 1.32 1.30 1.29 1.29 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 8.20 4.0 4.0 0.0 85.00 1070 21.1 1.30 1.34 1.31 1.32 1.31 1.34 1.31 1.32 1.31 5.20 5.45 5.20 5.45 8.20 4.0 4.0 0.0 85.00 1080 21.3 1.30 1.31 1.30 1.29 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 7.90 4.0 5.0 0.0 85.00 1090 21.7 1.30 1.32 1.30 1.31 1.32 1.32 1.31 1.32 1.32 5.20 5.45 5.20 5.45 7.90 4.0 5.0 0.0 85.00 1100 21.9 1.30 1.32 1.31 1.32 1.32 1.32 1.31 1.32 1.32 5.20 5.45 5.20 5.45 7.90 4.0 5.0 0.0 85.00 1110 22.0 1.30 1.31 1.29 1.29 1.29 1.31 1.29 1.31 1.31 5.20 5.45 5.20 5.45 7.90 4.0 5.0 0.0 85.00 1120 22.2 1.30 1.32 1.29 1.28 1.29 1.32 1.29 1.30 1.29 5.20 5.45 5.20 5.45 7.90 4.0 5.0 0.0 85.00 1130 22.2 1.30 1.31 1.27 1.28 1.27 1.31 1.29 1.30 1.31 5.20 5.45 5.20 5.45 7.90 4.0 5.0 0.0 85.00 1140 21.9 1.30 1.32 1.30 1.29 1.29 1.32 1.30 1.30 1.30 5.20 5.45 5.20 5.45 7.70 5.0 6.0 0.0 85.00 1150 22.1 1.30 1.35 1.31 1.31 1.31 1.35 1.31 1.32 1.31 5.20 5.45 5.20 5.45 7.70 5.0 6.0 0.0 85.00 1160 22.1 1.30 1.32 1.30 1.29 1.29 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 7.70 5.0 6.0 0.0 85.00 1170 22.2 1.30 1.32 1.31 1.31 1.31 1.34 1.31 1.32 1.31 5.20 5.45 5.20 5.45 7.70 5.0 6.0 0.0 85.00 1180 22.5 1.30 1.31 1.30 1.29 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 7.70 5.0 6.0 0.0 85.00 1190 22.1 1.30 1.30 1.27 1.28 1.27 1.30 1.27 1.28 1.27 5.20 5.45 5.20 5.45 7.70 5.0 6.0 0.0 85.00 1200 22.3 1.30 1.31 1.27 1.28 1.27 1.31 1.27 1.28 1.27 5.20 5.45 5.20 5.45 7.50 5.0 6.0 0.0 85.00 1210 22.2 1.30 1.35 1.31 1.31 1.31 1.35 1.31 1.32 1.31 5.20 5.45 5.20 5.45 7.50 5.0 6.0 0.0 85.00 1220 22.0 1.30 1.30 1.27 1.27 1.27 1.30 1.27 1.28 1.27 5.20 5.45 5.20 5.45 7.50 5.0 6.0 0.0 85.00 1230 22.3 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.32 1.32 5.20 5.45 5.20 5.45 7.50 5.0 6.0 0.0 85.00 1240 22.3 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 7.50 5.0 6.0 0.0 85.00 1250 22.7 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 7.50 5.0 6.0 0.0 85.00 1260 22.8 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1270 22.8 1.30 1.31 1.30 1.29 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1280 22.6 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.32 1.32 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1290 22.8 1.30 1.31 1.29 1.29 1.29 1.31 1.29 1.30 1.31 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1300 22.7 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.32 1.32 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1310 22.8 1.30 1.31 1.30 1.31 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1320 23.1 1.30 1.32 1.30 1.31 1.32 1.32 1.30 1.32 1.32 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1330 23.4 1.30 1.34 1.30 1.31 1.31 1.34 1.30 1.32 1.34 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1340 23.5 1.30 1.32 1.29 1.31 1.31 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1350 23.6 1.30 1.34 1.30 1.31 1.31 1.34 1.30 1.32 1.34 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1360 24.0 1.30 1.32 1.29 1.31 1.31 1.32 1.29 1.31 1.31 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1370 23.9 1.30 1.34 1.30 1.31 1.31 1.34 1.30 1.32 1.34 5.20 5.45 5.20 5.45 7.30 6.0 7.0 0.0 85.00 1380 23.8 1.30 1.31 1.27 1.28 1.27 1.31 1.27 1.30 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1390 24.0 1.30 1.34 1.29 1.31 1.30 1.34 1.29 1.31 1.30 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1400 24.3 1.30 1.34 1.29 1.31 1.30 1.34 1.29 1.32 1.33 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1410 24.3 1.30 1.32 1.29 1.31 1.31 1.32 1.29 1.31 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1420 24.5 1.30 1.32 1.27 1.29 1.28 1.32 1.27 1.31 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1430 24.6 1.30 1.34 1.29 1.32 1.33 1.35 1.30 1.32 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1440 24.8 1.30 1.32 1.27 1.31 1.31 1.32 1.29 1.31 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1450 25.1 1.30 1.32 1.27 1.29 1.28 1.32 1.27 1.31 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1460 24.9 1.30 1.34 1.27 1.31 1.33 1.34 1.27 1.31 1.33 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1470 24.9 1.30 1.34 1.26 1.28 1.27 1.34 1.27 1.30 1.29 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1480 25.3 1.30 1.37 1.29 1.31 1.30 1.37 1.30 1.32 1.31 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1490 25.2 1.30 1.35 1.29 1.31 1.30 1.35 1.29 1.32 1.35 5.20 5.45 5.20 5.45 7.10 7.0 8.0 0.0 85.00 1500 25.0 1.30 1.31 1.26 1.28 1.27 1.31 1.26 1.30 1.31 5.20 5.45 5.20 5.45 7.00 8.0 9.0 0.0 85.00 1510 24.8 1.30 1.37 1.30 1.33 1.31 1.37 1.30 1.34 1.36 5.20 5.45 5.20 5.45 7.00 8.0 9.0 0.0 85.00 1520 24.7 1.30 1.31 1.26 1.28 1.27 1.31 1.26 1.30 1.31 5.20 5.45 5.20 5.45 7.00 8.0 9.0 0.0 85.00 1530 24.8 1.30 1.35 1.29 1.31 1.30 1.35 1.29 1.32 1.35 5.20 5.45 5.20 5.45 7.00 8.0 9.0 0.0 85.00 1540 24.9 1.30 1.35 1.29 1.31 1.30 1.34 1.29 1.31 1.30 5.20 5.45 5.20 5.45 7.00 8.0 9.0 0.0 85.00 1550 24.7 1.30 1.34 1.27 1.29 1.28 1.34 1.27 1.31 1.33 5.20 5.45 5.20 5.45 7.00 8.0 9.0 0.0 85.00 1560 24.5 1.30 1.37 1.30 1.31 1.31 1.37 1.30 1.32 1.31 5.20 5.45 5.20 5.45 7.00 8.0 10.0 0.0 85.00 1570 24.4 1.30 1.31 1.26 1.28 1.27 1.31 1.26 1.30 1.31 5.20 5.45 5.20 5.45 7.00 8.0 10.0 0.0 85.00 1580 24.3 1.30 1.34 1.29 1.31 1.30 1.34 1.29 1.32 1.33 5.20 5.45 5.20 5.45 7.00 8.0 10.0 0.0 85.00 1590 24.3 1.30 1.35 1.29 1.29 1.29 1.35 1.29 1.31 1.30 5.20 5.45 5.20 5.45 7.00 8.0 10.0 0.0 85.00 1600 23.8 1.30 1.31 1.26 1.28 1.27 1.31 1.26 1.28 1.27 5.20 5.45 5.20 5.45 7.00 8.0 10.0 0.0 85.00 1610 23.4 1.30 1.37 1.33 1.33 1.33 1.37 1.33 1.34 1.34 5.20 5.45 5.20 5.45 7.00 8.0 10.0 0.0 85.00 1620 23.2 1.30 1.32 1.27 1.29 1.28 1.32 1.27 1.30 1.31 5.20 5.45 5.20 5.45 7.00 9.0 10.0 0.0 85.00 1630 23.3 1.30 1.32 1.27 1.29 1.28 1.32 1.27 1.30 1.31 5.20 5.45 5.20 5.45 7.00 9.0 10.0 0.0 85.00 1640 23.1 1.30 1.34 1.29 1.29 1.29 1.34 1.29 1.31 1.30 5.20 5.45 5.20 5.45 7.00 9.0 10.0 0.0 85.00 1650 23.3 1.30 1.32 1.27 1.29 1.28 1.32 1.29 1.30 1.29 5.20 5.45 5.20 5.45 7.00 9.0 10.0 0.0 85.00 1660 23.7 1.30 1.35 1.31 1.31 1.31 1.35 1.31 1.32 1.31 5.20 5.45 5.20 5.45 7.00 9.0 10.0 0.0 85.00 1670 23.9 1.30 1.32 1.29 1.29 1.29 1.32 1.30 1.30 1.30 5.20 5.45 5.20 5.45 7.00 9.0 10.0 0.0 85.00 1680 23.8 1.30 1.34 1.30 1.31 1.31 1.34 1.31 1.32 1.31 5.20 5.45 5.20 5.45 7.00 9.0 11.0 0.0 85.00 1690 23.8 1.30 1.34 1.31 1.31 1.31 1.34 1.31 1.32 1.31 5.20 5.45 5.20 5.45 7.00 9.0 11.0 0.0 85.00 1700 23.6 1.30 1.32 1.30 1.29 1.29 1.32 1.30 1.31 1.32 5.20 5.45 5.20 5.45 7.00 9.0 11.0 0.0 85.00 1710 23.4 1.30 1.31 1.30 1.29 1.31 1.31 1.30 1.31 1.31 5.20 5.45 5.20 5.45 7.00 9.0 11.0 0.0 85.00 1720 23.2 1.30 1.34 1.33 1.32 1.34 1.35 1.33 1.32 1.33 5.20 5.45 5.20 5.45 7.00 9.0 11.0 0.0 85.00 1730 23.2 1.30 1.35 1.34 1.33 1.35 1.35 1.34 1.34 1.34 5.20 5.45 5.20 5.45 7.00 9.0 11.0 0.0 85.00 1740 22.9 1.30 1.34 1.31 1.29 1.30 1.34 1.31 1.31 1.31 5.20 5.45 5.20 5.45 7.00 10.0 11.0 0.0 85.00 1750 22.5 1.30 1.30 1.27 1.27 1.27 1.30 1.29 1.28 1.30 5.20 5.45 5.20 5.45 7.00 10.0 11.0 0.0 85.00 1760 22.5 1.30 1.31 1.29 1.28 1.29 1.31 1.29 1.28 1.29 5.20 5.45 5.20 5.45 7.00 10.0 11.0 0.0 85.00 1770 22.5 1.30 1.31 1.29 1.27 1.31 1.31 1.29 1.28 1.29 5.20 5.45 5.20 5.45 7.00 10.0 11.0 0.0 85.00 1780 22.5 1.30 1.35 1.34 1.32 1.35 1.35 1.34 1.34 1.34 5.20 5.45 5.20 5.45 7.00 10.0 11.0 0.0 85.00 1790 22.6 1.30 1.32 1.29 1.28 1.29 1.32 1.30 1.30 1.30 5.20 5.45 5.20 5.45 7.00 10.0 11.0 0.0 85.00 1800 22.5 1.30 1.32 1.30 1.29 1.29 1.32 1.30 1.30 1.30 5.20 5.45 5.20 5.45 7.00 10.0 12.0 0.0 85.00 1810 22.5 1.30 1.31 1.29 1.28 1.29 1.31 1.30 1.28 1.31 5.20 5.45 5.20 5.45 7.00 10.0 12.0 0.0 85.00 1820 22.5 1.30 1.31 1.29 1.27 1.31 1.31 1.29 1.28 1.29 5.20 5.45 5.20 5.45 7.00 10.0 12.0 0.0 85.00 1830 22.6 1.30 1.34 1.30 1.28 1.29 1.34 1.30 1.30 1.30 5.20 5.45 5.20 5.45 7.00 10.0 12.0 0.0 85.00 1840 22.4 1.30 1.32 1.30 1.28 1.32 1.32 1.30 1.30 1.30 5.20 5.45 5.20 5.45 7.00 10.0 12.0 0.0 85.00 1850 22.5 1.30 1.32 1.30 1.28 1.32 1.32 1.30 1.28 1.32 5.20 5.45 5.20 5.45 7.00 10.0 12.0 0.0 85.00 1860 22.9 1.30 1.34 1.31 1.29 1.30 1.34 1.31 1.31 1.31 5.20 5.45 5.20 5.45 7.00 11.0 12.0 0.0 85.00 1870 22.4 1.30 1.32 1.30 1.27 1.31 1.32 1.30 1.28 1.32 5.20 5.45 5.20 5.45 7.00 11.0 12.0 0.0 85.00 1880 22.8 1.30 1.31 1.29 1.26 1.30 1.31 1.29 1.27 1.31 5.20 5.45 5.20 5.45 7.00 11.0 12.0 0.0 85.00 1890 22.6 1.30 1.30 1.27 1.26 1.27 1.31 1.27 1.27 1.27 5.20 5.45 5.20 5.45 7.00 11.0 12.0 0.0 85.00 1900 22.5 1.30 1.32 1.29 1.27 1.28 1.32 1.29 1.27 1.28 5.20 5.45 5.20 5.45 7.00 11.0 12.0 0.0 85.00 1910 22.4 1.30 1.32 1.29 1.27 1.28 1.32 1.29 1.28 1.29 5.20 5.45 5.20 5.45 7.00 11.0 12.0 0.0 85.00 1920 21.9 1.30 1.35 1.31 1.28 1.29 1.35 1.31 1.28 1.29 5.20 5.45 5.20 5.45 7.00 11.0 13.0 0.0 85.00 1930 22.0 1.30 1.35 1.33 1.29 1.34 1.37 1.33 1.30 1.31 5.20 5.45 5.20 5.45 7.00 11.0 13.0 0.0 85.00 1940 20.8 1.30 1.35 1.30 1.27 1.29 1.35 1.30 1.28 1.29 5.20 5.45 5.20 5.45 7.00 11.0 13.0 0.0 85.00 1950 21.1 1.30 1.34 1.30 1.27 1.29 1.34 1.30 1.27 1.29 5.20 5.45 5.20 5.45 7.00 11.0 13.0 0.0 85.00 1960 21.1 1.30 1.34 1.30 1.28 1.29 1.34 1.30 1.28 1.29 5.20 5.45 5.20 5.45 7.00 11.0 13.0 0.0 85.00 1970 21.1 1.30 1.32 1.30 1.27 1.31 1.32 1.30 1.28 1.32 5.20 5.45 5.20 5.45 7.00 11.0 13.0 0.0 85.00 1980 20.8 1.30 1.31 1.29 1.26 1.30 1.31 1.30 1.27 1.31 5.20 5.45 5.20 5.45 7.00 12.0 13.0 0.0 85.00 1990 20.6 1.30 1.30 1.27 1.24 1.30 1.30 1.27 1.26 1.27 5.20 5.45 5.20 5.45 7.00 12.0 13.0 0.0 85.00 2000 20.7 1.30 1.34 1.31 1.27 1.33 1.34 1.31 1.28 1.34 5.20 5.45 5.20 5.45 7.00 12.0 13.0 0.0 85.00 2010 20.5 1.30 1.32 1.29 1.26 1.32 1.32 1.29 1.27 1.28 5.20 5.45 5.20 5.45 7.00 12.0 13.0 0.0 85.00 2020 19.9 1.30 1.32 1.30 1.26 1.31 1.32 1.30 1.27 1.31 5.20 5.45 5.20 5.45 7.00 12.0 13.0 0.0 85.00 2030 20.5 1.30 1.31 1.29 1.26 1.30 1.31 1.29 1.27 1.31 5.20 5.45 5.20 5.45 7.00 12.0 13.0 0.0 85.00 2040 20.7 1.30 1.32 1.31 1.27 1.31 1.32 1.31 1.28 1.31 5.20 5.45 5.20 5.45 7.00 12.0 14.0 0.0 85.00 2050 20.6 1.30 1.30 1.27 1.24 1.30 1.30 1.27 1.26 1.27 5.20 5.45 5.20 5.45 7.00 12.0 14.0 0.0 85.00 2060 20.1 1.30 1.32 1.30 1.28 1.32 1.32 1.30 1.28 1.32 5.20 5.45 5.20 5.45 7.00 12.0 14.0 0.0 85.00 2070 19.6 1.30 1.28 1.26 1.23 1.27 1.28 1.26 1.25 1.25 5.20 5.45 5.20 5.45 7.00 12.0 14.0 0.0 85.00 2080 19.3 1.30 1.28 1.23 1.20 1.21 1.28 1.23 1.22 1.23 5.20 5.45 5.20 5.45 7.00 12.0 14.0 0.0 85.00 2090 19.0 1.30 1.34 1.29 1.24 1.34 1.34 1.29 1.26 1.27 5.20 5.45 5.20 5.45 7.00 12.0 14.0 0.0 85.00 2100 18.7 1.30 1.31 1.27 1.23 1.31 1.31 1.27 1.25 1.26 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2110 18.3 1.30 1.30 1.27 1.22 1.29 1.30 1.27 1.23 1.29 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2120 18.5 1.30 1.31 1.30 1.26 1.31 1.31 1.30 1.27 1.31 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2130 18.9 1.30 1.30 1.27 1.24 1.30 1.30 1.29 1.26 1.29 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2140 18.4 1.30 1.28 1.27 1.23 1.27 1.28 1.27 1.25 1.27 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2150 18.1 1.30 1.30 1.27 1.23 1.29 1.30 1.27 1.25 1.26 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2160 18.1 1.30 1.28 1.27 1.23 1.27 1.28 1.27 1.25 1.27 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2170 17.6 1.30 1.28 1.26 1.22 1.27 1.28 1.26 1.23 1.27 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2180 17.2 1.30 1.30 1.29 1.24 1.29 1.31 1.29 1.25 1.30 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2190 16.9 1.30 1.31 1.29 1.23 1.30 1.31 1.29 1.25 1.30 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2200 16.3 1.30 1.31 1.30 1.26 1.31 1.31 1.31 1.26 1.31 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2210 16.0 1.30 1.31 1.29 1.24 1.30 1.31 1.29 1.26 1.30 5.20 5.45 5.20 5.45 7.00 13.0 15.0 0.0 85.00 2220 15.8 1.30 1.24 1.23 1.19 1.23 1.24 1.23 1.21 1.23 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2230 15.6 1.30 1.30 1.29 1.23 1.29 1.30 1.29 1.25 1.29 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2240 15.6 1.30 1.30 1.27 1.23 1.29 1.30 1.27 1.25 1.26 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2250 15.2 1.30 1.28 1.27 1.23 1.27 1.28 1.29 1.25 1.29 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2250 15.2 1.30 1.28 1.27 1.23 1.27 1.28 1.29 1.25 1.29 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2250 15.2 1.30 1.28 1.27 1.23 1.27 1.28 1.29 1.25 1.29 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2251 15.2 1.30 1.28 1.27 1.23 1.27 1.28 1.29 1.25 1.29 5.20 5.45 5.20 5.45 7.10 14.0 16.0 0.0 85.00 2260 14.9 1.30 1.28 1.29 1.23 1.29 1.28 1.29 1.25 1.29 5.17 5.45 5.17 5.45 7.10 14.0 16.0 0.0 85.00 2270 13.6 1.30 1.27 1.27 1.22 1.27 1.27 1.27 1.23 1.27 5.13 5.45 5.13 5.45 7.10 14.0 16.0 0.0 85.00 2270 13.6 1.30 1.27 1.27 1.22 1.27 1.27 1.27 1.23 1.27 5.13 5.45 5.13 5.45 7.10 14.0 16.0 0.0 85.00 2270 13.6 1.30 1.27 1.27 1.22 1.27 1.27 1.27 1.23 1.27 5.13 5.45 5.13 5.45 7.10 14.0 16.0 0.0 85.00 2280 14.0 1.30 1.28 1.27 1.22 1.27 1.28 1.27 1.23 1.27 5.13 5.45 5.13 5.45 7.30 14.0 16.0 0.0 85.00 2280 14.0 0.70 1.28 1.27 1.22 1.27 1.28 1.27 1.23 1.27 5.13 5.45 5.13 5.45 7.30 14.0 16.0 0.0 85.00 2280 14.0 0.70 1.28 1.27 1.22 1.27 1.28 1.27 1.23 1.27 5.13 5.45 5.13 5.45 7.30 14.0 16.0 0.0 85.00 2290 13.1 0.70 1.23 1.23 1.19 1.23 1.23 1.23 1.21 1.23 5.13 5.45 5.13 5.45 7.30 14.0 16.0 0.0 85.00 2300 13.3 0.70 1.21 1.22 1.17 1.21 1.21 1.22 1.18 1.21 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2300 13.3 0.70 1.21 1.22 1.17 1.21 1.21 1.22 1.18 1.21 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2310 13.4 0.70 1.20 1.20 1.15 1.20 1.20 1.20 1.17 1.20 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2310 13.4 0.70 1.20 1.20 1.15 1.20 1.20 1.20 1.17 1.20 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2310 13.4 0.70 1.20 1.20 1.15 1.20 1.20 1.20 1.17 1.20 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2310 13.4 0.70 1.20 1.20 1.15 1.20 1.20 1.20 1.17 1.20 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2320 13.4 0.70 1.18 1.19 1.14 1.19 1.18 1.19 1.16 1.19 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2330 13.2 0.70 1.16 1.16 1.13 1.16 1.16 1.16 1.13 1.16 4.83 5.45 4.83 5.45 7.30 14.0 16.0 0.0 85.00 2340 12.8 0.70 1.13 1.14 1.10 1.13 1.13 1.14 1.10 1.13 4.83 5.45 4.83 5.45 7.60 15.0 17.0 0.0 85.00 2350 12.4 0.70 1.10 1.10 1.05 1.10 1.10 1.10 1.06 1.10 4.83 5.45 4.83 5.45 7.60 15.0 17.0 0.0 85.00 2360 12.2 0.70 1.10 1.12 1.08 1.10 1.11 1.12 1.09 1.12 4.83 5.45 4.83 5.45 7.60 15.0 17.0 0.0 85.00 2370 12.1 0.70 1.13 1.16 1.10 1.12 1.13 1.16 1.12 1.13 4.83 5.45 4.83 5.45 7.60 15.0 17.0 0.0 85.00 2380 12.1 0.70 1.17 1.18 1.13 1.17 1.17 1.18 1.14 1.17 4.83 5.45 4.83 5.45 7.60 15.0 17.0 0.0 85.00 2390 11.5 0.70 1.25 1.29 1.20 1.27 1.27 1.29 1.22 1.28 4.83 5.45 4.83 5.45 7.60 15.0 17.0 0.0 85.00 2400 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2400 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2400 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2401 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2402 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2402 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2402 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2403 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2403 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2404 11.7 0.70 1.25 1.25 1.20 1.25 1.25 1.25 1.21 1.25 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2410 11.5 0.70 1.18 1.19 1.14 1.19 1.18 1.19 1.16 1.19 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2420 11.0 0.70 1.14 1.15 1.10 1.15 1.14 1.15 1.12 1.15 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2430 11.2 0.70 1.13 1.14 1.10 1.13 1.14 1.14 1.10 1.14 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2440 11.3 0.70 1.13 1.12 1.09 1.13 1.13 1.12 1.10 1.13 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2450 11.2 0.70 1.10 1.10 1.06 1.10 1.10 1.11 1.08 1.11 4.83 5.45 4.83 5.45 8.20 15.0 17.0 0.0 85.00 2460 11.4 0.70 1.10 1.10 1.06 1.10 1.10 1.10 1.08 1.10 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2470 11.5 0.70 1.10 1.10 1.06 1.10 1.10 1.11 1.08 1.11 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2470 11.5 0.70 1.10 1.10 1.06 1.10 1.10 1.11 1.08 1.11 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2470 11.5 0.70 1.10 1.10 1.06 1.10 1.10 1.11 1.08 1.11 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2470 11.5 0.70 1.10 1.10 1.06 1.10 1.10 1.11 1.08 1.11 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2480 11.7 0.70 1.09 1.08 1.05 1.09 1.09 1.08 1.06 1.09 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2490 11.6 0.70 1.07 1.07 1.04 1.07 1.07 1.07 1.04 1.07 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2500 11.8 0.70 1.02 1.01 0.99 1.02 1.02 1.01 1.00 1.02 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2510 11.9 0.70 1.10 1.08 1.05 1.09 1.10 1.10 1.06 1.10 4.83 5.45 4.83 5.45 8.70 15.0 18.0 0.0 85.00 2520 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2520 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2520 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2520 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2521 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2522 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2522 12.2 0.70 1.03 1.03 1.00 1.03 1.03 1.03 1.01 1.03 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2530 12.5 0.70 1.03 1.04 1.00 1.04 1.03 1.04 1.01 1.04 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2540 12.2 0.70 1.02 1.03 0.99 1.02 1.02 1.03 1.00 1.02 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2550 12.0 0.70 1.00 1.00 0.96 1.00 1.00 1.00 0.97 1.00 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2560 11.9 0.70 0.97 0.97 0.95 0.97 0.97 0.97 0.95 0.97 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2570 12.0 0.70 0.97 0.97 0.94 0.97 0.97 0.97 0.95 0.97 4.83 5.45 4.83 5.45 9.00 16.0 18.0 0.0 85.00 2580 12.0 0.70 0.99 1.01 0.96 1.00 0.99 1.01 0.97 0.99 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2590 12.0 0.70 0.99 0.99 0.95 0.99 0.99 0.99 0.96 0.99 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2600 12.0 0.70 0.97 0.97 0.94 0.97 0.97 0.97 0.95 0.97 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2610 12.0 0.70 1.02 1.03 0.98 1.02 1.02 1.03 0.99 1.02 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2610 12.0 0.70 1.02 1.03 0.98 1.02 1.02 1.03 0.99 1.02 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2610 12.0 0.70 1.02 1.03 0.98 1.02 1.02 1.03 0.99 1.02 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2612 12.0 0.70 1.02 1.03 0.98 1.02 1.02 1.03 0.99 1.02 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2612 12.0 0.70 1.02 1.03 0.98 1.02 1.02 1.03 0.99 1.02 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2620 11.7 0.70 0.96 0.96 0.92 0.96 0.96 0.96 0.94 0.96 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2630 11.7 0.70 0.95 0.96 0.91 0.95 0.95 0.96 0.92 0.95 4.83 5.45 4.83 5.45 9.30 16.0 18.0 0.0 85.00 2640 11.7 0.70 1.00 1.03 0.98 0.99 1.00 1.03 0.97 1.00 4.83 5.45 4.83 5.45 9.50 17.0 19.0 0.0 85.00 2650 11.8 0.70 0.97 0.97 0.94 0.97 0.97 0.97 0.95 0.97 4.83 5.45 4.83 5.45 9.50 17.0 19.0 0.0 85.00 2660 11.9 0.70 0.96 0.96 0.92 0.96 0.96 0.96 0.94 0.96 4.83 5.45 4.83 5.45 9.50 17.0 19.0 0.0 85.00 2670 11.8 0.70 0.97 1.03 0.95 0.96 0.97 1.03 0.96 0.96 4.83 5.45 4.83 5.45 9.50 17.0 19.0 0.0 85.00 2680 12.0 0.70 0.97 0.97 0.94 0.97 0.97 0.97 0.95 0.97 4.83 5.45 4.83 5.45 9.50 17.0 19.0 0.0 85.00 2690 11.5 0.70 0.95 0.95 0.91 0.95 0.95 0.95 0.92 0.95 4.83 5.45 4.83 5.45 9.50 17.0 19.0 0.0 85.00 2700 11.3 0.70 0.93 0.93 0.90 0.93 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 9.70 17.0 19.0 0.0 85.00 2710 11.3 0.70 0.95 0.95 0.91 0.95 0.95 0.95 0.92 0.95 4.83 5.45 4.83 5.45 9.70 17.0 19.0 0.0 85.00 2720 10.6 0.70 0.92 0.92 0.89 0.92 0.92 0.92 0.90 0.92 4.83 5.45 4.83 5.45 9.70 17.0 19.0 0.0 85.00 2730 10.8 0.70 0.88 0.88 0.84 0.88 0.88 0.88 0.85 0.88 4.83 5.45 4.83 5.45 9.70 17.0 19.0 0.0 85.00 2740 10.6 0.70 0.90 0.93 0.89 0.90 0.90 0.93 0.88 0.89 4.83 5.45 4.83 5.45 9.70 17.0 19.0 0.0 85.00 2750 10.5 0.70 0.89 0.89 0.86 0.89 0.89 0.89 0.87 0.89 4.83 5.45 4.83 5.45 9.70 17.0 19.0 0.0 85.00 2760 10.4 0.70 0.86 0.87 0.84 0.86 0.86 0.87 0.83 0.86 4.83 5.45 4.83 5.45 9.90 17.0 19.0 0.0 85.00 2770 10.3 0.70 0.93 0.93 0.90 0.93 0.93 0.93 0.90 0.93 4.83 5.45 4.83 5.45 9.90 17.0 19.0 0.0 85.00 2780 10.2 0.70 0.89 0.91 0.86 0.90 0.89 0.91 0.87 0.89 4.83 5.45 4.83 5.45 9.90 17.0 19.0 0.0 85.00 2790 9.9 0.70 0.88 0.88 0.85 0.88 0.88 0.88 0.85 0.88 4.83 5.45 4.83 5.45 9.90 17.0 19.0 0.0 85.00 2800 9.8 0.70 0.85 0.87 0.84 0.84 0.86 0.87 0.83 0.86 4.83 5.45 4.83 5.45 9.90 17.0 19.0 0.0 85.00 2810 9.6 0.70 0.89 0.91 0.86 0.90 0.89 0.91 0.87 0.89 4.83 5.45 4.83 5.45 9.90 17.0 19.0 0.0 85.00 2820 9.5 0.70 0.88 0.89 0.85 0.89 0.88 0.91 0.86 0.87 4.83 5.45 4.83 5.45 10.20 17.0 20.0 0.0 85.00 2830 9.0 0.70 0.92 0.92 0.89 0.92 0.92 0.92 0.90 0.92 4.83 5.45 4.83 5.45 10.20 17.0 20.0 0.0 85.00 2840 9.1 0.70 1.02 1.03 0.96 1.02 1.02 1.03 0.97 1.02 4.83 5.45 4.83 5.45 10.20 17.0 20.0 0.0 85.00 2850 9.2 0.70 0.96 0.97 0.92 0.96 0.96 0.97 0.94 0.96 4.83 5.45 4.83 5.45 10.20 17.0 20.0 0.0 85.00 2860 9.1 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.20 17.0 20.0 0.0 85.00 2870 8.9 0.70 0.95 0.97 0.92 0.96 0.95 0.97 0.92 0.96 4.83 5.45 4.83 5.45 10.20 17.0 20.0 0.0 85.00 2880 8.7 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2880 8.7 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2883 8.7 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2883 8.7 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2884 8.7 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2885 8.7 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2890 8.7 0.70 0.93 0.93 0.90 0.93 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2900 8.8 0.70 0.92 0.96 0.90 0.91 0.92 0.96 0.91 0.92 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2910 8.7 0.70 0.97 0.97 0.94 0.97 0.97 0.99 0.95 0.97 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2920 8.8 0.70 0.93 0.96 0.91 0.92 0.95 0.96 0.92 0.95 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2930 8.1 0.70 1.00 1.03 0.98 0.99 1.00 1.04 0.99 1.00 4.83 5.45 4.83 5.45 10.60 18.0 20.0 0.0 85.00 2940 9.3 0.70 1.02 1.03 0.99 1.02 1.02 1.03 0.99 1.02 4.83 5.45 4.83 5.45 10.80 18.0 20.0 0.0 85.00 2950 8.7 0.70 0.97 0.99 0.95 0.97 0.97 0.99 0.96 0.96 4.83 5.45 4.83 5.45 10.80 18.0 20.0 0.0 85.00 2960 8.8 0.70 0.96 0.97 0.94 0.96 0.96 0.97 0.95 0.96 4.83 5.45 4.83 5.45 10.80 18.0 20.0 0.0 85.00 2970 8.9 0.70 0.97 0.99 0.94 0.98 0.97 0.99 0.95 0.97 4.83 5.45 4.83 5.45 10.80 18.0 20.0 0.0 85.00 2980 8.8 0.70 0.97 0.99 0.94 0.98 0.97 0.99 0.95 0.97 4.83 5.45 4.83 5.45 10.80 18.0 20.0 0.0 85.00 2990 8.9 0.70 0.95 0.97 0.92 0.96 0.96 0.97 0.94 0.96 4.83 5.45 4.83 5.45 10.80 18.0 20.0 0.0 85.00 3000 8.4 0.70 0.99 1.01 0.96 1.00 0.99 1.03 0.97 0.98 4.83 5.45 4.83 5.45 11.10 18.0 21.0 0.0 85.00 3010 7.2 0.70 0.93 0.93 0.90 0.93 0.93 0.93 0.91 0.93 4.83 5.45 4.83 5.45 11.10 18.0 21.0 0.0 85.00 3020 7.5 0.70 0.89 0.91 0.86 0.90 0.89 0.91 0.87 0.89 4.83 5.45 4.83 5.45 11.10 18.0 21.0 0.0 85.00 3030 6.9 0.70 0.86 0.87 0.82 0.86 0.86 0.87 0.83 0.86 4.83 5.45 4.83 5.45 11.10 18.0 21.0 0.0 85.00 3040 6.3 0.70 0.81 0.82 0.78 0.81 0.81 0.82 0.79 0.81 4.83 5.45 4.83 5.45 11.10 18.0 21.0 0.0 85.00 3050 6.1 0.70 0.78 0.80 0.76 0.78 0.78 0.80 0.77 0.78 4.83 5.45 4.83 5.45 11.10 18.0 21.0 0.0 85.00 3060 6.0 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.81 0.81 4.83 5.45 4.83 5.45 11.30 19.0 21.0 0.0 85.00 3070 6.1 0.70 1.00 1.08 0.98 0.99 1.00 1.08 0.99 1.00 4.83 5.45 4.83 5.45 11.30 19.0 21.0 0.0 85.00 3080 6.0 0.70 0.88 0.88 0.85 0.88 0.88 0.88 0.85 0.88 4.83 5.45 4.83 5.45 11.30 19.0 21.0 0.0 85.00 3090 5.7 0.70 0.85 0.88 0.84 0.84 0.86 0.88 0.83 0.87 4.83 5.45 4.83 5.45 11.30 19.0 21.0 0.0 85.00 3100 5.2 0.70 0.89 0.91 0.86 0.90 0.89 0.91 0.86 0.90 4.83 5.45 4.83 5.45 11.30 19.0 21.0 0.0 85.00 3110 5.2 0.70 0.93 0.95 0.90 0.94 0.93 0.95 0.91 0.94 4.83 5.45 4.83 5.45 11.30 19.0 21.0 0.0 85.00 3120 5.3 0.70 0.88 0.89 0.85 0.89 0.88 0.89 0.86 0.89 4.83 5.45 4.83 5.45 11.80 19.0 21.0 0.0 85.00 3130 5.3 0.70 0.86 0.88 0.84 0.86 0.86 0.88 0.85 0.85 4.83 5.45 4.83 5.45 11.80 19.0 21.0 0.0 85.00 3140 5.0 0.70 0.85 0.87 0.82 0.86 0.85 0.87 0.82 0.86 4.83 5.45 4.83 5.45 11.80 19.0 21.0 0.0 85.00 3150 4.9 0.70 0.82 0.82 0.78 0.82 0.82 0.82 0.79 0.82 4.83 5.45 4.83 5.45 11.80 19.0 21.0 0.0 85.00 3160 4.7 0.70 0.82 0.87 0.80 0.81 0.82 0.87 0.81 0.81 4.83 5.45 4.83 5.45 11.80 19.0 21.0 0.0 85.00 3170 4.7 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.81 0.81 4.83 5.45 4.83 5.45 11.80 19.0 21.0 0.0 85.00 3180 4.6 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.79 0.83 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3180 4.6 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.79 0.83 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3182 4.6 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.79 0.83 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3182 4.6 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.79 0.83 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3183 4.6 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.79 0.83 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3184 4.6 0.70 0.82 0.84 0.80 0.81 0.82 0.84 0.79 0.83 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3190 4.4 0.70 0.79 0.81 0.77 0.79 0.79 0.81 0.78 0.79 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3200 4.2 0.70 0.88 0.92 0.86 0.87 0.88 0.92 0.86 0.87 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3210 4.0 0.70 0.83 0.85 0.81 0.82 0.83 0.85 0.82 0.82 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3220 4.0 0.70 0.81 0.82 0.78 0.81 0.81 0.82 0.79 0.81 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3230 3.2 0.70 0.78 0.80 0.76 0.78 0.78 0.80 0.76 0.78 4.83 5.45 4.83 5.45 12.30 19.0 21.0 0.0 85.00 3240 3.5 0.70 0.76 0.78 0.75 0.76 0.78 0.78 0.76 0.78 4.83 5.45 4.83 5.45 12.80 19.0 22.0 0.0 85.00 3250 3.6 0.70 0.76 0.78 0.73 0.77 0.76 0.78 0.74 0.76 4.83 5.45 4.83 5.45 12.80 19.0 22.0 0.0 85.00 3260 3.2 0.70 0.74 0.76 0.72 0.74 0.74 0.76 0.73 0.73 4.83 5.45 4.83 5.45 12.80 19.0 22.0 0.0 85.00 3270 3.3 0.70 0.72 0.74 0.71 0.71 0.72 0.74 0.72 0.72 4.83 5.45 4.83 5.45 12.80 19.0 22.0 0.0 85.00 3280 2.2 0.70 0.75 0.77 0.73 0.75 0.75 0.77 0.74 0.75 4.83 5.45 4.83 5.45 12.80 19.0 22.0 0.0 85.00 3290 2.5 0.70 0.85 0.87 0.82 0.86 0.85 0.87 0.83 0.85 4.83 5.45 4.83 5.45 12.80 19.0 22.0 0.0 85.00 3300 1.8 0.70 0.75 0.77 0.73 0.75 0.75 0.77 0.74 0.75 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3310 1.7 0.70 0.72 0.74 0.71 0.71 0.72 0.74 0.72 0.72 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3320 1.6 0.70 0.71 0.73 0.70 0.70 0.71 0.73 0.69 0.71 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3330 2.7 0.70 0.75 0.77 0.73 0.75 0.75 0.78 0.74 0.75 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3340 1.9 0.70 0.71 0.73 0.70 0.70 0.71 0.73 0.69 0.71 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3350 1.6 0.70 0.69 0.72 0.67 0.68 0.69 0.72 0.68 0.69 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3350 0.0 0.70 0.69 0.72 0.67 0.68 0.69 0.72 0.68 0.69 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3350 0.0 0.70 0.69 0.72 0.67 0.68 0.69 0.72 0.68 0.69 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3350 0.0 0.70 0.69 0.72 0.67 0.68 0.69 0.72 0.68 0.69 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3352 0.0 0.70 0.69 0.72 0.67 0.68 0.69 0.72 0.68 0.69 4.83 5.45 4.83 5.45 13.10 20.0 22.0 0.0 85.00 3352 1.2 0.70 0.78 0.81 0.75 0.78 0.78 0.81 0.76 0.77 4.83 5.45 4.83 5.45 13.40 20.0 22.0 0.0 85.00 3352 1.2 0.70 0.78 0.81 0.75 0.78 0.78 0.81 0.76 0.77 4.83 5.45 4.83 5.45 13.40 20.0 22.0 0.0 85.00 3352 0.0 0.70 0.78 0.81 0.75 0.78 0.78 0.81 0.76 0.77 4.83 5.45 4.83 5.45 13.40 20.0 22.0 0.0 85.00 3352 0.0 0.70 0.78 0.81 0.75 0.78 0.78 0.81 0.76 0.77 4.83 5.45 4.83 5.45 13.40 20.0 22.0 0.0 85.00 3352 0.0 0.70 0.78 0.81 0.75 0.78 0.78 0.81 0.76 0.77 4.83 5.45 4.83 5.45 13.40 20.0 22.0 0.0 85.00 Subsurface-4.0.2/dives/TestComma.csv000066400000000000000000000032131226345450700173510ustar00rootroot00000000000000Dive Time (s),Depth (m),PPO2 - Setpoint (Bar),PPO2 - C1 Cell 1 (Bar),PPO2 - C1 Cell 2 (Bar),PPO2 - C1 Cell 3 (Bar),PPO2 - C1 Measured (Bar),PPO2 - C2 Cell 1 (Bar),PPO2 - C2 Cell 2 (Bar),PPO2 - C2 Cell 3 (Bar),PPO2 - C2 Measured (Bar),C1 Battery 1 (Volts),C1 Battery 2 (Volts),C2 Battery 1 (Volts),C2 Battery 2 (Volts),Ambient Temp. (Celcius),OTU Exposure (%),CNS Exposure (%),Deco Ceiling (m),Gradient Factor 0,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,19.00,0,0,0,0 60,2.5,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 120,4.5,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 180,5.0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 240,5.5,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 300,5.0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 360,5.5,0,0,0,0,0,0,0,0,0,0,0,0,0,17.00,0,0,0,0 420,7.0,0,0,0,0,0,0,0,0,0,0,0,0,0,17.00,0,0,0,0 480,9.0,0,0,0,0,0,0,0,0,0,0,0,0,0,17.00,0,0,0,0 540,11.5,0,0,0,0,0,0,0,0,0,0,0,0,0,16.00,0,0,0,0 600,11.5,0,0,0,0,0,0,0,0,0,0,0,0,0,16.00,0,0,0,0 660,12.5,0,0,0,0,0,0,0,0,0,0,0,0,0,16.00,0,0,0,0 720,13.5,0,0,0,0,0,0,0,0,0,0,0,0,0,16.00,0,0,0,0 780,16.0,0,0,0,0,0,0,0,0,0,0,0,0,0,15.00,0,0,0,0 840,17.0,0,0,0,0,0,0,0,0,0,0,0,0,0,15.00,0,0,0,0 900,18.0,0,0,0,0,0,0,0,0,0,0,0,0,0,15.00,0,0,0,0 960,18.5,0,0,0,0,0,0,0,0,0,0,0,0,0,15.00,0,0,0,0 1020,20.0,0,0,0,0,0,0,0,0,0,0,0,0,0,15.00,0,0,0,0 1080,18.5,0,0,0,0,0,0,0,0,0,0,0,0,0,15.00,0,0,0,0 1140,16.0,0,0,0,0,0,0,0,0,0,0,0,0,0,16.00,0,0,0,0 1200,10.5,0,0,0,0,0,0,0,0,0,0,0,0,0,17.00,0,0,0,0 1260,5.0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 1320,4.0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 1380,2.0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 1440,1.5,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 1460,0.0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.00,0,0,0,0 Subsurface-4.0.2/dives/TestDiveDM3.SDE000077500000000000000000000047041226345450700173410ustar00rootroot00000000000000PK YBޣ7X <0.xml[o8;}BꨉP`) mvv6qf{HYT`bQ 1!d?mf5~^fE:Q_?OXVizgf.ʳeȧ!u6{_,ϦڛZN[iqSj]N\tY#zϖTtբ4)oC( @[>|JX"4CS-2Ɖ2mbY|JQӉYUT~oqNv\Uy9-Wu|7o_EC| "׶z<@$n=>?.W`^E?va+Gۛ?Ŀ>ﯢ÷-8|[Ӷw-彉|f**G?[6]W|Փt<&]} 8@o7wwDmLn鍽IwMɱ`n,rz_?I130P~7` :ֱ ,<YzY:iKMM"\n)J٦ZB ^|Y S3!J߮εtty^@nNr)ޤ-Bꚹ9\,4sڼ_oSB%%s~ ?k.r{X[D}ǎUhq*e) Q}Mb/V|n{=S}Yh|6Jo,0 k̠V;0S г(=Ji8l 6E٘Gk{ a۶ѬnY5Vt5UKfg&EBD4SXRd )[|>UB)6!pB~܆]چ ] A!Hu!Xv!h/퇠mޅmօ`!DB!xB~ކ]ن] !!DBu!TBv!d/0 䂉P` /ˣX]X'm֥(ݜ]F5uɖ墨g`v%wζ)SBdtZoVڥέM?:8ѡ8888ɡ88顓6|69imF[kmqv-πz&+>"kR[M6մrOj6c{5c&@ %,8Sk(ejkakѯ/{Kc[Y"yG&靻{H@5S^eWc/gREAv_%: D ĭk)$GKqJh 6 +HT HЉI&9 8O<)I{(!$(: m繙H,Á Nwp̡ k,awn_`;$0Á%z|h w.Ái+0b6ZٗHXslr>7kqBV?+A0l<Db#[ @ 6nc5[0V<xs'F>>#DI8ȾJ@Jpt>V^ px,/\X$BH ~B{$0-H&DɷUL^hRx?:`61%ڕJZ!o¾+hm1T 8 7aoX@Dhu8n<|v=ДpdS 1CXp`^1@w1k0Fsf J)j6\$t!`ۧlC\`D3oT ʾ$bDy=~*0b`Jtd4ҁRL{@xzurnLl:j8gd4a,_X[XrUQOLIrFHC?b=;,73<1h-+'0$`!02Jb\6 Z0L n2J0b@n2C #D;4TJ@5Gz @boat nameSubsurface-4.0.2/dives/TestDiveDivelogsDE.DLD000066400000000000000000000020401226345450700207170ustar00rootroot00000000000000PK8ZB1δ1.xml͘ێHy޹JCqԀ{r(x,6ɰOdvH] e4ϿW7//7|sèvCD9E榨Z^ݼ;Q.q:;OgޅlG幦aHH)gYTטT Y Tk ~OMg$I?P|ӵm@)LQ0|ݤNw U-.bLFɐga> +S~KjQusKϟ~BXtS.ȬUI};p͕[J f‡pFa o, &S8DG9M`d?3.')eq{)QQnjݡ$A³OZ(䘖cQgbqD/۪i IBΠ z΂hۤϪcnjv>eM#YH0 ]M8N m9!LBYDG9NrȅdR,T$^|@%|)^_!f =6U%O!_*Y@Y%AWAJ&_K)/NZ1յYVW>/ji=/jIb%rwi`bqSFvV3ϗK .-o;*CMMmxj2TxwnPfOF&da$(i$(ʗ̥|20{G!Oԉr&vyWpթc"p.we pSaxS6ul Qaԩч^*[nax8M!5 Metric Rainer Mohr divelogs.de 2.0 1 USA, Hoodsport, WA - Sund Rock 2011 05 17 infinity 10.0 1030 0 Nitrox 11.66 16499000 6902000 32 68 0 30 0 2.74 4.88 8.53 12.19 14.02 16.76 19.51 22.86 24.69 23.77 23.16 23.47 22.25 21.64 21.95 21.03 21.03 18.9 17.98 17.07 16.46 15.85 15.54 14.63 13.72 12.5 11.89 11.58 11.58 11.89 11.28 11.28 11.89 11.89 11.58 10.36 10.67 10.67 11.28 11.28 10.67 11.28 11.28 10.97 9.75 8.84 7.92 8.23 7.01 5.79 6.1 5.49 5.79 3.96 5.18 5.18 5.49 5.18 5.18 3.96 3.35 2.44 2.13 0 Subsurface-4.0.2/dives/TestDiveDivingLog5.08.udcf000077500000000000000000000050751226345450700214630ustar00rootroot00000000000000 Metric Sven Knoch Diving Log 5.0.8.0 83 USA, Hoodsport, WA, Sund Rock 2011 05 17 infinity 10.0 1030.0 0.0 RealAir 11.7 165.0 69.0 0.21 0.79 0.00 30.0 RealAir 0.00 2.74 4.88 8.53 12.19 14.02 16.76 19.51 22.86 24.69 23.77 23.16 23.47 22.25 21.64 21.95 21.03 21.03 18.90 17.98 17.07 16.46 15.85 15.54 14.63 13.72 12.50 11.89 11.58 11.58 11.89 11.28 11.28 11.89 11.89 11.58 10.36 10.67 10.67 11.28 11.28 10.67 11.28 11.28 10.97 9.75 8.84 7.92 8.23 7.01 5.79 6.10 5.49 5.79 3.96 5.18 5.18 5.49 5.18 5.18 3.96 3.35 2.44 2.13 0.00 Subsurface-4.0.2/dives/TestDiveDivingLog5.08.uddf000077500000000000000000000277531226345450700214730ustar00rootroot00000000000000 Diving Log 5.0 Sven Knoch info@divinglog.de http://www.divinglog.de/ 5.0.8.0 2013 2 25 air 0.210 0.790 0.000 0.000

0.000

2011 5 17 46 287.1 283.1 24.7 1030.0 Second deep dive Linus and I planned and executed - Alex just watching down to 80ft (overshot by one) then the reverse sqeeze BS started again So the rest of the dive is a loooong buoyancy exercise Still, fun dive - but I skipped the next one and called it a day. 0.00 0 287.1 2.74 30 287.1 4.88 60 287.1 8.53 90 287.1 12.19 120 287.1 14.02 150 287.1 16.76 180 287.1 19.51 210 287.1 22.86 240 287.1 24.69 270 283.1 23.77 300 283.1 23.16 330 283.1 23.47 360 283.1 22.25 390 283.1 21.64 420 283.1 21.95 450 283.1 21.03 480 283.1 21.03 510 283.1 18.90 540 283.1 17.98 570 283.1 17.07 600 283.1 16.46 630 283.1 15.85 660 283.1 15.54 690 283.1 14.63 720 283.1 13.72 750 283.1 12.50 780 283.1 11.89 810 283.1 11.58 840 283.1 11.58 870 283.1 11.89 900 283.1 11.28 930 283.1 11.28 960 283.1 11.89 990 283.1 11.89 1020 283.1 11.58 1050 283.1 10.36 1080 283.1 10.67 1110 283.1 10.67 1140 283.1 11.28 1170 283.1 11.28 1200 283.1 10.67 1230 283.1 11.28 1260 283.1 11.28 1290 283.1 10.97 1320 283.1 9.75 1350 283.1 8.84 1380 283.1 7.92 1410 283.1 8.23 1440 283.1 7.01 1470 283.1 5.79 1500 283.1 6.10 1530 283.1 5.49 1560 283.1 5.79 1590 283.1 3.96 1620 283.1 5.18 1650 283.1 5.18 1680 283.1 5.49 1710 283.1 5.18 1740 283.1 5.18 1770 283.1 3.96 1800 283.1 3.35 1830 283.1 2.44 1860 283.1 2.13 1890 283.1 0.00 1920 283.1
Subsurface-4.0.2/dives/TestDiveDivingLog5.08allimperial.xml000077500000000000000000000516661226345450700235650ustar00rootroot00000000000000
Diving Log 5.0 5.0.8.0 2013-02-26T16:32:08
1 2011-05-17 11:01 13:31 32.00 24.69 {\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}} \viewkind4\uc1\pard\lang1033\f0\fs17 All data in DivingLog is Imperial\par } Salt Shore Night Steel 11.66 165.47 68.95 Sunny No Current No Waves Bad 14.00 10.00 16.33 False This is the "DecoStop Details" text field I also added the silly table groups - should show up as A and K False 0 ft - 3000 ft Drysuit Vyper 30

0.00 57.2 00000 0.0 0.0 0.0 0 0

8.99 57.2 00000 0.0 0.0 0.0 0 0

16.01 57.2 00000 0.0 0.0 0.0 0 0

27.99 57.2 00000 0.0 0.0 0.0 0 0

39.99 57.2 00000 0.0 0.0 0.0 0 0

46.00 57.2 00000 0.0 0.0 0.0 0 0

54.99 57.2 00000 0.0 0.0 0.0 0 0

64.01 57.2 00000 0.0 0.0 0.0 0 0

75.00 57.2 00000 0.0 0.0 0.0 0 0

81.00 50.0 00000 0.0 0.0 0.0 0 0

77.99 50.0 00000 0.0 0.0 0.0 0 0

75.98 50.0 00000 0.0 0.0 0.0 0 0

77.00 50.0 00000 0.0 0.0 0.0 0 0

73.00 50.0 00000 0.0 0.0 0.0 0 0

71.00 50.0 00000 0.0 0.0 0.0 0 0

72.01 50.0 00000 0.0 0.0 0.0 0 0

69.00 50.0 00000 0.0 0.0 0.0 0 0

69.00 50.0 00000 0.0 0.0 0.0 0 0

62.01 50.0 00000 0.0 0.0 0.0 0 0

58.99 50.0 00000 0.0 0.0 0.0 0 0

56.00 50.0 00000 0.0 0.0 0.0 0 0

54.00 50.0 00000 0.0 0.0 0.0 0 0

52.00 50.0 00000 0.0 0.0 0.0 0 0

50.98 50.0 00000 0.0 0.0 0.0 0 0

48.00 50.0 00000 0.0 0.0 0.0 0 0

45.01 50.0 00000 0.0 0.0 0.0 0 0

41.01 50.0 00000 0.0 0.0 0.0 0 0

39.01 50.0 00000 0.0 0.0 0.0 0 0

37.99 50.0 00000 0.0 0.0 0.0 0 0

37.99 50.0 00000 0.0 0.0 0.0 0 0

39.01 50.0 00000 0.0 0.0 0.0 0 0

37.01 50.0 00000 0.0 0.0 0.0 0 0

37.01 50.0 00000 0.0 0.0 0.0 0 0

39.01 50.0 00000 0.0 0.0 0.0 0 0

39.01 50.0 00000 0.0 0.0 0.0 0 0

37.99 50.0 00000 0.0 0.0 0.0 0 0

33.99 50.0 00000 0.0 0.0 0.0 0 0

35.01 50.0 00000 0.0 0.0 0.0 0 0

35.01 50.0 00000 0.0 0.0 0.0 0 0

37.01 50.0 00000 0.0 0.0 0.0 0 0

37.01 50.0 00000 0.0 0.0 0.0 0 0

35.01 50.0 00000 0.0 0.0 0.0 0 0

37.01 50.0 00000 0.0 0.0 0.0 0 0

37.01 50.0 00000 0.0 0.0 0.0 0 0

35.99 50.0 00000 0.0 0.0 0.0 0 0

31.99 50.0 00000 0.0 0.0 0.0 0 0

29.00 50.0 00000 0.0 0.0 0.0 0 0

25.98 50.0 00000 0.0 0.0 0.0 0 0

27.00 50.0 00000 0.0 0.0 0.0 0 0

23.00 50.0 00000 0.0 0.0 0.0 0 0

19.00 50.0 00000 0.0 0.0 0.0 0 0

20.01 50.0 00000 0.0 0.0 0.0 0 0

18.01 50.0 00000 0.0 0.0 0.0 0 0

19.00 50.0 00000 0.0 0.0 0.0 0 0

12.99 50.0 00000 0.0 0.0 0.0 0 0

16.99 50.0 00000 0.0 0.0 0.0 0 0

16.99 50.0 00000 0.0 0.0 0.0 0 0

18.01 50.0 00000 0.0 0.0 0.0 0 0

16.99 50.0 00000 0.0 0.0 0.0 0 0

16.99 50.0 00000 0.0 0.0 0.0 0 0

12.99 50.0 00000 0.0 0.0 0.0 0 0

10.99 50.0 00000 0.0 0.0 0.0 0 0

8.01 50.0 00000 0.0 0.0 0.0 0 0

6.99 50.0 00000 0.0 0.0 0.0 0 0

0.00 50.0 00000 0.0 0.0 0.0 0 0

182.02 12.02 15-20ft A K Alex 4 32.00 False 0.00
Subsurface-4.0.2/dives/TestDiveDivingLog5.08allmetric.xml000077500000000000000000000516441226345450700232420ustar00rootroot00000000000000
Diving Log 5.0 5.0.8.0 2013-02-26T16:34:07
1 2011-05-17 11:01 13:31 32.00 24.69 {\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}} \viewkind4\uc1\pard\lang1033\f0\fs17 All data in DivingLog is Imperial\par } Salt Shore Night Steel 11.66 165.47 68.95 Sunny No Current No Waves Bad 14.00 10.00 16.33 False This is the "DecoStop Details" text field I also added the silly table groups - should show up as A and K False 0 ft - 3000 ft Drysuit Vyper 30

0.00 14.0 00000 0.0 0.0 0.0 0 0

2.74 14.0 00000 0.0 0.0 0.0 0 0

4.88 14.0 00000 0.0 0.0 0.0 0 0

8.53 14.0 00000 0.0 0.0 0.0 0 0

12.19 14.0 00000 0.0 0.0 0.0 0 0

14.02 14.0 00000 0.0 0.0 0.0 0 0

16.76 14.0 00000 0.0 0.0 0.0 0 0

19.51 14.0 00000 0.0 0.0 0.0 0 0

22.86 14.0 00000 0.0 0.0 0.0 0 0

24.69 10.0 00000 0.0 0.0 0.0 0 0

23.77 10.0 00000 0.0 0.0 0.0 0 0

23.16 10.0 00000 0.0 0.0 0.0 0 0

23.47 10.0 00000 0.0 0.0 0.0 0 0

22.25 10.0 00000 0.0 0.0 0.0 0 0

21.64 10.0 00000 0.0 0.0 0.0 0 0

21.95 10.0 00000 0.0 0.0 0.0 0 0

21.03 10.0 00000 0.0 0.0 0.0 0 0

21.03 10.0 00000 0.0 0.0 0.0 0 0

18.90 10.0 00000 0.0 0.0 0.0 0 0

17.98 10.0 00000 0.0 0.0 0.0 0 0

17.07 10.0 00000 0.0 0.0 0.0 0 0

16.46 10.0 00000 0.0 0.0 0.0 0 0

15.85 10.0 00000 0.0 0.0 0.0 0 0

15.54 10.0 00000 0.0 0.0 0.0 0 0

14.63 10.0 00000 0.0 0.0 0.0 0 0

13.72 10.0 00000 0.0 0.0 0.0 0 0

12.50 10.0 00000 0.0 0.0 0.0 0 0

11.89 10.0 00000 0.0 0.0 0.0 0 0

11.58 10.0 00000 0.0 0.0 0.0 0 0

11.58 10.0 00000 0.0 0.0 0.0 0 0

11.89 10.0 00000 0.0 0.0 0.0 0 0

11.28 10.0 00000 0.0 0.0 0.0 0 0

11.28 10.0 00000 0.0 0.0 0.0 0 0

11.89 10.0 00000 0.0 0.0 0.0 0 0

11.89 10.0 00000 0.0 0.0 0.0 0 0

11.58 10.0 00000 0.0 0.0 0.0 0 0

10.36 10.0 00000 0.0 0.0 0.0 0 0

10.67 10.0 00000 0.0 0.0 0.0 0 0

10.67 10.0 00000 0.0 0.0 0.0 0 0

11.28 10.0 00000 0.0 0.0 0.0 0 0

11.28 10.0 00000 0.0 0.0 0.0 0 0

10.67 10.0 00000 0.0 0.0 0.0 0 0

11.28 10.0 00000 0.0 0.0 0.0 0 0

11.28 10.0 00000 0.0 0.0 0.0 0 0

10.97 10.0 00000 0.0 0.0 0.0 0 0

9.75 10.0 00000 0.0 0.0 0.0 0 0

8.84 10.0 00000 0.0 0.0 0.0 0 0

7.92 10.0 00000 0.0 0.0 0.0 0 0

8.23 10.0 00000 0.0 0.0 0.0 0 0

7.01 10.0 00000 0.0 0.0 0.0 0 0

5.79 10.0 00000 0.0 0.0 0.0 0 0

6.10 10.0 00000 0.0 0.0 0.0 0 0

5.49 10.0 00000 0.0 0.0 0.0 0 0

5.79 10.0 00000 0.0 0.0 0.0 0 0

3.96 10.0 00000 0.0 0.0 0.0 0 0

5.18 10.0 00000 0.0 0.0 0.0 0 0

5.18 10.0 00000 0.0 0.0 0.0 0 0

5.49 10.0 00000 0.0 0.0 0.0 0 0

5.18 10.0 00000 0.0 0.0 0.0 0 0

5.18 10.0 00000 0.0 0.0 0.0 0 0

3.96 10.0 00000 0.0 0.0 0.0 0 0

3.35 10.0 00000 0.0 0.0 0.0 0 0

2.44 10.0 00000 0.0 0.0 0.0 0 0

2.13 10.0 00000 0.0 0.0 0.0 0 0

0.00 10.0 00000 0.0 0.0 0.0 0 0

182.02 12.02 15-20ft A K Alex 4 32.00 False 0.00
Subsurface-4.0.2/dives/TestDiveDivingLog5.08allmetric.zip000077500000000000000000000036501226345450700232360ustar00rootroot00000000000000PK+DZBS"TestDiveDivingLog5.08allmetric.xmln8cUӠmNFh"itI)dGWR51EPQC7m߿>ׂn(^ڞEXe8tuK_dA?V$.jhY,'_:KdS;,HF7ynD\Ud* -FQcL$ O|:\< ǝcyZٶw,2D0.Hg.KJKv ⇪fQyZk"rOeh"HmAa svy# QXw$(v|e1f뿹;/A/P=L3,.x"i49KYzZnc4+cc^ 7&~(h|H՛ D93H_X°?xU)iQl(“w5 IX4^@GlLs0.)|e LAn EYێ\!/vpeH|!^b #,{"'\MK,j:TɆF]hj!XR~3Pޅuބ h.mG;:' mPꚤb>w4d>:[kv"K{]q~ەMXW, F՟Şog}"AηFYUWAgIo@OASR7;~RA>;ѵ;f_i,_Q_i|uMTϼ7յKҋYeF5bCli٦PK+DZBS" TestDiveDivingLog5.08allmetric.xmlPKPBSubsurface-4.0.2/dives/TestDiveJDiveLog.jlb000066400000000000000000000146001226345450700205460ustar00rootroot00000000000000 2.130falsetruefalsetruetruetruefalsefalsetruetruetruetruetruetruetruetruetruefalsefalsefalsefalsetrue600400true80060010010080falsebluebubblesfalsetruepublic_htmltruetruefalsebarhorizontalbarhorizontalbarhorizontalbarhorizontalbarhorizontalbarhorizontal1falsefalseYellow HouseHoodsportWAUSAN47 24,01200W123 8.53794Hood Canal007OSTC01metric20115171false16.2105124.69184800000000411.65250432.0Bad10.0LinusJDivelog DivetypeJDiveLog Dive ActivityThis is a JDiveLog Comment0.000.0SteelNX 3211.699778092399999165.069.00.320.67999999999999990.036lbsdry Whites Fusiondry2011517infinity10.01030.00.0RealAir11.7165.069.00.210.790.00.5RealAir0.02.744.888.5312.1914.0216.7619.5122.8624.6923.7723.1623.4722.2521.6421.9521.0321.0318.917.9817.0716.4615.8515.5414.6313.7212.511.8911.5811.5811.8911.2811.2811.8911.8911.5810.3610.6710.6711.2811.2810.6711.2811.2810.979.758.847.928.237.015.796.15.495.793.965.185.185.495.185.183.963.352.442.130.08falsefalsefalse #ffffffff#c0c0c0fffalsetrue#b31a0033true#404040ff#000d1a32#0085ff32true#d6ff33ff#5cff33ff#33ff85ff#33ffffff Subsurface-4.0.2/dives/TestXP5_de.csv000066400000000000000000000546671226345450700174240ustar00rootroot00000000000000Tauchgangs-Nr.: 128 Modell: XP5 Serien Nr.: 7278 Tauchgangsnr.: 6 Datum des Tauchgangs: 18/05/2010 Dauer des Tauchgangs: 12:07 Tauchmodus: Normal Oberflächeninterval: 01:27 Maximale Tiefe: 15,5 M Tauchzeit gesamt: 47 Min. Temperatur Min.: 13,33333 C Tauchflaschengröße: Arbeitsdruck: Anfangsdruck: 0 BAR End Druck: 0 BAR Tauchflaschengröße: 0 L Arbeitsdruck: 0 BAR SAC: 0 L/Min FO2: Luft N1: 8,6 N2: 120,07 N3: 148, N4: 0,03 N5: 7,66 N6: 244,36 N7: 49, N8: 0,01 N9: 3,38 N10: 2,9 OTUD: 0, OTUS: 0, Abtastrate: 30 Secs Tauchdatentyp: Tauchcomputer Abgelaufene Tauchzeit (Std:Min.) Tiefe Stickstoff Balkenanzeige Sauerstoff Balkenanzeige Aufstiegsgeschwindigkeit Restluftzeit Restliche Tauchzeit Dekompressionszeit (Std:Min) Dekostopp-Tiefe Temperatur PO2 Pressluftflasche Lesen des Druckes Status der Verbindung Tauchstatus 00:00:15 2,4 M 1 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 20,0 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:00:30 7,6 M 1 0 0-3 MPM Nicht verfügbar 05:59 0:00 0 M 19,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:00:45 8,5 M 1 0 0-3 MPM Nicht verfügbar 04:26 0:00 0 M 19,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:01:00 7,9 M 1 0 3-7.5 MPM Nicht verfügbar 05:21 0:00 0 M 18,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:01:15 8,2 M 1 0 0-3 MPM Nicht verfügbar 04:48 0:00 0 M 18,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:01:30 8,2 M 1 0 0-3 MPM Nicht verfügbar 04:48 0:00 0 M 18,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:01:45 8,2 M 1 0 0-3 MPM Nicht verfügbar 04:48 0:00 0 M 17,8 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:02:00 9,1 M 1 0 0-3 MPM Nicht verfügbar 03:41 0:00 0 M 17,8 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:02:15 9,4 M 1 0 0-3 MPM Nicht verfügbar 03:25 0:00 0 M 17,8 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:02:30 10,1 M 1 0 0-3 MPM Nicht verfügbar 02:59 0:00 0 M 17,2 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:02:45 10,1 M 1 0 0-3 MPM Nicht verfügbar 02:59 0:00 0 M 16,7 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:03:00 11,0 M 1 0 0-3 MPM Nicht verfügbar 02:26 0:00 0 M 16,7 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:03:15 10,7 M 1 0 3-7.5 MPM Nicht verfügbar 02:36 0:00 0 M 16,7 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:03:30 11,0 M 1 0 >9 MPM Nicht verfügbar 02:25 0:00 0 M 16,1 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:03:45 10,7 M 1 0 0-3 MPM Nicht verfügbar 02:35 0:00 0 M 16,1 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:04:00 10,7 M 1 0 0-3 MPM Nicht verfügbar 02:35 0:00 0 M 16,1 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:04:15 11,3 M 1 0 0-3 MPM Nicht verfügbar 02:16 0:00 0 M 15,6 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:04:30 12,5 M 1 0 0-3 MPM Nicht verfügbar 01:49 0:00 0 M 15,6 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:04:45 12,5 M 1 0 0-3 MPM Nicht verfügbar 01:49 0:00 0 M 15,6 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:05:00 11,9 M 1 0 0-3 MPM Nicht verfügbar 02:00 0:00 0 M 15,6 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:05:15 11,3 M 2 0 0-3 MPM Nicht verfügbar 02:15 0:00 0 M 15,0 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:05:30 11,6 M 2 0 0-3 MPM Nicht verfügbar 02:07 0:00 0 M 15,0 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:05:45 11,6 M 2 0 0-3 MPM Nicht verfügbar 02:07 0:00 0 M 15,0 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:06:00 12,2 M 2 0 0-3 MPM Nicht verfügbar 01:53 0:00 0 M 15,0 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:06:15 12,2 M 2 0 0-3 MPM Nicht verfügbar 01:53 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:06:30 12,2 M 2 0 0-3 MPM Nicht verfügbar 01:53 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:06:45 12,2 M 2 0 0-3 MPM Nicht verfügbar 01:53 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:07:00 12,8 M 2 0 0-3 MPM Nicht verfügbar 01:42 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:07:15 13,1 M 2 0 0-3 MPM Nicht verfügbar 01:37 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:07:30 13,7 M 2 0 0-3 MPM Nicht verfügbar 01:28 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:07:45 13,7 M 2 0 0-3 MPM Nicht verfügbar 01:28 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:08:00 13,1 M 2 0 3-7.5 MPM Nicht verfügbar 01:36 0:00 0 M 14,4 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:08:15 13,1 M 2 0 0-3 MPM Nicht verfügbar 01:36 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:08:30 13,1 M 2 0 0-3 MPM Nicht verfügbar 01:36 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:08:45 11,6 M 2 0 3-7.5 MPM Nicht verfügbar 02:03 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:09:00 11,0 M 2 0 3-7.5 MPM Nicht verfügbar 02:19 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:09:15 10,1 M 2 0 0-3 MPM Nicht verfügbar 02:51 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:09:30 9,8 M 2 0 0-3 MPM Nicht verfügbar 03:02 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:09:45 9,4 M 2 0 0-3 MPM Nicht verfügbar 03:16 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:10:00 8,8 M 2 0 0-3 MPM Nicht verfügbar 03:50 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:10:15 9,1 M 2 0 0-3 MPM Nicht verfügbar 03:31 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:10:30 10,4 M 2 0 0-3 MPM Nicht verfügbar 02:39 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:10:45 10,7 M 2 0 0-3 MPM Nicht verfügbar 02:28 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:11:00 11,0 M 2 0 0-3 MPM Nicht verfügbar 02:18 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:11:15 9,4 M 2 0 3-7.5 MPM Nicht verfügbar 03:14 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:11:30 9,1 M 2 0 0-3 MPM Nicht verfügbar 03:30 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:11:45 8,8 M 2 0 0-3 MPM Nicht verfügbar 03:48 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:12:00 8,2 M 2 0 3-7.5 MPM Nicht verfügbar 04:34 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:12:15 8,8 M 2 0 0-3 MPM Nicht verfügbar 03:49 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:12:30 9,8 M 2 0 0-3 MPM Nicht verfügbar 03:00 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:12:45 10,4 M 2 0 0-3 MPM Nicht verfügbar 02:37 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:13:00 10,1 M 2 0 0-3 MPM Nicht verfügbar 02:47 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:13:15 10,7 M 2 0 0-3 MPM Nicht verfügbar 02:26 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:13:30 10,7 M 2 0 0-3 MPM Nicht verfügbar 02:26 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:13:45 10,7 M 2 0 3-7.5 MPM Nicht verfügbar 02:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:14:00 10,4 M 2 0 0-3 MPM Nicht verfügbar 02:36 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:14:15 11,3 M 2 0 0-3 MPM Nicht verfügbar 02:07 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:14:30 11,3 M 2 0 0-3 MPM Nicht verfügbar 02:07 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:14:45 11,0 M 2 0 0-3 MPM Nicht verfügbar 02:15 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:15:00 10,7 M 2 0 0-3 MPM Nicht verfügbar 02:24 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:15:15 9,8 M 2 0 3-7.5 MPM Nicht verfügbar 02:57 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:15:30 9,4 M 2 0 0-3 MPM Nicht verfügbar 03:10 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:15:45 8,5 M 2 0 3-7.5 MPM Nicht verfügbar 04:07 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:16:00 8,8 M 2 0 0-3 MPM Nicht verfügbar 03:44 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:16:15 9,1 M 2 0 0-3 MPM Nicht verfügbar 03:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:16:30 11,0 M 2 0 0-3 MPM Nicht verfügbar 02:13 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:16:45 11,9 M 3 0 0-3 MPM Nicht verfügbar 01:50 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:17:00 12,8 M 3 0 0-3 MPM Nicht verfügbar 01:34 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:17:15 14,0 M 3 0 0-3 MPM Nicht verfügbar 01:15 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:17:30 15,5 M 3 0 0-3 MPM Nicht verfügbar 00:57 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:17:45 14,9 M 3 0 0-3 MPM Nicht verfügbar 01:03 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:18:00 14,9 M 3 0 0-3 MPM Nicht verfügbar 01:02 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:18:15 14,9 M 3 0 0-3 MPM Nicht verfügbar 01:02 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:18:30 15,2 M 3 0 0-3 MPM Nicht verfügbar 00:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:18:45 14,0 M 3 0 3-7.5 MPM Nicht verfügbar 01:13 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:19:00 13,1 M 3 0 3-7.5 MPM Nicht verfügbar 01:27 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:19:15 13,1 M 3 0 0-3 MPM Nicht verfügbar 01:27 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:19:30 12,5 M 3 0 0-3 MPM Nicht verfügbar 01:36 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:19:45 12,8 M 3 0 0-3 MPM Nicht verfügbar 01:31 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:20:00 13,1 M 3 0 0-3 MPM Nicht verfügbar 01:26 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:20:15 11,6 M 3 0 3-7.5 MPM Nicht verfügbar 01:53 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:20:30 11,6 M 3 0 0-3 MPM Nicht verfügbar 01:52 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:20:45 13,1 M 3 0 0-3 MPM Nicht verfügbar 01:26 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:21:00 12,5 M 3 0 7.5-9 MPM Nicht verfügbar 01:34 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:21:15 12,2 M 3 0 0-3 MPM Nicht verfügbar 01:39 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:21:30 11,9 M 3 0 0-3 MPM Nicht verfügbar 01:45 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:21:45 11,6 M 3 0 3-7.5 MPM Nicht verfügbar 01:51 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:22:00 10,7 M 3 0 0-3 MPM Nicht verfügbar 02:16 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:22:15 10,1 M 3 0 0-3 MPM Nicht verfügbar 02:36 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:22:30 9,4 M 3 0 0-3 MPM Nicht verfügbar 03:00 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:22:45 9,4 M 3 0 0-3 MPM Nicht verfügbar 03:00 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:23:00 10,4 M 3 0 0-3 MPM Nicht verfügbar 02:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:23:15 10,1 M 3 0 0-3 MPM Nicht verfügbar 02:35 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:23:30 10,4 M 3 0 0-3 MPM Nicht verfügbar 02:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:23:45 9,8 M 3 0 3-7.5 MPM Nicht verfügbar 02:46 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:24:00 8,8 M 3 0 3-7.5 MPM Nicht verfügbar 03:33 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:24:15 8,5 M 3 0 3-7.5 MPM Nicht verfügbar 03:55 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:24:30 9,1 M 3 0 0-3 MPM Nicht verfügbar 03:15 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:24:45 9,4 M 3 0 0-3 MPM Nicht verfügbar 02:58 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:25:00 9,8 M 3 0 0-3 MPM Nicht verfügbar 02:45 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:25:15 9,4 M 3 0 0-3 MPM Nicht verfügbar 02:58 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:25:30 9,4 M 3 0 0-3 MPM Nicht verfügbar 02:57 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:25:45 10,1 M 3 0 0-3 MPM Nicht verfügbar 02:33 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:26:00 9,4 M 3 0 3-7.5 MPM Nicht verfügbar 02:57 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:26:15 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:30 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:26:30 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:30 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:26:45 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:52 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:27:00 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:52 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:27:15 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:51 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:27:30 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:51 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:27:45 8,8 M 3 0 3-7.5 MPM Nicht verfügbar 03:29 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:28:00 8,2 M 3 0 0-3 MPM Nicht verfügbar 04:12 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:28:15 8,2 M 3 0 0-3 MPM Nicht verfügbar 04:12 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:28:30 7,3 M 3 0 >9 MPM Nicht verfügbar 05:48 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:28:45 7,0 M 3 0 0-3 MPM Nicht verfügbar 06:24 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:29:00 7,6 M 3 0 0-3 MPM Nicht verfügbar 05:10 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:29:15 7,9 M 3 0 0-3 MPM Nicht verfügbar 04:37 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:29:30 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:49 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:29:45 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:49 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:30:00 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:27 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:30:15 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:48 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:30:30 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:27 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:30:45 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:27 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:31:00 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:48 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:31:15 7,9 M 3 0 3-7.5 MPM Nicht verfügbar 04:35 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:31:30 7,3 M 3 0 0-3 MPM Nicht verfügbar 05:44 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:31:45 7,0 M 3 0 3-7.5 MPM Nicht verfügbar 06:21 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:32:00 6,4 M 3 0 0-3 MPM Nicht verfügbar 07:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:32:15 6,7 M 3 0 0-3 MPM Nicht verfügbar 07:06 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:32:30 7,0 M 3 0 0-3 MPM Nicht verfügbar 06:20 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:32:45 7,6 M 3 0 0-3 MPM Nicht verfügbar 05:08 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:33:00 7,9 M 3 0 0-3 MPM Nicht verfügbar 04:34 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:33:15 8,5 M 3 0 0-3 MPM Nicht verfügbar 03:46 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:33:30 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:33:45 8,5 M 3 0 3-7.5 MPM Nicht verfügbar 03:45 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:34:00 8,2 M 3 0 0-3 MPM Nicht verfügbar 04:07 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:34:15 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:24 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:34:30 9,1 M 3 0 0-3 MPM Nicht verfügbar 03:06 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:34:45 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:24 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:35:00 9,1 M 3 0 0-3 MPM Nicht verfügbar 03:05 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:35:15 9,1 M 3 0 0-3 MPM Nicht verfügbar 03:05 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:35:30 9,8 M 3 0 0-3 MPM Nicht verfügbar 02:36 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:35:45 9,1 M 3 0 0-3 MPM Nicht verfügbar 03:04 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:36:00 10,1 M 3 0 0-3 MPM Nicht verfügbar 02:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:36:15 8,8 M 3 0 0-3 MPM Nicht verfügbar 03:22 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:36:30 9,1 M 3 0 0-3 MPM Nicht verfügbar 03:04 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:36:45 10,4 M 3 0 0-3 MPM Nicht verfügbar 02:15 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:37:00 11,3 M 3 0 0-3 MPM Nicht verfügbar 01:48 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:37:15 11,3 M 3 0 0-3 MPM Nicht verfügbar 01:48 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:37:30 11,0 M 3 0 0-3 MPM Nicht verfügbar 01:54 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:37:45 11,0 M 3 0 3-7.5 MPM Nicht verfügbar 01:54 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:38:00 9,1 M 3 0 >9 MPM Nicht verfügbar 03:02 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:38:15 7,6 M 3 0 3-7.5 MPM Nicht verfügbar 05:00 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:38:30 6,7 M 3 0 3-7.5 MPM Nicht verfügbar 06:57 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:38:45 5,8 M 3 0 3-7.5 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:39:00 5,8 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:39:15 5,2 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:39:30 6,1 M 3 0 0-3 MPM Nicht verfügbar 08:47 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:39:45 7,0 M 3 0 0-3 MPM Nicht verfügbar 06:11 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:40:00 7,6 M 3 0 0-3 MPM Nicht verfügbar 04:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:40:15 8,2 M 3 0 0-3 MPM Nicht verfügbar 04:00 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:40:30 7,6 M 3 0 7.5-9 MPM Nicht verfügbar 04:58 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:40:45 7,9 M 3 0 0-3 MPM Nicht verfügbar 04:25 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:41:00 7,6 M 3 0 0-3 MPM Nicht verfügbar 04:58 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:41:15 7,3 M 3 0 0-3 MPM Nicht verfügbar 05:33 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:41:30 7,3 M 3 0 0-3 MPM Nicht verfügbar 05:33 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:41:45 7,3 M 3 0 0-3 MPM Nicht verfügbar 05:33 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:42:00 7,0 M 3 0 0-3 MPM Nicht verfügbar 06:10 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:42:15 7,3 M 3 0 0-3 MPM Nicht verfügbar 05:32 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:42:30 7,6 M 3 0 0-3 MPM Nicht verfügbar 04:56 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:42:45 7,9 M 3 0 0-3 MPM Nicht verfügbar 04:24 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:43:00 6,7 M 4 0 0-3 MPM Nicht verfügbar 06:55 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:43:15 7,6 M 3 0 0-3 MPM Nicht verfügbar 04:56 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:43:30 6,4 M 4 0 3-7.5 MPM Nicht verfügbar 07:44 0:00 0 M 13,9 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:43:45 6,4 M 4 0 0-3 MPM Nicht verfügbar 07:44 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:44:00 6,4 M 4 0 3-7.5 MPM Nicht verfügbar 07:44 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:44:15 7,0 M 4 0 0-3 MPM Nicht verfügbar 06:06 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:44:30 5,8 M 4 0 3-7.5 MPM Nicht verfügbar 09:58 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:44:45 4,6 M 4 0 3-7.5 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:45:00 3,4 M 4 0 3-7.5 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:45:15 3,0 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:45:30 3,7 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:45:45 4,3 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:46:00 4,9 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:46:15 4,9 M 3 0 3-7.5 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:46:30 2,7 M 3 0 >9 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:46:45 1,5 M 3 0 7.5-9 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar 00:47:00 1,5 M 3 0 0-3 MPM Nicht verfügbar 09:59 0:00 0 M 13,3 Nicht verfügbar Nicht verfügbar Nicht verfügbar Subsurface-4.0.2/dives/sac-test.xml000066400000000000000000000067071226345450700172200ustar00rootroot00000000000000 SAC test dive 1 SAC should be 20l/min (0.7063 cuft/min) We have exactly 100 ATM of gas in a 10l cylinder, average 10m for 25min SAC test dive 2 SAC should be 20l/min (0.7063 cuft/min) We have exactly 100 ATM of gas in a 10l cylinder, average 10m for 25min SAC test dive 3 SAC should be 20l/min (0.7063 cuft/min) We have exactly 100 ATM of gas in 15l of cylinder, average 20m for 25min SAC test dive 4 SAC should be 20l/min (0.7063 cuft/min) This adds a 5-minute surface time to the middle of the dive. We have exactly 100 ATM of gas in 15l of cylinder, average 20m for 25min SAC test dive 5 SAC should be 20l/min (0.7063 cuft/min) This verifies that it works without any sample data too. We have exactly 100 ATM of gas in 15l of cylinder, average 20m for 25min Subsurface-4.0.2/dives/tank_pressure.xml000066400000000000000000000020771226345450700203560ustar00rootroot00000000000000 Subsurface-4.0.2/dives/test0.xml000066400000000000000000000003051226345450700165200ustar00rootroot00000000000000 Subsurface-4.0.2/dives/test0b.xml000066400000000000000000000010061226345450700166610ustar00rootroot00000000000000 Subsurface-4.0.2/dives/test1.xml000066400000000000000000000005261226345450700165260ustar00rootroot00000000000000 First test dive, this one with location Yes, the previous dive is dive 0, that one with no location. Subsurface-4.0.2/dives/test10.xml000066400000000000000000000015211226345450700166020ustar00rootroot00000000000000 10th test dive, 3 tanks, 1 tank change 63.01043 7.31243 Shows two pressure plots, each from 200 to 100bar and gaschange event at 10 min mark. Subsurface-4.0.2/dives/test11.xml000066400000000000000000000016261226345450700166110ustar00rootroot00000000000000 11th test dive, 3 tanks, 2 tank changes 27.75685 34.25460 Shows three pressure plots, each from 200 to 100bar and gaschange events at 10 and 20 min mark. Subsurface-4.0.2/dives/test12.xml000066400000000000000000000017661226345450700166170ustar00rootroot00000000000000 12th test dive, 3 tanks, 3 tank changes 59.90935 10.64284 Shows three pressure plots, each from 200 to 100bar and gaschange events at 10, 20 and 25 min mark. Last change is back to first tank. Subsurface-4.0.2/dives/test13.xml000066400000000000000000000047151226345450700166150ustar00rootroot00000000000000 13th test dive, 3 tanks, 3 tank changes 27.40835 33.87772 Shows three pressure plots, each from 200 to 100bar and gaschange events at 10, 20 and 25 min mark. Last change is back to first tank Now with samples. We have a sample at the first tank change but not the 2nd and 3rd Subsurface-4.0.2/dives/test14.xml000066400000000000000000000034651226345450700166170ustar00rootroot00000000000000 14th test dive - no depth 0 samples 27.141032 33.958742 This should show 1m depth at the 30min mark and then a tick up to the surface 20sec later Subsurface-4.0.2/dives/test15.xml000066400000000000000000000016531226345450700166150ustar00rootroot00000000000000 15th test dive - trimix 12.48854 -61.49134 Nothing of value, just getting something for the divelist Subsurface-4.0.2/dives/test16.xml000066400000000000000000001245241226345450700166210ustar00rootroot00000000000000 16th test dive - temperatures 60.39697 11.23468 Making sure a crazy and wide temperature plot is readable Subsurface-4.0.2/dives/test17.xml000066400000000000000000001245431226345450700166230ustar00rootroot00000000000000 17th test dive - silly temperatures 26.31865 34.82803 Making sure a crazy but narrow temperature plot is readable Subsurface-4.0.2/dives/test18.xml000066400000000000000000000022511226345450700166130ustar00rootroot00000000000000 18th test dive - trimix 27.041458 33.907237 Nothing of value, just getting something for the divelist Subsurface-4.0.2/dives/test19.xml000066400000000000000000000022641226345450700166200ustar00rootroot00000000000000 19th test dive - trimix Nothing of value, just getting something for the divelist Subsurface-4.0.2/dives/test2.xml000066400000000000000000000005441226345450700165270ustar00rootroot00000000000000 2nd test dive, add cylinder with no start/end pressure Subsurface-4.0.2/dives/test20.xml000066400000000000000000000022741226345450700166110ustar00rootroot00000000000000 20th test dive - trimix Manly dive with two trimix plus deco (no air anywhere) Subsurface-4.0.2/dives/test21.xml000066400000000000000000000007071226345450700166110ustar00rootroot00000000000000 20th test dive - this should be in a trip with same location We are testing that the location of the dive is picked up in the trip if the trip has no location Subsurface-4.0.2/dives/test22.xml000066400000000000000000000007451226345450700166140ustar00rootroot00000000000000 21st test dive - this should be in a trip with a trip location We are testing that the location of the dive is not picked up in the trip if the trip has a location Subsurface-4.0.2/dives/test23.xml000066400000000000000000000012351226345450700166100ustar00rootroot00000000000000 23rd test dive - this should be in a trip We are testing that the NOTRIP flag works 22nd test dive - this should not be in a trip We are testing that the NOTRIP flag works Subsurface-4.0.2/dives/test24.xml000066400000000000000000000002101226345450700166010ustar00rootroot00000000000000 Subsurface-4.0.2/dives/test25.xml000066400000000000000000000017421226345450700166150ustar00rootroot00000000000000 Dive location New trip format + includes a divecomputer section Subsurface-4.0.2/dives/test26.xml000066400000000000000000000020341226345450700166110ustar00rootroot00000000000000 Same dive location New trip format + includes a divecomputer section - designed to be manually merged wiht previous dive. Subsurface-4.0.2/dives/test27.xml000066400000000000000000000013771226345450700166230ustar00rootroot00000000000000 different dive location Constant temperature in the samples - should still be shown Subsurface-4.0.2/dives/test28.xml000066400000000000000000000062251226345450700166210ustar00rootroot00000000000000 under water Short dive with pressure sensor information Subsurface-4.0.2/dives/test29.xml000066400000000000000000000054331226345450700166220ustar00rootroot00000000000000 irrelevant dive location This is a dive that has two tags, boat and wreck irrelevant dive location This is a dive that has an empty tags property in the XML file irrelevant dive location This is a dive that has a tags property with just a comma in the XML file irrelevant dive location This is a dive that has a single letter tag 'a' (plus the boat tag) Subsurface-4.0.2/dives/test3.xml000066400000000000000000000006571226345450700165350ustar00rootroot00000000000000 3rd test dive, add cylinder with start/end pressure SAC should be 0.46 cuft/min or 13.1 l/min Subsurface-4.0.2/dives/test30.xml000066400000000000000000000027241226345450700166120ustar00rootroot00000000000000 Dive with test events, can be used to test approximation of depth when exporting dives. Subsurface-4.0.2/dives/test4.xml000066400000000000000000000007011226345450700165240ustar00rootroot00000000000000 4th test dive, add temp SAC should be 0.46 cuft/min or 13.1 l/min Subsurface-4.0.2/dives/test5.xml000066400000000000000000000007121226345450700165270ustar00rootroot00000000000000 5th test dive, nitrox SAC should be 0.46 cuft/min or 13.1 l/min Subsurface-4.0.2/dives/test6.xml000066400000000000000000000012151226345450700165270ustar00rootroot00000000000000 6th test dive, two tanks SAC should be 0.93 cuft/min or 26.2 l/min Since we have no tank change information, profile shows just one tank. Subsurface-4.0.2/dives/test7.xml000066400000000000000000000013431226345450700165320ustar00rootroot00000000000000 7th test dive, two tanks, tank change SAC should be 0.93 cuft/min or 26.2 l/min Shows two pressure plots, each from 200 to 100bar and gaschange event at 15 minu mark. Subsurface-4.0.2/dives/test8.xml000066400000000000000000000040001226345450700165240ustar00rootroot00000000000000 8th test dive, with samples SAC should be 0.93 cuft/min or 26.2 l/min Tank pressure plotted correctly (linear approximation) Descent light green First Ascent red, second orange, third yellow, last green Subsurface-4.0.2/dives/test9.xml000066400000000000000000000040321226345450700165320ustar00rootroot00000000000000 9th test dive, with temperature in samples End temperature is not plotted as correct text Subsurface-4.0.2/equipment.c000066400000000000000000000116121226345450700160030ustar00rootroot00000000000000/* equipment.c */ #include #include #include #include #include #include "gettext.h" #include "dive.h" #include "display.h" #include "divelist.h" /* placeholders for a few functions that we need to redesign for the Qt UI */ void add_cylinder_description(cylinder_type_t *type) { const char *desc; int i; desc = type->description; if (!desc) return; for (i = 0; i < 100 && tank_info[i].name != NULL; i++) { if (strcmp(tank_info[i].name, desc) == 0) return; } if (i < 100) { tank_info[i].name = desc; tank_info[i].ml = type->size.mliter; tank_info[i].bar = type->workingpressure.mbar / 1000; } } void add_weightsystem_description(weightsystem_t *weightsystem) { const char *desc; int i; desc = weightsystem->description; if (!desc) return; for (i = 0; i < 100 && ws_info[i].name != NULL; i++) { if (strcmp(ws_info[i].name, desc) == 0) { ws_info[i].grams = weightsystem->weight.grams; return; } } if (i < 100) { ws_info[i].name = desc; ws_info[i].grams = weightsystem->weight.grams; } } bool cylinder_nodata(cylinder_t *cyl) { return !cyl->type.size.mliter && !cyl->type.workingpressure.mbar && !cyl->type.description && !cyl->gasmix.o2.permille && !cyl->gasmix.he.permille && !cyl->start.mbar && !cyl->end.mbar; } static bool cylinder_nosamples(cylinder_t *cyl) { return !cyl->sample_start.mbar && !cyl->sample_end.mbar; } bool cylinder_none(void *_data) { cylinder_t *cyl = _data; return cylinder_nodata(cyl) && cylinder_nosamples(cyl); } /* descriptions are equal if they are both NULL or both non-NULL and the same text */ static bool description_equal(const char *desc1, const char *desc2) { return ((! desc1 && ! desc2) || (desc1 && desc2 && strcmp(desc1, desc2) == 0)); } bool weightsystem_none(void *_data) { weightsystem_t *ws = _data; return !ws->weight.grams && !ws->description; } bool no_weightsystems(weightsystem_t *ws) { int i; for (i = 0; i < MAX_WEIGHTSYSTEMS; i++) if (!weightsystem_none(ws + i)) return FALSE; return TRUE; } static bool one_weightsystem_equal(weightsystem_t *ws1, weightsystem_t *ws2) { return ws1->weight.grams == ws2->weight.grams && description_equal(ws1->description, ws2->description); } bool weightsystems_equal(weightsystem_t *ws1, weightsystem_t *ws2) { int i; for (i = 0; i < MAX_WEIGHTSYSTEMS; i++) if (!one_weightsystem_equal(ws1 + i, ws2 + i)) return FALSE; return TRUE; } /* * We hardcode the most common standard cylinders, * we should pick up any other names from the dive * logs directly. */ struct tank_info_t tank_info[100] = { /* Need an empty entry for the no-cylinder case */ { "", }, /* Size-only metric cylinders */ { "10.0 l", .ml = 10000 }, { "11.1 l", .ml = 11100 }, /* Most common AL cylinders */ { "AL40", .cuft = 40, .psi = 3000 }, { "AL50", .cuft = 50, .psi = 3000 }, { "AL63", .cuft = 63, .psi = 3000 }, { "AL72", .cuft = 72, .psi = 3000 }, { "AL80", .cuft = 80, .psi = 3000 }, { "AL100", .cuft = 100, .psi = 3300 }, /* Somewhat common LP steel cylinders */ { "LP85", .cuft = 85, .psi = 2640 }, { "LP95", .cuft = 95, .psi = 2640 }, { "LP108", .cuft = 108, .psi = 2640 }, { "LP121", .cuft = 121, .psi = 2640 }, /* Somewhat common HP steel cylinders */ { "HP65", .cuft = 65, .psi = 3442 }, { "HP80", .cuft = 80, .psi = 3442 }, { "HP100", .cuft = 100, .psi = 3442 }, { "HP119", .cuft = 119, .psi = 3442 }, { "HP130", .cuft = 130, .psi = 3442 }, /* Common European steel cylinders */ { "3L 232 bar", .ml = 3000, .bar = 232 }, { "3L 300 bar", .ml = 3000, .bar = 300 }, { "10L 300 bar", .ml = 10000, .bar = 300 }, { "12L 200 bar", .ml = 12000, .bar = 200 }, { "12L 232 bar", .ml = 12000, .bar = 232 }, { "12L 300 bar", .ml = 12000, .bar = 300 }, { "15L 200 bar", .ml = 15000, .bar = 200 }, { "15L 232 bar", .ml = 15000, .bar = 232 }, { "D7 300 bar", .ml = 14000, .bar = 300 }, { "D8.5 232 bar", .ml = 17000, .bar = 232 }, { "D12 232 bar", .ml = 24000, .bar = 232 }, /* We'll fill in more from the dive log dynamically */ { NULL, } }; /* * We hardcode the most common weight system types * This is a bit odd as the weight system types don't usually encode weight */ struct ws_info_t ws_info[100] = { { QT_TRANSLATE_NOOP("gettextFromC","integrated"), 0 }, { QT_TRANSLATE_NOOP("gettextFromC","belt"), 0 }, { QT_TRANSLATE_NOOP("gettextFromC","ankle"), 0 }, { QT_TRANSLATE_NOOP("gettextFromC","backplate weight"), 0 }, { QT_TRANSLATE_NOOP("gettextFromC","clip-on"), 0 }, }; void remove_cylinder(struct dive *dive, int idx) { cylinder_t *cyl = dive->cylinder + idx; int nr = MAX_CYLINDERS - idx - 1; memmove(cyl, cyl + 1, nr * sizeof(*cyl)); memset(cyl + nr, 0, sizeof(*cyl)); } void remove_weightsystem(struct dive *dive, int idx) { weightsystem_t *ws = dive->weightsystem + idx; int nr = MAX_WEIGHTSYSTEMS - idx - 1; memmove(ws, ws + 1, nr * sizeof(*ws)); memset(ws + nr, 0, sizeof(*ws)); } Subsurface-4.0.2/file.c000066400000000000000000000233211226345450700147130ustar00rootroot00000000000000#include #include #include #include #include #include #include "gettext.h" #include #include #include "dive.h" #include "file.h" /* Crazy windows sh*t */ #ifndef O_BINARY #define O_BINARY 0 #endif int readfile(const char *filename, struct memblock *mem) { int ret, fd; struct stat st; char *buf; mem->buffer = NULL; mem->size = 0; fd = subsurface_open(filename, O_RDONLY | O_BINARY, 0); if (fd < 0) return fd; ret = fstat(fd, &st); if (ret < 0) goto out; ret = -EINVAL; if (!S_ISREG(st.st_mode)) goto out; ret = 0; if (!st.st_size) goto out; buf = malloc(st.st_size+1); ret = -1; errno = ENOMEM; if (!buf) goto out; mem->buffer = buf; mem->size = st.st_size; ret = read(fd, buf, mem->size); if (ret < 0) goto free; buf[ret] = 0; if (ret == mem->size) goto out; errno = EIO; ret = -1; free: free(mem->buffer); mem->buffer = NULL; mem->size = 0; out: close(fd); return ret; } static void zip_read(struct zip_file *file, char **error, const char *filename) { int size = 1024, n, read = 0; char *mem = malloc(size); while ((n = zip_fread(file, mem+read, size-read)) > 0) { read += n; size = read * 3 / 2; mem = realloc(mem, size); } mem[read] = 0; parse_xml_buffer(filename, mem, read, &dive_table, NULL, error); free(mem); } static int try_to_open_zip(const char *filename, struct memblock *mem, char **error) { int success = 0; /* Grr. libzip needs to re-open the file, it can't take a buffer */ struct zip *zip = subsurface_zip_open_readonly(filename, ZIP_CHECKCONS, NULL); if (zip) { int index; for (index = 0; ;index++) { struct zip_file *file = zip_fopen_index(zip, index, 0); if (!file) break; zip_read(file, error, filename); zip_fclose(file); success++; } subsurface_zip_close(zip); } return success; } static int try_to_xslt_open_csv(const char *filename, struct memblock *mem, char **error) { char *buf; if (readfile(filename, mem) < 0) { if (error) { int len = strlen(translate("gettextFromC","Failed to read '%s'")) + strlen(filename); *error = malloc(len); snprintf(*error, len, translate("gettextFromC","Failed to read '%s'"), filename); } return 1; } /* Surround the CSV file content with XML tags to enable XSLT * parsing */ buf = realloc(mem->buffer, mem->size + strlen("")); if (buf != NULL) { memmove(buf + 5, buf, mem->size); memcpy(buf, "", 5); memcpy(buf + mem->size + 5, "", 7); mem->size += strlen(""); mem->buffer = buf; } else { /* we can atleast try to strdup a error... */ *error = strdup("realloc failed in __func__\n"); free(mem->buffer); return 1; } return 0; } static int try_to_open_db(const char *filename, struct memblock *mem, char **error) { return parse_dm4_buffer(filename, mem->buffer, mem->size, &dive_table, error); } static timestamp_t parse_date(const char *date) { int hour, min, sec; struct tm tm; char *p; memset(&tm, 0, sizeof(tm)); tm.tm_mday = strtol(date, &p, 10); if (tm.tm_mday < 1 || tm.tm_mday > 31) return 0; for (tm.tm_mon = 0; tm.tm_mon < 12; tm.tm_mon++) { if (!memcmp(p, monthname(tm.tm_mon), 3)) break; } if (tm.tm_mon > 11) return 0; date = p+3; tm.tm_year = strtol(date, &p, 10); if (date == p) return 0; if (tm.tm_year < 70) tm.tm_year += 2000; if (tm.tm_year < 100) tm.tm_year += 1900; if (sscanf(p, "%d:%d:%d", &hour, &min, &sec) != 3) return 0; tm.tm_hour = hour; tm.tm_min = min; tm.tm_sec = sec; return utc_mktime(&tm); } enum csv_format { CSV_DEPTH, CSV_TEMP, CSV_PRESSURE }; static void add_sample_data(struct sample *sample, enum csv_format type, double val) { switch (type) { case CSV_DEPTH: sample->depth.mm = feet_to_mm(val); break; case CSV_TEMP: sample->temperature.mkelvin = F_to_mkelvin(val); break; case CSV_PRESSURE: sample->cylinderpressure.mbar = psi_to_mbar(val*4); break; } } /* * Cochran comma-separated values: depth in feet, temperature in F, pressure in psi. * * They start with eight comma-separated fields like: * * filename: {C:\Analyst4\can\T036785.can},{C:\Analyst4\can\K031892.can} * divenr: %d * datetime: {03Sep11 16:37:22},{15Dec11 18:27:02} * ??: 1 * serialnr??: {CCI134},{CCI207} * computer??: {GeminiII},{CommanderIII} * computer??: {GeminiII},{CommanderIII} * ??: 1 * * Followed by the data values (all comma-separated, all one long line). */ static int try_to_open_csv(const char *filename, struct memblock *mem, enum csv_format type) { char *p = mem->buffer; char *header[8]; int i, time; timestamp_t date; struct dive *dive; struct divecomputer *dc; for (i = 0; i < 8; i++) { header[i] = p; p = strchr(p, ','); if (!p) return 0; p++; } date = parse_date(header[2]); if (!date) return 0; dive = alloc_dive(); dive->when = date; dive->number = atoi(header[1]); dc = &dive->dc; time = 0; for (;;) { char *end; double val; struct sample *sample; errno = 0; val = strtod(p,&end); // FIXME == localization issue if (end == p) break; if (errno) break; sample = prepare_sample(dc); sample->time.seconds = time; add_sample_data(sample, type, val); finish_sample(dc); time++; dc->duration.seconds = time; if (*end != ',') break; p = end+1; } record_dive(dive); return 1; } static int open_by_filename(const char *filename, const char *fmt, struct memblock *mem, char **error) { /* Suunto Dive Manager files: SDE, ZIP; divelogs.de files: DLD */ if (!strcasecmp(fmt, "SDE") || !strcasecmp(fmt, "ZIP") || !strcasecmp(fmt, "DLD")) return try_to_open_zip(filename, mem, error); /* CSV files */ if (!strcasecmp(fmt, "CSV")) { int len = strlen(translate("gettextFromC","Failed to read '%s'. Use import for CSV files.")) + strlen(filename); *error = malloc(len); snprintf(*error, len, translate("gettextFromC","Failed to read '%s'. Use import for CSV files."), filename); return 1; } #if ONCE_COCHRAN_IS_SUPPORTED /* Truly nasty intentionally obfuscated Cochran Anal software */ if (!strcasecmp(fmt, "CAN")) return try_to_open_cochran(filename, mem, error); #endif /* Cochran export comma-separated-value files */ if (!strcasecmp(fmt, "DPT")) return try_to_open_csv(filename, mem, CSV_DEPTH); if (!strcasecmp(fmt, "TMP")) return try_to_open_csv(filename, mem, CSV_TEMP); if (!strcasecmp(fmt, "HP1")) return try_to_open_csv(filename, mem, CSV_PRESSURE); return 0; } static void parse_file_buffer(const char *filename, struct memblock *mem, char **error) { char *fmt = strrchr(filename, '.'); if (fmt && open_by_filename(filename, fmt+1, mem, error)) return; if (!mem->size || !mem->buffer) return; parse_xml_buffer(filename, mem->buffer, mem->size, &dive_table, NULL, error); } void parse_file(const char *filename, char **error) { struct memblock mem; char *fmt; if (readfile(filename, &mem) < 0) { /* we don't want to display an error if this was the default file */ if (prefs.default_filename && ! strcmp(filename, prefs.default_filename)) return; if (error) { int len = strlen(translate("gettextFromC","Failed to read '%s'")) + strlen(filename); *error = malloc(len); snprintf(*error, len, translate("gettextFromC","Failed to read '%s'"), filename); } return; } fmt = strrchr(filename, '.'); if (fmt && (!strcasecmp(fmt + 1, "DB") || !strcasecmp(fmt + 1, "BAK"))) { if (!try_to_open_db(filename, &mem, error)) { free(mem.buffer); return; } } parse_file_buffer(filename, &mem, error); free(mem.buffer); } #define MAXCOLDIGITS 3 #define MAXCOLS 100 void parse_csv_file(const char *filename, int timef, int depthf, int tempf, int po2f, int cnsf, int stopdepthf, int sepidx, char **error) { struct memblock mem; int pnr=0; char *params[19]; char timebuf[MAXCOLDIGITS]; char depthbuf[MAXCOLDIGITS]; char tempbuf[MAXCOLDIGITS]; char po2buf[MAXCOLDIGITS]; char cnsbuf[MAXCOLDIGITS]; char stopdepthbuf[MAXCOLDIGITS]; char separator_index[MAXCOLDIGITS]; time_t now; struct tm *timep; char curdate[9]; char curtime[6]; if (timef >= MAXCOLS || depthf >= MAXCOLS || tempf >= MAXCOLS || po2f >= MAXCOLS || cnsf >= MAXCOLS || stopdepthf >= MAXCOLS ) { int len = strlen(translate("gettextFromC", "Maximum number of supported columns on CSV import is %d")) + MAXCOLDIGITS; *error = malloc(len); snprintf(*error, len, translate("gettextFromC", "Maximum number of supported columns on CSV import is %d"), MAXCOLS); return; } snprintf(timebuf, MAXCOLDIGITS, "%d", timef); snprintf(depthbuf, MAXCOLDIGITS, "%d", depthf); snprintf(tempbuf, MAXCOLDIGITS, "%d", tempf); snprintf(po2buf, MAXCOLDIGITS, "%d", po2f); snprintf(cnsbuf, MAXCOLDIGITS, "%d", cnsf); snprintf(stopdepthbuf, MAXCOLDIGITS, "%d", stopdepthf); snprintf(separator_index, MAXCOLDIGITS, "%d", sepidx); time(&now); timep = localtime(&now); strftime(curdate, sizeof(curdate), "%Y%m%d", timep); /* As the parameter is numeric, we need to ensure that the leading zero * is not discarded during the transform, thus prepend time with 1 */ strftime(curtime, sizeof(curtime), "1%H%M", timep); params[pnr++] = "timeField"; params[pnr++] = timebuf; params[pnr++] = "depthField"; params[pnr++] = depthbuf; params[pnr++] = "tempField"; params[pnr++] = tempbuf; params[pnr++] = "po2Field"; params[pnr++] = po2buf; params[pnr++] = "cnsField"; params[pnr++] = cnsbuf; params[pnr++] = "stopdepthField"; params[pnr++] = stopdepthbuf; params[pnr++] = "date"; params[pnr++] = curdate; params[pnr++] = "time"; params[pnr++] = curtime; params[pnr++] = "separatorIndex"; params[pnr++] = separator_index; params[pnr++] = NULL; if (filename == NULL) return; if (try_to_xslt_open_csv(filename, &mem, error)) return; parse_xml_buffer(filename, mem.buffer, mem.size, &dive_table, (const char **)params, error); free(mem.buffer); } Subsurface-4.0.2/file.h000066400000000000000000000004041226345450700147150ustar00rootroot00000000000000#ifndef FILE_H #define FILE_H struct memblock { void *buffer; size_t size; }; #if 0 extern int try_to_open_cochran(const char *filename, struct memblock *mem, GError **error); #endif extern int readfile(const char *filename, struct memblock *mem); #endif Subsurface-4.0.2/flag.h000066400000000000000000000115441226345450700147160ustar00rootroot00000000000000/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static const GdkPixdata flag_pixbuf = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 1383, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 96, /* rowstride */ 24, /* width */ 24, /* height */ /* pixel_data: */ "\206\377\377\377\0\5\274\236\255\"t\217\236\314\234\206\234\211\306\211" "\2276\377\314\314\5\223\377\377\377\0\7\305\225\237`\271\241\255\375" "\271\226\245\372\313\225\240\366\275}y\265\355\247\235c\377\315\315$" "\221\377\377\377\0\12\277ei\257\253`h\377\360\302\313\377\340\300\307" "\377\225cd\372x,*\364\305bj\335\355\221\251\236\377\323\356K\377\377" "\377\12\215\377\377\377\0\16\377\277\277\30\276TV\353n\30\33\377\344" "\232\262\377\374\347\370\377\351\316\341\377\220\"@\377}\33\30\376\256" ",G\367\255Qh\355\313\205\227\314\373\326\342{\377\377\377.\377\377\377" "\1\212\377\377\377\0\20\377\263\304Z\252;K\376\205\0\4\377\262\77]\377" "\373\314\350\377\376\362\375\377\355\267\333\377\253\0\36\377\255\0\25" "\377\234\25(\377\2250=\375\245P_\360\276q\200\343\350\254\271\257\377" "\311\327_\377\323\345\35\210\377\377\377\0\23\343\216\261\243\217\26" "4\377\301\0(\377\254\0\32\377\275n\205\377\377\377\377\377\377\367\374" "\377\344\243\274\377\241\0\0\377\273\0\33\377\307\0(\377\263\0\35\377" "\245+6\377\247HT\371\266Sd\347\311q\207\316\321\215\246\217\275\232\257" "I\264\226\264\21\204\377\377\377\0\24\377\266\333\16\310d\215\340\213" "\0\"\377\330\0,\377\323\0\23\377\212\22\37\377\312\265\262\377\377\377" "\377\377\374\362\367\377\310{\215\377\235\0\0\377\313\0\"\377\334\0'" "\377\327\0\35\377\277\0\14\377\253\12\"\377\2422D\377\233AZ\362\220P" "l\336\216k\202\221\204\377\377\377\0\24\377\246\265H\263:[\374\230\0" "\31\377\320\0$\377\344\0\30\377\264\0\0\377\221D\77\377\361\337\344\377" "\377\377\377\377\365\352\355\377\242#A\377\241\0\0\377\334\0,\377\341" "\1#\377\321\4\33\377\301\2\34\377\272\0\35\377\263\0&\377\242\36:\377" "\216\77W\231\204\377\377\377\0\24\366\204\213\225\243\23&\377\251\2\34" "\377\275\4!\377\321\2\32\377\333\1\24\377\263\0\0\377\301w\205\377\377" "\365\376\377\377\377\377\377\345\312\320\377\217\0\0\377\275\0!\377\335" "\3,\377\313\6!\377\270\14\35\377\273\11\37\377\307\0\36\377\316\0\35" "\373\245\0(G\203\377\377\377\0\25\377\225\252\14\326S_\334\227\0\3\377" "\270\6\"\377\262\11(\377\260\13)\377\320\4%\377\331\1!\377\241\0\0\377" "\326\243\271\377\377\377\377\377\377\374\375\377\315\237\256\377\225" "\0\0\377\312\1+\377\320\4-\377\261\13\35\377\251\15\30\377\267\6\25\377" "\320\2\33\327\321\0.\13\203\377\377\377\0\24\362\231\256<\244\25""1\375" "z\0\0\377\256\0\30\377\270\6'\377\263\15""0\377\274\11,\377\320\2'\377" "\262\0\15\377\227\36C\377\353\320\331\377\377\377\377\377\370\356\362" "\377\257On\377\233\0\4\377\320\2""1\377\312\7*\377\266\6\32\377\272\7" "\32\377\275\5\24\227\204\377\377\377\0\24\256\200\220\212\275t\211\377" "\262Kc\377\237\0\34\377\245\0\0\377\254\0\26\377\265\4\"\377\300\3!\377" "\306\6\37\377\234\0\0\377\271^t\377\375\356\366\377\377\377\377\377\352" "\322\333\377\223\0""4\377\256\0\40\377\333\6""4\377\322\2!\377\325\4" "#\377\277\6\26P\203\377\377\377\0\25$$7\16OGR\326\314\224\252\253\333" "\207\242\241\306h\203\326\263Le\377\247$:\377\243\0\0\377\253\0\0\377" "\275\1\31\377\300\0\34\377\246\0\0\377\334\235\257\377\377\374\377\377" "\377\377\377\377\323\242\257\377\215\0\0\377\311\3+\377\333\5+\377\334" "\2#\343\331\0\32\24\203\377\377\377\0\24""62@L\0\12\23\355{{\204\37\377" "\377\377\20\377\255\321N\337|\236\216\310s\214\301\274dy\351\255=U\377" "\254\0'\377\265\0\6\377\246\0\0\377\237\0\1\377\352\301\313\377\377\377" "\377\377\374\360\364\377\276bt\377\240\0\0\377\305\11)\377\315\3!\242" "\204\377\377\377\0\2""85@\237)*6\307\203\377\377\377\0\17\377\377\377" "\1\377\333\3721\366\250\304l\322v\224\251\301ax\322\260[c\361\2556C\377" "\200\0\0\377\230\0/\377\347\334\336\377\377\377\377\377\364\317\327\377" "\2340;\377\223\0\4\377\262\11!V\203\377\377\377\0\3""999\11""53=\334" "22<\200\206\377\377\377\0\14\377\377\377\22\377\302\333G\345\244\256" "\201\311~\213\303\252v}\336rSV\372\231`l\377\367\362\360\377\377\377" "\377\377\331\250\260\377~(1\351z\12\12\31\203\377\377\377\0\3""51>>5" "2=\37211\22052=\351\215\377\377\377\0\5\377" "\377\3774\355\337\327\177\350\316\306\277\352\305\304\342\377\323\330" "\\\203\377\377\377\0\3@@@\4""32=\32531<\214\217\377\377\377\0\3\327\274" "\274\23\261\213\202X\256\224\206\23\203\377\377\377\0\3""5/;+42=\377" "33=2\225\377\377\377\0\3""53<\20342=\334\0\0\0\1\225\377\377\377\0\2" "42=\34131<\214\226\377\377\377\0\2""42=\25751=\77\226\377\377\377\0\2" "53>t44;'\226\377\377\377\0", }; Subsurface-4.0.2/gettext.h000066400000000000000000000004551226345450700154700ustar00rootroot00000000000000#ifndef MYGETTEXT_H #define MYGETTEXT_H /* this is for the Qt based translations */ extern const char *trGettext(const char *); #define translate(_context, arg) trGettext(arg) #define QT_TRANSLATE_NOOP(_context, arg) arg #define QT_TRANSLATE_NOOP3(_context, arg, _comment) arg #endif // MYGETTEXT_H Subsurface-4.0.2/gettextfromc.cpp000066400000000000000000000010751226345450700170510ustar00rootroot00000000000000#include #include #include const char *gettextFromC::trGettext(const char *text) { QByteArray &result = translationCache[QByteArray(text)]; if (result.isEmpty()) result = trUtf8(text).toUtf8(); return result.constData(); } void gettextFromC::reset(void) { translationCache.clear(); } gettextFromC* gettextFromC::instance() { static QScopedPointer self(new gettextFromC()); return self.data(); } extern "C" const char *trGettext(const char *text) { return gettextFromC::instance()->trGettext(text); } Subsurface-4.0.2/gettextfromc.h000066400000000000000000000005461226345450700165200ustar00rootroot00000000000000#ifndef GETTEXTFROMC_H #define GETTEXTFROMC_H #include extern "C" const char *trGettext(const char *text); class gettextFromC { Q_DECLARE_TR_FUNCTIONS(gettextFromC) public: static gettextFromC *instance(); const char *trGettext(const char *text); void reset(void); QHash translationCache; }; #endif // GETTEXTFROMC_H Subsurface-4.0.2/gpl-2.0.txt000066400000000000000000000432541226345450700154570ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. Subsurface-4.0.2/helpers.h000066400000000000000000000031421226345450700154420ustar00rootroot00000000000000/* * helpers.h * * header file for random helper functions of Subsurface * */ #ifndef HELPER_H #define HELPER_H #include #include "dive.h" #include "qthelper.h" QString get_depth_string(depth_t depth, bool showunit = false, bool showdecimal = true); QString get_depth_string(int mm, bool showunit = false, bool showdecimal = true); QString get_depth_unit(); QString get_weight_string(weight_t weight, bool showunit = false); QString get_weight_unit(); QString get_cylinder_used_gas_string(cylinder_t *cyl, bool showunit = false); QString get_temperature_string(temperature_t temp, bool showunit = false); QString get_temp_unit(); QString get_volume_string(volume_t volume, bool showunit = false, unsigned int mbar = 0); QString get_volume_unit(); QString get_pressure_string(pressure_t pressure, bool showunit = false); QString get_pressure_unit(); void set_default_dive_computer(const char *vendor, const char *product); void set_default_dive_computer_device(const char *name); QString getSubsurfaceDataPath(QString folderToFind); extern const QString get_dc_nickname(const char *model, uint32_t deviceid); int gettimezoneoffset(); int parseTemperatureToMkelvin(const QString& text); QString get_dive_date_string(timestamp_t when); QString get_short_dive_date_string(timestamp_t when); QString get_trip_date_string(timestamp_t when, int nr); extern DiveComputerList dcList; #define M_OR_FT(_m,_f) ((prefs.units.length == units::METERS) ? ((_m) * 1000) : (feet_to_mm(_f))) #if defined __APPLE__ #define TITLE_OR_TEXT(_t,_m) "", _t + "\n" + _m #else #define TITLE_OR_TEXT(_t,_m) _t, _m #endif #endif /* HELPER_H */ Subsurface-4.0.2/icons/000077500000000000000000000000001226345450700147425ustar00rootroot00000000000000Subsurface-4.0.2/icons/advanced.png000066400000000000000000001165501226345450700172250ustar00rootroot00000000000000PNG  IHDR\rfgAMA|Q cHRMz%u0`:o_FbKGD pHYs.#.#x?vIDATxw\gy=mlVڒ%˽wc pc09$$KB 8q\޻-ɲz[IN=(2 2c@e(+28QVeq(8FYQq(ePF1 2c@e(+28QVeq(8FYQq(ePF1 2c@e(+28QVeq(8FYQq(ePF1 2c@e(+28QVeq(8FYQq(ePF1 2c@e(+28QVeq<PFGv@":h+dI^@QЗY% ں}c(cPkeD:M:2]`#%.=ǹ?@eL"η5\¤ʁt Ј?=Ǻ?ce1IH몐;t pQ01Z:zQ2 bBC(I"Al2Ƃ%  ePFDA!%/1Nt H>"AAUPVeql 퀀"RDw1YHd\9!ePFDo!Ttٴ#]d^"'If\̌K yty<@eL6Hxg; G,B?.ɼ`j>PVe1I$HxuHq,hV9_%u2}㣬(c'r03#gI?unK 2 p cl%W`Б^(#pV;/QmX0.c1]rZQ=#XRGU2}eL epB x0 hZV ¨dD8(aϢ@ :=.{OG8 @ %E<% JB4M!D19g"؁{[* ,fiRQQA2&jkk&JljbBu]{"5UzvD֡=yIAbdhh FX X3k,V^E]'ܹsBu{ߋ(L&C{{;֭gƍ Fo*<quL'IȻlߑi[ ITJL>Ep jB@{P } XۻSufϞͅ^e]իijj4@ WJiH)u}c``M6cq}/N ެ ٖHXqy 29Re? exHKp$o;bee\r4+?zt>DhB7qy駟N]]a6C¿sa&aP,ٴi{/w}7/2|{[ֳoܕpmY%!U#%sl[`Dyz5fP AKh>u0sWq>lZ.Rbv)iy֯_~;~߰qҷtN1mȨ8n1‰H WJ[HWbk {ɳÆTN(@uQ"|z}xr~Y(AEUۍ*y |#i< p'{ Hstq5`ż=ꫯfܹhF.;^ 4Y|9gf?QNkBAGQ2ǐ$'$8귐8!\%UTA/iCU`ǺFO1p =T:Ba %HeV,>P?o:d2뺁p p]bH$ /ŋswk.PqҚ?@Qlbc""vfOfkdFQ0-$#<7d," H9ؒ-:p2uV|W OCun AR=iw3N(ɹەhycOb@( RI#_p_p.QJ;Q>ck'qyT t~Tqw'92KT(KK3g \s #ܟ "X+Wno %|q2fwH7|mƈA(0\w@`xA#RP+(/ ͕ZxB8STҏj *JN,u( d*8;#Māxjٳ?UW]E" #8RJ4M@E!R kS0tH%,AThĊK^T)Vt0%j(ЋY'kDEgjQd''OOymIf%̬Yԧ>UW]E("9c `K,SRJ>e+Qt I H:1!B́ QW#jKEI'aK`xp_` ~ٿ乚oeʽ܁4&F{P39^DY m@)# )((455qM7q嗣:\pqt]g|X,#* 22.2R@B$\+;G*j ($l9m*h0j~UQ >2\VC)UYDW$J?u]G<X< sꫯo_|q߷<*% |Q).$\G#lU Ћ(ZWBTQwZd1"JKuy:QQDsO, 1u{uF$#85|uM7M.+H$B.z#ap 'puΝnP?g9d 'YW`:[!D+h6Xҕl139Ag(j&\T7(5SPU>T| ߉21H@_fqL*V{؎o:U(w(`ռ爐L&3 mP(g][K9@y9gfZH"hE $K݅t yhD] 5c|(}"XިvJ@n;B8ȧ1> rnLeXHilf>Osn~ ޽{}ݷoFY{$9\Er(!/,;.[ I%VA"mAƑ+ ˀ~,w]F9L#i~TD K(=Du]Dy"?RWw0b실w~!TdxV"٣0 9VZqhdK}‘ҷXEf'o{6 ?hv$qWb d <bÉ`L_;(/_~h[ a|T ?20ʲ9UC񴠬v7QJr>]Q={6g}6XB0_ߥ~OK)%exbRE vzoڰ,d2I}}=444L&1Ms\aBD8y'ٻwo1PGٟ+ :_dx040sڀ5lZCa1.USjU<%DJUq$?W|?`;P|$ׇq(mc}K\ iooP( =JH$D"Bl6K?===i项3fP]]M$07%SC)%3f`ܹc)P P)7t|J@e՞>+)Zܢ^)?/9ϖlH9(.gTm3BOr{9T*)KM.ʒ s>jzr,DcFss3---OEرcvbhhx<ܹsihh&X|AR"4 0D"$ eY~R?# B0G ˍR k-K,cG_R?fx-K8Gخz$WV%rUJRj ˻Q.,jdGL6{QǍv{o>Ԓߔxt#VWPYwL@2拆3H$ QbHGG[l]י9s&3gΤX,!rضaB!bdP(eYAt_ xK}j|q48oP$y4P(DKK )$*.\bPcK$a[(tHe&+ $s]sRVYTQR %T8>;LO(),a= *bbEE>/ yf3fPQQ8l߾.,JFe_-  VP(D4  :|Eaf@os_wAujkF,==={nfA W9!޶.>%やB6F̤EmQu\ .ȴ^@Hj DN _ڹ3^:vZg2R7fc*%@E'"~ Ѿ)w^l̞=Zl۶@f̘A}}=H$0GVn  S(*EI&1Wχa4M VҘ7,H$B$!SQQ7!LL&3g+V={sNz{{ff ?믿>+RU4JHD\`iE6H%VZ`u1҂d*HN`+f Qk@# ko+* {mn(s*(m0Qu (e"AMM Xbpuvvyf4uuu&F7o^ Pv]h4DQ8MB[? ~8B@__ضeYqjjjʇB!hjjbҥtuui&vPp>c)?PUUE8-(+;wϠ-U˦ pS|`{ NJyލZ6g-qY5M VJq( uV!ԯd…DQ|44] VT*E*P([C>fXrҬ@&nlX+--- b1Z[[9s&lذ7X4+ 1Q_Śy۰ըrg/h7 .kj0<1p!*vrT k-jn,DQ=1Tv;S 8|jFCS]qӚF``;wC"boǨҁ~ x7}woMH&TTT`]]]b1)žQ[[g… ٰaׯg`` Jw9&Pt*4_^ep(j$lA @%ն`sX;v\iD(S&cFaT-U((FPʨ%/'2N߇; gK(bɒ%,XFRJ"0-3fP_WO"1f}P+E"J'8[P@JkJ3Jlܹyg޽T*_mm-gq祗^bdY, =xj lɭ9gɶ)jXI(fK`qSݧG%&^A bNo%uQLpSP_j=Tzb?>e܊ M}P䯮bnmF*⬳bٲeAt= {!n4660w\ xg3f}W`_Km8*U~aTUUJmA%LJXDmm-]tg駟fΝ4 n3PYJJ> 'yAs^`pg7W7$Ơ4*&*<oP90 *w?x+'{PdgCY"yn%N4 /piqNiѤ!V9Pv?? ab֘BBaoGrvjK~$4^ǀhGQ_0m¦Ff,U[_?{Qa JƙF)8qQ,1 s=+WDUvlٲsryBwO?}o:B0Tw|aY֨abR!cc(/u#(3g$NC__+RN8Kёyzik藍*Ru,Xvg]r?_SȿRz\5׈F?LMC&-s,/ o 6X&|?稺}MCqM䎓Q{x*%PJ>ׅ+؀ "&j"Qw)\ubqL_uS__Ur9| MMMgAN:_X,rEp0bD.oiqVd,bxxx~_}Qjear %HF\ qGX B5k֠YfP cNĨLĘm<:A4M 8+Dgƍo8swSSa%R9P~dܤP}Gm_WvH1Qsr`2Ru;? 666;!eƆ cquW:"0 !H^ @TR6&V_ò 8 }߷c A+e5@ Q%Um8l^xW^yOcTqtMcVbxi39n6Gem?O+Wᑽ؂Mb|•Ơd0rXN`"G-?pc (7:ԉj,ŇQoϣjgx߯ƁEw'o-*Ksww](^]L2e944̙3~RJg*Jַ5m7lݻYp! A5tddKy'H÷ҏ+hAA6 -;i,K5n%=W}ci rر 6P4 Mj *SHTZ"VkA ʷ hDoqaT;RK!qPJ2Gؽ EǡP(2wFlL3e'HCC=3W^o81B*{ >G])Jh+PrH$$-&fQ4[2ߣ@%W9N>dy~i93'?I"@Jɺuؾ};'th4' ]9#Vr wbR sf؉]EHIkTaVNiϾ u1MZI9ࠑ(e7"iGhLa,;Fۥdh5s7omPp)v!ڀMoҤ3#0lp*rXNbfQN;b1 z5 *.G澗ɥ@ }TqR,+`0ӏtI\s5[ fΜmtwwϲdɒ` ,)RꞰx9t?@}~DB=_y+n@"u=c?Q6WRJ\BHA2]!p]]  0!fϞ`Q`FBҰle-0wСPuDÖ59H$Q[#QP(+0 ^ǀc @xυ;=8 {cDe% ߜvituu! zy}}=gy&/|D"A]]\.h;#_%,0K[KπDbR"D ZtCE|PDjž?*;?&6bi6AJIQjBjeRJ8:`Zm#u4خ l)q hUM}|bI_-™F)R?V@N74~-BT]O.BSK=a:00t:i Oꫯ{n8 |z8 i%}^_зMf8K wto_:t@f pd29j;cKӉB`֡_?r2 e8@ +$Ev\\6HBQPB!/\M(5G״nt-Dž,JbF8+ 4_p)߉{{> "cr>woزiА ޠ4Mb lTݽSO=E]]aP(_ցET'w 1X ۶d2 }E0?{8|wlBXA3F#K2dxIz(.bBข@B"4l!G"445i8 &js%’"͑VD f E)oc:w+O?EKÌTڨtF5 1&[?-ӆq'hU-u=۱c===^zԄb|ȏ?l7oPڈwVACcppl&Hd2ŸFbGVW@DZ):63Bc kؚy\)ۄu WJ)%dE@u1L !%CFMl/8X(@Ӱ54zr l/G yA8V~ yq5F}M7wZ=k֬D:P(`&h4(ly#-!bp޽ jժäӃbqlۦ3plbk֬ xҋh%LH%2%%.KK )U%wѤ$bi.dl]q P\p4O.cwf7 u,]|$k5׀n`%|` o ar9:;;ijj |aT-[l~bW_}5D"ϠnD+ַ8Y&x, )X+]tS" -d*J V| ~K໚S;&p(#owL>e+m~`dڞiUhCaL2 DUPA ,_+12qlr|p~oP`xx8 j#_v :u]祗^BucΝTVV*GJכҕJUwĩCFz@[wu a`YHB3C`Y4\Mt\tx1]G 0vm 9BY"bH$X,B@}}=tww}_IIn];eVUkO| `C@UkNzp  6Fs=<B$ tlٲ۶ioo'N8e*"<5 Z"Bgp4GqQv( a"tt!u\J\3S֨Ae4g! zWyⱕ\EOs0x3Pu!FFT-T=3hAgg'frQ.po&k׮ "cs]4]+% @Q_+CqEEl6jˑA8R?nzzzp]Lz]B^zBq!4%0Ba4Cq /@.d a_K']-6BSP[ qimQΆٺp}ⳬ<+_mk;ϪWӾӣ)MϢzW@088PUUE:&a~*> |r">DwTmJf\P!MӰLJG,7BI!~+!p";kTe%XD"btKuĦ( NA7CQH'hX؆EѴ(ݤɢqR*č-u":thI@PeBn,YT5jGu1C¨^?cfT|{a{q#M>G6/;3hul6UU/!tR UsK R]Xvvv+V :WN iiiaѢEDQyH$v_MSH3%V]G$l'58nߊ :M12"nh!2 p52(8.ECDZLP6óm{1dYҙb&hnaV#)rfHM=ճqa-[i?1GU枩V4kx>.vdy{#tH)iooG?L&rcsݛPՌPTg|Sr{'lfpC/^̪Up];^6l؀id2YsN R~4u@ ѽd_J(W9Ҥ㺸CmM 4w~#c& z"mmmpuu5ͪT+3 :45Bئ( (,르HECtuB ̓Ի% _g$BK7ZxB(7h0+su z!z)P'ɐN1DH$wyTVVꫯmDSt4t@6?3/8^/|\6mvbMtuvQ(*RZZ[3w .dٲe̝;78vsxx];h`vAtݠ c Qs?Br# Ƃ7@ P"P:АGB+/W)` LRu0yGٻw/''"hLiii JvGq MӰኀ ϓddشa = BCTT"N>Q("Ν;ٳgX;wRUUŪU8FD" R5 "@/eH-1Hyo g2\Oq E]Y=ժ ! LiâqQxex̭Oq0gך}wrw <ÑvP #ě7o6W]u\p55581tNQ__OMMM85ϒfcēO30\$ " &@P(D"@') T@6e͚5lٲիWS؄c&MFP!j1Qu(Om!ϓefDC\" ݲ, iZHD& 4Ԍ?>_|17pn\ft_b8544{7vQ{+^3g*3ߣzjH&+*ٻn^}u Xp84sJW}۶ ƓcY᷽mRSSC(" %d%>H凐vUJh;9r4ټy3[n%LD$>ه$CvodΩSA:b(dl#T= 5O*@V{@V4 cEHM'T t0{˳%ʝ{w}qx7j Qio,˪_L't]gѢE,YEa#~ΝtvvRQQB8C__ߴkƭwr9F+b~(fJUH%'+00=i{H4p+O%R7ЬJ4/PTue3i?'x@pxr^+Cдι˹ٳFrYu` QWWJ Ndv.jkF*$ MЫj+RءEä{aZ 0F(uĶ]E-aPR7o{eÆ 98(+h4z̙3I Lێt]/}/Ƴ,Xh4ec6;v䨪"w^}i]ǡ}vn}ä*+B"q6 0d(c*f_ҨkQ]_BW pCpX2IQ@AJlGTUF6 L^xzމe~3 `jf??S.\Bdq^555ݻ7 (,E>pN;N;-unݺ wlaI;y I$"ZC"o!" Q1 .+4ɹatzQtȻJRH-ؾ:pݻyxWkxx#e, ` ,w͛2iN\,[,e 4P((mmmEJI___ BtvvN88~7K,!JQUM.#s]w}1Ӆ}{iM}}֬e'1^O#AJ<3!W 騱&9`tA$M9]Jaj`ok׮_o(`ce0yhѢDKK {Rl"X`ʩmH))LGsSSSìYxGmh4J4@i.***8xǜ9snZв,btI_%O<'8vqщHMWΝ;=ҎCosYgEo/_O82 A‫'̻.9 B >_7POTE]E]~;n6~_ݻ5:۶3c*y KN8!m޺YQxH֠Xy_0HUA(4,bflH_³ŋ꫽jR>O~( Ts-": o =(1g̙vil߾=NDzj>O|rz{{) L&C. }%>qw𖷌?;kb+QO/w˚kYP \r'`//( B(EW 33B:y+žGc }z:,VXQ[8]7ӑ8.1Mk\pu駓H$rCXş} |7rbd2Ʌ^HMM ۶m vt]g޽+seQQQA.q2Lbxx8|7y(D"nIuϒ#Q@]S M1- ~3#/J%y!ɸJKCGSD#ͼ_@'phmmꫯf…+oQ 01,ug6\}`L&3=x'?Q?yV+Vxbn@iƊ+lA#jP:BP ?vʠ[ꫯfΜ95SI4c{YUU+Wq ̄5 ے%Kp ̙3t:4J.o>x7KLJ?C,cѢE_uA|bR־_"+W$+$[Luu|ӟV/sY|ϧX,Yk F垌xghh :~0Y3x2$L& Jwl]]]ٳ'.~188H?qyy ҥKJ<ݴ=.iPYYɻnΝC,_Zs̞=ٳgx饗8w!H?x0-Ͳu@i:::ظq㸟jmN<u0b H-ÈD#QhP"E8J$h(9>Έ N^Ɇf\ץ[H$ _xW^ICCwܼyTtS& o+7tAOʟfq]n^y6m.:p82տ2ϧR(b455뚼kAAO2J>!Na֮]֭[iooP(gϞV! e B)4D1cq"JJ*x#A&2xŸvƄsR^W~'\ Á^}k?XcA]-N#Wp"T뮻wX`>?Ͽ}vz!vqPFvF,ktijzB!?|x1r[laŊqbPhƍY~=[l~/siR;ʺzp- %^*h ,Zw|ߜtlFJ4?uuu{n.2f͚3mn3˿KfϞ]_sIK~q) E->ƙgI>n\)$K<&.BNZ2F'7L Q,]<gΜ9TWWKUvws7,+kӁ%~\gg'[laƍl۶6z{{={=z-[Fmm-'BfG6j([Sl?>_bJ.P_o$&q%?W׬w8ׯ/O>`DAYt=mmmpǓ4͏^|7t---A:ǡ|{𖷼 Eɍ  rp8駟NX hV^Ͷm͛yXx1Ko)5}`ر={w^zzz%?j~b 7ɳ/I~b4@ G B Awd' o9sXݰ]wŮ] hhh s| ryOU=ϥ~J/v(7RԻz" qF?}9NXP(i& CKK An2/4;7IGGGp3۶M6>ioo']qaɒ%\s5<Ѓ<#̩|G ')JUJA }N@^8\S~/fb\ps=9+8ZZZ 㬳's8sYbW(CDmbRΟ+T]~=<PN30h4'RMbX4 AkNM QqJΚ5K.u2۷sspgJFalA28g9Ǻʕ+ӟfٲeA`Siv_<z,[kS P:|>O$!Ja6jqL&ewK_ƛf>NW~sxVX.ZUx@u.[-F3bb1+Mf@,g};+4 swg.rZ[[@4媫jqcCv0cY\ ?,Z=}u]"/{G"9jkz(_KGyiUUUA˹+?6}Y85k===ڷJ>o9-կ~uT}A&;'tMMMA_8R M̞YguH^z)p VZ5k5Fo]qƟƃ!±p.h%ZZZƝw; .UTǝB F 0 v6O}j gr-zڵt:  uArAxx_>깯~r9 bQC4h&N43<`Tw=d\d2,_/}K,X<߀Yr@ıNw?Ouu5z_nx`Z}}r)̘9 2Bbfh+K&_>}n۵m-[cǎmжm si4|A"={;8Y`p8PS~ `ҥ,Y|cP(prmiӦQAN8/| ̜9Rhq)^zg>*++X*xO:qSFee%z ᰅaH)[ A.? ͛My?3W>g׮]A/N8v뭷ri>M}}=W\qՁ;'%)oH4*SrDn:n~᠇ Jspp+V~w0}p,)_.\x>9ZZZF~~GG~;/]1%-Zҥ~~ -[X3.XaerShll<>twwswpwݍi[gy&'bA6+ cKK%g?~PRJ^z%~OO8RZTJD;rPDz,hPһm۶qi?_|:O~z_cr)pWMH*N~ Q AV/^< ʝz͛u} dKxoheƃq,(07TYjU`C;<#zQipxʦcee%V²B;?&`T&**ئMƍi,[?|du^]wM74پ};^{-}}}455qu ēM4ѽTe%'X1ON7n?1*Y?zw#=p6~p,(p A`8R$ Z[[9SXpos2w\N)E)Hi6 HPYYI?ׯo#̗%/OwX|9vwy͛7sײyf$Ї8SSW 0M4B`&'ک,_+W<*?ttt<쳣,t:nSN9'|Fo1+o zmoJu 455Q[[Kmm-ON|ٲeTUU" JQZD4uٻw/etW,ZկF5555̜9[o9s挙n{ؼys0=K/%c(L3Z={S0Id2DPLKww>~3,~j>яvrGG_D=)8@O˗/{~__zh DQ9s&MMMTTT,0L۷oߎrr[x1p$K[mAhi5ڮ](TUU188HCCo83gr7s7裏ioΫ:~QUU ,oyc{|dppX,G>ꪀ4(^#0Դ!סyNz[mMMMf-ZD?{a` i.IJɂ Ї>ķM2 @n>}{tvv=׿'|5Mf͚E]]p۶顫kW3RkIGhmpe6JO)f{{;]]]ضڵktI}qyqyQG'P_~xW̽ @SS7x#^ziSjӿ&%BCa.\O溺^\fͷ-Zkoo?Uz,X@GGv TP7 \K/X,^8 9ȃ>%)`!ѪN>{Ei'x"===A^_oKd̙ٳF44;w޹sk!mS9ٳgЀ#, _zo=d2ذa?<\s5466hhhkTS{ժU\viARP>Lo5M-I_~wttlkkkJf+.\'555Դ.\P5kl۶;wR6ms=裏ݛ,\s=W_}uIOOχwH/x4'Ν[{Wf~6~_y1o<*++m۶m۽{C}}}R>h'VjBCف%PZiPuٲe 6lgѢE\{Սkwf۶mr-𖷼3?Tk/,˂`KcS3uSUmہ̴?w׿s̙Κ5liiaѢEWbEǫXv-<H ࿀W'ѨN1 s9JRᯨ`ܹ̟?tttiӦ~944x*3̙31 5BD>UW~`*b͚5lݺ~ロF.RjjjhiiNa !xY~=Wbڵիy[Ў+i߲Cn 00t ב$UQAsST6W@Lf_G˗/=ӛz͛ڵkٹsٙ|>ڵkb{Q C:shT744ԯ\t:m_*p8̜9sXd h m۶ݞf-nH$hllLy4w%- RT*EKK [n套^bӦMرo~ERs ]c t5kּ!I'_ŋ4 ϿoRj@ )0-STH]`:l6g}qƍv ':{gϞR)KfuM>)B 6m J" ͒N~477bŊ`]OO6mڵiӦ;+Y0O`OצoLE r9"555,^={믳qFnJ__ʸ}qjkkYh'p+V9Ȧa"H$/5/ Anfǟ$Dz!`?o׭[_xډ6I)?ITm \t?G(~ƓO>O_7݄OD NB_X}?qz҂R!-RR{߾RjꇔR TJ^~ۡ Eu`* LSѦ~dfnݺáP.k֬hoo.۶@`JL;SWW74DV7sU۷\%n (F^}ߥϿJ<$!/:IFGPUЈPۀQ1I  KӴ#)t4O%RȠ#pd#^)c*9a48j,[ǃT|7 6jؾz߯G FY˲Nv#p8"x3p:.%&#L&)yTUt?B)Pg{y]r PPVFآ뺌b*R&?_Y/ͅ+H)a0bd2I*bi)6r<=FoPJ_ƁkfR _hep`8k㤫S>xSaIZ\+Sƛ! kKp?0 :^=w>7gb*(F` mۻ-J566yWu v\!^PV?QWWGUU?Qh#W@; k9/v[3̲YfcA՞([ b>=͇*C=2 㔴d4MӘ5k7nZHW*M(CA4\A/Dj#y,άYYzP7#xS:a-yZTQѤP.]We0q2L]}}=cJedQQUvoF\ a;~fIY؟a5Mcxxu7 ^ޏb8yi^G?f(+`&fϞl¯/e^CY%= M&̛7p8=7>l-y> t_ Fz,ԍ*_;QVGL:>'͘7o֭7k躁J>qG\xsid J!ྙIRK6exx&M 3Ejہjf݅R{'ò8Slwpp&JQ__ٳٸqB,b(B5 VƛqT/c2JsssP1!ΛW9(P!~(+%!Kݗ̘1P(ܹsd2ޭB@zhH(spݲxHYkhh`gB6A8È(߯+eO1d7W@-ϟ `rWM@cj-?!^% E'̈ٳ)K7Qw_ Dj#c<-c޽{/X@ضMss3'ttuuẮ$~q(A ^d 'B(~ Dqp'nB0⷏෼ e0y HohYtixbbX0J ReL?z5Q*p]I ;8 UcTvމ25h::;v|`Μ9D"& H છQqhs2*cLH:R:::عsgO jTQxdLp_\k׮O<1u]G Bݐ X@4WBAկҲtf>ن mET1d *4C8]ש\͛o3gd29]RBJt)q{@H m{}#Bl4p8Ν;پ}{UQuLFqFLqWRVG$;{zz.غuSO=5<|vejBXhضɒףR|yQAghC$gRLeppw vU\pP۶fA`fHGp]\21RS?4]R(( A8& /r>݃}yn# {~_E^{mܹsK. ˑcP*Cųʘ^8J14. ,m D"OL^H4 !AdaA:"-xDAH#H= FݪE LFMS kbTфL$tv={p^pBp3hhfL 4 4=գ \=I ؾ{ [(;ِ!TM (+ cŸ4mYp˟ {|ٶ7+f6bW7>qpT<:Q MBUYhfU`a5Fz WL B;nnnGC c5t>}6MChVUj!4ghv .\Ŏ+N\63t6`q;.8H {ᄹz1%0knrdR/(_ȹ8 @X *5B t37,ɼ 0*ѭ=Bb9g`Z1L2)GͬKGb8E+ȡmtCYZz4o_umDP5ITDb <±ftc4S衘kJaxiv@36 ..hH(fxTq gΕ"n: Dk. p%&4#t]\F!kc.0y qk.q/2G}ObR pA,Q Jpl:Dh%dcKEDf3PVB! GӘ +6cD5LyZj.n۩>PIJH"Of3\Crz%?"z{MGGpp8HIDAT1fAYL)͘4ꦺA5fB}KUJ#F*7kMh(_C 5ob`ƛNr/L߃8 Q%8hWK:~>D=hh{4 \iRȦ)>ChXNZ-O{'&o}M>JjJ3NsmF;8c)7 M3b3%lz' ~N)A@m-( |XQV%LN`8fT&*:3T!!JT 0 | MsD R$VXNvfǷph歞&:f2R/$aYk+u]hݿ! ôÞɯ㛖z0$f-+j@"v)m0?yi_/y)xM ƂI4MnjPTx;p 4pA:P:0!tMDw4% l@X ^Tɟ'~?) R ^!W"HB3O ?X/"8;0<6z-C+;K>wov1vo[(AH H<$⢈׀C r Z'K|fgL⡪3dzo:=kUgiqh'Uzq?|(f@KTϕϽ/ݼ2F 8W%M` gm c(}J.9q!so.SO?ñC{ŧ3àd~NԓafM&ijhŅE] '`uW/G(3\xOY;ņʧZu8vؕPy.ͽ;X\z@@DLO2rc]? STƏ@˭wlDU4(}&VFI :"fH68d ?ǬpcV,|_M03zhq^8~'d;9r#|r;^Rŧ@|l.1riM0ąָFc7~Ŕ.PB@A^Y p="00.jcas#VϢ=J, U2ҥ7|ȃ>Ot XtU&`g5V[SOΓ re/a;Db?UJ "O7&8t_!:/C WNAvAXKf^3 2g8wÖI%+H]Lb5psh_8πK<l0.*.<+J Y`EA7ͺN.Cl[콮Afk5TL~oZe)g;f c\)ßH g0X8@̀r)D_#,25)ÒV>α4nL[ke8D,%.;x' 'Y;0> –u"V.c~s̹{ɯdɣA ,}wPO{[EqmIW7' Hei_-V1, gv|Fɧ@B pdF= I.8z-#@?/B5` !3 ˅)Ul 90ƈ9]LVL 4EDBFf-780muHs+,Si{7yϳ`ȇ ^+'L\ߛA[%VjQjQ(eƘ Iʍ{Yk ~k^}+~_:JR|Y?AdA-W дMo$`H l#6D7% 9, %=T@<H,TVbeA,qxPD(DUO$2`4w<_VMk%t?7:v49A h`/S\~r]Nx(k5c=ǯc1&Ą3.O(-jrڪuOD j(Z W㨼#m8O= U80E6BNy]s:k۸,/+,_e^(W?xi,A֪1o0\F |kC[aM%i#cɺ'hL{c+tc$;`Nx4l/?~~@ =\K S7ïq`TcBM6<@>j*&%S`:-o :۶9T 5y7@fpOSMaz#9s־6v^Hߍ K|llՓ;Ɔ]G;6OVu4քiMǘM̡[e(҄ + >ڛ2R4Юe:Apb\,bQxf,TarԾnf, \(aum@>U2,dh.7Za(`z gr; 6 r)LvSB[ߪ6rzix6u`KdeOνsC2]5W3- Y6ua{m'Jj /]<*{QK'D>E#@Yε_)g_bzr&֧ <{ /1!42jB~2"J܄0_ͣ/ǹ[#1VV!uUz G6Lj"m`ϼT/nyq~f4TBXso^U Z e~JBoԱi_D%l$o9t0Mť`/׳Qǒ%ʭv(;.D;cPEP!Ƃm2S Yhf 6qud2)1Řy+U{2(_1}lI]<!EmuL}t:ly܄ 3~\cVx`? W9(OK`{X^7Ƭ!6>5UT#s\ D DmiЄN$tqHKB lu[bspk_V FJD=e9aޜHՎ^i͋,x?[N~.D[8r :aAe:t6"p~7[2^Ub X?Yƍ"& _т@<]Mu; &Ф>a̯ p@T` |>xb@]oρkk-t%|V7T\6*>Y9ųzۖ!<0@&,Kʩ_2vL oǎ6(pQjɠTCU,̐&ilZFkHt燑[ڧ# . Y(ۧ\Z@%~Nw6k8KIeW:\y;X@dԭث^k_KVAtIq.ϷnvFc(2 |5-K&ehnnso,'`jN_uO#0i's]Fdu\MQoa &, UCQkp3!\ǖPƤA<,ѪO`XL5ո]q٧(a#Z0kS]m#\9†& %"m(=qi|Mp@9 Cmz WP/AaɁf G0xń,: .S)e@UWѮxu_獵.΂/&8%ߨQ̥,ZoO\PF# $Q;XkQj 6zh2DǠVΊxs8Q! qIX $4)/vYGb[SWq㭜rbSFXQI=`2(kulXdR 5\y'dPUW-c `?"}X" ~йvDh >d|>A]aK N]p99Wݜ:9g @[j_qI2e xb+F(p:t1c@JMl $bU\n8Yo&%XUYOAFFmJ2ưM7*7z9^d0 rУMFiY4ZmX?zc |Z\Օg .<}ߝƟS:"D7G _@ڀ6 KÌeW3k'j!PyfW&gi;I4"l @O L€`D-JMʷ.7&<YZZunry"Iw 7pPؘp$5$~h%NV_wNH_on5]qX \Yo/V`0Oo4 q!@}N[H'NiM#°hUI}՚@?5HHI|?gcKLв~ﺅϽیm|X4~֫q) A:5GB"A\'tC i҂;Ӏ_|O9*pC( gԶsѐ:d+EA8iChnt`;^~s20Q{Ǡ&W fHcZA$*q`:&aq)1 +KXߠ3ۧu\Ww떘jϸEE'Ku?G)V@#/#*벁X)5@vrv#y7?x7'o89GC!7D6q]/x勒B׊鬵N=uPآ®).Y.}q~GxEtu;s'pˉ8z 9&Uxt!*F{|&PB*bo_} U/AFnaROJ1ָͧy߾}my6[dv Lߨp̐3Z- FtA8 [^`~n|126e1>f"]'ʵw&8L@_ItAR[겦OE|ғWզ.k<ۃaNgdAݗ&I'Rg8ӛTk;i]+m&:lRVXSYLʚc6ʪIժefL@}^oZ: 6ޏL s$i3+4tO;!9?m~c:iYC+S|nu=II7zmRnkblV ?cy|\_^~vadTY,չȠ%)DʒgI/UyͱA<}u}HNպR-}W3qz< }lfM ]y 9f ^Q@K_;:u<'ehARiJt_j,e>Nߊɧ1 HISۍioGilq6znk{!$t;[i>]V<)wН'U5S2he9vb5}[9v [h}q< (SOˠ_S =G^3=S4쓲:vLi/߉#o'ށ\mI`ZibZ46;$oeL=iPe}Tp6-ꧪ4=sJ͢E;hWΓJjݞ{9s6`w/S}+R,N*ngw[5I>4 8$蓌SfOکv FAgx{n}fN^lNGiZN٭CqENa7e/OG@>A9VmoWg; moLj%0;plrOٷӿ۾yEi_i3ь^YhFW!`F3i35L3ьaft f4kf0]4hF0`F3i35L3ьaQhQpJIENDB`Subsurface-4.0.2/icons/average.png000066400000000000000000000011241226345450700170600ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<IDAT8œP̉+:>E""Qmv-oxD t4@GɾB`Hc'P vH7RU\: 耈&y"r~Q`g^ﻈfGns$DaJv̧s`<Ƙ#"ιQ%V>*D>βl/dxBc:ѨIqKY|>41Tuq+Iq:5"5|({\sf~T+C4pεj(eYh+ep{eBeB@]MDzZBUU=E(u]eYo[,ˏt:̿˦iN6M:9&4M'Ƙ.(άf~"/1R($;m~ Ṭrp4IENDB`Subsurface-4.0.2/icons/average.svg000066400000000000000000000055101226345450700170760ustar00rootroot00000000000000 image/svg+xml Subsurface-4.0.2/icons/expand.png000066400000000000000000000005641226345450700167340ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<IDAT8ҽJAg>$B Z+K[k{/^+RX:D+Jб0IvɁarvgv"3K~̱,;앸̬ Gj6mX 'Cl ȕ׸:d۰#=VgЛ  'd '8L1M]3"u|Ez.xX 8+xEB >%E"Z*sեIENDB`Subsurface-4.0.2/icons/flag.png000066400000000000000000000030231226345450700163570ustar00rootroot00000000000000PNG  IHDRw=gAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDATHǵ[LgƟ'hVԖUD)r#((* 33[%ղLLܲ ,l1h9Dqs*"౶ ŶRiKK9 `O^}_}|!S~әAq 9S KQn>s\pPLA"Q߰)wɂzEFn3 `;uE{@gV~lke昛k@+ox&2WܭTOIt(Dm5dZk7l~}}ǾBMTUUMv n_-|}4BPRqHVо̥7ΕH#bxQ̖9Guo>wB1 ]E[ 5?|Y*Щs3j)i.b0*5? Znom~'g">=*$ bqzs3f*}010\ I;{)2BrdԆ?F&FG;!ДVQB(DqPMP6e 1]Ikin67Mcq @7KuTc ~Di 8Z`JB# !h9umw[ @?#G/^%@r~6Jkыp^0F0 h7k!6es-wC @#`h\rм+:FVz$WF1< UTYC fW!&Վ􊍻0n΄GR 0~3xO" +ra=8DEP$) kpኄ,־݉CVvv#j1C<ˏf+t87c P#2Ƞɚ-bmxugKfhEDY.^yA00b? OKyF8X # Z^;e5c@fOHnР[i6xΙߟЩk94R{/N.&I}"`=P\\,rlgCP\Y賬|[S"l￀X_P[Hn== ¼./oUΔ78yɺO>k]wsc.BcO=}"`YC4:C˜lwcYCyͬ=.:![VV' ^1/SkiFyL^ڬ!" E(-L+,`hm&N9Gs0_/<a%tEXtdate:create2013-01-16T20:21:27+01:00)*%tEXtdate:modify2013-01-16T20:21:27+01:00Xw IENDB`Subsurface-4.0.2/icons/graph.png000066400000000000000000000206301226345450700165520ustar00rootroot00000000000000PNG  IHDRfCd IDATx?wWW @_`F343;:Y7Q/h3G6ZGl)ZGNN]#Mn =@UUsHtխ ^`}?Uu5/Y|Ů;^,uhf! `0@f! `0@f! `0@f! `0@f! `0@f! `0(dםŮ;wtߓm e2t^멭{V\Vt$Vɢ_>hf *8ʟ/ +NS:)E~HS:ryigUzfi_{γ-}\y߾̦UmiU}WV$'7CW㣣\߿$,cKy헹I| _[iBٟ$W4é4 Vsʞ&-?#뗭?{Q7 jZUi>m$㣣j=Ѯ;V՛\?E]2u(z;'Pvg|ENjJCaeHn޵iUӬ8]Mk8%M}35CaU&D '+TO˶@([Y3+6 | 61j5(`dng_*W'eK! k 츇pk}{>ɮ;ITlZU/}Zm 3YDǮmlB0)=O?C4'"*P'w9ݡP:1 ܛ`{ᬧjٽ*G,u gGH0=spy}HN:>\3`fn g\zj\2yiU:082Q.P`'=.,݆4?|A`-l]KvhvyT}&8'fth*^}լ0(uf}TVu}1$m)4檵R=LR.!ɻ4:`07/lf=ユU$I6?ۮѦWgNxZUJͼInZUU5vVbvhZUU6i`՗'IN : ~[/~hW'Vyos|&I38DtwW'8[VѴ^%6o1IΎ]ܫ+_״'ᙵ| mocYV|lqz@4iʋ$r'iz3Ve8d6]گ|nnv9x:9tD9JQ.+fO %,͂ys_f{4Nstأr~5'I~i_\>KZ;*;S1%t|[/nq_w|6R쪗iN9J}4ߟo҄xP]y{&X9e0|]Sio2`A{}umM>pZU/ S4Oi2'y4k}^ڋ\x굯T~({kMS}2 ɸjvYMcnҫiU=}&`}҄\"I~wދ4U*MU3`u]7 H,IsԢ{(#/z I`t38m'/]lpS}chwckV eЂ`-\=񾞵 %;<(#XPB܃`|c6ЋexpI-Y%/38m2wC\?oJy^ewhbque GI-w > ܤ,Nס e Gۊٻ^{q7m~_,c}VۆӋ4g/E{5L(~ fpU5pnY淼i6W^آ~PvʠI{=}Øt&g2{!ffpcyU-ݷ42a0F7me9_o?hǵ[ý7*mtnM(0i,:'qもS{>L(s9H}Y>lx(U/[{*h9Lsnra/!iۍ^;gk;~ު|˖qmuTʖ= O _9!rxN3Ow38S򺏍ռ}6=")vOZ޾6W]WԮ7I쟽*y垶+N]w`{lpܡ c0; -ue`= x޳UXU\Iwux6礧n;&Zvu`-uPvdCm'ag#~R-`U$y{Ӌeuj۹W7܂eV`zaUgNm/;Uj'3Rz١墮z,9q:=o{oVFop Ym𢯎 Lۡ]vyN#H ɗef-i087u {Y-븧}yf= FhZUOqWwwCI`32_fmy@ q; `736|_e%:bcWwӾ:`#R0̳>2PO:;eV|f0= a>]֥bKX;0Ri a^de% %E]/{NW:k8FL0V>Lu ZC'|ȓR`U0ݎ]JPǠKhˮhT`J˰Im VٿmX*fw5 #%J2{>?٣a̕ gNz% ԴN}e{3ٕ;ۥ2i]B^WIa_ f0@Ӫ:NrCSO˾X{l1iyP1Wƿf00%uݯ,IC֥ZvW'6p|/#"3I s5֡oFuKhv(Mm"4C_%|MpZU.Vլs0 @,i-{hgJCӓZrZU >FV۴?iU}u^ Cc=`k.?/2m2neuvJNBY>E vPP=TƴZuQgӪzOR5*'-t;`Gze9yeIjY2a+1ɗ-6PB= L؁CE`;HL3V'm =ihkY ޿-k6ϿfEkځ }$yvH[ ]gx=۹j6MՖ7:IYq؟^N`4j`||ttϷڙZ=5y볞(^e?=ھ߿GG)oZ6$cV%Mz&c?O?$6=.[&$ϒ<.isQ?)Y҄ROV~_)3؂r y,<;PV0lдU&Hr{loJh"qesˮaY/ _i*4!Yo&Ns j\4M0vpϾf!kg=6{CckJ̛t=VUcn4Iy;*o;qTxoJ;K2M;|MޖgY/&_vsh`욗2e|lZU/ҭZvm'6gՊ޾r"+_79+W>>)o5UX;QkvN07YcZU/j({Ռ|E]??@w2'ӪzX~P e=(0a.5:T$̠eΛC etz׮2=̗w< :(._dIOA\);6zOǸͳtj AKewiV"y2KjJYu8ry/cӴ&JuVʝ(+u}o0?TV+ fpe._%K%}n_0F}^@O}H-t|`w0YYqdIS8PVul"nlufn&|@ͬ\zQ׏i&'ܼ:!=4F8ewuI}T9FW^udNr¯s+5a'3bZUӪzM`Z';PP#gO)T X:IS9`3(}9_N;3Fǣ|ڸH/" ZY88q崪  fծBYk U(ې 'i6 pP3FgZUOՖgitU#4el6V{l`=ig8Eϭm{sBٖl(杝ڄ_m4ydכVi.ʶl-q m½X-7$c7+M3*\iU%V@&y;̈́۩1FuӪz'ot5Vm8ɯl<{_ SO|TȒr0*x8O`FovT+g'*ZX^4mg ʄ6Y ԧl(;{<F0nre5ti>){'\u#b K{jQeΦXw!VY+|d+ 99_vӎ#3SeۋiUK3l.T,8 ^.qg|, hoU5`k334gZnzRӄ2ԢN3lGΒVջKj_@wғ$e;u'[o$/!/U:7+ FlZUO|&mZp-΢.!i[IqiU-cSs FLz~݄y*rGg loX=Y_90<ɷIlЙc#Rv]*PLtQ׏2jmmgn46u+B0(tGH\Fyi\څI=n%$ egIKFOcnr`>3iݢ狺~$6 i2TlϚ9p<26nQg~&m[|ܙ`㰍 d-<~RT}f -K0+ eCs|m@rqmBgw=sUO2nm m_$ ,, VY.{l͢_/qj:6wJ0(UYE:NАIՌڢu}㴛v^A`$ʰhg5\iȆseڪv/4*`9FdQiU=Jsiv1?J$uagIr`i_Ef[s* Fl` *1e(` 3B0 ` 3B0 ` 3B0 ` 3iUu'6ݢv `6>'9q2B0>} USIDATf,;ce?YŴ'y%vדSq%IENDB`Subsurface-4.0.2/icons/maximum.png000066400000000000000000000010321226345450700171210ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<IDAT8=Aߙc7agn#s#3PO7 DKz ¹{੗x,.e2 w3u=OU݅b,jʱyh=~[TBq !hQ'{C:mo檪b^c6ͭEɥ|BЮ.d7gr9x` ր:}y 1fqN(m0,2xmۮZkc7*Dc]׫惶mW1F1j/Yæi @з1# w 9wB%ʲ| +;$11lCcT&pfq %)UUȋ'BtzfeY>SHVU}j+rExIENDB`Subsurface-4.0.2/icons/maximum.svg000066400000000000000000000055271226345450700171510ustar00rootroot00000000000000 image/svg+xml Subsurface-4.0.2/icons/minimum.png000066400000000000000000000010551226345450700171240ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs : :dJtEXtSoftwarewww.inkscape.org<IDAT8Q5d&aV4  بDt7h&&;+x-qι@$@$`fws%i0VkbfJWeM$I HB7wvv$oJH>~vөKU-A&x# yH^^K$I59ɫf: [AEѧ<W|#h$PR)iZ%4:Ae\/bX,~E S4MP\ҏj023 o2p58>+sEQ& 9 9&9n%qAdfΛ! MӬ,Kf꒤Ɇ N@ M˲)g8K{)33m/2 =IENDB`Subsurface-4.0.2/icons/minimum.svg000066400000000000000000000055161226345450700171450ustar00rootroot00000000000000 image/svg+xml Subsurface-4.0.2/icons/planner/000077500000000000000000000000001226345450700164015ustar00rootroot00000000000000Subsurface-4.0.2/icons/planner/arrow_down.png000066400000000000000000000005531226345450700212730ustar00rootroot00000000000000PNG  IHDRd`ܭ'pgAMA a cHRMz%u0`:o_FBPLTE"f`#go8paT| tRNS!"LKbPbKGDH pHYs  nIDATh 0& JD,_ W%#Z7%[]ú~k #6l ~^/BL)qƜu^z1_ Jn5"IENDB`Subsurface-4.0.2/icons/planner/arrow_up.png000066400000000000000000000007271226345450700207530ustar00rootroot00000000000000PNG  IHDRd`ܭ'pgAMA a cHRMz%u0`:o_FPLTEom&h$gY`X~cbEuBt~`{0l/l}tRNSUX }8=_d Z9bKGDH pHYs  zIDAThiF" "D8V>:>?4:]}}ydp8Ս 3&nc&&_/D؛=`,LJUWlmLhX߫J8O=_OF3tfF3G4F3F3F3G4F3F3`P헌F3j[홏N<헌헍rG5M:SAH5cSſWEQ?J7`P씉rdc~tRNSN 0J͌_Mm$ZpZdks`(S[%P(qKfnqKfnP%$Stqkdp[Z 0JZ͍Nn݉N ,bKGDH pHYs   IDATh_LQﭩ}ע}”$!KR!!Qh%MZ4ʟj{;wysy9wp8av[QB%.ř]xzfv̴swc*9 ^>{|}>SӃC*բ *[JVArpC*xHFcbD8YœH".Q.E#LZc_,3mKZ- I<@$IY"&gIJk|)hEa F$~Dn-Z"Tt:ǕϠd$tK2ɧI4^ nI)g-$LU|B׋R02^B~%[J G)X\ˑ$y߈|`7 P(~̻$5Vm"Q޹+%PLD)XtXS/)[t {,Xqy}[Jd)bFK*ցJ+RJ`BxVc-y.P]^"^yuCo7%MhRy-4PB"7߷Chk_!K.I39VHNZtXIj(f`:/bߏ>Rkz)A~;0z7{n/? w0th{?nX#~tlӰյ-hҢ'̸ qp8À?W.YIENDB`Subsurface-4.0.2/icons/planner/left_wing.png000066400000000000000000000036551226345450700210760ustar00rootroot00000000000000PNG  IHDRd`sBgAMA a cHRMz%u0`:o_FbKGD pHYs  IDATx͋Gj&q: ΌqfђRhZ @IM ^:o1vMKJviB.C܅xFPKz?tu}}dE*}8Hxy9 !@!!AB( Q $D1Hb !AB( Q $D1Hb !AB( Q $D1Hb !AB( Q y枟1i4 M1vK2-!1$cB<"XB,iڍAh=/Ѻ`]aUF#1v\Xp\4clY޿w<ϑ$ z>|o$ g`Fx| B{117zBpΑe4y`1T30 '+,sBWQXZZbJIɊE1!n2t]kӱ25+4=$˲W X1ޫW(onnb8b6a:MfAN׮]q\p8t:yL&emÜ99ض'Nm}}y'ɻ^Gbii ڪu_YbZ*Ѻqiւ4MwΝ?tm+~~mJj}HSw},W {~l۶8z$u)V"!8.ENBPB,B$eMm$8uԈs>^?h4:iN۶tvjȃDNZ.4- ]eYmDbdɓ'gyu Lgi0y9n.`^%(jzh]H5ՕSmABNeVWWw8ׅ9竜azwt]_ofK}du!u9Յ7i*- JW8X]]<_/b'DNp >Q},KఽX}աeъAB( Q $D1Hb !AB( Q $D1Hb !AB( Q $D1Hb !AB( Q/NTIENDB`Subsurface-4.0.2/icons/planner/minus.png000066400000000000000000000004061226345450700202420ustar00rootroot00000000000000PNG  IHDRd`]qgAMA a cHRMz%u0`:o_FPLTEF2E2F3F3F2F3E2E2XtRNSwwsbKGDH pHYs  3IDATXϹ A+U|*@D7ؔ.Ɍv5Sl<6m7tIENDB`Subsurface-4.0.2/icons/planner/plus.png000066400000000000000000000004551226345450700200760ustar00rootroot00000000000000PNG  IHDRd`]qgAMA a cHRMz%u0`:o_F$PLTEE2F3E2F3F2F2F2F3E2E2;tRNSwww™xbKGDH pHYs  SIDATXA @ KPT-Kiښ$Io-< \EhRDBB&IPHC " !GAEarFٝy)rl!}nwٙyFD`w ,0Xa`!B  1 b,0Xa`!B  1 b,0Xa`!B  1 b,0Xa`!Qd TR iR%"GD]]kD'J_܎*JEN*233˲D)%,{ZWRVJv:h8p &Dzcj)&QUBV2Rjږϲ,i"MSdY,2KDtJJeY,˶"v}"BBEJND_DCGN81Ve*LRB^/nT*dqq@Jo0۴aE(BH*!R9;vl4MlIE)em+I)0 y$yLDWRWN>^uŏ"dTSB ;JKgΜu=]Ȗ **)[p]UJ]TJ]9{ r>,G kkkGs-WV1I7˲| S@Jf9߿y7n8xMqL3338|Se}r׫sb)Om=zԪjo_v*cH!a[ZJрm U4B4veQ|^l=M/_\D, 食6RJmLOO?+x8XH!UBPkB,$I\f!CBHDysY$IEzU}Ga"t]H)"ҧ(#"^TGIRMEQ. @pGU2BB!D.css^Yacc#8Y1M^IvRJt:H)pvUqMO{ 5eٛ\22l$I> }rR8YձY!Ź[haB)!666$YG{JH9 NwLj(\Es\pqj!@tk"~'Y'\rgY'BH1O<=KqVhqAyY8_FXz}`wU=]tK(kzE/R[evz…q;R!zENWhB 򇽒0lEX)M۶ҷR!; r!^(#]D!D?| S_ض%UlnP=0QFvP5oO~pwn۶۰7\Db!}q<}E !eKmW0==VfVf {.z +nn *N `Ŷm',B^G@+l<$*evƼȄB  1 b,0Xa`!B  1 b,0Xa`!B  1 b,0Xa`!B  1爆AIENDB`Subsurface-4.0.2/icons/planner/round_base.png000066400000000000000000000054011226345450700212300ustar00rootroot00000000000000PNG  IHDRd`sBgAMA a cHRMz%u0`:o_FbKGD pHYs   eIDATxKՏٞ}"= rvrıqDD1B|ql,9d (0 L$VNF^m5g%;3=~W9x3^K<\=4_u櫯뫯 !P8@A@ HT)J S `*L%R0@ HT)J S `*LF8s Lӄa0MCuhXҚ~,WI1ODB&ED&'DƍW "?o޼9!P@,JMӠiWnoA؂X298|~✿rw.HlM,˗/0+c~9%5 {!0DGCD,mڴ)V@FpTӴ{* Ht ` |J !.Z<[zu;f qc1ƶ[]AD4&Bʕ+|Ν;EqUY^^ c̮T*J%82 Cp!H\*Fsz/rrE]Ӵ4M[VQ!S:`A<|gڮid}^cp1iرc;R ~&8Z@D xưqDvm ?<3ʳJN]׷9)g\O,˚\M@ DF+vٰajʀ:u>؏dpԼ299 0~xTT~=666FHKX`rrDK=UsMY/E1 NٮҦ F؂Keᱱ1躾pȑUSnh4eYh*{k@Jl.E4eTQ"u[c`bQY1 M2~|ݭ")_o&SeKL FF(1"I=U25 dx"PeGT- \9 ? S@B*{8kW7RJucD4Z@E{0CBUS!|_z4 $UTY@FCdܐ9Bʞ)tҁ\9ʦ=bNgaHj%(yʦٽ{0VQ[$J<}q|ʶTV]H!bpu>6Sm_u]֛^LR~7W 9UA){˗39M%HFCEEh6pжXu[߿muO Y |ŕoSNqax¶Lγgr8NPBR8. @ؗU_2rK=p]w [&7lؐ"J+Dҧd$qZⷶm=@X\\#M<4p0].Ց yxy՟yVWWE ٶ\bM9~xuܹDtԲ{nfLLL H{Hd0xU<>'ap]vA,8 *K0kZ2o/--p]wgB1>>]D6\O;xxsss;;z]ױe (޸pfH|P˲~]2)*YoxennNYȍP@2V40<9?|{I>y`$6k4]^VQ~k{ )5b&V `*L%R0@ HT)J S `*L%R0@ HT)J S `*L%R0@ *g.IENDB`Subsurface-4.0.2/icons/plus.png000066400000000000000000000162741226345450700164450ustar00rootroot00000000000000PNG  IHDR>atEXtSoftwareAdobe ImageReadyqe< 0iTXtXML:com.adobe.xmp plus kv"IDATx]Ml~\\R,'FCQ #@/N:vSIb;61r| :DT4)Υ/AS8g[mФ˰bҡ%K gW+#gfg73o^/$IV3q+5 BsYa|Qwa:ϔg\,T,@Rʢ<%ItnO߈aT*:"~XUGyaZyyk|21ԘO3MD}%z"-I3vXø^eG!'<\m) $oß>1W^`ɠ現>*OS7ߥe}#Z w>& #b`~}٬ f\ <ި(I0@pLN$0(v[q̣`9\'Ml#@:{>,#FrZe/-I=:*܌+'e) fp xg|z8=h}.Rc",`l݄Br"oPLfX>TE"P:鷑hIzWtSjǎ,F&I8r;̻Q==FᄏkkkŠR*1I1IT(H ժ"\.$vi!w\Ax'``Ol1(o=]4#*ȖI&/Y[ lndh+z~G&&q)(尹ND=}5zW6't[ijf,yȘîe+|[V3֑L|I55[˶GƬ>=11/p̸׿o&/!c4lB{mSC~Ũ133zVP6Hdv]a*9(պM|)"/J ?\#=M׭[u Q9b,-f9Hq"ݼy f^5gQG j7_)|I=jn;VY`_b=A* =dtexǽlfW IUï "]qGػ"|a'CB/Q}87}"Xr[4-Z+ Ag"63u![  b6!C`+<[l^}%7ø 1fox_fbhrV@I`>|gϟb[2"K=F|vE岵sh$|FQ'+9;l_ "mz+OmWQ3` XNIׄKw@1v@.@YZ+K%K̼j8b'S/wH;i۸{z-!T[\ƐlȌKPyo]m!m\⋿dI zŀ \~۸m )")3M!%o_ۊhiPxλlDTPDXd [jDsee7{O"Pg֋@m,K{>&{xY;Az {>Q_ϭۉwJ|tg? B_2}B:O_#LQw lk%{2*O j8 ƽ|'rb]gP81lv3?r81|3sG>0|ǔAϿ2,Іr(Okl [Kiybߑ<R0{FX̬ZPVy[}: lFHM9Y3]-y&UL$Xih*x(^C䃖5g&ړXFqOvS[@6|0Iױ#||]Ü6 `RW IxB{8jH5⢀_u"'ʹ[ Ehx kIfPgL]bC{L0(/%RiRlV y.c!]@ >PEigύ@VI->@DLbs[LϢMmr=>%k8N1 Ž՘MQ\bɉu>`)[=eINJf image/svg+xml Subsurface-4.0.2/icons/satellite.png000066400000000000000000000005271226345450700174420ustar00rootroot00000000000000PNG  IHDR 2=50bKGD pHYs B(xtIME8IDAT(Sҽ.DQܘQ(0dyJ)SO7bAQ)$"* ьf;7g95e^3*r ct-nQOKxV]eΑ,G.1b-Ŷ4JN8wlhfȳt}/L[:e^ʛ̾c5˔˥v m@pֵ\yp;, G ׾:::r}٣CIi ƈ!&61bsgϣw^=.IbV*V%aϹ% !v-Rز<XއϢ{lU 0{k#}r9~4ȶ'sK;e ǜY!^9 @xf9Uo@SLbV +̑;aJmZk@`ٓ6OǺvz{ Eɻxv555bCnH0[ Qtɡ) L;&@ vC,H՞AcSF4F744\W&455w.a(;!+1XRPmBߪ]g7Jz`.{]r%{"½H(فSdN)&"ŏ*_nT'ҿ@J?m{C3<+JcƈWԫgnF疗.onn>8%S΅w%9ԃ C=A`Lg<,ԟR#$\YzYt ؖn7~pf eUZB8=wdPU5ExG6 !vId$)~Va,wV}|`ȱ:$I+89%@ؘN&G2nxv &O&%>@20<Bt9---93MyEP) _uڪ>/(SIENDB`Subsurface-4.0.2/icons/scale.svg000066400000000000000000000104121226345450700165500ustar00rootroot00000000000000 image/svg+xml Subsurface-4.0.2/icons/star.svg000066400000000000000000000047041226345450700164410ustar00rootroot00000000000000 image/svg+xml Subsurface-4.0.2/icons/subsurface-icon.png000066400000000000000000000356601226345450700205520ustar00rootroot00000000000000PNG  IHDRkXTPLTE!HC?A HDFJIK!IL#I"JLMM#KNN R%LO&M'NPPTQ)O*P!R#R+Q"SU,R"U$TW.R%U/SY'V0T&WYZ(W1U[)X(Y+X [ \*Z,Y"\!]5X+[-Z,[#^/[.\%^$_6[0\/]&`1]0^9\'a1_)a3`A^4a+c5bsFsPrNs]uUvYvEyMxUyS~i|M[u}fps~bXVQe~}^}zsp}cXĂg^o~fvcΎkv~oЙt{ќĠ¢z֥ӒǨ©ˬ٪ɑسɢΖܵӺۭռ¸޷ڳƽȽüǾڽEtRNS@fbKGDH pHYs B(xtIME 4!I2 IDATx} t[ՙ.vmZ*~KBUaDz(Y*8^ ϴnC>\ &eL4x)7d£ PbPBR0$ݛZ~}$03s}r'l42rS'қ"EoΔNr o}oS'>{Сi' =!=oŲOWo?}ndzуl͔cއ^#aiO}a@>w=:p!8h"#?!3 Hu]R1-3%,*ͣ?KXȹwoʺEҲ Q1Q2%tʠ"3%%~˿yp/ }~ FjG +$O RqSx9CK$i"$\EH\7>|`'6ǔFSװQ EWi=I*E֝5w}gNeGɣnQ0 ܹ7~koR"F `*SE+!  0ܸ,60n}d{ )S߽GOf p{7^78lNHpܪ*:ރ]c2b*) _U?;H{ؿ"A%T1pepB`Ù>P} 6 0rzፇPr0 ufThs{4U1LCjiYj 1eNbaa0%Ͼ1bp71^G2WԡmGrف7ef~Y+*U{l |v󽲪d3{0gE>SsN(~Eޢ&pv`jWbJP {8K }{"M~hƵ1UU~z>+n^/eza"Z~\";P8]Bx047ߌ5ѾTg"PmӴdXBwN#e54+w=8~pq5dx.!Д cFGC4(OL\-x? B|3Y@ɨlf2 ҫ3 Y~B7Ij^Šy)ƕ3=0p{~Ǟ_x%v) bjNRp0 ]m` k7Lj~"PTS dx/nvC_ЙW{Iv)Ě=xD;VϞ|936.' ;#'GtXK(<ZEOm` Ewl)<꫿;3vABT޻SNǍ c R pe#o>gx$𻇶~x9iRީလg`$~=fyLr0./cmi}̃#o<|/ЫǶ2p Jh|A I@7x?k.:?fi` ޱZط7g (t_B1BPZtəŲ(.ΫwoeCg hv%C#M} ;i2Eá@g?CwE+N8BC{<nYGfR8>ymOm Jx=VzgμG wk %f[⭫ݟ lcY8idO]=44A5py E}?O?&۷|cÆu1 fYǴ|/.ݼ6ҧ ^}+-ףf!__A ߎCp~NiX%p0iB-Hs=yjHii9e-`Zs L$/DYڵ$!>H,z( IԭtKQCJF探Dd+K?A- $XbJfF3!jv& PfVf-y@%7qhx=N\3J a? QD3$=QZ) Q#Z?xZDQF(jgPf F x$nrWog!NQ'Xhn]>N(ھi4=/<mw`7'h`yY{!L<׮X1X'i: b1]ήrpP[|4xp8 G= H1a9B=~]DG{vz%@B4>aB P䁌ʈ`9B.QER4-H@W{ z<9J$pH?EpQc27¤H4R##(#d"0.)A=Ppn<(Spδ JY±ƮSEr__$@RpD(H¿0_C _i`\ MFHUC`_ l,Laİi` cXZWьH$HRx>D!fk``o ")Y!p`K>χ~YGFi0'ASB ሐ>J'MH(HG!W AO`+ _rl3Xx]X*CVT GRȱb"$1$IM +-bb* QI~L`mFhOS {$C(8F;l \ĉ\LsvFu:; A_? m֬Y~A'[f Mf|LXA(tmt|f/b`0H6r' Y_q+ BB2dx #Aa"@iΎH( p|G u q Bᠯ|2` KZFI `T+w;Ѕ!cHnim˦PD/Rf?m G?IY$‚5&EST )f 3cWNd5M__Flf En7cbIul BE~e nvy+wvBarا<Wut( 釙~c1m}_ ` ` P0Dr~_ Tr!gwLŸ7D׫x(`ȧy< °ygQmd%1SP Tߺ7A.WoFbW'+Ka/Q4(pPF Y?3Hx*CBpB9A4'5-t$qOtPǥPc<L^~V!|̇B,g5+#a>uqwD 5F 0xf_'(A` NH! ^a faFPl1}>B-?v٫pB$T~&j`RxYI # 6(DaL?%ǎERH4ߩ#W g7;oSy}3ց|"!V6 ^ hD)V2>!DJ6^ swq#x/G$5kb08EBpӽ#w'Iv1}:@(PXjܝ"x3^|?nZwAϸt]^wg`@wGI0N(#d"jF|~eM͸MZƁza\^B{#7k!~`|X3|+A_ kp_6$e~^bbTSm.uH M}yqC|*NYJHx#_~p|'1"MVtkC`O$_R@|i$҇ -\>L}ihkB㓃*=Oh%Қ5WPFk~n= ߨH [%DR魳IYIfZ;0#c[)1AX]Iy6?<]!/2#I}hJ߬>nJ))+qC̋JH`doZP{5Xzw-߬Do`d%4@63 Au]㊾%(:~;{4G6]5g"ĭ0)ҫiSݾ.<Q}Wy:_:k>Vʄq edAx y" %Zyvk(2'HLimKWlT'Lh-mZLAh(i}k"}9懨pDDjYaATJ /d`҂iA{_[ Z _N_D+#A p',na)1[fgbL.B&>i LV\XWg̈́QVch OWwjBRyWZ?ˆD}Fu d- `ænEB!/0V,W0lȉtp?ԟP145\;FT/ 9蝝~o o )C[K [_M[f*I 9ѱ(?G/x䦆YlFi>`> GK2RR M!&=cq&IgfU|c+g誼N/8;Ya0wD:Bd!'v< 4z{3}" EU>ҹqXȻn0 T q9+A ]yqrjU@/MsO $3 @ Xa@#n複KhY86M< )Ç紷R?Ij$a yTx6(`pEVI?} o焞=(P4{\OC p\5 %`' MC@߲mծ<.#=f|fyh 4&<Ҙ]dIUM?J r KK*1WJ>0N;Au{_wUv=SL @8\ʹ0|\@=qY4B=){FR <#~uG,@IA2]uH0.F V皩7aţ)xP4 &s_ GX嚳~sA@ [ڢf.bl{ S'GJ΃!`$Ua^A,X|/ʩNirZܟb!ʓG|y[,m/N&-wKax0$b"АOj^f]vq=-S Sԩ6p@0(v5`.sq-[E.Č2-řκEo۾y,v`#Hj1g.mHR걔f(KhsIdYjWT`)6H~N*QmqGj4'@|3bhqѶ5B+@XaifCݑb~j;j(~RT$u4lMe6AۑV.qN^*~3;MY}RdzjFiK]{ek|ܲ<v6@?$ T*Lb.qqhY%2Z|D.@;:PWn(t7 8])!| p5O3O &_0h 7$T/YE&"1oCs L-i.05YK'lNEqsSВSB ~plA5HMM468*\-s;O@von2LYKViKβVTSAОo`ᮉw(t&֔M TRF,KMDƷEӔ$p|>T'a{+uX s_=Sx-$< zvp>)ٞ#wIyOKƁ@ @0; Jx:Š{&458i4ˆt&;Z'q^>"1ɎZ?M("yv!T42b]Ό 2RyFuUr/).e&ڛX= XF?4, IDAT3{..>AZqe4?u;X ,ɯ~S"rM'uGRf]w؝ՋnCZ1 tѠN5; ]%/)/iZv\HwI+$7p0 ,ym]Nv6D|ŋi7/[ؗ8!NB{nPni 'K|kN_I 7(ĽYkcI_V- ;~K,-}6h>$R)' :IɥiNH`dqR8 PK݋I]QWo7tS?*F i=9H7dA\Yt_Sum.N]ZOX=$pvs@vD0.;D'7j{R޺~B Sh5-DZ3\PܿFvivY<`jL&lOKk𷩚' %]Hq#qX -a8`Ē4iX:?Cݖ%Ko^Q%:?@{_;m\b^| !&_ 4BuAaףT__|zBz&&{,\U=*x CRs}S Xz5DWu OAc6ZScl޺ eH'6j6A{]ȳyӼußr#w.[YgϟzEk8B !qXϬ$`]Asހg0Q(hb$e5o`@a}[OI=3NvI>௓ %ȃDO;P}}EQ؁n 'LFIB =%o,Zw$ ol,rWۑDE85 h8 H=+iʀKzVloAuX j#O5*DE`wՋ.䱐G,I,w '5Ljim[`;D H`LrK: Kv+Uv6,dŪW vGQ Av\wTP~H}uxR 2L1&usOZCZ?0:"K |sdX$C6)L2(/NjCrXE $kIϡ6X榟e8X. Wk 9 &r >"ѫ/[R:`KuĎ<%P"Cqa&hg&{q G"[pYq}IvHznIkXA D q8!-Q"1y8 "FSxXGh0/ T_,&by:߱R9gL\@"p1T')W͎ѼpOה?G F|2 T!`hjaW{] Y;ŃqXzNYđ@-PUZ${~޷e*o$zWZ0,+M4UKb>6Ol=>ˇ@%pV*: % `}ivH* (BYະ:Sqg9bJn &`XMb VCRmm4h,ju\J4VMN'$`NDDj(I1& j =Pg5[Wȓ{d6JWkJmR5~lMpj JRGbCO51 nFoYf`VromES* Yi> [ n_4xC4] eK-;'Q5~k t$!5WR m8D0Nx}*Q.qDwْrrGt1>! EW[me},qfvVwK[jan~`VJ!a ͥ)r؄2&ZEQazHtqv-z_f E";14<<::h|݂KYY?ZM`c==N-I/e@|Ten@ý3&]-lD* O.E Raj gjhOjK5pjV*Ҡ({;\6+oY,u^8ꥀ54v!>k2 ~+ F\1n n&T귬T盬Xg=ZuFmd_wK!bq[|ݻcE'6)`NVjfEI YX,@kp L^5ar - cr$RmoE^O<$cpdp[-/JXbʵR g_JeRpF\ʂI2ؽRNk$<ŘH;768| &f =@ :KdJ=fyբLx=--z\v {*Q`9}c O g/1.dO-@KmՂbmtQKN9iFZv(ՆXP>+CkDIAQąL ϯ+.*ɡ ɦr%ZI-¬FC gUkX4wDkulP~l4$Z[DVRw|r Vɹ3F,p_[[T,(iU/3I!&*-Y*W$Qsp%~ XXhk-2DH@7u~ܸ5}#i`EؗK),S:ԣĵ}nҚ𭥚>9y➦,y>ؐjkE3e EK<'MHvbu/ҁf,NJ ?۪U: €%Cʒ[?bCjH$:ODjpZX+q ?`(5mYA `!-!lHw QD-M˥p;aGLM!9 dԊry/JDjl rb'O7n]92Y'5BaԌ|&?kzEk/ն cK.KO Q58%pJ`]^*1אx -/tAUdPSS&U` Tմg"=|>gE?;K+pF%QiRWUUUICUT-In}Uhj+M?*XɪAVrz=PeV*[dT#_VMa.U?-PIzj=P)Z-<3zUӰʚ韝JkEU85Lz*j>T >оUU4d|ö ^&س&x*pYZ7/y!R2R'`Qy!@Ž--] @m3唗g& \Ii@myy#K*  (H(**X|p Xe@}0br*U(΋~T%Ȯd`E E+KT™xSQQ#80FG;if<< Hϟ~&58/~V\Zd' U8R2OS֤LL]~ŗ_|]z?h+S*h&ڱ.^(=ѲiPQ7Y|@N{p?\rh3HOJ#AQ^ WU!c9 T7$J#,(*g> Λ~VȮv>軮9KV4N0hIO4 E+rQ;wHWqSo@wmqU@*>Tz'+6|q"@hxϩ' PRכ`ce ȇ~!tjuAhbqEBDYRR$Ϳ< ,v~5Y$d~6YǴş߹ӗ]v~\?wi^&c @;TKsFhBR)ڑ|䗦tZ3яh_ZZ:Xsۃ?ӮTZkiEAMsl͡b*) OF"ċP*' :13 1rT[u9~Z ~$]Jf_\F|^/lP*+s:hL :qyTh10Ȯ*.'!J֖T~<6zc0$_TqP%Oʣ<Ӣ[w=os9|Me|n/Bee)c K]XTә0&Rˀ p;(+_\{ 3qWt8@ 2 ` b,辬.!Zʐh*!+]Yق[{ ^oB"h&({/+K*h ``~C`9|t?-@"X2\Vz)F_&&ZZ,\%\&nx<([0C;25kY ̏~0巸g#QoZ.XIHLLIhRCVeK10/Cs4rv*BSIż/Zշ n"P\QFܳȠ%ٳ*] UBJt(-XXm6u-5 UIlyh2{, V~퇫Gv~})IG6 .#%t>+1۷L!-/+~e?@Qpp׭r1F˲g)Ie };_ ӿ~~WWE Db&˦9R¢wy9g8]ۿRT HQv89`=0rj;%EC MEYܿi;5l㛿Ui4\'CKƊ\^}7S:ƩK@p'Է}`NM!|?τ+5h ~;w= Ot#zc=q3'ꗌe Ͽ`SgG_6m9w쩷O},IS:}칑fLG{.Mu߫JoIENDB`Subsurface-4.0.2/icons/trash.png000066400000000000000000000110511226345450700165670ustar00rootroot00000000000000PNG  IHDR>abKGDC pHYs  tIME v̕4IDATxp\Wuǿ'd#[; @ M+Hp(!MSvmCiR2N6GIQN'NhIl0rl޾?vofgyws={ mxn1 3sXosg" ee.?n?LMM6|izz-of.5BZ" f[ym#Bm4fCD|8 [dRдԿBЇh:/,'DyBDIR'~C PŸkv 3J,ѨRJϰnjCD|O.W'|<Kb*:DĻ-/jvSW^K?J_`UFcR%PKM"td\07{atODw1bt]+ʊ|yhh6lX'k#BaN*u(wn+#B{5mߢ)*$¯:01_?pHau"ߑggg_ ;aOGEU|WdN[ ~|Tn>{70k"Vid4 J 7Y޾'&M-?U*-Cds7nᏌE%v_K03&HWŸ4Wߠ&Z1__JX_;E !i4;88xYߢߤ?66ŬDʜga7<(]of+Y<.,}7|ئqr3^Ggt~WyʋR`~<ڽyꭴ|b_v%%oGo1Or$(V?L󏹁tZw:Z 5MK9͖tCx?ض9LĻ W@Ecd^uB 4mOv[hX<0::ljq;JnVj *"ӻzeRazz5kԥR[JBOxw[K4m2 r e<"ǟ7(o9zp,-% gLDLD u]ŇXJf)%K)ž\ϼPQ|oZR:=z@K |9"+D f qd ; =j/U9!t< cc_ao5HTĹV5MZY]WBBQU!nW NoY-ISCԟG;3wA _y ^&PӴKe!H|!?pɓLI\6;;{̸V _Iu3X7ZWR;z6<{YPӚ۷5关kH׮..ٹۈ0ߩ礀YhP(T&̷zn !|P.6=㟚ɓL;6})")kwey`aa1egzꙕ̙m6& ?R IVs 0H3ur"Xs,jՔ=wl>,!,g4O)5Idܢ Pg&IIYGϫZUQM-X7lrwwyѣ'N/BNyŸRMƩ^:ƹs=Gc/ AYL3 ?KxTcBfoIҹn-U%@˗Jsܶu zH IHNk7+ЪsU%audu_ߦdV*vN 7%wn:Tfr1̽T bn)I&KNCOXunI?=o5y`jjri$ej_>|4IUU lmN&K PI4s[kU_F0?+B( 0008@gZ,__YFG=O*n4"YΞueZ]{Dʮf r-FEh%%!*Mb`ddn)$ܿh|Ƀ_wthha˳׭Dx II]EMK=L=>LO3#?p,4I\ߤ&P)d?H7Fd ]m`^^vl/_ǫgCY;+!@4}:}3w^?9GYHϻtza1'XL!i/<ۘFso5"6x?ݱ|wxXǬ|ʓd1w]^ abrI$Q^fL['7'>4Ks^f݁ߚ+33{VR?(ń?G=y6vscR3R;YM`jj[Q@+XKH xYh˯^O^=Ē,׮R\.cfyyDU׿UdV_nÇ`q og _ϟ |l `,m[M+J@_n'ܿp?rOo7(o=~+\.!-k_{[~c~Kir vmz)Νp݉'=>'Iرc>wR2ԩ.yE>3GǏ8 i0jוAV7۰a=zz\ߌc/5kf2(7"3=r]J`~Gz\5rIw>\awLӴDR1eBᙰ;V7ݠ3ԁo|xTJbz)@7~UUG&opv6cC`=͋Ev/Q^AM%in:V@);/1:"Y(K*ⰾ/ixS;=(,/_m:05)OJ)ˁ:KҰ3./eq͞?fԁ&V/w<$paSHą@z I(>p8)$ueʋWZk%U9h-լ$xhZVW\o7NN&*涭a9͞e2 𩈨r])e=03/ҙzڣўVƈbgs*-\D|Zm.(c)Vc# R&{ڧTkK[/\c 3Rb@JH)1 %f 3Rb@JH)1 %f 3Rb@JH)1 %f 쩸;뻣uWsQixQ{+7ѵFZ{ZqɑF=h6} WZg\zZiDmPiq(p:HlԺ#"^@tZ`cuFD6UXjSV&}9Cv.q"ba̯h׮J{_{~WaDĿ?ԛh|D}Z@Xۮw{.s  "6bQıwl;3k3W]EwGOUX "6D`/r77EF w.yol'6TecK;g.~jX?|#>< *XD`B>Z˺`"u4Qow9ۨRyT!"ہJ) #"^v[{7~ha\) 3Rb@JH)1 %f7=2a/W\rP ::Shgąv[U`ij2މFXGsjȟ756A@}2K?Y2Ug<yk\&+Dq#pcRs "bE>QD\q @c˒V y"g)PI{һi N~|$DQRִoyk9Cm>AsX.Ud "nzqh*FRb@JH)1 %f 3Rb@JH)1 %f 3Rb@JH)1 %f 3Rb@JH)1 %f 3Rb@JH)1 %f 3Rb@JH)1 %f 3Rb@JH)1 %f 3Rbpz)ŨHk9155&pB5+'XYq=ˀiଊczx)$uI`KSHĖI BR'GR^[&#bxI$ c1==u"irwHi|8DvQہ#iH6u&zޡR>l\-xz~qÞJP\{懣6`DHvor_ݍ7 |$IpCckVJwN`g7>aR> |hʈ\4=k[kL&i`5m~X#w+\.Nc@Iu <sEH3 iN:X<< l]lI4kCHxv;8#j'PA|;E#!f3+!"KD9B/pw '-H?AAD$\63z.">`HY xh팽 vyPKDj.*BDE,9*3v YB ~BDA,iQqu45]Dާ ~Kv)L BD#2oy(A;,!"C2$+8,Ef7/{?`$UiQ]W-;RKD>jȎeh= jjKҘ vy'|_/~;AwKD>̶˼sV%kn3 5P:-n<{<{`wKD>J=s\0oN!ծ~e~<%ks w"Rx*DC+eS7us;?יYqFzЊĎ ,33;w oRPn}cwRu.F!"c8"RXfvxش%'sgu&{R%"83i'Tpոy=Ɯy,!"%B̪G~'؇Sm獷:n//n{c>g)uD6+ijs^\TW&Xs8j`w)uDbzʼ2T%x[R?8x1X x3:X" `ƼWl]Ғ?1!D013; g>JEY.-F!"HL ضSo"a%i)N>k.-7l`O+wdGbHiP$̬x㇟'V|}=Pп1ABDG,xZsqu嘚W2)>|;:X"1cf-|usPYG;?~Ͻ:|-];p叱uj%T5:X"ա+fe1!D$w83Bv,CWѯgW#z7vmc=OvlÛ!D$7u8WLkmqٓ˧,!"H /p|jO `]<ѷA<BD:/O<8Y }qPQ`-G+vEȩ%Qfv)U O# ~Ak"9E0R`wZ>;tN=DnypV>ijYɄsgfCHiP$b̬ zeH%׏{rH~qw}>8NGE:X"ѳ `UE[\ fd+}CHǨ%!fv,k 镡6Ziu/qx-/ABDO,hَcqp/2 )n;:X"qpS7=3 ]oG*i1r=& ;|i">`D˻D(Knu>Zl!"K$=\0* rnڄZ)safýCH۩)rf!{w7fΜw BСS%R<̚\ϱӞL:=M!"mM"ER^jv<{ GA !"GHqێcqpWz2z"rt`)3?,QZGkio}ݞ!D)BfαuiKl+$+ojv!"GH29pɕ|zyFp罀Aw3G x3:X"Ej^&+Z<#Iou6zS%R|\שnt3el #/waf#CȡiPY?a+CUEҥmθIABD>N, YM/N?/qaf{SKH9<3VJY:>'䱧cŏ^c  !"H0;ǖ%-*>_RGo uD>+z{FWwu.^~dBDB,3*`oe8$4VyP%~w]<\sQ-'> Om_O׳2P%bf X䙡,E^IiiQ=;d -DX|a PN!".Zfv:C =ZJx[(ӻX[70j1 B$ !33B0a㢌v8uX9Sƺ=̦x;uDB̮3)ǕiU<^OŞ\O B$j*2fVlαcEӽW7x3X"qذ]VDc]=5z+X"!bf=e&e蔺$wmvB$T`FuFzu+ sӿѹf;H 3;晡KSg_ %)cbN` Yj"R`*Dcອ| Uz,%9k^K,"q'H[:e03B$m_ӘVQ%ʀ9vBBO1'Ժ!'z[ p5Yf(K76,ET`82.JKK3"%zHc[Cą ,_* ioqw&݇nfD@3;3Cs};om!T%X=߽SX!*Dwp 5Uz +'y:=YEeٞfzJb[ B$T`.BROj==B$x)@?]ܿcKGEOHg# 1ڵ50,z %}oMA|;HQK$wX\1IUl]B) i_]0sK<3^¢܏K mM3r׋ {`cwb%BN:x/a9=bLgɃ^G]@k"B,ΛsquI*"1m3]My)&`tU;~9e~#{E<{gO {]c>G"B,ι ډ*"|XBX%Af=PYo-Q0\ ~B%q[p,OoTqf۽CX"`fgWxf٥e7?K{J%qc\3B$T`;[3;ؖ%RI-f֩ikF_j=#A}̾=0;HiH;Y%(3~`\~ZOo}?y +uDg9*b>G۽C:X"mdf=GrQ6~VZAB=/SϹ}S!DH,ۈcqFW@Yx2"`~Lv)v>Jeދ$+`'oq g!DFOjفcqaaFŕ|"GafSQNR܏K9KG=.!&Z"93+'{19{sֈ b;C'=} \w݋:X"G jT\U)1!DB,0dVyeHߏ=J"HxowAv!D@,ۀcqW&uIV>|XB$ 93; /!X*Iy/`]<6=  !MOnCہ*]ҥƦc&"3g/%J:`Դ'o\ '!D-fxwy+  #\}=\|n5O E*bL{ 3;-dfݾJRC/y1xc8 y_űW}{r 1CxPK0_I uIv}j1);|ݮG_#;|U"H+{7IjN{ `wBSKb&{f7}/yƐڻ/`ŏ)mP{!A !RH`IY ;ǽ[T\I^M21!D I|`ggT1 +%.3NqBPD(efd2{eH%|/C"HLw8'p~85@;8W7]Y {i?;<>^xy/^ WQ^1EKcLC-).!eZ~N9)ckҷ|3H!%df%:;N'?j|"ǞX#*8JF -$ςg2h."Kbyfwy k{<7 UQ˙2)ckVA)O*$vl,m {}bIy~pnn^y0+\1qpM˯Mv˞!DIĊCY%߫q:6G{{Ulx=F C ,3|3S+g{yFp3{Ywox;RcU q;1yu>  !/*$6̬m|J$W_ʼ"_ϼ~u+MMU3*ʢO{Kny=FxXfv/3ìꮞ g5Skҵ9yL.rιIo?C ,3J!{/_=y ]gt Drǽ8YG%j9m8Wwj|qЮ=>r+G|snx2xɍCʘ6=0;H%gfЧ{ F+h-1/`?bQ/*ti*2p.i``x%u$,αeIKd`bQ\|oq?~;JR=q)k`I,o<39ޞ+'fzoFdͬ X5󚽣tou.^|5=C:XYfV ;Vt7n,cl+~>wNLpEb5pw\Q%Qx~RÇDo羱x>SlzM8xHS%df}[=3T'Xk}׹a39I+Kk1:,K[c[C ,-m3)Sf_髞Uqus<Ǘ'6*FZF{,mr13{f8k f+wEO:ߋN(΁ q_à ЧM:X)ff`,æEHWou- {,t;aP]\;Hgdh7+gx9_]?_nL.^gfADU|3'"6{_QtntI݁!D:JD gky|g 9/B_[ԣOo U@,Zo,*$̬'oicӢhe7v_hmۗwXUE ?UZ"Kb:Zzc=xFȹbo}} vu}fvwR%ENzfIbz}ս~wK&`t ,)j:a u 9ݟqU9=!F8 `P ʹǟ~;B$^z8ao[,BeD:rۺ`љ)gϽ\EA<_?~Kq!DJ@OWጓ9 #D+rP,53Jpm3Fvty༩jLTKSrtyiTzXt]#}Gk,5׫ʕh,Hѥf;Ѩcfq1<#]42(K:"GKX O!Edj"Y:NTN!r$X0 ,ce BKP)D8&m!DD 3K[sܻ<3NKW4J&~oM!r81`y՜7uo}dWxڲ7 i3kVzf(I[/LS}*RK[^?_YݗʇC ,)kj 5пWgJ&UhQss({cfCq93;ᙡu2 IDAT>ɪ9p(:IyQ`AqLߋ pwR%`Ο{g4kVEف=]dff| , 53aH47]ą:X@yX}h9DBC[sܻ<\$aEpE >|t[DB!_R$n{wfcNwYNkAeۗwql!>XJf!4/XCaE}}gs}p[;XVuLgpߴgwZ"8,o˒RIiLoN nP_df%΋K ``RLq?2BDvͱb<u:Ĩ,cVwjCH|zfлSCA{:'EzS};fw;CH8oж-BCm2#*r!N>h5 >|t!G`gGU2PaY:&,tVi4|TP0z`gd:ڇqqu8Wc)!$T`IX4z9{,á$au#F3| 5U 17길.*fvwXwԬsVŹ͋3a84ݦ"K\h`g=JYxMgPSquٵ'8w%~T`3K;sl] ;Dq zL}h4"~483Y#BG$ԴDq`e5&&!$>T` 3zfH$`2:X=Xq QzxP%^VTIC<#8c"ᣥ&*A.PU`-ЬV}LG]1Q܇^afyS%m3ڬL[U'u*Ksܖᣒw*,r t-aCNs:1ա:+Ǹ,9̮!ѦK `,-Yh$l?mp?M[dfKFIF +qoEGOӽ܇xR%afUz BhTCudw"ti ,)ۀP)ǹ`*JZ"lVW䮹wyhR%ygf=3T%0h~utsӿѹf;D ,)̀kh鍍h)P2`$el^3J$T`I^(* 3)V6Иa\:3W03CH13#c6BE>ꝡSVm_ւOm`gHN[Gj`gC˹vbgHav'['SCHt0rBp'n śqa>f0xx X/ˀS'툄_~EEխ׸<%:, 1fxP6~w+`p'xvw7I%Uǟ<@븝~@k/y+E5ʱzjJz`w)~*$lpg.M)n!2Zj+ W1̳lw)n*$vnP]vvqe{+l!MB3fvpgq%u"K]cΘxN5`B , 3K7+ZHSv vֶMG\Y pj974 꼓aHI8)K:Z;<3[_i.+7/̄aEE:3i S!Dv2=ZJX|bR|T`I0`g$4{F- Y1z6S%њ3V飜oZ"lXR]/PUR\$ffǘ}Eg(K拵:X5sr=C[݇0!xi)bfV.o!Oqhhh{n%KK$ZV>l[A?>$k ÅGWW CIq$n!ǀM=3${X,`~]kWJJKv󛵉؉NIF݀!$T`IxB {2w2xѩnlk{̺zR%mbf)`w˻Pr,Dxt2 .ȸzR%m5QL8Kcpg~=Ke|fa:XvA3U_gk}R)tݽ;֥-h,Cxd^x-)Vhr!Kg&pgsN՞4 U`XrC#3%f; ,3y^";VCᥒFMaʁu!$$CY ަ|ä:N>DPAKA_NύDO|zfHMTCKXgF*䣶nD&}9bF>|tBGO0)N\ 3*La`  4X1`fedqcEE66O`51N3!$?u^.;Gh,CaP|6-PZ⾗pzSqf3Ciec6a`~=K?=0; [TyXxMz-jt]·iLCqZ5Uf^In03;3Cs}75{F:XBrKVx UE`}3~!$wQfv)pgc9rU"0Xūؼ}h)!8-+H]HY`Eeyti4/O:_nf %wM=梳`Tg3XWfj=T`E5wzf(I|tBOVp=2zDqi0Kھ" ˃nj/q%,ukr:Z`80; ⶍUsiҗlli0N?(۰0CYڽʼCH۩*Rfv!03C1,'53ѣ4ʎZ¢cySYPQW[PZV'*T1RSxmFSo73(~2PR%=#HH-CMU{VCHۨ*2fVKBg7X r=>fMcp_ӳlw9:Xgz?K6P{-%+hDC|Ɩ%]$; "bf+#!YX`EgWsJ<rd*6r;f5/TluVl_Bs?N0sK<32q+~NTƵcySUαeq RG 8Z0%D94OɍdVܜqRW !%BX=b rh*B̪u4A/K`tir/7.!T`/ϵk13UU$Xss{ g#ʡ 13S 6ܪslXa*m3:sFg*G.5j(Q+ޒ콬1ȎS1tJ =ZJX6uhJ$ZV܍= O1.!+XM25A.' k~E4|4<N'{y|9WO E$<(;/q>z0;d C6zر̥D Akd,wZ]cf% 0ZNvxk5LcD!A]S,}hW#LVY`giQ3.%lz#O^/5n!NVl\Z|}#t- E(BC{*[Z +4`g)n ~q66u!f6;D dGB/4ų#K$`R 4|ԕMC̮NpҐ2~XT\;XZ"9T%r>zW*Y;ǎ]0$OTsC<njPdխfzY p55uoTҨ3\cHK3sr{ `w8R̺yfH[x,,uhLuW371p]_xM}{zF,,iiLb /qˉ\!Ӑbf!q.$eaLHX|}#=Z .2!DO?;p]LM>q["UypVr&R vu`fg{f8o=N* J9v!q.G,i3ؾ}۽Cąb o!3s}jgRK뜓+\|!@VY3pg  uDn˒RI[,^oDT`Z3 譱 {q;E!{rӕ_7y:Xbfte=C=#H$acI9KG=nC*s=3U'g2HĥU6(yq %){%GT`vM'"J.UʼOy3,9+l 03C^|ugtJrU2:Q+,I6 n[L\NjZCm;or>ڀ}Q+nz8od(nl%LkOwmP ̬w(PC[xfH$` cSZ"cbw);DʭUdwr3zPAb&iu$_SèaG0Q! 1Vf Օ ݢ +娃%}yNVl#ZurvSl6Kxumgks;QʹbL{ 3;D1Sfv.03C%zmge7]7Xge(-q_ndfb,αeI R_Fg_|to~)(e4Y}! Λ p &_N[ ,uVn ~;̽+F*:̪u`NJPlݩLP]G_}M\Q;ס%]\! AyէH̻c?s̬wb̬73Cey 3D>+"wfwysD)[g3cEKi1!5TRX_'UxǸQLT`u\ᙡg~1!]2:EHKcSw-1}Y P|YR Xt>aӢ i}%ƟU+s.>: _rCWUjc LQ,T`u+gx_4êJpK9w[3awt T`U|3]-bFP-խ׸,Q T`rgk9u}j%ϊNAyq4ջ̢z\yf(Oi-[HF)sJu$j>|X""+khM!-C[xiwN1K\ |MW3ћlw0Sf63CL3=#tȚ3Vډ$DRIcџ";RxzpVaarsIڜKzR U]c|Vsɕ1aU2( ÇqŽ"6*.un.M)TOHhihqfVlαc2H[t]#3.+OԞG qE3OF*l pgp lxU]9kD?fk1RWHX0zl8ؐPuf3C4Erb(T]kՓ'wDڤg]~;Dب: [mOw-QH/mٯg)?B&:)2l"Ӑ=NҘbl ʕ}VԄ`S+05Eݪ+}h5pw0X ?DEgW/eܙ>SklX_ ׏t 0̆x ;C=3?_}oOD?vNt1jwjND ra, < ݿy#ȉ{op'_{rg5kYssF0H$]0|o;!3[l0jɞDB{{op߿z>j=ϭfYUרc%G+IAp 3;$eyq/7%FݚSto)W.̰F/)W^/G%b_`h C}Eq\+""WY`Z^bJ930tA""M ?'!<Ľu3ո3T\H%TCl;XfRI㿾֗}ݯ7{Sˏ1.QHq`݃cq0gJ+ɫmK[Ho5X;0Mk~DܱL=0;D!Ų";]suɬĚp_cft.43 0w)󧺿MHLtiJ|.rMf"{ 'ϩ ""10~ϼ50 gRŕ\EYu{(t̬Xi2J?믓""Rx+׿50"_yȷ8u±qy+qHd6x Gc2d)PS`d/hS|G'AM6+U\H(l -E7l4pg=JYxMg?7ͬCK, 83Ǘw j<#|ȋu.xg "squֈ W"":l ""2`'6#}/' ) 9osg_s/ٗK{6Iѵ9Ej(y 0aO?500SU V+]\Ê֛o_~&|o9+=IV3*uHS S g\jOd nɰrڶH轷7sW'^aIqֈ .]͍QY%EۜsÓ1!r%r |31]Kx䛭!r8A_nytiJqff\^@"..i7c\׽CB ,33gp_ڃ|ol K3oM2\|.dy:1w  +v=ըa*D]{hS7+~&-xox>wл9S܇xȅt̬l/ }y|WPzoo-/*]gϴj]]ڻȡ~Zd Ը *D>q O߿X\QӞ?E ꓬ;F#;DgEef=Gk( 3)>zGɻt&Q,3;Om&BLGժ9:"//{Gɋ쪉iA=/ACtDQW2| `í-*D>^W댟{˩ȑe],:ثH#sZ"qxw[_w : .}fvw(%B3+wQRgǿOUl AT("Q";,Yd9=d4j㖉8I4(DDٺA[]9i뾿G{6ؾggЕ/3H$<:ΝYohǸQ1Df8twv pP!N)Uq%\|ò*&]S;Ht/k/p>;Dsee:8TG{еz#n*nE$->-fͺzkh>3DsdkN+Uek`ĥ9[\A?>g[:"iSY+cTC4Gu 4n`]U7%m>Izl N/':zI[%K]oLXKa%q#:ClNNЫk>׌ 9zz0yWm 3VSSޜafD`SK9E"e I(-q뵵1h]d ,*@'Ӗ3wP$J[ד#8< ]nfD2 V ,3H$7T`%1o{+ p;^uDΊjS (d % ;ƙfvgPVcx[$&9\ ̭q/4%榫jH$r:k? =kqNzf_>׍ izt%͙PK9fY[efq?<D"}M;B9\ԩ.c܇v&y, >k 7j] :_VM],c\ ,3+f{],NX}.W vFEqǹV/ơ`>7fX9=!E" ک@HZ~QUh$w]vN}zAfrXf?0!M94AtQU'𸺈x Osyk);jD. j%Y:w"pqŜ|SlHhefs2κtcEO5dC<;F 󟾙V}Cfj=;B"YE+&ON!2fXwK2P&kɋ#2.ֆO- Tt`lwu-rocnfi^̊9Xk7ىdGR#tD^SkL6t/2rߐgqd_!a'j(os霉j%UQx2yuHi/̬309MwMXХ9Uۢw\ort.\.ϩVѩN[UD#kT.{̊Dޘar ١:xZ ,3;5cmi_itɫXL^^h6xiafܗ7]hSw9T1DJJdN>-W$3;=Ng1 ӑ}eDZ#q@7;B<^>}?. f CmYt9Q=")6wb$1G܉zi>= cS}tMN:Mr 8L7Zߞ\?9 ($=Dq5q63Ki9ߑuQX`̝~H5{\ ErjfpFˆ4K]UU ŵK:J;i/fEUt頱 "ҩ. ܝ:L{$aHSdf)ծ:+aVojS~_h3nH2 9mRpn0gBm労ze1Occ'puHt/4#RqU"fvpl,dnɘ+ϫ;wʱ^?|Ԁ{RqXfVH8N"͛sncq"(i[W7N$[dfw̬X 5wTK<ܝ^]H΃kZSIJc̺WEKֻ!_Lk65#+T\d申xQOnV,y cJ,ɔ1*D`:Y[`YemlqeYŋzPQ"ݕ[|4DAsO)k5WO$&_1tdSWgV771m =kІ8""gŬ]zz{&Xfv:X HnQأHDROX#Ϭo7ed3.Gf"dV3u  !sz ,3S,i}3, "idfyz=<]B4#1 *OXD2fCw]EM-.`I2ǿ3dkyy,_e6wV6l}UX`NС65 :$ӣ'о&@DR?~S`@K߁S1xSD>U[Mp]\B>ٔr[NW_7f """K8=yw,3+f#USǘ=}/"aĐR1{^45+̝TK~T{>̊ zt+7ʽF \O쭃u-.ij(T"""A7]YMeUXfV LO{Կ-g. """VQgU51v=u&i,V絼dk/GgCo4TXfVLXݸr]ADDD@^¸{^;:Xٍ1Lp?Q"""%94 {+u&d4NfJYH7} Jfʝ\M1Uy-/"""Y rp pX? ]Ϥj),Xi;ulÈ2.q/`e^ˋHs8ױ gY>pkvmSr׌O+aš idDܘ:XfvpW`JDDDR`R.֩Y˭{"-qDDD$5+6`fy{4: :2zvqB'tYGp1m=V,kFVz-%ӃSJDDDcĐ{Ā+P~H+թ.)XK u_vkۉH6A:VUy!t]]nt1_HzunlK˩]'"""9Ʃ*s)u"""cj+dYi tRMH*+gz2bvy$JDDD2#פXA h䊺]DDD2%XA}xisFf"""Vgk}kU/V~5ˉH{}cy ؐ7mYV䠷,㫮RKDDDoѳy,<,T%"""q)t7+"""9䅿~;+x,_"""cn*s`f~L/+"""9_튙O0e 2: BDDDrM wf/m|౴bWܺ^oBŀz%4=|b"""zFx BX䑠FON:m`W*,?0=RdO&3##"""cqvzy&"""V`ܟT""""Yl02M&CDDDD4v]>fe"H{w즃`fq!i&"""6BDDDDr\=X!g""""s{ѽ}n/~I_FgP0c'e:Gss@} dWЄ `u+[JDDD$K5Bo6M*BnL&HBXԜ]^`U`|^$"""}!d pns B%&_".f[YTDDD$ H$:X{YIDDDD$:V `(Gp/d'X!u! ODDD$>!\B؜.3Mcwd*"""[n !!ioSylzB RfPҶH<L ! #include #include #include #include "gettext.h" #include "dive.h" #include "device.h" #include "divelist.h" #include "display.h" #include "libdivecomputer.h" /* Christ. Libdivecomputer has the worst configuration system ever. */ #ifdef HW_FROG_H #define NOT_FROG , 0 #define LIBDIVECOMPUTER_SUPPORTS_FROG #else #define NOT_FROG #endif char *dumpfile_name; char *logfile_name; const char *progress_bar_text = ""; double progress_bar_fraction = 0.0; static int stoptime, stopdepth, ndl, po2, cns; static bool in_deco, first_temp_is_air; static dc_status_t create_parser(device_data_t *devdata, dc_parser_t **parser) { return dc_parser_new(parser, devdata->device); } /* Atomics Aquatics Cobalt specific parsing of tank information * realistically this REALLY needs to be done in libdivecomputer - but the * current API doesn't even have the notion of tank size, so for now I do * this here, but I need to work with Jef to make sure this gets added in * the new libdivecomputer API */ #define COBALT_HEADER 228 struct atomics_gas_info { uint8_t gas_nr; uint8_t po2imit; uint8_t tankspecmethod; /* 1: CF@psi 2: CF@bar 3: wet vol in deciliter */ uint8_t gasmixtype; uint8_t fo2; uint8_t fhe; uint16_t startpressure; /* in psi */ uint16_t tanksize; /* CF or dl */ uint16_t workingpressure; uint16_t sensorid; uint16_t endpressure; /* in psi */ uint16_t totalconsumption; /* in liters */ }; #define COBALT_CFATPSI 1 #define COBALT_CFATBAR 2 #define COBALT_WETINDL 3 static bool get_tanksize(device_data_t *devdata, const unsigned char *data, cylinder_t *cyl, int idx) { /* I don't like this kind of match... I'd love to have an ID and * a firmware version or... something; and even better, just get * this from libdivecomputer */ if (!strcmp(devdata->vendor, "Atomic Aquatics") && !strcmp(devdata->product, "Cobalt")) { struct atomics_gas_info *atomics_gas_info; double airvolume; int mbar; /* at least some quick sanity check to make sure this is the * right data */ if (*(uint32_t *)data != 0xFFFEFFFE) { printf("incorrect header for Atomics dive\n"); return FALSE; } atomics_gas_info = (void*)(data + COBALT_HEADER); switch (atomics_gas_info[idx].tankspecmethod) { case COBALT_CFATPSI: airvolume = cuft_to_l(atomics_gas_info[idx].tanksize) * 1000.0; mbar = psi_to_mbar(atomics_gas_info[idx].workingpressure); cyl[idx].type.size.mliter = airvolume / bar_to_atm(mbar / 1000.0) + 0.5; cyl[idx].type.workingpressure.mbar = mbar; break; case COBALT_CFATBAR: airvolume = cuft_to_l(atomics_gas_info[idx].tanksize) * 1000.0; mbar = atomics_gas_info[idx].workingpressure * 1000; cyl[idx].type.size.mliter = airvolume / bar_to_atm(mbar / 1000.0) + 0.5; cyl[idx].type.workingpressure.mbar = mbar; break; case COBALT_WETINDL: cyl[idx].type.size.mliter = atomics_gas_info[idx].tanksize * 100; break; } return TRUE; } return FALSE; } static int parse_gasmixes(device_data_t *devdata, struct dive *dive, dc_parser_t *parser, int ngases, const unsigned char *data) { int i; for (i = 0; i < ngases; i++) { int rc; dc_gasmix_t gasmix = {0}; int o2, he; rc = dc_parser_get_field(parser, DC_FIELD_GASMIX, i, &gasmix); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) return rc; if (i >= MAX_CYLINDERS) continue; o2 = gasmix.oxygen * 1000 + 0.5; he = gasmix.helium * 1000 + 0.5; /* Ignore bogus data - libdivecomputer does some crazy stuff */ if (o2 + he <= O2_IN_AIR || o2 >= 1000) o2 = 0; if (he < 0 || he >= 800 || o2+he >= 1000) he = 0; dive->cylinder[i].gasmix.o2.permille = o2; dive->cylinder[i].gasmix.he.permille = he; if (!get_tanksize(devdata, data, dive->cylinder, i)) fill_default_cylinder(&dive->cylinder[i]); } return DC_STATUS_SUCCESS; } static void handle_event(struct divecomputer *dc, struct sample *sample, dc_sample_value_t value) { int type, time; /* we mark these for translation here, but we store the untranslated strings * and only translate them when they are displayed on screen */ static const char *events[] = { QT_TRANSLATE_NOOP("gettextFromC","none"), QT_TRANSLATE_NOOP("gettextFromC","deco stop"), QT_TRANSLATE_NOOP("gettextFromC","rbt"), QT_TRANSLATE_NOOP("gettextFromC","ascent"), QT_TRANSLATE_NOOP("gettextFromC","ceiling"), QT_TRANSLATE_NOOP("gettextFromC","workload"), QT_TRANSLATE_NOOP("gettextFromC","transmitter"), QT_TRANSLATE_NOOP("gettextFromC","violation"), QT_TRANSLATE_NOOP("gettextFromC","bookmark"), QT_TRANSLATE_NOOP("gettextFromC","surface"), QT_TRANSLATE_NOOP("gettextFromC","safety stop"), QT_TRANSLATE_NOOP("gettextFromC","gaschange"), QT_TRANSLATE_NOOP("gettextFromC","safety stop (voluntary)"), QT_TRANSLATE_NOOP("gettextFromC","safety stop (mandatory)"), QT_TRANSLATE_NOOP("gettextFromC","deepstop"), QT_TRANSLATE_NOOP("gettextFromC","ceiling (safety stop)"), QT_TRANSLATE_NOOP3("gettextFromC","below floor","event showing dive is below deco floor and adding deco time"), QT_TRANSLATE_NOOP("gettextFromC","divetime"), QT_TRANSLATE_NOOP("gettextFromC","maxdepth"), QT_TRANSLATE_NOOP("gettextFromC","OLF"), QT_TRANSLATE_NOOP("gettextFromC","PO2"), QT_TRANSLATE_NOOP("gettextFromC","airtime"), QT_TRANSLATE_NOOP("gettextFromC","rgbm"), QT_TRANSLATE_NOOP("gettextFromC","heading"), QT_TRANSLATE_NOOP("gettextFromC","tissue level warning"), QT_TRANSLATE_NOOP("gettextFromC","gaschange"), QT_TRANSLATE_NOOP("gettextFromC","non stop time") }; const int nr_events = sizeof(events) / sizeof(const char *); const char *name; /* * Just ignore surface events. They are pointless. What "surface" * means depends on the dive computer (and possibly even settings * in the dive computer). It does *not* necessarily mean "depth 0", * so don't even turn it into that. */ if (value.event.type == SAMPLE_EVENT_SURFACE) return; /* * Other evens might be more interesting, but for now we just print them out. */ type = value.event.type; name = QT_TRANSLATE_NOOP("gettextFromC","invalid event number"); if (type < nr_events) name = events[type]; time = value.event.time; if (sample) time += sample->time.seconds; add_event(dc, time, type, value.event.flags, value.event.value, name); } void sample_cb(dc_sample_type_t type, dc_sample_value_t value, void *userdata) { int i; struct divecomputer *dc = userdata; struct sample *sample; /* * We fill in the "previous" sample - except for DC_SAMPLE_TIME, * which creates a new one. */ sample = dc->samples ? dc->sample+dc->samples-1 : NULL; /* * Ok, sanity check. * If first sample is not a DC_SAMPLE_TIME, Allocate a sample for us */ if (sample == NULL && type != DC_SAMPLE_TIME) sample = prepare_sample(dc); switch (type) { case DC_SAMPLE_TIME: if (sample) { sample->in_deco = in_deco; sample->ndl.seconds = ndl; sample->stoptime.seconds = stoptime; sample->stopdepth.mm = stopdepth; sample->po2 = po2; sample->cns = cns; } sample = prepare_sample(dc); sample->time.seconds = value.time; finish_sample(dc); break; case DC_SAMPLE_DEPTH: sample->depth.mm = value.depth * 1000 + 0.5; break; case DC_SAMPLE_PRESSURE: sample->sensor = value.pressure.tank; sample->cylinderpressure.mbar = value.pressure.value * 1000 + 0.5; break; case DC_SAMPLE_TEMPERATURE: sample->temperature.mkelvin = C_to_mkelvin(value.temperature); break; case DC_SAMPLE_EVENT: handle_event(dc, sample, value); break; case DC_SAMPLE_RBT: printf(" %u\n", value.rbt); break; case DC_SAMPLE_HEARTBEAT: printf(" %u\n", value.heartbeat); break; case DC_SAMPLE_BEARING: printf(" %u\n", value.bearing); break; case DC_SAMPLE_VENDOR: printf(" ", FRACTION(sample->time.seconds, 60), value.vendor.type, value.vendor.size); for (i = 0; i < value.vendor.size; ++i) printf("%02X", ((unsigned char *) value.vendor.data)[i]); printf("\n"); break; #if DC_VERSION_CHECK(0, 3, 0) case DC_SAMPLE_SETPOINT: /* for us a setpoint means constant pO2 from here */ sample->po2 = po2 = value.setpoint * 1000 + 0.5; break; case DC_SAMPLE_PPO2: sample->po2 = po2 = value.ppo2 * 1000 + 0.5; break; case DC_SAMPLE_CNS: sample->cns = cns = value.cns * 100 + 0.5; break; case DC_SAMPLE_DECO: if (value.deco.type == DC_DECO_NDL) { sample->ndl.seconds = ndl = value.deco.time; sample->stopdepth.mm = stopdepth = value.deco.depth * 1000.0 + 0.5; sample->in_deco = in_deco = FALSE; } else if (value.deco.type == DC_DECO_DECOSTOP || value.deco.type == DC_DECO_DEEPSTOP) { sample->in_deco = in_deco = TRUE; sample->stopdepth.mm = stopdepth = value.deco.depth * 1000.0 + 0.5; sample->stoptime.seconds = stoptime = value.deco.time; ndl = 0; } else if (value.deco.type == DC_DECO_SAFETYSTOP) { sample->in_deco = in_deco = FALSE; sample->stopdepth.mm = stopdepth = value.deco.depth * 1000.0 + 0.5; sample->stoptime.seconds = stoptime = value.deco.time; } #endif default: break; } } static void dev_info(device_data_t *devdata, const char *fmt, ...) { static char buffer[1024]; va_list ap; va_start(ap, fmt); vsnprintf(buffer, sizeof(buffer), fmt, ap); va_end(ap); progress_bar_text = buffer; } static int import_dive_number = 0; static int parse_samples(device_data_t *devdata, struct divecomputer *dc, dc_parser_t *parser) { // Parse the sample data. return dc_parser_samples_foreach(parser, sample_cb, dc); } static int might_be_same_dc(struct divecomputer *a, struct divecomputer *b) { if (!a->model || !b->model) return 1; if (strcasecmp(a->model, b->model)) return 0; if (!a->deviceid || !b->deviceid) return 1; return a->deviceid == b->deviceid; } static int match_one_dive(struct divecomputer *a, struct dive *dive) { struct divecomputer *b = &dive->dc; /* * Walk the existing dive computer data, * see if we have a match (or an anti-match: * the same dive computer but a different * dive ID). */ do { int match = match_one_dc(a, b); if (match) return match > 0; b = b->next; } while (b); /* Ok, no exact dive computer match. Does the date match? */ b = &dive->dc; do { if (a->when == b->when && might_be_same_dc(a, b)) return 1; b = b->next; } while (b); return 0; } /* * Check if this dive already existed before the import */ static int find_dive(struct divecomputer *match) { int i; for (i = 0; i < dive_table.preexisting; i++) { struct dive *old = dive_table.dives[i]; if (match_one_dive(match, old)) return 1; } return 0; } static inline int year(int year) { if (year < 70) return year + 2000; if (year < 100) return year + 1900; return year; } /* * Like g_strdup_printf(), but without the stupid g_malloc/g_free confusion. * And we limit the string to some arbitrary size. */ static char *str_printf(const char *fmt, ...) { va_list args; char buf[1024]; va_start(args, fmt); vsnprintf(buf, sizeof(buf)-1, fmt, args); va_end(args); buf[sizeof(buf)-1] = 0; return strdup(buf); } /* * The dive ID for libdivecomputer dives is the first word of the * SHA1 of the fingerprint, if it exists. * * NOTE! This is byte-order dependent, and I don't care. */ static uint32_t calculate_diveid(const unsigned char *fingerprint, unsigned int fsize) { uint32_t csum[5]; if (!fingerprint || !fsize) return 0; SHA1(fingerprint, fsize, (unsigned char *)csum); return csum[0]; } static int dive_cb(const unsigned char *data, unsigned int size, const unsigned char *fingerprint, unsigned int fsize, void *userdata) { int rc; dc_parser_t *parser = NULL; device_data_t *devdata = userdata; dc_datetime_t dt = {0}; struct tm tm; struct dive *dive; /* reset the deco / ndl data */ ndl = stoptime = stopdepth = 0; in_deco = FALSE; rc = create_parser(devdata, &parser); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, translate("gettextFromC","Unable to create parser for %s %s"), devdata->vendor, devdata->product); return rc; } rc = dc_parser_set_data(parser, data, size); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, translate("gettextFromC","Error registering the data")); dc_parser_destroy(parser); return rc; } import_dive_number++; dive = alloc_dive(); rc = dc_parser_get_datetime(parser, &dt); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC","Error parsing the datetime")); dc_parser_destroy(parser); return rc; } dive->dc.model = strdup(devdata->model); dive->dc.deviceid = devdata->deviceid; dive->dc.diveid = calculate_diveid(fingerprint, fsize); tm.tm_year = dt.year; tm.tm_mon = dt.month-1; tm.tm_mday = dt.day; tm.tm_hour = dt.hour; tm.tm_min = dt.minute; tm.tm_sec = dt.second; dive->when = dive->dc.when = utc_mktime(&tm); // Parse the divetime. dev_info(devdata, translate("gettextFromC","Dive %d: %s %d %04d"), import_dive_number, monthname(tm.tm_mon), tm.tm_mday, year(tm.tm_year)); unsigned int divetime = 0; rc = dc_parser_get_field (parser, DC_FIELD_DIVETIME, 0, &divetime); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC","Error parsing the divetime")); dc_parser_destroy(parser); return rc; } dive->dc.duration.seconds = divetime; // Parse the maxdepth. double maxdepth = 0.0; rc = dc_parser_get_field(parser, DC_FIELD_MAXDEPTH, 0, &maxdepth); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC","Error parsing the maxdepth")); dc_parser_destroy(parser); return rc; } dive->dc.maxdepth.mm = maxdepth * 1000 + 0.5; // Parse the gas mixes. unsigned int ngases = 0; rc = dc_parser_get_field(parser, DC_FIELD_GASMIX_COUNT, 0, &ngases); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC","Error parsing the gas mix count")); dc_parser_destroy(parser); return rc; } #if DC_VERSION_CHECK(0, 3, 0) // Check if the libdivecomputer version already supports salinity & atmospheric dc_salinity_t salinity = { .type = DC_WATER_SALT, .density = SEAWATER_SALINITY/10.0 }; rc = dc_parser_get_field(parser, DC_FIELD_SALINITY, 0, &salinity); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC","Error obtaining water salinity")); dc_parser_destroy(parser); return rc; } dive->dc.salinity = salinity.density * 10.0 + 0.5; double surface_pressure = 1.0; rc = dc_parser_get_field(parser, DC_FIELD_ATMOSPHERIC, 0, &surface_pressure); if (rc != DC_STATUS_SUCCESS && rc != DC_STATUS_UNSUPPORTED) { dev_info(devdata, translate("gettextFromC","Error obtaining surface pressure")); dc_parser_destroy(parser); return rc; } dive->dc.surface_pressure.mbar = surface_pressure * 1000.0 + 0.5; #endif rc = parse_gasmixes(devdata, dive, parser, ngases, data); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, translate("gettextFromC","Error parsing the gas mix")); dc_parser_destroy(parser); return rc; } // Initialize the sample data. rc = parse_samples(devdata, &dive->dc, parser); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, translate("gettextFromC","Error parsing the samples")); dc_parser_destroy(parser); return rc; } dc_parser_destroy(parser); /* If we already saw this dive, abort. */ if (!devdata->force_download && find_dive(&dive->dc)) return 0; /* Various libdivecomputer interface fixups */ if (first_temp_is_air && dive->dc.samples) { dive->dc.airtemp = dive->dc.sample[0].temperature; dive->dc.sample[0].temperature.mkelvin = 0; } dive->downloaded = TRUE; record_dive(dive); mark_divelist_changed(TRUE); return 1; } /* * The device ID for libdivecomputer devices is the first 32-bit word * of the SHA1 hash of the model/firmware/serial numbers. * * NOTE! This is byte-order-dependent. And I can't find it in myself to * care. */ static uint32_t calculate_sha1(unsigned int model, unsigned int firmware, unsigned int serial) { SHA_CTX ctx; uint32_t csum[5]; SHA1_Init(&ctx); SHA1_Update(&ctx, &model, sizeof(model)); SHA1_Update(&ctx, &firmware, sizeof(firmware)); SHA1_Update(&ctx, &serial, sizeof(serial)); SHA1_Final((unsigned char *)csum, &ctx); return csum[0]; } /* * libdivecomputer has returned two different serial numbers for the * same device in different versions. First it used to just do the four * bytes as one 32-bit number, then it turned it into a decimal number * with each byte giving two digits (0-99). * * The only way we can tell is by looking at the format of the number, * so we'll just fix it to the first format. */ static unsigned int undo_libdivecomputer_suunto_nr_changes(unsigned int serial) { unsigned char b0, b1, b2, b3; /* * The second format will never have more than 8 decimal * digits, so do a cheap check first */ if (serial >= 100000000) return serial; /* The original format seems to be four bytes of values 00-99 */ b0 = (serial >> 0) & 0xff; b1 = (serial >> 8) & 0xff; b2 = (serial >> 16) & 0xff; b3 = (serial >> 24) & 0xff; /* Looks like an old-style libdivecomputer serial number */ if ((b0 < 100) && (b1 < 100) && (b2 < 100) && (b3 < 100)) return serial; /* Nope, it was converted. */ b0 = serial % 100; serial /= 100; b1 = serial % 100; serial /= 100; b2 = serial % 100; serial /= 100; b3 = serial % 100; serial /= 100; serial = b0 + (b1 << 8) + (b2 << 16) + (b3 << 24); return serial; } static unsigned int fixup_suunto_versions(device_data_t *devdata, const dc_event_devinfo_t *devinfo) { unsigned int serial = devinfo->serial; char serial_nr[13] = ""; char firmware[13] = ""; first_temp_is_air = 1; serial = undo_libdivecomputer_suunto_nr_changes(serial); if (serial) { snprintf(serial_nr, sizeof(serial_nr), "%02d%02d%02d%02d", (devinfo->serial >> 24) & 0xff, (devinfo->serial >> 16) & 0xff, (devinfo->serial >> 8) & 0xff, (devinfo->serial >> 0) & 0xff); } if (devinfo->firmware) { snprintf(firmware, sizeof(firmware), "%d.%d.%d", (devinfo->firmware >> 16) & 0xff, (devinfo->firmware >> 8) & 0xff, (devinfo->firmware >> 0) & 0xff); } create_device_node(devdata->model, devdata->deviceid, serial_nr, firmware, ""); return serial; } static void event_cb(dc_device_t *device, dc_event_type_t event, const void *data, void *userdata) { const dc_event_progress_t *progress = data; const dc_event_devinfo_t *devinfo = data; const dc_event_clock_t *clock = data; const dc_event_vendor_t *vendor = data; device_data_t *devdata = userdata; unsigned int serial; switch (event) { case DC_EVENT_WAITING: dev_info(devdata, translate("gettextFromC","Event: waiting for user action")); break; case DC_EVENT_PROGRESS: if (!progress->maximum) break; progress_bar_fraction = (double) progress->current / (double) progress->maximum; break; case DC_EVENT_DEVINFO: dev_info(devdata, translate("gettextFromC","model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)"), devinfo->model, devinfo->model, devinfo->firmware, devinfo->firmware, devinfo->serial, devinfo->serial); if (devdata->libdc_logfile) { fprintf(devdata->libdc_logfile, "Event: model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)\n", devinfo->model, devinfo->model, devinfo->firmware, devinfo->firmware, devinfo->serial, devinfo->serial); } /* * libdivecomputer doesn't give serial numbers in the proper string form, * so we have to see if we can do some vendor-specific munging. */ serial = devinfo->serial; if (!strcmp(devdata->vendor, "Suunto")) serial = fixup_suunto_versions(devdata, devinfo); devdata->deviceid = calculate_sha1(devinfo->model, devinfo->firmware, serial); break; case DC_EVENT_CLOCK: dev_info(devdata, translate("gettextFromC","Event: systime=%"PRId64", devtime=%u\n"), (uint64_t)clock->systime, clock->devtime); if (devdata->libdc_logfile) { fprintf(devdata->libdc_logfile, "Event: systime=%"PRId64", devtime=%u\n", (uint64_t)clock->systime, clock->devtime); } break; case DC_EVENT_VENDOR: if (devdata->libdc_logfile) { fprintf(devdata->libdc_logfile, "Event: vendor="); for (unsigned int i = 0; i < vendor->size; ++i) fprintf(devdata->libdc_logfile, "%02X", vendor->data[i]); fprintf(devdata->libdc_logfile,"\n"); } break; default: break; } } int import_thread_cancelled; static int cancel_cb(void *userdata) { return import_thread_cancelled; } static const char *do_device_import(device_data_t *data) { dc_status_t rc; dc_device_t *device = data->device; data->model = str_printf("%s %s", data->vendor, data->product); // Register the event handler. int events = DC_EVENT_WAITING | DC_EVENT_PROGRESS | DC_EVENT_DEVINFO | DC_EVENT_CLOCK | DC_EVENT_VENDOR; rc = dc_device_set_events(device, events, event_cb, data); if (rc != DC_STATUS_SUCCESS) return translate("gettextFromC","Error registering the event handler."); // Register the cancellation handler. rc = dc_device_set_cancel(device, cancel_cb, data); if (rc != DC_STATUS_SUCCESS) return translate("gettextFromC","Error registering the cancellation handler."); if (data->libdc_dump) { dc_buffer_t *buffer = dc_buffer_new (0); rc = dc_device_dump (device, buffer); if (rc == DC_STATUS_SUCCESS && dumpfile_name) { FILE* fp = subsurface_fopen(dumpfile_name, "wb"); if (fp != NULL) { fwrite (dc_buffer_get_data (buffer), 1, dc_buffer_get_size (buffer), fp); fclose (fp); } } dc_buffer_free (buffer); } else { rc = dc_device_foreach(device, dive_cb, data); } if (rc != DC_STATUS_SUCCESS) return translate("gettextFromC","Dive data import error"); /* All good */ return NULL; } static void logfunc(dc_context_t *context, dc_loglevel_t loglevel, const char *file, unsigned int line, const char *function, const char *msg, void *userdata) { const char *loglevels[] = {"NONE", "ERROR", "WARNING", "INFO", "DEBUG", "ALL"}; FILE *fp = (FILE *) userdata; if (loglevel == DC_LOGLEVEL_ERROR || loglevel == DC_LOGLEVEL_WARNING) { fprintf(fp, "%s: %s [in %s:%d (%s)]\n", loglevels[loglevel], msg, file, line, function); } else { fprintf(fp, "%s: %s\n", loglevels[loglevel], msg); } } const char *do_libdivecomputer_import(device_data_t *data) { dc_status_t rc; const char *err; FILE *fp = NULL; import_dive_number = 0; first_temp_is_air = 0; data->device = NULL; data->context = NULL; if (data->libdc_log && logfile_name) fp = subsurface_fopen(logfile_name, "w"); data->libdc_logfile = fp; rc = dc_context_new(&data->context); if (rc != DC_STATUS_SUCCESS) return translate("gettextFromC","Unable to create libdivecomputer context"); if (fp) { dc_context_set_loglevel(data->context, DC_LOGLEVEL_ALL); dc_context_set_logfunc(data->context, logfunc, fp); } err = translate("gettextFromC","Unable to open %s %s (%s)"); rc = dc_device_open(&data->device, data->context, data->descriptor, data->devname); if (rc == DC_STATUS_SUCCESS) { err = do_device_import(data); /* TODO: Show the logfile to the user on error. */ dc_device_close(data->device); } dc_context_free(data->context); if (fp) { fclose(fp); } return err; } Subsurface-4.0.2/libdivecomputer.h000066400000000000000000000017621226345450700172030ustar00rootroot00000000000000#ifndef LIBDIVECOMPUTER_H #define LIBDIVECOMPUTER_H /* libdivecomputer */ #include #include #include #include "dive.h" #ifdef __cplusplus extern "C" { #endif /* don't forget to include the UI toolkit specific display-XXX.h first to get the definition of progressbar_t */ typedef struct device_data_t { dc_descriptor_t *descriptor; const char *vendor, *product, *devname; const char *model; uint32_t deviceid, diveid; dc_device_t *device; dc_context_t *context; int preexisting; bool force_download; bool libdc_log; bool libdc_dump; FILE *libdc_logfile; } device_data_t; const char *do_libdivecomputer_import(device_data_t *data); const char *do_uemis_import(const char *mountpath, short force_download); extern int import_thread_cancelled; extern const char *progress_bar_text; extern double progress_bar_fraction; extern char *logfile_name; extern char *dumpfile_name; #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/linux.c000066400000000000000000000046701226345450700151410ustar00rootroot00000000000000/* linux.c */ /* implements Linux specific functions */ #include "dive.h" #include "display.h" #include #include #include #include #include #include const char system_divelist_default_font[] = "Sans 8"; const char *system_default_filename(void) { const char *home, *user; char *buffer; int len; home = getenv("HOME"); user = getenv("LOGNAME"); len = strlen(home) + strlen(user) + 17; buffer = malloc(len); snprintf(buffer, len, "%s/subsurface/%s.xml", home, user); return buffer; } int enumerate_devices (device_callback_t callback, void *userdata) { int index = -1; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; const char *dirname = "/dev"; const char *patterns[] = { "ttyUSB*", "ttyS*", "ttyACM*", "rfcomm*", NULL }; FILE *file; char *line = NULL; char *fname; size_t len; dp = opendir (dirname); if (dp == NULL) { return -1; } while ((ep = readdir (dp)) != NULL) { for (i = 0; patterns[i] != NULL; ++i) { if (fnmatch (patterns[i], ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf (filename, sizeof (filename), "%s/%s", dirname, ep->d_name); if (n >= sizeof (filename)) { closedir (dp); return -1; } callback (filename, userdata); if (is_default_dive_computer_device(filename)) index = i; break; } } } closedir (dp); file = fopen("/proc/mounts", "r"); if (file == NULL) return index; while ((getline(&line, &len, file)) != -1) { char *ptr = strstr(line, "UEMISSDA"); if (ptr) { char *end = ptr, *start = ptr; while (start > line && *start != ' ') start--; if (*start == ' ') start++; while (*end != ' ' && *end != '\0') end++; *end = '\0'; fname = strdup(start); callback(fname, userdata); if (is_default_dive_computer_device(fname)) index = i; i++; free((void *)fname); } } free(line); fclose(file); return index; } /* NOP wrappers to comform with windows.c */ int subsurface_open(const char *path, int oflags, mode_t mode) { return open(path, oflags, mode); } FILE *subsurface_fopen(const char *path, const char *mode) { return fopen(path, mode); } void *subsurface_opendir(const char *path) { return (void *)opendir(path); } struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp) { return zip_open(path, flags, errorp); } int subsurface_zip_close(struct zip *zip) { return zip_close(zip); } Subsurface-4.0.2/macos.c000066400000000000000000000050111226345450700150720ustar00rootroot00000000000000/* macos.c */ /* implements Mac OS X specific functions */ #include #include #include #include "dive.h" #include "display.h" #include #include #include #include #include #include #include /* macos defines CFSTR to create a CFString object from a constant, * but no similar macros if a C string variable is supposed to be * the argument. We add this here (hardcoding the default allocator * and MacRoman encoding */ #define CFSTR_VAR(_var) CFStringCreateWithCStringNoCopy(kCFAllocatorDefault, \ (_var), kCFStringEncodingMacRoman, \ kCFAllocatorNull) #define SUBSURFACE_PREFERENCES CFSTR("org.hohndel.subsurface") #define ICON_NAME "Subsurface.icns" #define UI_FONT "Arial 12" const char system_divelist_default_font[] = "Arial 10"; const char *system_default_filename(void) { const char *home, *user; char *buffer; int len; home = getenv("HOME"); user = getenv("LOGNAME"); len = strlen(home) + strlen(user) + 45; buffer = malloc(len); snprintf(buffer, len, "%s/Library/Application Support/Subsurface/%s.xml", home, user); return buffer; } int enumerate_devices (device_callback_t callback, void *userdata) { int index = -1; DIR *dp = NULL; struct dirent *ep = NULL; size_t i; const char *dirname = "/dev"; const char *patterns[] = { "tty.*", "usbserial", NULL }; dp = opendir (dirname); if (dp == NULL) { return -1; } while ((ep = readdir (dp)) != NULL) { for (i = 0; patterns[i] != NULL; ++i) { if (fnmatch (patterns[i], ep->d_name, 0) == 0) { char filename[1024]; int n = snprintf (filename, sizeof (filename), "%s/%s", dirname, ep->d_name); if (n >= sizeof (filename)) { closedir (dp); return -1; } callback (filename, userdata); if (is_default_dive_computer_device(filename)) index = i; break; } } } // TODO: list UEMIS mount point from /proc/mounts closedir (dp); return index; } /* NOP wrappers to comform with windows.c */ int subsurface_open(const char *path, int oflags, mode_t mode) { return open(path, oflags, mode); } FILE *subsurface_fopen(const char *path, const char *mode) { return fopen(path, mode); } void *subsurface_opendir(const char *path) { return (void *)opendir(path); } struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp) { return zip_open(path, flags, errorp); } int subsurface_zip_close(struct zip *zip) { return zip_close(zip); } Subsurface-4.0.2/main.cpp000066400000000000000000000022051226345450700152560ustar00rootroot00000000000000/* main.c */ #include #include #include #include #include #include "qt-gui.h" #include "subsurfacestartup.h" #include "qt-ui/mainwindow.h" #include "qt-ui/diveplanner.h" #include QTranslator *qtTranslator, *ssrfTranslator; int main(int argc, char **argv) { int i; bool no_filenames = true; setup_system_prefs(); prefs = default_prefs; init_ui(&argc, &argv); parse_xml_init(); taglist_init_global(); QStringList files; QStringList importedFiles; QStringList arguments = QCoreApplication::arguments(); for (i = 1; i < arguments.length(); i++) { QString a = arguments.at(i); if (a.at(0) == '-') { parse_argument(a.toLocal8Bit().data()); continue; } if (imported) { importedFiles.push_back(a); } else { no_filenames = false; files.push_back(a); } } if (no_filenames) { QString defaultFile(prefs.default_filename); if (!defaultFile.isEmpty()) files.push_back( QString(prefs.default_filename) ); } parse_xml_exit(); mainWindow()->loadFiles(files); mainWindow()->importFiles(importedFiles); if (!quit) run_ui(); exit_ui(); return 0; } Subsurface-4.0.2/marbledata/000077500000000000000000000000001226345450700157235ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/bitmaps/000077500000000000000000000000001226345450700173625ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/bitmaps/default_location.png000066400000000000000000000027011226345450700234040ustar00rootroot00000000000000PNG  IHDR00WgAMA7tEXtSoftwareAdobe ImageReadyqe<SIDATxiLe3˲[(,gK9B [&Z?ド5ѪIڒjk9A)ЃRX@r,.Ѕ..O~h#C5N23P,h8Q`C&;_P׉\?C-] 8; >`63FmBN`rGh h{/l_]\_+MɉYByC~}.C!2猸uS,OKЏQv +^.U*9pW0rUFEa&t}}9 99UEW(JB#ט&1M5>>Ģu2a$289R)?>57YO`c px4'.r D9x hͿ&(@!eA\l!EӁO0=* UtA (/C2knW̦'{va-V <sNy%R@hj\KQ+lh1ANBA|@/rY!"Kv>b4Y'M}nPPJ0=L"X-{bzOdA 'A׺T25Y>Yo{.Zw^KFL ի|!Yo2e[vQI;Y3WRRރ肄zHU# _ u$5or=ݘEPmoo~#P;v.% ͪ\GHj.Z = R9_rn&8d)xxxx 0K>gg؟IENDB`Subsurface-4.0.2/marbledata/maps/000077500000000000000000000000001226345450700166635ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/000077500000000000000000000000001226345450700177665ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlemaps/000077500000000000000000000000001226345450700221235ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlemaps/0/000077500000000000000000000000001226345450700222625ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlemaps/0/0/000077500000000000000000000000001226345450700224215ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlemaps/0/0/0.png000066400000000000000000000002371226345450700232700ustar00rootroot00000000000000PNG  IHDRf:% pHYs  tIME *5Zy#PLTE@bKGD-IDATx ~7`!զdIENDB`Subsurface-4.0.2/marbledata/maps/earth/googlemaps/googlemaps.dgml000066400000000000000000000063201226345450700251260ustar00rootroot00000000000000 Google Maps earth googlemaps true A global roadmap provided by Google.]]> 900 3700 true earth/googlemaps cityplacemarks.kml placemark baseplacemarks.kml placemark elevplacemarks.kml placemark otherplacemarks.kml placemark boundaryplacemarks placemark true true true true true true true true
Coordinate Grid
Subsurface-4.0.2/marbledata/maps/earth/googlemaps/preview.png000066400000000000000000000531721226345450700243220ustar00rootroot00000000000000PNG  IHDRpR"嚆Jh EQHD(JM,.\+nﮜ˝h8ýˡ9c$ # Ș0) M E L0tA׽'W`M ] I#4Q=띖Hc?'cR&I*6yR{JI-/v58z1qL&a×1 pݽ$!'X1~FilEQ25D#o"Md-c:E^[Gʻk?*h6R9q$Mxq(wt(\^hQ)QƨyM$޸yrbd]K*B۶fdYRO1 `ak*ʶ\6Pft-S[qwBٰ?6) 2$ˋA>-VXL:D2 yl]GU!,! #}j[2YG#NP׿'Ov7V:,vN)am7i5[5f؏YZr}~f(07Yo[o*d`r 4NK7Wi6p۷#wUgID0Z4A15 YX2&'02ʙce-3=ehosܼykׯz?؍nkWTӜG-V`&R,dIKGRJ(f8Szy$Rl:8ASEar ~im֫5>rAt]r$6u ] A`MtU -ӽmSMl Hnrr\.Gh,]Z.SiuM1-~Dhjh($I6+]K5FK6&HL]oMg$Eիضm8fp(31 ,//ߵБ#}iNxŦ(BP!e(pqJ-#Zf$8RK-4 *EjݧLrޢhPm7ôGj :HWiQm8FhTtU%2ckt݈B-QX_b&B)[I:Ũ"I>Gv:E!!ҥ$("EZ>S#P%mxAU!^`aEכ*b5cpn˗PPOmj tnIIi,EMĶa։qjj$IÐbeCDQg&$8 QsM4tà<6M\rvEƄ!dAF`1#j{%zPo;0$v/tz{a[K{zƾqҸbpn<lK٨ciNtC0!8c8nSDWW Y[cll,rB1']&vY[Y|[0;b=~? +cG.nqCtU%L$KU. * `all"7d#%9 TAa\}9yG`&蚠EH)+aB`bj$o'q뾷G.HgUܸqb!A-ҨzGk:t]Xk,T{1ϏI"hn.wq7%8% :\9 ό23c`hm#s!qc+ĉ #6F( ) ?o@S@Ba+vS l$auu- 4Bb;#,xzm7}$<Wo{NHe4Uj>Qʛ>k[NoGƹp5}mZn }UJ:#?^>.s̢k:*pQ̛چd]mI$]l6 um n~Rd2IilD(4 XEf푎@ffog/ըӧhÈ$fl?T չй0sSdK,-0781gQɗgJ|ߧVoajׯ1;;Ր.!'f49 lw(B,[y!A8X\8 Ð(1sI]S"Pi41r[xQl^ɱGz͗yi|~$pDA3gNapj gU&իtS8 3fX&a0Q|elS#N2侣)>E^uR`!qAdN}HQnJ)0u$I댌`[Ǐ_xSc213w[I[mQ[>|{dY܇iJSH}#̱_^`GHaWi I, 052m7$B-a"aDDdd$|ӞW)P' { R imjzl.DW7e_-NzO|/w>c=Å YyٓR %,U]Dc#(hL$*.EG< BQǢUЈ$~gIa`$j'!}._LE8wIDn,.2R**=/`vc{IJ3G>awC;}/]߬qsLjCDH5-+$P- {lݷ~à $gCԃ$w!9;z]Sx# \ \)y'N2:J^0M*2DaXs@Rk6)r}[c'@ʛmwxzfzFբhh44 VutM`{*Ix|ʻͲ RJ~-ΠL$N$I<7p\P=3yÃ^g'~ݹ3HVrDSW"abԤXsBGܸq^zI^:WRƍ!P)qfe>767nя}*q-$&fum(~G-@r,j=58M۾:q`0vBn-$N[РbJʕGo@tfds9~,E$t!#}r뺨s?!*N&×zֱ1\ṟc)e*dY>я"KK̰jHzaP4k7Xe)t0%*&c*iֱ,kXe:리(qm|/TMw9귽2t=ʣ_ '[qZc$5kܼ9ϑ#Gi6y~J3ܽv$ls=RH٤Rpaqɓ8ZJXY)hi=J!FEI+X_[.?zN>MۥƇ?Oc_%7a,axlB]$AxILaf0lFضMt:L"" ]`ntE:h)$Ih;[-rq4M߳ls@[H}}fm8{ E(Unk}ygoxQFJyvyy֫U~:Pu 2&'P(FHH>%8t] `ttY~af掓RiFg˜K- $"JyMӅyxaDCnaPA)g{ض=yTq$"-ӮE=Cnp{HsQM1S*Qr~5j6v*lj]v 'pjc$CObNr4&8QD'ON zaYvNK>̾}Z!؀ 6khZLt,xy^/+*٘)TkXL2A@橸T -K)<˶I˲$DqݯQE nM>_ *bZueױS?o){S7/W(Ө-Ӭz?HȕXw_yW.:܁ &2Y)}ڃꚪ IDAT(4 (MJ4mϯ3׷N&n[ڵ6lDdaKr}CbiqNǪEENjh}06,C\a&7R>OKwWWWU046Y<0 d!xl4ˡ A(Y^u0~sQPB\~bkF`y&MLMS"Vpc͍fg}ZF0n\`q|@1gVXZGP.ZT&IG7 Zi:a+.IAA*LfvCm( 7oL5sl |h/&zEDR8vl  riث]{K*I +kKE_lCss 3~Jg2Z=-`b|{μsW4{1R,YZ^ɖCԹF,]%q$%lˢ?{~rBV#I:RR1MrA01€8  J( ivMy!Rlq01~FdV! |$cTMdH{gYw {xkwKPP4O|= sss={8p"?_EӍ07{qVV2T* HKH]qdэy5*ϯ y3fuMaZŴ, ?NZFcjj!K,M*apa&E"Bt",BN]Ӧ7Vf1 ^PZHH?[2b=LI}y2 [{ pu VyׯE=V\W/{|I$Ku\p˗/fgyOӡT06Z&=oPji:A `yu0 9y$tFX%avvr'^j$5[^YE`YjU7v]7AQRm\٦0tY*l+)'RRkٌ͕jݣ *i"^PB|CzjѢI){U}h4|Ge * r`gUs@S?8w.]/WLG@hRUS0`q4A]Om(mfnnLNI9>B@b&#|#+G5|;"%aSJH,S<{P'cvt;E@Yzzۧ>'s,W{EԖTJ2̐>11'?I2 |cg_^&9;\d_$kA@~e9dJ/7}X `!ɘ҆&ָYUᖅ6? vc̓7ȎIs!v[ Z#rH1 cWmt˲?a"_c~qX|d.hlڛ:14 &S# vSH/։HR\]vɛ :~pavSR6[דD6}~ ýե #8`)rh֦n,m ^R][effoH&&&ķWa}}6P857B!Z{&pPpLN֩jE\/f6-7#Ƴ$ϟ -B۶rC|v5W.S@ܣ`邫vu% fj:ɦZ׍p$zZmŷUWIB.cj,;FKSNH$=bqw8vz_Sa8lTkƐgY2ƉǦ% &X2}t K([K))!y:.|nU {f,Ɗ41=Daf_׋D!@7uMu(j`~DInc L*)JM{ϐݍ0;#,G89Wqs3ܸ"y4MVQ,y{CVcnnJ1MsW # Adp(Ͻ/095|nZ گprpňrԘ5>n!"IRp ~ #޵ BU(:;|2N7ʅʐ/2u$a\:u MӘҕ;|ULOOAO??y~%jiϣ* >W\ôm|Rro*Fnٳg~:B9{/Ν^CQ.]q]ɘNrl8pe,C'X8KFM4}OqύMbt:ı vbj&.ٌFwҬ.pŧ?pmt]ctHޠ[qxx{˧>) Js|{˲d2iJ@AEԺ,("bx6$W&٪T& Nե|8|պ?\⭈M4<3GNc62^Cz|_ȑ#8nNbhAG}"Ƕ1 d* 6NBx >x >я2::im]]]eff/rEgϞE3Oot[;NQי`lljʳ>__sen޼ɫC=Da{ Q,HМ1QG-L.lX2®ܤլx]ZnKɾ]DF@x||ӧNOh4xᇙH>a@hiZÇz,./wFFFv r9~gvoa|~7gϞeii^xaX433ɹ"mZー6/2cccE^xxG9rBa 익ǘиC4TmPw"~2:~SU·2P4}iW^ z{n)B) !wB)'[z˗/:,3glbzVMaSP<*f49i@$Jדdײ!8~8mBpI#dxIVөԩSE>|INn6LOO.VtMM҅5MvBQt]2M /J\0#MR/^ٳ¡H8m&<2cCOepc:RʔI####;6y&cciwXYYVJdA\opaޣ7S-CưUUJ%u;m\KuvZz֨S4o궀Y cW//|逸x]r=K$bwb[Q hJ}EQ<zv=dc {u%ɖT@gQ!QȠ(o_jxFZR8$4p7fP sD3F`6D> 66^Qz1I BBTmC-_ݽGȞBsO>I< TyPTmo툭%؆ lˢQ0umUr%v N>M.cuuJµk?8f??͛ض% ;2ضMě#cCHhvj:ێ%duǠ] x8RDqyӊBT}RJ]>KCj {j166$ZLn޶ 8`B>_D&EԻu2=}(JZST{Ї>ѣGyӈy}Looy饗Wo}[ξV5M{S,<=9zv0M#3#۸Oh?̵bs!69h6~'! z}plLcKa#SNQ>aT$Qtj󨚁P^$cdfV%qU}'_JԖ֩7۴\Ǝ?8BT@!+++C# v*f\6r:^1~03wkv׮6xB}H ԴGI4aݕIBwM[;./Шݖ z}sI:?jZ%I"tsgCv96MӘ Ҟ\kˋQ2HUcsxvr̙3g}EQ{ޙu^ګk}&)ӒH[(#M$# `c28 8f0l'p< %(Z!)}?^UI6M)ɎPhЬW{^GannnʱcgQ4 5}OYﷂyQ%7ҩrql};̯8s9>JW6Lr0M1W+!J(Z$IBdF*6fK!>KA!RI45Mne}U_S!_gz&[a˖-tvvDH&<(¾}Zs`bb|>?ӧ,ػw/dYh I(+,8GMchgҁlsn, T r]׶['p ۲v\XuGVo>s4G~e͆GE=J*Q(jX[/,ZةE &Ceɠ¹DjQ%ff 7zM4uּ( ]lco%~}c@0d{ 8pORdY~arԧZm6bz(Q-zj n>IĴШBf foTdT.l FbuWxbI NG:"_K>>QM={xr9^z%$$Q1 _|r?~QikveJ",R iKXr=/I$hyǶm(B4/ջt< ZDQ7!""Y(N(!!<[Η^A:ıcǂFW2:skб ϱAQ( 5XT%VEeȢHbR*0 h)d)1+ 'i)H@\x Q*IӘIV#LLgGjxIyii8==DUe`&FSմY&(HNU81qVU/^A/`yGUR.RV`T}Μ%}.ܷUd8q/'ODKVCqP1p:T/a<ŕ`_u ~|uIeTxZ鶶kD"LHUhopW58KGU|A i45#FT}##H+uhHŮWQ>d;篬6+6ȢaMCSUAqlJ*"Aa< :i Im(/_7o}xf;s(8Z-BqDۋX릁mYXeX+X~Zuc6VD" hKxw̍=lXh5 x;ch1Ps_m1aY8Wa{zVT+4He rq''I$(J:l4_Wy'e_|JbffJ5DZmj2 RRV\R.7H8X^Z҅36Rw<].gotd-3 U 'ujX C[.}vl deqnξ>QD,Fn*BRiZ 4ٳٵAn8rw&N399Ɂ)*Sh[ M;z\Ǯ3=u厃piʕq;qwQOѢh -FGg'18_ >,SuJ<<+K,͑M)J=zT*ŋI&,,,I"! ABr|0KߖN=DWW'Žm+HL/ۖ\au,4f˺tb5Jeonܵ_<2ԍ6*U"Ѡ-B4p|:~89}(rAfgXX122ٳg9~8+++T*1Me/~lg/GGJf]Bs(+eO06SN aZozw،^:7^Ͽo"w?p=ӗosߖTh h_~?|T 0DH\DElۡP(knp]'BQD$ţ?%pJ}'x hUS( L+"X,(%6h M[V>c ;NR33r3^j!;kBLey5ԈGpe q8[zQ jM$22NiZE #6PfK.6qYYYFeF_(ӓcSI\GblOu]zj^.RKK9RR1Gef26m|oܿ {?Y/ip=3U2}mB ͶQ3v$p= JXe})YtyT6sWJEftt۶dbb}+vkCe:0l*A2yM*qDcMsw{9Ï:|"!L˷mUQ/ꍄU/$m/]יX,04t,]):D?IGxmR p-|G3)5kVըΚfgO+ qTiO9ew %$\ lp`kYX+,t(2soQwVHP\5O9WA᭚ki#gcK7l c߹̽x,\mzڳO@F)R4L`dC->uԅ qGHj[ L/<8Qtv?hrK,/β87ʄw$@>x__s3/=PA^߹nWc.Ǵ @ rB<kL{,jہ( Ν&ҖH!ˋLն+3re_e95EcB2?O>p;A #IL755 봷8gUMjf׭E|z۷p#L̕9y>׺3$Ie:og06[uoyˋO.pKJ4/>g))$f9В[&{*HD= a-LcvK7$/a:9 E ۉr@M  ,-/ ǐǯMjjrHUۣ/W) UF~?] l`Ac]g~ѐI2RXM(29@E|]vH$ԩS"ThcdmcuSOikc1Wo-lJ>zr1)NH34-͎Q+I%样;OgJ=6=z{{&Wk8 gϞe``l4Bi q$c3e _ ?՟`S^n L{7/fdYU6ȞGZ2N]'{?PM#^O{ǥ.z7 \W^= MܷA_|{miǢOޅ HAxDms i9 .?s ϿuׯxOJÇ>Q~_u{vhXvr(*&zp=\iԈY n0[]\x*xH$}O?b2~-ŰmE<{#a:S 57/;ɏ_sⵟg|)>Qۓ^ FqSG؆AG{Qgebm]AUac~o1v]w VD$緎|'*O=A !}|A|Eܻ<9]9k+/}:,UZjd;z>ʡG?4; '^XY{W>@V#{! =;Mb4e&Ϟ\)nߨ2e';>:ȴUQb69f4FN15q=YvlQ)* 1ܳ}}}gIENDB`Subsurface-4.0.2/marbledata/maps/earth/googlesat/000077500000000000000000000000001226345450700217525ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/0/000077500000000000000000000000001226345450700221115ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/0/0/000077500000000000000000000000001226345450700222505ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/0/0/0.jpg000066400000000000000000000234641226345450700231220ustar00rootroot00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?i7hĘ{w8;h-P#̟5JU=ՈeG$B"iSyTE$_\E_䖌i6`>sP<8I^ 6H[`Sq%K,[TҺ Ïu:%cF1ZWWע65UaYv@.>5x+GhW2#->X[ jhfe2{W'SB7n zi/i"(,dӹmic5' >*px\VZeۋ}3^g#Nvr$E[QI:e'Cfvԩ)\ =N)zS˶ɶݏFAZ,Ly_zb3E=MI-!RD5K*R\ĞZjskO˕OQ@# bW%g4HeXBP`}ѓT4R2f h87,n;6>RҮA:ݙ|+67S 9'$W4{3Hcմy\}J@fs90{ֳ4ONXKbG~xs뚊yȪqX@ *ЯҾ&\o=qlHW^CFA*SFI:eXLb/\hl?:`+rkԜwt~+V%qW7<=A^- W=y5c 6#?R&R ǯCDjwgرSQ ɠ֫D!;ӂ6 '!!T[%h%Q=DfݍF``өz}i8)(ZȽeOiY}M ¶E8ǵT'*͎~sW.^1>47Tݬr{,TRAb3us y_-8!ifUFmƢڱZH""x }iƒQQ4eQ zXԯZF=Η$Lv+W݂Ua#qԌR@0R~O+fUsԚ@ >lZliqD_0Q+:QMlT[ So'8N劆pGCʒ"`DjL&B$IYT{Xn1I80QV/ۛIDSRtۚwW+'0-2ў Tc^shZ`9FGLF.54#jB dՊ;XJ|wglKu]|$JZF rq^?jֶe :t76Zw7'k-yfG!k6ȹts k2J F\"q=?u,,NӊZSI6hɉpw$2 vB q؞[lR;ˉfI#< LteRgߥHMʷLv5V/lK * ,yϹ涧^pi3i=Ȕ͖ V24{Ie!j+r3ĎP:Wn{keE&̯g 2s  h]p6@ut:m; 6fY9ʮ0;ԣ(8Wp[e9=j]8V"pjQF|ʻ֢2w)u =jb03{zKoY'k;ce'r6zN+a&sG$݋** U,@HGlcbKwέ|tlW%w +7z~UgqȻmpZAM[HGW#Z$<x> &et?OɌ8<'p]5-U$}d` oc>7vːǧW$DBC}W=l]AN j$,~b~nIyxI5ڞ'wYN؊ˍB!s*Dy$@p㜟-d$\]Oz4@c ^ԆQw#*t8&{9Sεwvװib=cj6*LG zՙ`RmQ?ҢToApuǽzxzn fRme8>_qBXUbkD)$)TsǖÀ͜WC|K5!ǗWoQNAnrG"ɵIGcLydT'-R0;['pn:ו9V%"9--a]{qU&sƣ7vRW!H#)ޘEh aF ckGR~nOm%2H&*O#%x4qI X4ms`U W0b']Bpܒ +]﹅ۜt'ur\ÛwNډe«݌u򭹬Ĺ QOQVҬtj&YY;N 5Xݣ~oN:ّFXx,[{P哻0k[I~t!UF+&%FADǎ(?+5ir=Eu x;M:7^)N90O\pfƚT4!E#k&[k@G_n^5IAyX(X.Ws## )HUP-ѽ?_S&o*k-f2s9k˅J\M%k3' )ܩQGm"q=kTHo\HăW~r\ry暬s"wfڟ ;#5}D\00MOsrX6*ȦgLV$H+kRXrNfgD:ҩ!c^Y+-c|3X9 uXZsj0mb 9yxCT|NJƹY%HF:s^7 8T8Z۽#۲+c {g5 tU{v5e-Xn? 5ԕI.mu#. FOCP6ҩltȧ}DI/D󞴁[ n6GTq{PLرjpRE8)1֚AqNTxT3T"{{`|xWQI.#=ϷY)蛛dEm{ݼ'qbiPufҤGBFRDžaZ'6ldQ8NsYTI5q_ǽ*++z~5_+5wkuk'&#  y5w)0ЪE]:F0%lT:SvJ * VX7Q.LUlమɵ!E##W_Ii!ʑZQCzXiN|^ЪzK]XH qakҖap" 2}減i$bqՖ$A8upU#:68bë LEGY0K(IbYsWl&YJ ;}xN*)iR֖kQp}2Q.丕ĜtڮXMJ#`L8=P(sV)G0\dnU]FЧ[OxwSޢ{6b hmÙ>[#_LI:W-`fTcnOK3< }̻H\ON*lH=vhv:gVUӵ@jPZۑBrGjW@HG_+ʪׁžF\mw#ju,n3cr1DtN{ջWcʪ!r3RV8㚘 SbF}joݲT{S'Qpj@ZbV#ki00/io#9[@+RRӭ䷒W *f6;&6 ]ߍϒun@8^NkXLZlCg۲G9+$WMtN"rs[!iW{Wrzxw`T=? YE6 n1kh9B:fR˄_6̓2f>qYzk4+fb*AsLȣ(5>U;NvJa%%uū;\X#ҢF;:=$C!  D$[ztmUD 'E7Ζ[ ے)^0qP[ݳȢ#L9H$7F@C&aߝmRXZ؊4ײ4)TzX9`z\vή U^+Rub('9<'X3+)9ԍFGtWn-| @W'Iw6rr=k}[S$SI'9$HP  rJmb r)-RxY_8MbqިCL }i 2( :V߫P~DfYĐH5Aܝ@sְ;Rl|Hݮ@*<{zQf USڱuK,6QN>\֋cgy. n1T%sR݌$"L/AL2}L Re#h 堌`'5 wMR:¬؜ךwsօD3)a4.GsoB/^ʹoc)\\3 ⠁è9*puF6z'+ڄ5[,ܟoj +έ'8UR `嶈^H(T¿>3Rm UA&+ G)P:S]JȨ]pwvGkC/ } h4pa ^{rGlq#$Xq^5LMGd1N)+\ [8]ΠnHsW o߂޼)JƘ0k3U)^JF VK=Wrgʅ3Q1e`A sӭYU jź$@P<{M#:X$ d֨ '9W5;i\=ȍ8¹]V^EF u@2R9WHyPa'&%8}shpiw%B9Xb;"RsU0 c%XdBGU&&QXRI.*_6qBsqZ^1!Dۗu(j4ny5m62ƞR(XQI5vPnc#nwl3ZЉU IX b@#1!2S!;Ux-yW{S$Ӡ}N})r[Y-kQ pdar ehW4@2sLbF*bg2z$AXqO.gfl<9  ڋ+.>sV36d5.JPzԺDvpRf254hSUPݏjV]@r aߨyKb~h #8L:&E fKVr*> V4r"mjdpmb[u6ZCɨۧk%pZ1Zw5b w >B2vgX626bMDrz`8Ps<" ҁSIЍ5d X.BrI$iFqR$e(N)V"\9Ȇs*3#}j5ҳC vqQ9"vIPF([df2c2VWܑAZur\/Q:oErk"$GU|=wkp,ʸ0vF5>sYqjaZR1ޙ]w 3RGzs\HRH2#B , hE)}0;TH5ĞHuM=i4 rCcM-j100qQ*i3ASOH]I b"`;AkX m*D,-8].-|Iǹ1Z^)uDUtq $Pc27V*>ԨRBy5̭޽{j?7Q2כd/=)kJ{6F8ڻEBXVSY$֭u{,)lL6{kQ]ݜ!@נion!T/ ӌW4 64;"Ʃ6YN:U|w{㱧(ځzVo.IC.#0}wiҴ7`Wj$S@R'"}QqT;jyD\*;VJM;[Jڜ.c?xzS_ipiŠ 3y$3VVRvII$ؔR Hc@QT f񼑩d9V#5% {KwehPȽԾZ$"8N&=<s+U+Kں*9Gf'<Tơ-hȌ^2WpA^EYu+#BQFc8+\[ zϗOu< tjnyU95n-{+ \pHk0P[+.gS0:WLA"kd) 8SKgo2R>63Eewv1yoK2ېƶTP)hCm $!Ub2*r3s3cJzH ioXѝzWKBx]OE%BOZޕg J^O]VTHt?jꠂ;x#@ ڮ!8u"Ǣ,J ֒Wb(&)sv KHh1vQJ()hOR9mgr nV;6Ayzy(R_fky|FwTn3sHz@4(J4cAKE(ڐguaN#SC iJ43@ 7`$Nojx4 \((" ;@vh E(c %h)3N" nuMLeʜ$Y y99@G#;PHG ͙?N j!)EqHM ފh<ғ֞.MJ攎iJ,")jzRCR(o =ȸP)B ~x#g;4r)X\f)QaRN)^ <-)R1E8m0F(;ъA֟CBl\Tg&RLj9fV{[g/7UZGSubsurface-4.0.2/marbledata/maps/earth/googlesat/bicycle/000077500000000000000000000000001226345450700233645ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/bicycle/0/000077500000000000000000000000001226345450700235235ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/bicycle/0/0/000077500000000000000000000000001226345450700236625ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/bicycle/0/0/0.png000066400000000000000000000002771226345450700245350ustar00rootroot00000000000000PNG  IHDRkXT pHYsPLTEz=tRNS@fUIDATx OH47NUIENDB`Subsurface-4.0.2/marbledata/maps/earth/googlesat/googlesat.dgml000066400000000000000000000134401226345450700246050ustar00rootroot00000000000000 Google Satellite earth googlesat true A global roadmap provided by Google.]]> 900 3700 true earth/googlesat earth/googlesat/streets earth/googlesat/bicycle cityplacemarks.kml placemark baseplacemarks.kml placemark elevplacemarks.kml placemark otherplacemarks.kml placemark boundaryplacemarks.kml placemark true true true true true true true true true true false false false false false false true true false true
Transportation
Bicycle Routes
Coordinate Grid
Places of Interest
Subsurface-4.0.2/marbledata/maps/earth/googlesat/preview.png000066400000000000000000000673061226345450700241550ustar00rootroot00000000000000PNG  IHDRvcml݂7ƔٖhT[ ͒U\IYa,R K$RuW9,ݮ$ Sr({b׎Y%e."Uyl ǧ91n QkE1ZxIt+x2'\} &H RLN0;5G]][s\8\wGUbZEdh"",0Zb 1Ii#5פR Li5ǧڜDuq0ioGH7@ &FJǑ8 g_G=%9p [8~lj;P8ePyC)0V5X<gi߆TW 4H4HRz"]霨iBo5g l^Ɓa2D8, c3(nmwÏ|?%Z8dj4Wa"}L6dɈririKo:4.T ƦT*5U'G9qNB0ԒS ep4B Zxcӌ"ǹY 6q%|\EE}\-lGixϟԩoUTx/r0~*"RTQ6sΞyZ-`icى-<+"Qp J$w n) .055InIi@m6?H89 80,YnS$)I Vdx%00Ӟbs0vCCX9: Z{u\c4LLt_&?O?$Ir={blrVkh &d&SZEp(Z[*W)w;oWNȨg}sin)Mp|DN31l*Jf{ CY#=M]CAZ) q%cAa4ZIn;z^zr Ȗjr#ُզQ֥:KΟ!NQ[{ZԖ "M{8&#-Kd&U1 + F`Y\rK WIAy\ۘfq%auKkˠAү7ZVi- A}[FYTef' GBR"*۩Z|SA?k2g8֒iƚ-^8[ԟ$'nX4}WQ;DibPJt$Ijԋvx=4:8 @R4ƪ8Vk%jnVcKMF[v`hM9Ǝ靘HaLr!K8GqZa $'f@8.ҙisv ŞOQIA_H!uNѠ] n7҄p `r -E8tGT+c^G 5(1Fl%0&ǎmw[(Hkw[w0 #eVd4|=-jq1Ʈ1M8&$i9AHk8SL ӯ~60KxYyij_YE|>vT>-{L{>y I23X'S|ߣ*-ng{x2HQN ǯUtlb9dU /k804aőqӄL($破FClJG ƫuZAfڰKntv)JpgHb>_۶Qu,K+ \C0?'Jc-e=R#CzzĶeyᏞ??`x}Jeݓlt7yȹ~?jp17WRkwVbW;jas gAǯ< fv+_/|!*[ \zksN_2y @#1ƔjtVRn\P8_Dw2#&+UȵB JKvHkxـ|އW>ŘoHj1$kaf(QEr?”Cc$}(/d ̽x#wEfET{y[[o ?>3|sEo={߸\NY HG1eLW&+zK.^cjs\zn}=ػkuO+8s8rAfbL1FeGhF $8ip]5,o'mufP~ģ.Jv=Jx1+_E91=P%X83Q3+"&$V)5=cpUR8 ׹nkowЮ`XO޷'W~?S#/Ϝ"MZl\:ChARTpE@$:^Rb+N嘳-@KDH7OsD'7Xp{4\%7+ Z9DcxAiآB0m++bbQh>~\x^ǩG|:\_[(gQT$oAf Fg8 !3U&'I]p[fc񯿷ĥZ#QuȽ7Oq \eo'8cc䴢:hQ]=+ELhMRQ(*&BaA Fo 0lmt$F Y([t!8 )kdc%N850!'W]+vEya_$:x_|6}QLL^8IHeqHhŒ0ȄFERq2,yeR!TUnu*!|9{4mosr`ë\>&VVW?ǿ_wçN~5֮B&<죍+ w$4N[*z fg yN%Fm0p\G "vRp4Dg[ӌSq8 6y;|j?kdLc+;׻s'gII4#YrlIxk&i@S "R56M 6ilǵ›l)b[%[4,Cwgiz(_, \}sF _ y56n˔b_!JCQ8E4bi+"I`U W/3^TJK=V#.lKۤkGa(KBc6P O(IDS µoe fU"fMS{{,(4i2i,6T!I"v*TvWwvX n$ӌVp}?#殻ĩ5.)sPQ04dp]`nq@` BK8@g:čg|WJ5^`y>/ :_6\dx?wxw^^^{ڱ[_`8cQC`Ø8k\0"1lOUT4a-024>D. 0 84e}qO~  !iDQ̼}0g'n3goyϸl&(VbwS܉6#B$PgiO['YcCV+OM~}7y<]~WoWڒ5lo 3 9w@IVORp;IpUqf¬308P5q13(BE?jX Q D8%Vy'^W8P!-nt:li-/R%O4ESQ{C:}08dd\,D@=-'?^zz2n*:nSe;Y_}A'K1wi]P}>Zy>wۿn)g%YN>"︝_ޥVr+56.D@U8BRWj D D*D`lll3#x pU.vv3q^|}S_5 !}o9V 9AR6:ƣҏLpHdB(R*XL3 g'ʢmA%ԫ(x=~D\¥ l1*`*8J:mn? ? G8o9弰Ri֎i$ h4g% }{?G;AmoЛ[(y !^o$u9Wh )I{D"L|Iz5h;K &h'+9O2-+3tj 4P E ||կ=IV-o뫴!%ڄT IJ`UBҴp8L tD#r UME꟒pMMVW~PQVu 8D,$:F)trFN4t.\ʠ 0JҸlauMmr{trQV))ә!\\U)dO'Xi}SF-@VP2-ӌL+CJs T{j`)yЙBG;Bez>Ue:A$P^dU1e ݃=@*Hk G-v@'IW)7` Q?B l^@Qi̤KB)sy=66V(E]n-Sno|-zzzq;U>@&V(UQERup,cB"b~2:sLn]a:?!Dau2Qܝǖ3aA3a4)pmA{n9ħ/rmbzDeI.ýf:BHĪ7Xiv^lM u}d[_&{51lSY /mݰοGħE? `sa5*cmˑ~.6S` QNT7"k݀3.fy=z2\BYԌx-6@;M*!-DƯP7%8aRW A(߹iHVئEIB/5m!ö]dyix X:*to8#7'!!Yx<~4ȱcLjG@IdҽQCob]j?+'w !2%qd9?,݋3m! P<#9u5D#cEJ6"j͘ɥp2r :6H6(<ӔJ%\\EmNߍe#dRDj6!F . D=}5d|W)hjsH%ԍnj?:)tt:B#-ZqJ7 U7W.mx r)w4_} ̿;ae8 U^|ۄB("R8ꭤ#$yP]x`ϻwbN,_aǹw2E{góAT?z4pP폱}ldH$rxX`}"HIFJ|EOsUpW?AZn#.) Z " vNނI,:e`1%(2 bpt>UmUDGe**F">Bd(1N $ޱCATt6Rf eQ2JoiB[_' v B9^;,AIIViT]-A;olӍuK }MOI9=k)>:ۤ޿@yp֋i{] oA% u|6P 7į"$RH@HpX%qiV: JSV%-}mFw S9Vgh)}JΠ &y}K|32BDU?s @J?6H*GiKHJmN`%iJ: }:*D ACJǡnwSǏSNGts6[X:t@)& w ԺX@FA/~cܫ$ݘ[09sp&`i1lj7! 4,8k-Z\6`/.] 6%628VMz)8IFMVaa:HD?my7ۚ[6wHi2TPH@ ׾b8hB wq"Lx/c1ڝ6YB%B /OGٿ. $ՙXʫEdk"F(&(I#G>@8 YdD;E1,kc2JPϝornء`am ګ78i{/sH i3l DQ h pNS0ȧz=ec⪂0I&1ZYqBMﳰo^e%8r+矇O"Xm!gcLA( z/_9J:#` , pA g  @4s &_;j{|Z8,HEz뛲*-M>C芪.ˌ粜@>C;GJ؛#N[i $ V'6sgX$- $+vM $!4$ ![aJ^U,,!=?j#h&-HN`o3(0fZf* KʼfxOR߲0k}8JBb+zXS0H ˪[(H C #pbQ7']QPp4تnfIgBUbkd0$>aڥARg>d_9)8bP0]x)c S-ٟ/ǮsΝk.S$[jK2dYx6ldEd, @,l@q$,nI-"š7sN@ xbջE ;пq[=!RV{cAEM0ͩEH8a0L8/~Q % Y37j1[1*\OLWV Y11Rl78cBf~4$}ObV86E% _\k1 ==vdAjy]mp$T1mqzHakJdoQ&/?5pRw4%o h]G`m?| D[IQ@Sdc:yC6b! đ"J"0T5n}HBp7E҇XILېo`#NU1G[67@s=~!{ۯPVSΎ0 r_|@ЫhH .r d<^#+gc,xpW{RL k-Nt8+eO~t#eH z%4VZ!VˊHDZY9HG -utwWi=tp}o鿣9k{[#QY@2ż<&-W@T7FQ>zJKog2]12z*"-A^IU=ؿ6gtu6edsk,萷#Kyrɬsk(H\G/̍3D`iEFsx( BTh̯ @Dyz-NZ ZTV 64@ ,I]Z#jlA\@ t!Hߣ#z\ߥnoqBeu1 ,Iԍ(ǨhCX'}Nj+ecAd%øu^Hcn\BS.+(|oK/Xv%W6<vx:?|>waR52R,[BF_$cZhɛa z2ϵ-X DB<HAE&UAꥋ@īBu y'WBkPD#lƱ߮ t f*-luD:$cv6HB\Š(a}aA i q/z)=5"mχc: i5g&]3-z׸XGT VEEtvWʧ@(#(D] x90,M'$6~ ?u/-ag] V9tЀ$5uX d /oq!'9 i LA`*í|`:7" *KiBub|GF i|r.D%QUB20Tpgk3yST+X3ӋO//l900hk,Oӏ>Dwnj[Gc7}d:˘%&4R$P#FO3?i1(OxO2 @ 2d i1Cq0@Jh:" i:۬?G[I7#qu JB\=' +MCo05]CARAs-Ft&뽐-H)A~mWջ|XzeBHD;%o} y b9!͆Q>bv-tl"4Qy9"(ZS0͂ʧPh 4H^>j `UZ/u[W<Ou }i%)0UK/XzQɯRɄCj7AM<GpmؐS99[Tx|>&y6ZB)Ak,L"sz~hBς,/񨠮h/I֊ALG4m-N#UWኛ[>A7Պ`. \Fa(_Υ(VKz۷!kg*Ze}L'@Jz`e iy^6x'H 4aThjb<ѬVYNX,#i) %{Q=uZAB@BTЂ`$H|K_dk@ HhS넧Bς RF KS1قI/De8\h1'&uʲ~l>$S'\dg,Ry[2gd!kQ-^ :Q!#=N:O zN_x#~ػ>:czEfVK4pzѬj4Q r % !u: LZ`PiA3u_ԾXIfѮUd҂R cp 2Sрd8$Pѐ|TA>Y )@aA" %`Y>w) _g|"yW"7qsN.qS+Ų`p6YbD왕Yk9Θa(ԎD M[IɅ DcL8_q<)KcM,0]!lX]%X J^&-c s2* lG$"Gkp׾2_ ecl[`u+c3AH 2 pC?h:c!)tx}?Kl4ZWxd@ES Lrl]a <*T]ӭ<+ؼӸ3˖; 7]'g<4<;GRXAg8sv1eh6F(Kl tMqArgl7K/V!))mΏ9>;actzn~')'˯o2q>lhx6Nֈm3gg i*^$iNYi:qD" Hdںr%u)'! <$ eS1F*aaimWŏ*ֿhQ =5r/ I3vxb"97%V$眝/hk8vC!#{_at=r K/sҸO/{3&;db"Y>n,Drgwn!lJv|AFsqb@64mqqzjy霸RL /$E:W1|nJ}_Ո8C45R 7t *120& ILUK6\Sh $N"e^L<#s(wz:T1Q&Xit2a0g:Dز;r@#Dط]yO]xٕd89h;SHC(jM19]Ah=@:=jn"d8\ͯ3iSf >qt>?~D<^^:Q8CySvnWy`{׌z 'sz9\!F_믰=xڽNe#GWn]1&%O^%wpsu{{[^٠89{J1?%2d-~Z͹M1r%w/ %Ǯ& ,K,> P.c{8?zݗ}gg{(|؊+NcXDSQqFqMn L[ҕ3_cjr!#2O]./ B%J\ r6r6g~ϮP,f^7_xsp2]NjyIy(qv98ޤ=W;w)a/Ys{D7v2+fCƽ56\' >y1K74bry5xDmmQ%u|pxxL$hW EH:?>MզH}Y.M|:m!׷8k 7qhBKfI/R~)]k;yMk)]뷟r.[QAI0,%pIKeoL%<<<|uO>k,,ϐ0_G$RԄa0NQ׵ W A]qFGhft9т0^Xq !h9!\pHq~釷6|7c}63-/xubq}w;|Get"Z'q*0]ͼZ'p=?9%()JDJD؀ `c{ުkUw(G ͑n߮[U-ݧ9/{{_z#.\ӿԋe>㘖L2 d#J5Da^#R4r92"Ss2 *@x%]ݍ,#&/%1[op^3SgD=QƲu~P+bi\DXS8+,KwG, =pQQrwd4KüY֤aTM~ ؔkVYxx@,M}Iel|~[QӉ1\sxx;[ ްg|aZdZ-@Sz<@qt| 8ye1u6uQ=Erl5(RIq*.`\K9 $ou6QdcE멐|&e1eZ%YyG<{1h}2 ml^26\J<7l%G ˁgM/^h͖v.#6CsϢsUp -+i'tr`-$Z3!7C&+ph;' ?m.97oc@V@d˚/h5έf{>kG$&R7/`g!ٜdGƉc5( $W:2m!C'oc3ֶV8cěÞ!zm>h[zQ宠u ƶ-U?vG^ D)_Ta`:.]f7._q2kOB7;^Pqag׹F-O܄e2Lv-rBzㅸ> iwkT .쾁Vy@MYU++dqP1]i eGu'$9?()Dd-B泑O}|RKxƓm^3$f|z~!C:a@c<}AYP)h#\ ?p8d3v\,x%iǍ,ihkv_g2ۗxLH7Hvb''2IN!J]VbY2CzkIz;~*?7Kc19";=!8)`TZ=+tJ'/:$ w жs#9n ض9j0Kst}7mRxxl L|pN`wʎjRƏNp (2ܒ`I:$o#&} 3 IK}lʙkNJdCVeY *PB.[2ӲuqPؠ]tSɮ I@[QW%IPqjIc T(ywo'7O/FO\.N?|sİ5o/n[A]S0=˷9:< |y/{ ~W^|d~ -W|p}UŠN$ X?*cUJ]wtG? {{ϋBpI1QPJWCG8(Yir|az=v!I 9,S<~[r)F2AH˾l7!Μgsm?䓷 ˖۬nhA}eB)v AKdP)_#\dX1텒؉D AvP6CA1JT"N+&- Zd`_z"¤ C?#t%]5=_N8>ݗO{CLb(ܴhNiVZ K7Ha ESHqYbݾNt!Oͥc@`p?F)kk}E^sma2>ucĥs$?8eMF$ ֊EH;+e [QD!^O PxN(7G!G,XYwNLVVhjrL/ 8X !uѴDA9!VKHp9~%y^v hi'1 GgS &< XI{EA#45U_نYհwWh@:[D۶KG' iJ Ude%RYz.Kƭ'@6)E&DPҒW5GsſWcJ ŋD!IEi$ۋ~7~[].-|xM/RgVH>8ɧogJ+@Hq ud+iFo{~g}18י 7˘?LѥU$IxwŒ!'1Ӭd|:"\9A Dv~ʜ͵ DqV-n,gI('W7>:}>{tw=陂2ܼ]2ys)C&#VVBV Q~^`V0ޔxA"<4WX#Za_@>zO]cm}ELbm3EP4N*nMoe"&0c.u~=fF"r bT%usFc-FoP\fsyhxzJޝW{G4Io[>?Kd _V{4& Yvw?> ۔p@94 VI;2PJ>(J%OI"?]P54"M"mR0 룃ƶX"cWȫ3&kkpVH;ۗl+Ɍ|Z+|f--e]ln_ 09lN9pRw(I *MqPdqK*j<;:1\@"<>x$8ctMQ S5 JҐ&&sɤy۵ ,|hTG|vqk}W#)_/'|А$)Ap"tkkV _(ϼM"%oQw 8;?D֓}ZU{*w.)N>6:OƊc1E#58 t~=ᗰ >Eu}Fxz bg){w~3u[t?lQfa,dJ+[ڐSzu |pp"'%un>r0ԍ}d_&F"VC<'b13*^E?| HȳFEQ*;)oSr!>|`4pxrZv8N|c v;b^]|]4+ivǹݫ<[cGDV_LH9P7`B|sL'xiUϭmcF1R,N`(hbQn<+ږwVOM∣g3!d6/\D9H:C:r'ru&WU :\KCl33lY9s}SP͈1yǣ BL,)xQa|TxZ:'!~n/}w,wAlF^l-YZҭ*HD|Vt koH8ghw2!EՅI@i&aYUH2B[J3" x#$׮!/*1y%s}mC+ӸC;zv[I6M&SKNYZCN\toRֵe "ڌů=tO+02|v`K}~W7"$N]kNgoy ( mIڥ.z)[bӒ]lETäU2!Kšb:LKr3}@B-_,vV$B6U J%z>vV b!@1~: rhp zllM0Y0ӞD~IlOk+ͱ*DDž˺<%?%xvhyIQxB8:D䇑 B?weR/i"VM-ֶUxʧESs|IShm:g<92s6' t?2'e΢*E>z2_ hĘ$'ϳ񈽳|mr$ =9F:f'2W']_\pku(=rk4˹ \=E#F 7;2/%f-j6:{fA,d( Z<8{P7,c4M(aaH<6rlKWxe0>(.rn4N -mÓZU>o~Elw/DG$QJy0:`3ˏXŜN\g|`ӔC;K{[lD`i ]3r{^ R$Z nSŘ2[P֥`U)8Jw%<- ik\\eVw|ٳX_gXR9 lV("[+]ꦐ66pneQLe~40Jbi9EM{$g`vUx8-IYKF֓>Q f NN&h;=S\yS]3>pߔyݎ%~K\{ICrkA"DVіTS姾AO8A.Jk<c*Z8DV#p2KXY{ ]FmʅYYt:u]H-`ڠK|O9].8[?I mki[jmd6bd/k%_y]k[켪0ۗzΜ3s2d&ILc[l-+*-TcEKQT(j)N 6I$k'3s.uoZ E%19la0\Wf[f$9* 5pg(r^E㯾lLJW|ʹBJ/K{S:n ]{*Y?Fl0;H^TKl KxߦL%qԄ |řs spP@_`⢂ sdYq_ԵKb`eX26&W[tNdM۴ӈI.(Nh lsvd[Ν'9$2ۖ og:,-'sJK4Lj%B"Z8 G>{]|D\VIo-Wb]vYxaCXsVܠw\\"J' < IPd %ʇ=FIYvX!3LM40<ǪLI} =n=̯݀۝ #<#9].=Ů=i4S/-LD&KxQct " yJ$2ZhE04u\u&R UYK4 k'*D,9@`VGg:iNdd~)}%[UEVL& *kuCS _پZc%&o8z(w6` ?R6&BHx V{!a(K6+>: J$&jKGH+)ZD5IbwYo1 VB* kbjsd[RB2i bms6ƫ&k}~CW7xOqU[ 9|=˧9irbl$O (ɸ&Š bU9L"BFx^\ Zk3pA\9VȌ=6È]R+6"+ `*Bd噙A%q[ЙwXwC.]D7Cm:IPEd Ns|_jdBz/wx!Ѡr+?+A=)\eyr(b^XIVF6A^)(h3 /8Ԭjiv;׻]X*/뼮E6h b9K%9O820Y.l z.D&?RYԛ=|O(I/gSZcDC2( IxW,*ćU*NzF-&03Ql^Fdƻ@)ؘ @7fi-,agX(vJR ZVcZ!wXmƑ$j_ l*KTeI^~={  Eq=xo2?ʋlb$]Up@YdTt YlHT%U(bшVT JC[ЮJuD(DY7&Q)s PBTq tZ-y=dUgOqşFu b90=;b[@7BCG-DZi{E-W\],9(7^ET0E:3PIVt:AiGo8Oyc-$!BVPKҍ ۯ9AUQ~)-pybHuG{9 {aq^oX?*yaskKғ0++J"jD'9z(߿# r H;,ߵ/ci3" A :iCА-(R PA ~g:kƲ+TeQZ#crr/5q7/rzF&`vvh2Mh&1)7&Qj \NЩ7yοW:kdEŧ0&Ac|cL1cL1p cY(A<2b|XPƸ#G l= A>R ;&mT l# n`$ !p #h Y!`ĸHRAF$ԓq=ݧ(@0&uѓo8vIENDB`Subsurface-4.0.2/marbledata/maps/earth/googlesat/streets/000077500000000000000000000000001226345450700234435ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/streets/0/000077500000000000000000000000001226345450700236025ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/streets/0/0/000077500000000000000000000000001226345450700237415ustar00rootroot00000000000000Subsurface-4.0.2/marbledata/maps/earth/googlesat/streets/0/0/0.png000066400000000000000000000002771226345450700246140ustar00rootroot00000000000000PNG  IHDRkXT pHYsPLTEz=tRNS@fUIDATx OH47NUIENDB`Subsurface-4.0.2/packaging/000077500000000000000000000000001226345450700155535ustar00rootroot00000000000000Subsurface-4.0.2/packaging/macosx/000077500000000000000000000000001226345450700170455ustar00rootroot00000000000000Subsurface-4.0.2/packaging/macosx/DMG-Background.png000066400000000000000000001420241226345450700222420ustar00rootroot00000000000000PNG  IHDR,etEXtSoftwareAdobe ImageReadyqe<iTXtXML:com.adobe.xmp ?PLTEdegи蜬ízilpsx^^^RIDATx̻OHY=| 85WI@̤s  "(IiHBh )T0NH$4@U! ABOjMKk9դ}sk>I:WA\f-gkW&\FBp#¿\/4?G1 %D~)o_-,OϷ;v95_k?=s(?h~O, y8e_ K!M# JNMӚ瞪N)Ξw _k&3D,3_8.Q,xg1PzX _|I1+bt{Ora>XO-yPDeI!̟7| o۟yG|Bl!s;hr ?!ϗ(C'VY{ ^Uk|+)(dBL < gը|2nyĬVv>e>'ΔU,8筈rUH/,) ]1*_WN:L\'|!}\sIR!}1- Bl G;I>F e&++[qAo` 3i(OC }\o|8Sy}%K,mF^q  x#*ҪF\-'"e^mΧ#rqe~χm2 [ȇA"ܹzXsC^p"BuF;U2&Bq3R o'=h\ȻdZ͇Ѥ<=$wL'UiC)쉩'e}6]Pӷdck>{. ":cNl)T>OۂYc ῏>qE 8a Sx4ʊA=o274 ps|*Y{P̂ Q=h>RVA)ӥ9RQ ϑϥ0'J[=BnO=pd"o{cnJwB0>9(y 7'k"o'T ;Zy$kccMLLP 3qB'́m,$<ebB/'rAB )4ȇ9BZmSYUna&&t{ے|(8M2,hN(Z_-OLćD~&2Kܟ gc.Kl,=>G%, NQ Gm\83taU0|8KFwc<[@JI }&)Ngqͪ1&f3 rMM,ǫwQL5s0]@FeyML7[y36Ryz?uL~"1H}J̽ͱϏ:Dh"YΌ *o& Vސuh^TģT]5{bda~~rb{xMIBkP|]N2G64EM|7ޒ|Nr& 5#O׎\3kV^kAjؐ_45|Y91$G@[>dəI-.G*ڟS+$| 8z,## )Qf~yQ5?pґ`Gces>ڸ2sp䤚P1 ] Ld~M'_dQvQ^֢=aʒӘeEדf'^B#4l8C$!=ClD.İ^"X="u ZUҥhp]@~"_OҁIwrד[ btgB,8ohGbAL*5gfaSGci҆xi*I^bCKH9%Z)JN-adsIȿ`"HKؚXz/` Cfb ,Y($^‰9a 9G!dc{ξh/I9pn&e&B%b IG$&LeSr G$B RdX &gF{I1*GK`3#-B2ӊ%=h꽗 +Vc[! z c 0(:3L;?&|P&gòIp9KƟ*uB6fz@BYWPDl@Abo &CO!`ɰ0y яriҦeҺC5Pϒdf6KKPh(&)M⊎LqdzǪDp\xeEHSd^?4Ptnr/Eh&LM.|*LQUbw B^.rj{$q"0,P1LHU"BAbjYĪ\{&uzť"S0=Q E:0Sz)Lo,~.<ݻ.>Fc(փ1==S0iZbTϒI(LBb/AP{BjX%!A=(K#Z@S9 腃0%S[!)ʁ˞z]҃>3Iz8`zMMA2ME+}2Or&՟I csEzujn`oq(~"¥>|6(aN¤gJM[YZ`:%뽘Pq}-)+`"̓8Z\j~[V=uxdpPWTQSb)D"#J+8|Jo=ѩ8s׫gDb$-CS ȉpJ'Ll,]q+0ϩ"D롣bzD455QD)( "r1hX/S/?)+zˇ/4S,NQܩ^zSl8pSDJ!? lsed bSr0 -I)~pȊ쵈!8ix&s^{{iL41 uqhyu &ONO:n rȎ}(#`5^GEp1SD3E&2*rڜ)<+{ N] H.9Ee@/@\I!"IN1:f!@Gꈄ[/~{gH*ŋ<{J[ARp<ȡdfo>'ZUEY("IjW|'mo8liK?L~wG]:q'eW%s7 t?[9yvjC'{˝"wfSCYmVfmլ5YGCYQtQhO;~^g-E"!u5= m ̾z)D0F}.&I8{r#K$r_n,ߒ۷ԟE,c^)HȂH: B[ljֆi֝>ѬYNDܬDm} @1f2׹ywN<3o?zfۼJC|,$6e]9iz۬/ ɘ>?1]@i1PՕ;˻sL%f9HϞDY? .¢a#{\p\7ٓYv2+IIV8 h3;--eVIٴZ[?2NGʚ;ܹx}@xl[GjY.c N~߸ K_qU uw񸘝Vڮ[ (P{wjh6=2z`'іqh615j66VǮyU6 -Nwq\|m$ zV!|羲Y#xVjTRW$~'=̥[W6{v[#zJraբUtuس4-$4oUgkhԂd[+m3ҖXny62uyX[R3Ec ˶Jo"P[jk =G9im!FMw,=mm< /qFy۪n& Yj4oo3nXo)]G%"{UR=rp{dD5Z6ƤHm%}[PUƌ ^9"FQm 6F5I!n 7jxi6rՈ[W-HMoTmfH4s6NWlkk =hqK'Kk6bWeQm֨.lOm]H+Ije٨%? CM|~MQ߸hω[~\[㪬\j D<4BqüSI{qiE0k;V i фFQrfȲ)FFMi[ШMXh[͡ 7+f6%m77*&߿u'}SnG'"y3> -r{êSc;鼝l(i˳֮ZbՋl<ڪC\? NL%`zRﳍQ6c|mYg> ;W l#zR_`gBp/v{þ-]mUҷo9ٍYHeCb_!j;/%Jv ecU.Verϰ38nr]ֶ*̬rt=iU?_U^OtLϠFqNb1Tg=!4QU*Ȕ\eQLg4'YYj'UV&^B6vm4^gپWUe~4+ى*1JsArFzҵ+1ٗ5V⯦TU%g'5+;UUKU3c;pU2HϨW̫QbQSU*Yl|p&ulLx&2[~Tox\Yώ%~_0xm*WП UUhQZ%>*hJUUlU4$*>]O*yUAFS&n(,Ė=K<>qy࿕xҫldXfGOntw}8X܊mU%Oe7fJUJOZUM} nJe êfE-t÷^Jo52c:M MULqLu?O.R%[7fvf6=ܶaM_мfe"ɥ[7Wn9ÿݗehrj[Ws2zy&{lf w8Y\]y?Խ{q#r8:Eu]ýFBRZgg_gtȎka=c*FN1̪k^]BV5A8j=Vf,L(Zݻ*b/y tXowL6EYu#80{9}ϐ?׿"^ WݐU^-dssluH~}+72[kx.bפ /%V'# Fn?n_@?LL䮪Ml^sGC b!NUBtXDaU&*23+ @Ũc]'7ۗ.K%+@]5L\0QxW?kiǻ/%~w7v8=&\>F!oOK9!0D]],X}) |8F鵗|\1oupxmQVn1Z~X}l0+h \X8!zD `B?Xp@K?\ E5SK_r뇇/ru"!ޡ8!0-~H1!' 9 H5{A%`zw'C'̄g |N~>/wv?!p(D1)sx)j|J A}-]#S+NSa"OV0 *vO .\;bvxΠ]aA q,Շi83=-ȍ"S'&N.Ni>WRR`G `6-#\;fWA1"GG2%[cD4!T0Zr&$FB:0Dʘbku!E?Kn!Ahzc6s=ntM=0 1#_N'f}:T6YdaZ5(raV LvIDa.)vq48Y&^5S͉<eKӁ@d~bF xFg1hhR?ZlNku} }vǏl u `?[ 4E>%iW_c3xSBj#)h4ҩtxPc?@ϗuHYɋshos_%4a|IiΚmV%L\)D:ئԡl$GYIu$tQljj2q&RKkr&dӧ*HbywmR 5&-ƺ7YhlS^;Pfk&2,^[o= zZxRT|m&kR̾&o$ #Ԥ%TPӓI)j/G(a\ujjjIC¨{~Da< 0 $)+ژEi.BN'z)ujN_GՉC@>|X*GVƳ]s{Xr16h9 6QVDuz.b=76Q֐<)eݗu7pa\(#(2')BΕn$ى:a95cM "4Nm%#q͸~P?θqʘ.M0h\v`Jɕ,:-(%)|tZ^L4H8%eU5|uG {Lk, ʎundR]"rN6)].5b*:!hD]% ᇜ~|\&&ΡCu]֬l$q~/͚M*zn֐%]:A ?d8暾PFNEzuu(eE3-Czv"R Fi}6k:tFi1H[lruKiz{c?va5g|<2BQ@)]|ۀL4dꭟ+ypi<%)AlIP6 񃃐$dW 9XO|[: m09lefdaD6o0;2p`lr%,mpz, I%em~7t7(Z;׮_E9SwTeuah[ $pqD>ڂJ$xF⛜_éo7Zg4`Ov47hO})t;;,.;-+M9X xKٰ] AQo6적 ΛM-.v,Ylǔ]W4s;ڳa HtQ*$u;ddKyYh]hccIڼarocspE@QvTmYvw6t vLEynƶ@nѱ [;(-Yhby`l, x aIz[Y !J˿Iwy/mSe) ޿ ζ,(M qgRΓll\ѝe&,w;:C!2' <7ئN},a. &eEY bw˘eEC#0Q0 OO2 F-!mhJh$L F b{wqzŒ ec\(R˿) d+l2 Ȕ {4x6uD W0Pd mJiL92'q6-TYxX&C67snԅ7oJˋ7vSxcn0M ]Kٛ{MܢMFR _oUvD^f|V|v#lN(\حdsmdln2J>7:%z7,M؛Fo[\yC1¶*]e6yI }4I YQ7XlyYizАnݔo-Ɩ-Cbyؖ= %VCetC7iv~Z\/eƚj;L-JJ!v"R)@EŲBl++A(^vo i#ZohhF: gBjnP^֦L=eI}AɄ2`H)yJRVY(S @X:V)\beʼ(+e:)787@Efee:cGeHe,*@I! !Lʶh` mkձbߤ7D(d#&䀮ʴ h@ӡ" 1&e4I+a$)e%e{HAf JU.hUƀ8f2e)M;DPŶy+2ZzŶм+ei&"e_G0DtZ8АYy`04d7\foh iG.޼yNafY`s3[f< PYpP6Đi\ng"g1PU@;ٕв"h8Y"L/벟u忊*u|%|OP3lO}_kuB9k /^wD@zc\#"@o:z,2#.bXIm++otVxWY;4.J[˴@YұbReU/vDtvwε0&+EJĜ}ZKmHO(#;bP" ut !2PQ;:l&\HݲA"]aE\l7,m s_;4@25uYce>\*h;2d;K՞.??vL.R!1Y+&*o|5O`` jawQ*ll0Laʺ.+d@]aN zg Mura +蘾[JWة3튊w%Xis>u9g뼸VՕm]_(֕||ߗ$:aL`W7=- o d^\_=d?MZ q!k" gk%TdC֐djoœARo g;qm$~0Zn3gYT†3״60D_h(G˞ᖙ9UW$]{vM[ H$`b*P_ZQC2 4䨍 Z֯YB4rlRt4׳2UV6eT ]7>%8 !z W ۮTF;@CI :WKs" s4HpڳeVFTzWNc'^;qٕ@e%4󼲃֡!W&;F<ϴ 4\eÇ\WiJ6?eTipeq:*7j47$au @Ԇ(SMSM^sJfYBʈjT* kD;P ŴQ JsQi"tX9520*SX&ĄQ[;`5Ro#JeC;ҐŊUE̳݆,HyJ(Hīoi R!*ßx5|%i7x Y i񤧯Q5b0??;WJoFGUj=Q& 1Z2VU%G6))L+%_79T-U\'FhjݎfM3 |f鏦u'kho4%?jQu?ꃠd`#^0phf"9HeOmkRh~34R!KN#C䴌&#XRY "7zUy⼠mf*Ts_L*q7U?prgةLg'.3 gr*Z3?[[汇dQSNծZ}r|=kM@BXa,:N3&*1tAp>Hsgڏh5l"ekv~JNR Ñ1Qؚch {B^ J^x(`_ AXh勉^]$xap: = G:UP^KB׊KKƂ. EXZwuP`-X*0mFd &ب+P&u`͏FI[؅5v-x 9K[ [\yoqA~F \^v^\$ꋟ-"[)w/T bV>BZ‚N^XU1_h㭭֖Ol{e j bHJ?zqHY%QR ZYe>/taŷlRYa7[[/^L ?$ Zb$ GVHz[Rd}Kq^ԖBkK}4R\PJ6^8 +VJO[GT "_S-ž(89CI [=po(EҪ2(`NrD4gpy: 7( ~ung^" O[ Vt}7 7ZꩶE$c `[oJDy*;,hFeo ϰ\Ey^ Y;RǝB!YQ?C X=IzC6߰nSB?}f7}~肈 (D0z#dzzo! '9CHT >')yJorSP7Ou2RO*|$>ES8QorbYP .LA9z# Ƙrn)B@H $޸[OM- oFڭz l2,7Xz>,@T3+0Tj?u[8 cޘ.2G<0bfm}Brro9a(4g szr"ӧ]գ?ʻŴK+>xi|#WR+O=a._ |me#[v+ zWqG˕~HGZ}TY\|DW @J8z֥YǺdLcB-L0M4B#uCGFQWꐏK4^ =fmo]/j'G?e.*=hi>*!S?Zez+dJO 49|N]Zv F":gPQn2Կj0vIf=}`ZD< fQ ݏ0[>8Z/ O3»#W " RGPێzKWӎHil #>DcQS (o;@`U}}=VPW?wM)$zɕ$Bv& 4hSH&$Ic)YN=6dlp>`3Cr_X(E-PK !~QH"+5BE <4a+4'qLW@_ JUDzOWhSF*# lHP\!StInh&\6^Oz=mUEqxzzB. 4 uA#Է{vCGbBwzV3c]Q}WxOX;vH?i>^)ׄM)aϻ2=(UD;xG1Nyw?=(qY7Ķޚ"X %i}r=Oيerh?L=CO[֩+,ڍ3WEpo% TN)dMkjTZvzۙ璞(i^F"Ts{n$VtIFZoTe.^H[YִNdB{}SwG*uAV>=U4ɒ_ㅧԛUj)9CFVm׍S[KgQPTɷiNm$NmpT({;TL]IdMQ浟ZzWo SQdV>.^-h|]j]FZrZYYZך@)mȮ5MwY!֭>72kܜ^R]PuD8kpz\urm-8k'Xݭ"CEp6NHGI/wi{Zh7X#g mj]2R@̩[+4ZŮ>i -Y(T[k_n7\[KpJzY궾]N2-ٱqY4 cYr: m5/d= +N#XPڸLJjpZWkPh dmmSqyI WN7IkIޒ*) i"l{{؞onz򱧜kMEK"쫣) +xNHsTi,%ھ"ZIjE@gf YAM1=,f4KuQS,!S)4@SY]Z# j^Uĕ)U4v^~$ϭȮW(5-܊y\p9.WǂoۊFҶ}Qɔ^ ;bsl9AUeOyuxO++&_!abƭ( p\a65_q\ b)*ՊҞ} KdEo=c+ v=7h .WƸʅ j}:h4ekq-lEREL⊲#]S7gk zf!`~^ L()w!WV%N,>%tQHLyEe}.J’{d} l}F EG!gfʊ|/jE I_a_ _(\^qAYufs}u.yqEQ@74Z'}Z%fq}e|b D@hg7l/ZmVm ,p/SeMgHK(@k Q4h\+Wf[Yq'\ `r,cT;J@fZ 7Mr~yŴ&P2ߔ}qd?x1Xm HR"p]]^oƅ|W{gIXcV؋K0fgW/j}׈o"5G`B Yf/%>\$/%YG p>S]m̍j֖[̎--j ^d`G_hhiT.=:AbgBUSsQ]mz+BZ[CKB}wn[ ZkBhE$i:lF}DCF%uÎ2T0; H&>U^]D:fُjPE7"~T)")U{hy}J(ZΫWG+pľ;ՙ48aBžӱ yOoCUCDe3 E-52.[Ù b8s(j1T\]R]=lVϫld##.ȑT##IAVEpT~&Z˕ZZ1 ,Fb$# hʣ< ###]F*VV+O)Y ;!iԾ򐫊Y-Wׄ宿lj-0ԶuFFL0|: \Fy2| N' jĕ I``]Hy>F`}J"@& /GFʣ#qރ(s=a6!AR8fat}'%g j8朦e@[):#~tխٔP# b}D|D `)n9.!t 6+HI" &t:ll0Da?T_s0'#ڹ3lTuA#ziS9RncMӹb;3PSΊZV,Ne\_֗]v>Zd偂e^#R$gd$$<.eR"# L IAPGF2}E4-3WQG,g;lTn31?Gޝ'4R^)SDiP Ti7I*WlmEϜro=^aRndPz]V J0юՓKa*mr"_YI*X*$>E%h TO l%>i@(kPTS)Lx}UWO>9 Zcj{ԁVI) $pO*-j5cpĴDt\do'g}P.xǟA@| Ɲ>0(iAKEd5,9 KE_C VIt#^(]j1 LnyKHu;% shBs9Ȇ\9~՘J8L$ 327B@qSp.0vVIH ޜ ڤ̅6(OfVe0Ծ ڄС*Š9?vse.xg3sP9M1=9l( `0ɜM1Ω:H4l NM GBi(Π +=87gZ`*,Bwlr)l}쓰᪓IaszP-A Au-svrss:1}m~b@cSsZZ܌8GC˜Si  :Iv#lVrΆX]A jC=tn\iVG6eG)QQAfmnFI66fďET+\G0h lnj deț~}|{[98\,m2Vc&CV}mJLp)qkL3ѠIE--- Z)s:f~d;6h[dy#yCsQlq>AG[}f=Hڳgn 7 lb).U n]'61xD CD&pGvL"||7$3g43P)uMbG`znS>3h3:o3JPؤHY}mi&I ۏrp"`ܦvnⲰ@~d3vϞ8Ϝ?3RF 9{?ZgzG{c~c =+J6e忞}GŗP~I73TM_)`h&|y_x)O}ʱ7uDou#Nn|5RLo "/DHԺ;7܌TE3*NyQO7 qFō4:E}顮):x7ƹк7tM&n`aOuG^`Y^ |f8SY˨nZd+ٍ@\ vVcC-zyč@uɳhW+}0/X.vu(IYۺ^^EՅr}dHչu)J mR UV+@', INqTTzys"?o4<7gѲ'>hctZڍ@hݐ@7إ.݄R}GuO~Ls]]"_OsTکsq#y+ybF|!aQeB]ƍOdn@Yv֚qQ?F-Lw{_M|ļ?gV}&J$эB0!.V jHuqp|Ǔ_ yb 'olp qJ V%ym6T*_?T_~ē&Ԥ/BPS%dE蜵 JR|yL'/PdDI"7 И TK`vR_F-EH?sQٗ).9DUgJ }˦K,j}b3rܦjʚ{:Io*4$>KaB=iS?4; 55ib52x:65Q~'A eߤ^L `ADՆ~ NCMMjKkj R[)n t1$> !VSYSb%6eJb-м_ .LCSqqM_Z2qmcץY?_x%5$6ȴνJ!j㋥T ,4[/kPGmmVTn kH!KqX6jѱ !EQ*6XMJ~m6D+s\h"cͤ=CU%@_\8~Q-RZ*B+$!tރD`,lQz8ԯиx׆m 6]O0XɱUCSN*v EKD ֆ8 EΛ'n)6$shpܘԔ8BMxۋ^ յZe7p^KAN:}I'y7|^}CaUm}o3^vZC }x-R],؛vomangmzSk֢hz6bi,hogml(A-nR OÚ?T۷tEBu' P@Ħz^x;r;1!GL\1tҩz>:<2MÇX@ЎCvddx6"s;qT >7&`` J}J Gxz66n?Bcc7mlBdl8AWN¯h, Qh3@XG)ßop[b}}m<@ tߺ">HE %=_-ÞAqߏnThqoS ĴLGZFl8Kw!4R3c@>aycf:X˟mxxP#F=ϊe#cX+kaY*>@_`hGĉR&2@" B£ Ցâ 1!>Ę9kk35hrɞ0'j_?c0 LFdq:l a˶8}À?Lԃa9m1|cxqx!-J6-} Kaj;KƱ5D&?l1vç7=<7랶 9+qcPPS< GD@G "g Q%=?be7)dF C 6m@"ck?t:+0LX-_OGΛf|)N.H+OCM+4S󃄬(|V͕I`9똝n'hv;&D7'*%_4777"9xQ<;jvn)0mΎ*jNHRo-5Gn N 4 K&ٹF_$QYkP[ J9mΤq頹9җ@&9/-*r77GL+툴b#{'n'bͩYְ. gլ.Ʀe̥LYZaPY6H;ZyʓBA\{8;oak8ZȗXb{%,dGj 7( +u\PJ 'ezs_-t&=UM:*[[GO<>۽3|-ǩM>eɁh9:_q%-[Z7L1-Bv,9SZZPB WgZҴe >)3'ȂəҖ3d[Ѡ~yRs&3:hiTTxK-YKlM㖊j3%Y-:l)Zg%iJ gZjpȇƪpFޅ.J|v-ٻC8g7 ZtוLKsm)~;F\![[g</"-Z=S);]mIE3~LKs>h[bK3-:hbϜ9h9)Rqz`E?3,{<T[4NA=ÁUV첗}Xj:Z2Ğ?UL@A: xlZEW;ВE 5؂bxF>u`cO`Mme;-T >jT"0$Vr)TjAT  FIt BtZgnT|挷 %#p|@<4e?\G0۝ 69(K! %* &$pIOU+A;O쀥)|rR@\GC}dE=j?l:>ڃ>F:p<"Խ BXj+ ;C5jqC,v]un1t=FX )]׎ua"7 uh`gWWEXNgfN|ݡIjRP ]?}d=[}=TDB͉8t+.K91 Aqh<Hgh"d XeC_?~b;>ďH" }&74㎞XOs&]Kw&Bw;߿  k( ] 6a&yx*vRfD>k-W@5mY ٴsQmͶ"8#u*Sx9nv ͶTTV%xA\8睈7"I>nf9ήf` Ib%<Է>Jԧ),O-oSߖU_X#zr@P6Q(* 6.EY0:r+ԑʠG'm_>p|Ǻ_а> h&F.*קuEܪOWCXԧ|\U _/R/HRJOR>.3I+]E1Y1l ZmٟW]- "S!IYJe[vn4o!B7/lM]K3nO[r@g70gֺpWImQmGN.vB߄r"mmڎCi>s=OvYqS3g*CNv"öK;7>}}siک?ɣc>qՇϾWdW}?Mz,N>>DƧ>br~* i3'wr͊ LStL''辜ӻS.LZ v=^N`Tg/,*"A s) A.y=ŨO=>iONebI_7|c ɽDUPT! {>P~ذ@},@"%|9:ನ'WÛ)挖@3r#WAڥɯq~flRZ=M{}>*$;'>e"*[)᫯ϐFӾO}EFϟOg}e + YHKRWȒ#ȰOёbf\O)> =MeO~tot^9yV>%8VPN՗ }zջY1p8O|l `#c7R}z+ʭh~9k?^t䕒+Q[N+x I[Aչ%Sn g~ee">5tXܤʷn݊S떢.3ѣ/g~˗oQc&"ylyBkzdQ(r"tI!&"pB|}aɢ嘰{!p[d \&{9D\/GޛwgUU[w|+(CdfY*)er_Dͷ#{ݺ= S=pdfY!8W4A⽾(M`Jh[.,O`W@wlaeKqB-vv*p&#_Rli ÞOt/ꖼ˪*s.Kw*|R>)y^ ޺um[o 7\/[or5n&ڶ@ɪIm Y%.o9PD]E\/.h1muӶoenb}$遷޾EGo7oz{V1zI_.hz\{ ݻqyER7 $`Y ӄm %n[z'4yK`v7GBpoޤ7=MM[VwOoqz&\ub[ Ꞃ6Eې7o!+˙zZv+yQ+{x(rbh 'Z0`'QU%/JB!~|-3f %j[˃F>M.(x sS % ~K [z=F?Q^V~P7D7 'c›t1x g fEۖ|YYw?9{OS!j1y/2U-/8e8]D[jI72TҸ?[`5f`plUyśz||Nۻt^` c{ɑEPyʇ@c$S^8C/24@*=*zyj,|.^L| )x^&"[7Mы;# aerzdΟx>`ٿeί&Zˏ-~oe 2`=Q׋FkMHeeWo*_c 3VV=hjXn"juї$]Rvz\F{~A)!oE0U֏acuyv3 ЫCLp"^F&8*pd.3٫6 ;½,`>2kaX.]dQK7*Vˏ1 vzquռ1]E=Ƴ=1"b+oViY,[(lMk@W%E˫7U"WVs$5V),zfWFzD7:n4C R*bée.+\XN@eWq\XЋY#:}DV/oUWzm_+/V/,I6K+*17ݙu"Y|.dX[R/2Ӌ)O tr'j~ KJ0 kW_*i!'~R{t @Y bE*Z問R,jdo\+y+(^—T,W>d[7U?"Z* bx,2@|\,ҭ;1ZVr5e @cg?>|A8s XTl!+P[Hg?Q<Ӌ?X,⧏ɇfW(\&P*/?~`=j0/(}ĬlVg?r /D6L?r–JʇfQHU 1 U` 0RAl2^/Ŭg9OlA18MceR>rְf/OD!DUП)rrx!}fnM7D`RL)sf9GK|ٵZaxcH! ):db1/PZ~52Ŋ~``v8_ `c?rۙD ~E 6+6R d`9/4ywee`+ $0ȃBt`/3_km_zB`g" L|@5""9|YSp{ b뀪_DH U'Wr@O0uij5(0(EDBӁٿ}ƼUqGtpzJي_@8h\?PH+<1HxҿЋ?ϮB_uuL9 g*_?[.*D2uuuURD(?i i6,k maZM2s u*@"1P+ fy :蚭4TvJr"GBbte竣T)?>ؿľbV2;0$]]]":Q1&(X@B:ij+G"IAl]!]Jljl;r~5r};*s]rr!RkّҐl߬ϩ)ئ9  .>5]EN:㠉@4j`!}Yw뤃jvQPOG4J<0vu RJWG\.WPy2uuSM1\%*L~Kr& wT, ۪ꈛe?zǀ<9舤8w=# ۤw]2;z@!9;IR|-7rÝ0.tG]iO(yE3:uqF:b |;e}2_W11 rhᔋꥎ/v[ED %>vȑT3HlIPW?w:GTY9UvxuJ%VWQ}\QC*s1?s`Xk^us eB'@r%^} d$ԫ쉯ǸU t}Hڜ ^nca\ObYCs"tL0_5Tк:jiWqt.v1wŨ:scyiƻܹ χ5e$Gunw0) Gcjusܖjۚh*PJh2Iэs:F%vWn`V>'>NL=r*" 1Qb* 9Y]->>1>62H4>QC%>rO[t1@dRvDiW=z"A;/(Uի4X]=}rszpPeΝjA$7gaPm8gءj4LaL2#B zt 9[P8 ,ltp<V:w:T{#bA Ju7EΆ$1$+`w VgI$ 2% qPǵ PnO`w=犠jQ\O;UqM`03GS d 76=:iLvVZ~bt"sGvxYȹlvDD.($Qq =zvVX hGsՃ!Z`0pPQ|Ч׌Pz"_==!wq 2'R`:;doT@K=fPPfhb^Z$:~LzDZE{b(`ЬqBA/\dFuRe{T:RcS -MLuY_es\D_{q88far3f0==izz 3 h{IJqJ38IDb$|bWYCw: pN'>.ovf\w\ޞ\ބ'wfN=p'k8$3UgFάCVnFFHk΄!ͬ{,=`@9=mFUcHͤ,\WuL3tdG Xu먾ޓ"FZ$Xs]{g54'.-gX{:'tD9nLIAYqx޺3u ae!3$jڬ>E89CCc[>DVǪ#~9"z>`uU/2Â3mgD1} E[M.ft<lJ$ңVGbzӣ~L=sN:`"g=3PL)d3Zg OlA֝yw XIl;=ן<3ן O'B/ßH-=+DQ3$$|H08.m|j}d=(h?YW !:&c#;ϟ8 &_xzbvH1I.@0 {g0yU0R1JO^=[_"<|ʽy6L[+}5`4O=yn4ۯ=v_Y'VٓWlh4t=׷-,±9~Ϟӈ33'ڔ 7,ۀٶm=yf_7{I4m 'W Iɺ!4Oש8LW2V>nls̭LC;}m9'TՓmK(=1lFIHVg敩>crBHvdI;ጉxe5f*L߼ pmMm{k!+`ڨ?WϞ=7m< *&ɫg4l)q=+xll{oW2+g.zinMlӠdLmô= ٟZ˰{d3ƴ'jz0٫gm+ed_O?6X-H{b$IMW1dn2 WlηmQodf]3zzz M6ۯ,|m ImL0 ƴ]&40ϠbCa13%3ٶf4?3e-n{ MsARLocD>\O[n3 Aq }pUֹqwzF+U7 b pl1*"&@':O0jOLXPO9ϞHL'؛L9%>`BUicظBP}N :gMbgyCqB=Mc6T —(L?Yo?=#؟^䙾^%L*/Z3RM:2ŖX#vn϶s۞]Q9mk*!={&RzS&M‘Gwtd{+~C#]ŭ+iWp*CWW2tᆴL_^824U3U,uȶѕدUd_1_UTM7"'v%D*/P˅&{%l_._TӴvW ^q*4êdltY-(3X*{AEWT|B*ը*ArTILmSijM+QΪ8m"+U3χR $Mېf;qR^QYA+![UN.:+weRUBU8WRUG|UmI&TM#]z\~V 0(W9q_[!πUqګ` T,YviЪ`$۪i Sbf- kc E쭪̏*UM2w a7r*IhnoխnwWaպHFXwgw!NSp $ز[-:Ydn^qE !|]H4T) rR4S8hjvtg/~:Ro#FeʐLw!UI9v$i%#4HaEvgEl 3~ygkwF'.[/U]:^hV{N)Gkv҉h*3/;Y(ۯ\c~}bp1{_nMKXt8dY;T<\J|$ړl~RKQ"Q2). GҥBL܉# \#~)DR{E~>헎NWx^v%6Cv>C= K-`&sq]4;rԵ!W+vkow)T\vrmӴp1VIH3퉽z{SջTC\tRŠ]*ڥ]BLvGlwsT Q=J7݋ IyHx'i/ƥ=Me{nMl ͋1m-dJ5ۜΥA3STN?p)ɵhϺo_ O8'QBTMivWE`(| T*^ڭi}@ /s`%4n0Ӝ3e] w=$^"jDDv}$Ob/\픁%IC-VS>EKS~KwbEZ"Oإx|۝z>y2 ]5{r꼜]R8/ @\R];ܵ%|%3wE|< ۧt4>]]/_c%5!KtɕkզKBAYc='c Ewuw/۽wўww$9KnOsDfnK rlt/}B.͡Kpw%=¼1NT6jlWۋ3sٹQ/\^>fg8ۅpwV9۝( 9G5H_8K $#xaJUXT  xPϹ̜[={e=&*QT(!Du DrN:ʉC5w=j} Qh =kRY)9ġ+Fy:GD|4`gpv a㬓 w؋w̴-$*xwV<, ~anۊ.Cxqbo{&c4PnfflguGϒ)fZyPYw˶Fq/̕ B۳Qc[{|(Fp0Pbm{~=N!(r =d^{›2mÊ. 2':Vcš9|k8p,ļp97xJn?:٥g@GexRVkLEB덷50q& Z=IQIlt, [dR(a,ptX<2 MQ p/@x@ cBw0vF9C~aPvRE=`Fjw.@%,z4"A Rl 4^8C8% C5z)担7wԴ<>}W\EhpQ>PcTPЏ1lŅsAShrYib`K/P]:d}̊Ca>7Y!܅O9;_ؕ}0lw:}(,ȄCOn=XwHEџ=} 8ʚMYUhD(5@gLjq8|ԂS&[P$Hw-XGu0:3c8e7p/di@ʽC/*DŒ Ȉs$KȢ@7D q&/ V :XTkR1˥ʋEmwCqtXc; q^EkLNbj<&a$TG8O%(9 [>ecS2`(DZdKċ& ?'Gs;4/E^T+t8l_'^\ xK {'TB|(Ks˫)]ja|ɂjЦ^\ 8lљmrCPT- jjRHXJPd!^q)ӛeP^&m)[SN\ 8M=/ްFY ?SuXa_Ye/Pv_Ί%)GQl#lVqk5G=&Xaw_NPBPOERRNָi즹5355ްQetMÒ6W.~7\v1+lNjBq)]]伃n5,b55]4]*㉴ĜnKM8+N.ȸ1:r bH'~|e8ƫ@w8t>!9u`5djgIXS[DhNbnѹY뎨VWv,j4)qŸRQ?GѸ>Fw؍9)yh&vR$5+_,ǜi Cl$-\SON;rHrHMp3*'Al<#PME\_H!l9\& øjJE |Tj*?ymGGj88#rM%mr;瑂Mū\>TA+M%6F*g WB#$ҢB)Q#٥(+8"?쾌$ر2J9_լYȚg`)qVzHe=S^[CW#)k*؇5, 0#k#8"p#Sy Z9fFlj |++GIGi8;Y*+JR,b45;򨙑B5qӀښ|Lh|U`֔4`~-u]sF_蕐q|kp5Wi=4O\5'qd+#_0K3K$卦/*살[|$UHHz_18g5сW5Ij1o$5YE4ƬDJH~q4iQV#Ĭ-TPҸDȯ(Η_54DO"zMSWVy"ߵ@k}x릎՗4+:SL_F˼?5!u]ۼK>Qi{hIcgm͵q"sC3Tkg7.W5&ke^nPPõLcʜn'U5(:X)Y+$_e$́g$VOEõJw>[$YDTNkQkiN#QY`f /ZA/<*mH-Wɵ,Bcfdb&38yȾNFؤGȖxjQj'x!#1_)g'cgr2ggh6w&IE=Tfmd/GdE5s˖+tn8,Vc&ĖONOSbk2jkx42}rTm4?,|=&ӰFl2 JY= >M0~*88 flnǀ5٨S qn>\ldȤe s蝲"莩Ƹ<$=$k)NS/0CB[຿ hܢv(>A}dVT 4:;hb7>]&qҹ[pibVoQ<+cB7}Gi[8[[<ɚ&xkB25؍V&%A5к1[#=\1s[:N4e 6Ql" ttF:@ mm0 p|PN6ok2[D V>.5t8fuX&52),7$hl߸[zZғ mKӆR<Oz+jI[#W#7'%m/ƤNʳaEFDjql5㓎r[#a5 lШ1j_}I&A9K#QcHğY(l}^ onJXrTtWN 3 j2T@ [関'Ó-JrRhQI Jcc8ɀl3*O64Nn,))OˮAJv7FCJ1B&[*9ImLF$h򍺰8^zԨrU,|4> i0ڹ^o;T6%}ɷD17%$XT).g߇* $v uB3V]mf=%wKߎ}EߑCao︂;9m[ɋ>wDs\4~/%ct7·ai ,Î;",f7ߎi>NtO~{|r?d}aշj$>/Y Wq|Z"hL4eJéZ "P2bw'K F.Hǘ;8b: -E"ܒoB淒raL;Y oe M _ `ZMϝ;wT*Aj :1qYp;0O5 ;.CTȒ0t`+ 8,3UmKHJ0 [٥{L#sAEM?j~n{UNܵ_>J(:f"Aa;q5\C%Zq=]"WkGӍS @3č~l1Dc ;]f2 8gGgo׎j/݋H @ q]ۙmÛ`JXJ~Z&Oz޶~P;*0NQař;2L_Y&HWG{&5q<69NB=̿/q!AnH?—/xQ`{ ?@n?苒šLF+3޸ük`L0V_X*NPSڠ?7߭(ض)1(?* (6 a:j$-9v0)oIK !6 U?>d|V=&b_@6&+gEh3jT͎1# CFBundleIconFile Subsurface.icns CFBundleName Subsurface CFBundlePackageType APPL CFBundleSignature SBSF CFBundleExecutable subsurface CFBundleIdentifier org.hohndel.subsurface CFBundleInfoDictionaryVersion 1.0 CFBundleVersion @SHORT_VERSION@ Subsurface-4.0.2/packaging/macosx/PkgInfo000066400000000000000000000000111226345450700203150ustar00rootroot00000000000000APPL???? Subsurface-4.0.2/packaging/macosx/README000066400000000000000000000052501226345450700177270ustar00rootroot00000000000000Creating a Subsurface bundle ============================ (we now have a small shell script that should automate this process; look for make-package.sh) After you build Subsurface and install it on your Mac make install-macosx you need gtk-mac-bundler (this has been tested with version 0.7.3); run $ gtk-mac-bundler subsurface.bundle This should install an almost self-contained Subsurface application under ./staging/Subsurface.app Sadly because of the way gettext accesses the gtk20.mo file, this fails for localized use - so I ended up building MacPorts with -prefix /Applications/Subsurface.app/Contents/Resources And then things work correctly IFF the app gets installed with that path. What a pain. Worse, gtk-mac-bundler fails to catch the .so files that are part of the gdk-pixbuf loader infrastructure. So we need to manually adjust the load paths in them: cd packaging/macosx/staging/Subsurface.app/Contents for i in Resources/lib/gdk-pixbuf-2.0/2.10.0/loaders/* ; do \ ~/gtk-mac-bundler/bundler/run-install-name-tool-change.sh $i \ /Applications/Subsurface.app/Contents/Resources Resources change ; \ done Finally, you need to change the IDs of the libraries: for i in Resources/lib/*.dylib; do install_name_tool -id "@executable_path/../$i" $i; done Next you should sign your binaries if you plan to use them 10.8 (or later). Then you can use git://github.com/dirkhh/yoursway-create-dmg.git to create a DMG (use the readlink-fix branch - unless this has been pulled into the main project by the time you read this). Here is roughly how I run this to create the official DMG ~/yoursway-create-dmg/create-dmg --background ./Subsurface-Background.png \ --window-size 500 300 --icon-size 96 \ --volname "Subsurface-${VERSION}" --app-drop-link 380 205 \ --volicon ~/subsurface/packaging/macosx/Subsurface.icns \ --icon "Subsurface" 110 205 ./Subsurface-${VERSION}.dmg ./staging The --volicon doesn't appear to work for me even though it does create the correct file in the DMG. I'm leaving it in here to remind me to investigate this issue. Caveats ------- * You need (at least with MacPorts) to build pango like this: $ sudo port install pango +builtin_modules +no_x11 +quartz Without the builtin modules the installed application fails to find the modules and doesn't render any text. Also note the comment above about the -prefix * It seems that gtk-mac-bundler expects the charset.alias file to be in the ${prefix}/lib folder which it isn't with the current version of MacPorts. The following fixes that: $ sudo cp /usr/lib/charset.alias /opt/local/lib * libdivecomputer needs to be configured with --with-prefix=/Applications/Subsurface.app/Contents/Resources as well. Subsurface-4.0.2/packaging/macosx/Read me first.txt000066400000000000000000000012501226345450700221510ustar00rootroot00000000000000Known issues running Subsurface on Mac OS X =========================================== Security Preferences in Mac OS 10.8 Mountain Lion ---------------------------------------- -------- If you get "Subsurface can't be opened because it is from an unidentified developer" or "Subsurface can't be opened because it was not downloaded from the Mac App Store.", you need to change your security preferences. Go to System Preferences » Security & Privacy » General and set Allow applications downloaded from » Anywhere Missing dialogues ----------------- There's a bug that sometimes prevents dialogues from popping up. The workaround for this is to move the mouse pointer. Subsurface-4.0.2/packaging/macosx/Subsurface.icns000066400000000000000000002141411226345450700220300ustar00rootroot00000000000000icnsaTOC @is32s8mkil32l8mkit32Dct8mk@ic08is32˚vtɋ7  .$9::3 +(&* .54&$V'&'32$%w{"#$11#9#"#00#,:+ !#//!$| !/. "^".- A $., z q:.,- 5Z$-#+! "*   -."*(!(('()$-вמ[&332.;5J^``Z6CM@MKOD+ET*97<:XU=JIBCv5KJK>TS;GH'2FFG;RR:FB0[4Fy:QP8G7NZNDDE8PO7D@G059CCD7ON4ABEx%C>&)Z%LJ/=1M,7)Rs?60JA0>3K<6@3!&6>1@D/&.8$, .+.G@=FC5CEDE@@Jֿ뷕z}~}~}wהv|tzx{zc~vz{~|_ɻl}|y~yoٓpji}xv}|kdlŐn}u{qnwlʞ|uu}xuyqyt|reiuzuxvcsmqzip qprcuruywmwyxuss8mkil32Àʼnłɺվ[:+%#%*1=K]q(̞Dev  !+8BLUXXSG6!YO '&$+: %_\%# 74%]\% ( $%]\$ ' _oyr'$\\$ &*,$Z[# l#Y[# E1#YZ" #o"YZ" ! s#"YZ! ( $!YY 7t^"!  XY 7)>J#  XY #+ #  XX   5y XX  "{bj XW  ! XV )    WV  ], m *o WV  #p [ܨ\ WW B  VW  /X  VV ϲ VU QT W vNVNOSRQRQP QQRSTUUO~ȃɄʼ|`RMKMRYco~ֲk}40=BEEDCA=954@HS^gpwzzvk]J7"rj2MLKLLJQ_5.:A:765569>DK:xu8KJHE\Y@K8vu7J M9:45/IJ7ut6I K1}(LI6tt5H J7PQ?H5ss4G A>3G4rs4F 2fT=F4qr3E F*3CE3qr1F E/A=EF2qq0D :K>?+nn*>?:(I.;2#@;2($,@?>*nm)=>@zL A? 1.M=8=)nm(=>-G@==39vw7:=*nm'<2<$7<=^2'==<(mm'<2?=<0Nr9'7<'lm&;9'վ#:;?.!2<;&lk%:7+(7:%hi":94*;.9:"j4987+33892b#% !%#hdehgghhgije‘ŵ 1⭝˪|yyϖ { zu Ñ ð{ zБ~tz| y𴃀}{ |~v{{ xk{z ozy wnqyw s~yxv d\mvu~ u~xml~}~~tt}yor{uk~ytnlr~}}ts|}bh~~huatѾ}x|sr{|p_}{{txˠwy{rpzs|iwzesel{{zpoyr|d{yzqwclvzyonxwliwx{pfsyxnmwunluwnjvslynvj^utlrru^~^hjk]Yikjijh^l8mkit32Dc  /Qс цO+ 3 v$ Ǽv \œ ٪; {|國O{p~OVoˀ2#yh:q፺ 0W ~;К6z͸j_TIA;8544569=BGNW_ep~ izeӣzR7*"!"#$%&/%%$#"!  "&-29FUfy$қ[+fj<$!%(*++**)('())**+#*)('%#! !%-8GUav(ɟg<" ))f˒R&$*+*'&%&'&%0&&'()**++*)'%" #)09HYk&ĠU3#$+)(#cёY& )+(&%&'('('&%(&'()**++*)'%"  "(0;HP]n~&ȹw[G1#!&*+(%%(%b˝;*(%%&'&'&&%$%%&&'()*(&$" "'+.4=EMW_hov{}$}zskaVJ>3,% "&**)'%%&'&("`ɡ3!+#%&%%$%&'(()*)('&%#"  !#%'(**)(&$& %("^ʟ8$%&'&''&&'&%$%%&&'(())*))('&%%$%&&'& %("]ʠ5"(%&#$'&'&%$%&'& %(![ʠ7#'%&,+"$'&'& %(!Yʠ7#'%&'(0)"''&%$##'& %(!Wʠ7"&$%&'[P!/"#$&),,$&% $' Vɠ7"&$%$&$ZC-+)$)$% $' Uɡ9!&$%qu"6Mip#'$% $'Uɡ8"&$%+*#+"&% $' Tɡ9!&$%#"1!(Q)#&% $' Sɡ:!&$%&%&$&V*#&% $'Rɡ:!&$%&#$% +bF(#% $'Rɡ9 %#$#$$%"!'+~|*!%$ #&Qɡ9 &#$%#"!!"*, !%,*!%$ #&Pɡ9 &#$%$()+-+F='T4 '#$ #&Pɡ9 %#$%#-6("_Tf{,#$ #&Oɡ9 %#$%")TɥLX~{x)"%$ #&Nɡ9 %#$%"*h!4&"%$ #&Nɡ9 %#$%!*nf "*$#%$ #&Mɡ9 %#$%$!-By&&#%$ #&Lɡ9 %#$%##+k *$&#$ #&Lɠ9 &#$%#%) -$ #&Lɡ:%"# $"N '!$# "%Jɡ9%"# "$)hQq( $# "%Jɡ9%"#$ )r 01%"# "%Jɡ9%"#$ ) :(!$# "%Iɡ9%"#"%$ >) $# "%Hɡ9%"#!&F &(j) $# "%Hɠ9%"#$ )m ªJ'!$# "%Hɠ8$!"#( 5$!" !$Gɠ8$!"#' '" !$Hɠ8$!"!%B & " !$Hɠ8$!"#(s)#" !$Gɠ8$!"#(?]& #" !$Hɠ8$!"!#% C/=$!#" !$Hɠ8$!"# %H ®go%!#" !$Gɠ7# !"'o !&#"! #Gɠ7# !"'G* "! #Gɠ7# ! "%l!"! #Gɠ7# ! $AL)#! #Gɠ7# !"'q &"! #Gɠ7# !"'V nq]&"! #Gɠ6" "#g&v "Fɠ6" "=/6 ee(! #Hɠ6" !&h5k '! #Hɠ6" !%gl-) #Hɠ5! !&V&)! #Hɠ5! # H(()! #Hɠ5!  %'"&y)! #Jɠ5! %''"%Nv(" #Jɠ5! !!  !+[%! #Jɠ5! ! $@"! #Jɟ5" !')$ #Kɟ4! $O'  "Kɟ3 &`+}v&  "Kɟ3  %@.I"  "Kɟ3  &%& H)$ "Lɟ3  $P&%  "Lɟ3 !1&#" Ps$  "Lɟ3  &!&(#  "Lɟ2$%## !Lɟ2!k$ !, !Mɟ2 +Q# 1:  !Mɟ2 %%=!)O" !Mɠ2!$_(,f$ !Mɠ2!UFV"($ !Nɠ1!" "#  Nɠ1"f #"I"  Mɠ1 ! $ "   Nɠ1"`| $ #Z+  Mɠ3 "v %  ]" "$%&"  Nɠ2 !Zr % $ k"''&!!   Nɠ2 !m % #>%&&""6K[es}~L   Nɠ2  S()$ $&&8W#  Mɠ2 (!& 9'$' ']s=  Nɡ3 (_"&"^+$' <ڥg2  Nɡ4 ("$$c"=nN!   Nɡ3 '? ")㘒ݯo< ## Mɡ3 ' #"" ՜a( #! Mɡ4 "&!# mԙR# !# Mɢ4m #5Y! #" Mɢ4 !ڄ/#! Mɢ4# f"!Nm' "" Mɢ4# vq"" z: # Mɣ5E " + " Mɣ5 $! " Lɣ5   Lɣ6 "  Lɣ6 " } Lɣ6 " " Kɤ7 " * Jɤ7 ! ; Jɥ8! R Kɥ9!q! Mǥ:  Rɦ> ]}C4 !mLP ! /x)je B& Y  ZnA   3tI.s /*/U tA6uT, a=x'T"S{/M/SǗF Y);E& D™!qv\OHECABCCDEDCBA@?>=<>?@#AABCCDEFGHIJKLLMNNOPRSUWYZrV Y L   0Sց ֈQ, 4 y%!̓Ǽy _ǟ ګ= ~~坎Q~rQXq˂3$|k;t᏾8Y EП7|ɴ|skgca``abdgkqwΌgݺybVMHGHIJJKJIHHGHJMQX]co|!ܴVHofOGGJLOPOONOP#ONMLKJHGFGJLPYcp|շgLFLOpϕzQFINPPNMLMMNNOP'OOMLJHGFGIMU\dp"Ҹ|_MFIOONKn֕PFMPOLMLMNNOPONMKJHGFHIMS[eqx$p\NGGJNPOLKMLmОfCOOLKLMLK"LMMNOOPOONMKIGGFFGIMQVZ`gnv~$|sh^WQJGFGKNOONLKLMMNKlϢSHOKKLKJKLMMNNO NMLKJIHGFFEEFGFEEFFHIKLNOONMKJKKL KMJkРTMKLMMLKLLMMNONNMLLKLKMJjϡRKLJJMLKJKJJKLKMJiϡSKLQPIKMLMLKMJhϡSJKMPDEUNHLKJIILKJLIfϡSJK Myp?ISHHIKNPQJKJLHfϡSJKJLJvÿf@RQPLHDEOJKJLHfϢTJK?CɎEFL[nLMJKJLHeϢSJKPO:IDOILKJLHdϢSIJHGSFOrDMIJIKGdϢTIJKIJBtFNHJIKGcϢTIJKIIJFO@~gDMIJIKGcϢTIJKHGLLMMO;?OHKJIKHcϢTHIJHHGFGNRJIKCRFAMGJIHJFbϡSHILLNNOPPECi`LsZ6HKHIHJFbϡSHIJHS\PLGDB{t/ےPHIHJFaϡSHIJGM@rгku뫔AMGJIHJF`ϡSHIGN=JZBIGJIHJFaϡSGHIFLA=KEOHGHGIE_ϡSGHIHER@eҐIMIGHGIE_ϡSGHIGGPE RKJGH GIE^ϡSGIH GIOH UKH GIE_ϡRFHG KL mHAJEG FHD^ϡRFHG FIQDq?KEHG FHD]ϡRFHGHEL= 6TSBIFG FHD^ϡRFHGHEK? ;\AKEG FHD]ϡRFHGL C`:LDHG FHD\ϡRDGFEI@h NP;KDGF EGC\ϡQDGFGDJ= ʷh>IDF EGC\ϡQDGFGDJ? XBHEF EGC\ϡQDGFM LEF EGC\ϡQCFEDG@e @HDE DFB\ϡQDGFGDJ<8LCGF EGC\ϡQDGFGDJ?a=w=JDGF EGC\ϡQDGFGL fGV\?HEF EGC\ϡQDGFEI@i ɻ8BHEF EGC\ϡQCFEFCJ;D8IGCE DFB[ϡQCFECI?eAMBDE DFB\ϡQCFEKHo?H=GLADC BD@[ϡNADCEB95CdJ>I6FL@DC BD@\ϡNADCBCGHD:55BAH6DK?DC BD@\ϡM@CBA@?AFHHC?F8kCI?CB AC?\ϡM@CBCCB@??BBC@MyDG@CB AC?\ϡM@CBCCBB@E;dFCAB AC?\ϡM@CBC?H4RH@B AC?\ϡM?BAB?E8kEI>BA @B=\ϡL?BAB@I}PAF>BA @B=\ϡL?BAB?E7_*NkDC@A @B=\ϡL?BAB>G3IF@2cQH@A @B>]ϡL?BAB?E7m@?AG8=CF?BA @B>]ϡK>A@?B=CB1i:C>@ ?A<\ϡK>A@D4E>B>?F6H>C?@ ?A=\ϡK>A@>D93F=A@@=D?4H@ ?A=\ϡK>A@A?A84E=A@@B=C@DQ>A?@ ?A<]ϡJ=@?@:JAn5C=@? @;S\:A>? >@;]ϡJ=@? AFDN\8B>? >@=Mn7C=? >@;]ϡJ=@?@>CL@|I=@>?>@@<]ϡJ=@?>A?uhu7C=?>@=J5D=@? >@<]ϡJ=@?=BJ2A>?@=C55C=@? >@;^ϡJ ? =?:]ϡJ =AI/D<> ??> =?:]ϡJ =A;}/D;> ??>=<<;<> =?;]ϡJ =AF/D;?> =@:{9A<>? =;:;>@BDEFGC> =?:]ϡJ;><= <@;y.D:>= >:C0?@;=?>:?GHJGEDDCBJA<= <>9]ϡJ;><= >;@F-D:>= <=>><9;EGFJAFL[lyk7@<= <>9]ϡJ;><= ><>As)F9>=)>:C.9B<>>=:9>FJFF@]p1B;>= <>:]ϢJ;><= >:JD>@;=&<@7VN<99:=DHHCPz`9?<= <>9]ϢJ;><= 9JEu1A:>=$;A3|@JFIGCHaܰ|O;>= <>9]ϢJ:=;< =9JF2@:=<#=9B/z;HDLaǚf@/-8< ;=8]ϢJ:=;< 9JFZ4?;<";=9I婤โW7-2;AB=< ;=9\ϢJ:=;< ;JF-B9=<"=:A1ةvG2.6>B@<99;< ;=8]ϣK:=;< =:EFE:=8]ϣK:=;< ?7>;<=:A2ݔL008\ϣK:=;<=9A01A:=<=:@2gÁE-8AA<9:<==< ;>8\ϣK:=;<=9B.2A:=<=:A0굌V6-;B>9:<==< ;>8\ϤK:=;<=:@3b1A:=< =:;I0.4?B<9;< ;>8\ϤK9<:; :<9F3?9<;<8@A>:8:<; :=7[ϤK8<:; :>65?9;:<98:;<; :=7[ϤL8<:; <9@/:=:;:<<; :=7[ϤL8<:; <9@/@<; :=7[ϤL7;9: ;8?.G9: 9<6ZϥL7;9: ;8?0N7;9: 9<6ZϥL7;9: ;8?0]5<9: 9<6ZϦM7;9: ;8>1q2>8: 9<6ZϦM7;9: 8>21>8;: 9<6[ͦM6:89 7=33=79 8:6^ЧQ6:89 8<5B<898fS7:89 8<6Y9:9 8?qO[:9898;7->7:9 8:5Hz+p:86<0y-=698 795R>896=-n'=698 7f?{A57767676769^"VE676879X0U˙S8677898986;a)hndStCkWZ6!Hm\$~ًo:w> كo{ a"L"4M'S9'^qZ/USO^C+hMJ&G@Ӳylto߫c՚  5"Yi\t։15LsX g8ocግ#f45@ B:K@8i ΁'&.)@ry[:Vͦ#wQ?HBd(B acĪL"JitTy8;(Gx_^[%׎ŷQ麲uan7m QH^eOQu6Su 2%vX ^*l O—ޭˀq,>S%LdB1CZ$M9P 'w\/].r#E|!3>_oa۾d1Zӑz'=~V+cjJtO%mN |-bWO+ o ^ IH.;S]i_s9*p.7U^s.3u |^,<;c=ma>Vt.[՟Ϫ x# ¡_2 IDATx$Gup9.(S &$c 6>26 &c0 2@|:t{iosMgg潮鮮~U/֫W1A)zJ)G)񻽣=Օҭܮէ|N,'{)=3/%27Otvt2xo4RG!Y.{d~D 7d2^1"I&Y+ya}= j8Uae a#3pi(yW=?|ӎ~_HY2$a2(+3w ܠIzX+ )|JΚ33/y ۺy5Om'[6oYWWW_]XXX$١ptz߯a (.U;l}۾M-tʕ+mɒ`|+*,,Kvg; iߴ=p8MX@-&cl;]VadpYdq\Pڱc=V۸icLR_0_Ǽ3f,ky[[[+xl*D` 1'ϻ嗼_ے;v675n۶-V*u9bjh!{σ6{hvGġ&ՓcYp8փ+!G.f{ǭ:v1K-QTTyU/}Pxp7|z6̍}XWw5O7߷?ie+K. 14C@8=~֏#.0z1CdG4j!j=éb5O>%KoW=7p OaLv}]kTDyz~K/ʵO>(~ɳ<_*;b L@lJR>LC(A+&3B|0సȊ٭ޚzSW̙^ZVڵdD"*_u`Pkm]ߺ7^tWQYFGz+? #cMMP4&8cyFm!B\g[4QxȷSO=-,}ߥ6I干&9=m2@f!*lBwvt7\җ\uͲ=c]/y߼-6gkhlDbz A`JKSV;f2[jUGKs1#Ct3A4/ f[d]qyf:ԥ?M~9 52sLJD[v6oڒky],_y+M/2oE"Ld<br#N޽;eK{= 0 Jf;}lFpMCvIk-Zdr{1ŀ??BHy3@*)$s&g_}A"B'A`!@,͚5;IԾ}{wS:rpAq ] M,p0"""]6rq<f)k:])BĦ0BX }$1>77-Im~d!&ɡC!۲yS, 0;q:;ϴdk%i\7Q_?qڹwlߑOիOXC nG(v 3zD K~c!O apv{+ղL ֢<\EU\ހ4OuQN7$GuPGq+;[u3n2@c1k9؜K9Vu:|\M;Dء֖d%DY0ćV#@āRJt&#p 契N Ҹ7&;ZR&~5%YGk[Dڝk+fڢ@ԫk$ <5@^.1sؔcy1+uAB~i4/ߟ%x{8Lw6Rwt&ל%Gaʺ[(@8|ciZRk±mbEǧRO۟M7_+M_ҧ(Mb_}2HOBz-絚{tk=6Q:;X{m^kԄS(o={is`zx4 D|8F1oa˾6{nOm;IWդ8fhI0蔟r":Όق "5´x.҉u<>gcCRSRo׍p[å A,- g ?]S":D(䦭N[΅"#HUA4D@RE &J$$>xH (A{aY<"3tTYLړۛmsemUmUBzHXs[fhvKK+wIhꊿ/_n 4m,WĊ QPNu.lP*[I[ɶV6:kջIAv(~#NY  / i^:{?'`֑};+m  '''|g"A}S9O#L/`CKMKH;7 jD"J 8 &P= ="6Қ% ^}s^_~Z)_?48BacK9$[i&m[UdwڡZkInWk /WFGgG-X} &74fmzʡ8ojnigUZk-X(F_'|3@K7^v_H?ȴ/ҿ;\2e"@nы2׳x&8s}4B=Jq-4P=D( $-DLDbDTT3/n}Uj,D-YYI/ xpO{IYxgN2룳%9k@}%lhǦ4V`(&^j5UU1n'SǹL(*~~R:\͝37!ΧlՂv&{`cqКjk=&$*o @чfsY>!40/5%2u s@@TKIUJ%n'ΌFE$\(HHu R7Gz!"J"0i"5i.M>H0''( cD(IڝMû*mvhn}\-duf . :J[}KBV^hvMf)I-Mzk8D_ihh ԏ"RM+dO$D BgBITB*R @ V95Ml^Vfv|w;X#"tI RHdhNLG4%)!=U;)#]{mg3IjCMD#~'D5Fą>IL0WøÂ6R?k_޿׶m*buSL@U=X 0 >yÜ`ό>w$G(CC'O P[pFXqS B4UKLޚ(:D뀘0?;`Àɿ$nvpo TBv[1+h=n_ɥR=[#gE*&_J J ڪv p=hTDgZEFyo4*]Ue!Sd~;> 8@6.42fLq_ Yo'` I-C7:} ճ1ٯqɯ2ٙtSR;j=ɞy?²27FYm $1NYyÃauPcx/}f;̥3%?ʥ_STwA#^ WШCND|%48^RsHx#C)swT yXĝM Iup&?ztA`Agh3@Q61閹>vXI{45$@@@W:@4cGᇩ m){Q0st @~樍c/q P}S L~b]S0ƪ ` :_4mD)$Y/DtcΜfa EEz3X&wDMu@vP޽Gz Tv@X'j{xM`k zpm֢8K,_ EϮ(MmZҡ7++'޹BCIK0.HzA9CƻQ։@L'j4)u @'۴PeR7e..W< S{VBw IDAT?Om5o4v;[z}r*/S !3CZXdh ׀(<!06kz/")~ Rd$r*AfEi*A—(X3"@8:Oe:BdT3l:m}3w5vH}%Tcr[6[TEN8>퇜x4wjAPzpmנGF`Z6*Bd)d}\=>3=Z腱6񾌳 6Z.JxE; B@j3N\>S7[^;5+B Y23Jhkf )nzYyLgׄjƀiR\B7Œ4x!/SyXElfi z;Fc$'lcs\ssfڍo04ߔl&!Sˢ1b=ͦ*t5}_'O{ gg6lxˎr.EBt`$R"@ǠUFY‰1@0Q+mx ! K")`(P<A$$>k}69LDe;pᙋ|ы$׬ɿ3 LALAgQfWC̃T{PpPt +fjF*7=L'J F@0nnOtb] }>4^!; {P6&B͓/Y'BK|""CMT\ :ڻqoSo&p_զ(D75N }>,^f7 gpn5ox?x<mO&`^' >"F:*&ywDG:ĕ;_ <}io,z9%0 @0=?‚FtG4ʇ<::6`c)c $&dRBRK2W{A: "c3叚 3p!S67*(x@ޅ;T!.ёGxB WKp1y?p 'M%KO$X+ b7qxv|Sx)#@V HTy-DL/bc60kQvF>/"]WāDMr "Slg0^x"{yKmղ wݾArP8~g_^zb{n{m}o/AtG{RE P"bWβ~N/)C6#8ݳ!GRpH!G[r!桺Vk|!F`}x ζw+Gzm@Vq-fUf-ͳ[f_G|\Xf{y_# &  (۷xBv_sR;QXQK%sى֛2Bx ru]R|z4Xv؝oE6W:RV 7ܤVRHGuaA~@Vv#k3NZ`#>.qpaё7IƜܼ ,‚bQQ@5m)ۥWor.T v΅g,~͜Yf=bZsv/i=K+Z,ۀKd$B!E O޲-:XY u.U0 BqT. 3!n5Fj@{onҵZ$D4(_˸)^G]P},"/b_cIj4Y  ݁}wcÑOJi+6qmjtQX}@@NZv:FAz* !Hk$A2څ1KVM;k~TSE.Sv@(q0:%ј0P{͙>Ñ] Ԝ@bSڟ-U.5>v}_lsߡ&M!j-oRc/y&i7~6;(]\A3< S!t͛ BkZ3GGgvl.|dᶂTuWŶWt_6:EO`g o9.8}‰%Fq?0_EFZoC F/Ph.?!0|iM"/@|b0WQv>s_co=^tM8@q48[ev$מbo[~rbeKc9t3"C1!4Wkn%:Y\ִ}BlrC_z8kvW cY~v|">>x7਄vVVIѬͲV^|"ҏwki LEȯm|PQ0RƱW%&e39ڵN"4V~ {0J cںVm;]bg\˚p% N3^~zev²YV+Iŷē#'J ^|=Mzݝ6N%{C?/!XXި5͗o{AA)P+햯kk9u9R>KA8ROXV.| qo+S(ߺiJq?%4 AwK-w%m30;O/_U5k 0Vޟ A@g@*г#c'A <#|;wn,3wJ B0I Q} \lUMDb;C"`lz}??v7} P# F|R[|%\q60$g3$`6;eҘ@AW:-17\wsHK =x!q`0'"8(!@ZC]d|7ҏU 2]oT0=ڙo`z‰d3'ߠQB~\{W;[lo 5?NC@ fd6jK{ (_S~tßvw_cw><ij!x\ә['H5Q mU JAA@ v$@\]V(.W/nIcCM fMc5>?#e;;% SZS2egtOmX%3/?i. U=8͹{$E*AK 95on|$?<7e, /;N:%۠Jk3$p5hC*!.y\+L?cB~QPBƿ~_Xkd^$ vAKy8;*CIZבDC=_\Imj-_3}\B9z+k)`avPfD6nhMI_ ۣӀ!K3|ʵw af mJiց\Mp) ^zLiy@kAV+ԥ;;W^ΎhkAn(A Q|[_"k9~=w?'OS%-_C1PoK (GaX0 p5y*&"75 gc&aqkoRn U9rHZvn9 >&IO#w0?wfc+ׇ5h0$gG*{;'hBF`8и<7N Xh/yzrD(B,Wy5$gZ-{$#wSF@~s9ҕ0gtCmǛSQl.* bF"Wt@XL;n ᙣ?,VL@*F@Dߤr9iL~y: 5$`!v[GQI#gjk,=v_ȀҖWn9ZOpI8:q v˽ ~Oz҂iQ)-:.kS|QoT 8)\[o+m@_o_>&['k{3)X SkᲧ  =8{6gw!zHBu* nċ~! ϑ 0 ]ScZebOa 4*oa~nOC_>33pժSS}r+{Gzp|-m3m87f ;Ŷٶm}ȾW至ŋ^}jEE/D@)Mhqf2{oImBZ{wʓAPl$y~-jmuޥAB@!D nG(ڢ{\\QS{a,eʃ>t\_摍,4pDf!|I?I{hNFQi#@FiAG",-=vI3u_$3,cu#q/tbF$VaxO~ll T#Gɀ:nXsE dn_/^\I(͟a_ɓnd?C]rٛS*Ά@Ї.:{%.&ΆsK ZE+@>ƀÎ:7|8ܵ琇>=w:bMONR 4`^4 8{<"g?ۊ%Kؒt/Kfkvo|*J٩ "RG>ƻh`O$ky3r:{g> =x;!'XP41ixtQs4o\k{tP['|)h0(E&;z̾11_ܱd+Wby|$ xFizA ?MEf_v4*wIQ >JHj8.+յRԝ 1/n\\ :YƠUu7i/ey,mzSek6Ԇ&k͜UaWβdSTJAcV6hW\ GOqbomkk3ZV]c2G2EFw=&)sNYd;vV8+!F!јN}y4KS 548_H!jOه R=w"펇jPD]_CߧQvn&ZsV=NۼmrfEJX<:(6!*j| @gٵ!G>?vqOoSDKn}`0)D5+vK]  wܜNGxbwqo,UoDg! 3&> j8/EmYR[0DX<2I[B'}%bqylRSh8ͭ(= . t xso?WQtowmY%|SV[/;ozm{ =ɷV?֑S."a 1쒱-st]LK^mrI+ӎ7]$oRs F*/?lS BFAhu'72MNlƲ'hV H#0׊|B׏W8y01k|KD@agM]g7qNZ9.9]x1v y.=2G{JM 1Tجcʵ0 v :dB.>D}A6v.|Nu:loZ=$M@ߟ}񰕁jk{}fi㏙eHMx~{_{_$' XqV٩δA DJD]zbʇ.= HD4޺:f$1KF'ѫ{E06ϕN~EYiĚ{A ~rHr(Lswwr$wUL~G[> 9 %yIw^s G৾󐂃[:Z)'J U }}7 @/`Ue sr=H y!TKk+r d?C}Nu*i;$ҝy̮B"P""G;'Z89 uL.6نt$6v1"}g!</3Vͳf+)-u˰7,"t뤾=!Ȅ6pB=K n'@rD3j7>|-[fMrh*W'0  9 a۞jMˍ#P> )S:?NJ P/vfI'"KN oVeUnSJ/pm]P]{\^+ u//I-(Lpp9grojϾ:[퐯6SfC~WFܟbT,vՋ2 6Yb -^/F?' zg)TΤ`VJЎd| `CN $ه6m`aZ!K=FJJGFxucrVH%[8f-v׿z*Az!ᑈoDg򟔈dZ\efE]hMNtwuࢢ-:O j; Sc4/@fq;ZwPhrivKEa&d IIv.<DA J8txD2!W}{bct z[  pvK(^Yl[^&EY%9Շ]HQ^|[`&EŲ]%_Iѽ@F0^Gi!Π@N-!p%ZgPe͟?_ms?Cwڎuh^/JbSCqj H`f[\e8n2I8 e @LDQCDXÂDٰշ> @0ܕX\TyuَWϼBR-02~G3{j_oI,B"4i@8 T,Y+Nf{~OQmb?TQ__,_=BQZ xUEJ+| #q{Rrg!𑖟rG.EY|[apa|R=@'!˽ h"?f~n}>K B&XiI{?7G^2Q.X݇@ 3Ku߻_ b0&O+Kj!'q!YIQi^fE?08pU~ & E-]pUw#$N *Ybgv>x}q (K ?6 mE ui$1)`@jew;dpzy0*/jE, Ec PB]x)1~ \|[4SP*Dp*UZ4=o: )%}0^&zd2Céےm h(c t2O!!<(wrpy8;yj]޵ѥ#}*AR; BrH߭وvjwx4Ӑ"q@D #J).{P (<w 6AcQcS߼=dTA[,JTN Z^Gr f Űg{ٱ x 'Fq)T>uJ_R<cK`N=~lw͟U6}}"F}rigqkiD~Vއ ԙwҖanD%v8S(f["A&ӿO~^-K;& P4mIXsv\T-# Pot{l nDsؔ4"cQ- !aAHGN(@hg`lCj'u@. (c߭RW1=h R\附! 4 d$%,::*4-A$,ѹ  lu8n䖃#ڀhQ)3q+v AzFpbw!z3JGaIGq|yJl3/o9<1s`',J$,L5s9q8kA\d EeTKPʑ6k >F#S^xy -/q'Zן Y[8A7G:a8 ' aC)䰵D ^" @&l /."-e>5M:[9?NP-'@ "%M_\:CqEQ@@Ȕ[~I;-mZt%P;f" u$[,i ސ {(%edTjLޭ' '*z2T1-DIA"K+%E_ l;i0?cR#FL^V L_5S+Cͪ.+ 9R\@/[X*cY=TKZc|SdMrOwvB~j]ضNGf0xkԱU6w(bήZ= !Sm7J c^\ W':ۿ/N>}c/\yΟ48 MZ7oNO?~Q]ݶ m;z|Vveb@,h.1hl H q BKˬAN;';.9{Uhps:km{9G@-]Xcnpߣ)DwBʘG3[ܰǽ b vQy} @DǏ# [% ݳE3 %BymWhJE,Fq +?>? KUCvF:"ˠ'ceCc}WOaf487A@EC`7ľ=} @ ϱ@7/F<ꗬPXmoqr mq>͍[dX4M}\{=(R@PM!S36ɥ!0\tF۴F+ *@0jVh߀X;(URs!0Cd8]Z 5nWdQ-5LR@@‘_8Z}yΑ?x= Q$$Tq[Њc@ HB䚺FTu Y+/ |vEh8=ˌs!jZcfث.\.գ/:RL"sgڵ߽W&X^M [VrPP-,B +s#ge.$- A&.9Qҟ!c5 |@?&ӭfX 5U'T=oz r_w8dXtAw}FψkP[g2lM  4S‘[=_|&9TD*هK:J rzlŋ@߲f=fYBS9 iDԌJe'DRbb74fX"ǧBm[s\ud-A5ښ6YBe{97K#.V[X ;@o~ivk`ܟwB7zǧ~kwr &ԢdK4 [v*Mح`7¥`_f?s{_+0p`(MiD/(DQSA;ZŽutfPh3Hx52bQY\K{wc MJ5`pB-afV)9MXL[6k#K/9g}W،MVU;b DÐVIX`A0s6#Sf'/mW)+f |"eZ'%Aׁ p\p~`ГsXb01@% H!9! <'~ʓ>b10bWȚf>Z_ qI0a q? cH1g/ݴ^TAv!+Q8!nMm kjQN* *wwn{OPRT` %*Q:6#hS&q|$lNOULLL{R1V_?EU+BȟSP,ammf4 Rgk<6]3 UZ y_1WK^b'r% yyK6!aU KkUŒ0f]"6xmQmw<~q&v{X,3^ @iGS/gN,b7n]gk){%'N\_GއS=tp,hˇ===&~ $4uD}y۲.f-t ]D<휓+Ab!$M"z5 uRryBzBDO>ї+7_.2; pBHsiye[a,V+4;RyEl AA=^Pxv#5;lۮC#.ғ=#}T7#?&/5(xV!A\zoĢy7,͖'!p],;^]t8*%v ]JJjD$Abt)vYsbYW;@~uѡ"P\u}R'؆|&~nq@ z^J}@ϡBGW7 VCοWC e6moAd `7zm%>)Z{N9 "R-ͮo+ :Q0e~ԣ3V͵3N+_Jܞux;MIDAT98>qt HDVB2!IE}8+k5{·*m ^M挕vH\lU) \3"HGZ34.t70gk7~,dz$vNȑ{0 muжU٩+g:= B~f8;V{@K"oH"=G!bHBJK*g+n@품.?_Byn#IIEs.ϴ$)O=|<T_YΟyB!f%k8?o#p?{z4-X Հjy@>ՀzrLF; rىeTKr2T|Ԏz;%ʵ}w>4e* ޾' VgH}b}}SFdWioPX{j}i$8LĠs?閈N:Yw䗌N|Tgt*mNKG DxvA."y$"T+p !wuACaS#إV9_b\Z/nuWjUc?|-]3_l >%_ T.Nmp z eL^r߿6l?זӆ(H=YЃAV nIە9юݓ뗏q9Oջ:?-=WuxqG}ȅ5JCk5( b͒9eZah*ivϞUkc]rZ uMf%\7zڳ`^ ps %/ڄ%>c*44uZJP Y`GO yJoy_R ~t9@h_Vtl\h u)`Tչ@ Pݡx|]OhC[n">"~^S;!f-0@@G*͞S( &Q3ʭ-[#Ү_nxsfnZcg-):2mx܆給G"8󐘫Rҏlt R8-xYmm" !vHǃ QH-$/l,hDnb.8 hm>MFR-" WIG"Ô_P78I}d7dߍc/.k_;T;(>m}1+B< Xݴ{\||~/^aGtٳX( zJQ@\ZS 1!SSdh'3iuZ `x=Cq]XS,j={s8p'0`T~d`5ZAhcB# ijJ՞/`i4rt@ۓPOFИxl0g" xQmqOM`+D\}[nH/>nqp03nFph_Q(N@A.nTO7 ?` Gg*˵FdYW&Rq _iiXˆέ_nUQ6BX"ٌ\'MJJk_ R$ 7Z(U`T `Q0c!gBR1ĬD6R/G!PK8_TSXq ~+/ʛ=s{+b ,4]:\Ȩ.PQpy JA6Up8>c:kCK4̙\]+6P7X֐FRBHa:p]4f@`D0XG(64D _ƆAJɺQDzHs>_7bNKB4|Am0g7]҄5C|e_(V-WcZZ0?R bjF /D/ i"Z" b5N]*F!fv*sw:mn8  i ][G@^SWF]=]9`灛u8jIgdc(@;:VBcq*el\@S/<Frp @m0"Dn)ؖN G"5 YTZ"[%bEXbo1Jʃ-6 t.B`Mm+%klCaC:yVD,3PĊ{4ۥ02h羻5"z:""v KBvzuVlΎ'W .H >Pw_8B ]׀|j_ X2DO/G@I Hy Dw[c^lEUDmg}>ګmABpX??r{Bm]^()ll{Gvv: 弞ہIe alz#W^\@!P 9&dN\ob[䃡H$cįSGs{Doj+d!))OٸgBo',J\J`ov#e*h6U(bz&.?>.޾pSοJxWʛצ& PΧ(I #5+pom@l$҇`x%,2l(YE+V(*Mzya" pHz /._2_6qT UVY\r j_#^>(Sht:+b _y|)Em` m9d*Xn! &Xwjr:===3- ~/^ ^_@Dsp|IG(5/$}C!_~wP̥sWH ϧE{KSGēqLhI(PA!-q ^&?fhC@. ={fx+Ø 7˗mjZs4B50}g2}F>s>x NHt~s?9*O Zk< ׌90bg D>DUcәԉSF#PopnļC:J#@#{"űŮ- p{KT47e[WoΠe0qi|UO6!RCzl<xY:7ӟ3_E.VHe3<}jBΧz0Q}|D"ʈ`򂜚Ka#༟zɔB}y3j u首fS?w3LYWvttҩ7OOgbv|m(vcn\ < e 8g_~㢔 8zbGb ,GRB;o~):Hr VBv>3vi˃-W^,|RwȤG҆5Rٹy9B!!'kTrN@XA2gESq[[rPk;{:=;}c;%.G\аdA50p|z 4fIvC&` hgه0ҋ7D/64_Z{Ghkk3Ñp_?8zt 0O=8֤͍uSg&Rtƪq*%Y} \uUx*n]p'JɚνآgH9<3?;~?v@)Ti_aM{nbdskؕ0"5^ARMϥ(ֆ%_v)iK۳[*i駾v~*/ayh_|@=ޗ7in00UP(`伟z,.-w_i[[o >_AYa ܺ t {歳'f wuJ#PXod9Tg#>H3~{ȘqSoPK d;_Ov~g-#I(^az{_.z!W@kAOʼ4EA%pªv`.>y."ѽKoj%::;^y/}{}(/$rN |>w_.WPb9sW7A_`qIKq{" ˻J;ߛ0:w[{zb 3vBN]DŷG|~>ˤnoЄf!0mLvmjDdI2:*})據hߗ5ܽwuDo+8@:f31% K"@i!#/?w)9Ns#;2Crkywp [B@!>Uv|K8֩kFoZ4=}:\CG 7L|פֿ+A8;[[b- R0].C$sn1$(K\JcՕB=v;Vx$u}cE__Ίݚhnmvtuc- ޟ~OCO;?VWtj RDϮc?uʕLn6>O 12f(|)N,_BkB`\X- ѻy? Z[S"EЌz: 襁!,d؆&}vbdeWn[(ΞY*^ϲ(ʵ<Ӳ0yX 2>1|y?CO}x<>I|;>v,zy5|eB {1Y(;{tDjbx#0*G,`n_fuTWƹxm-eÿlr+;y{sq!v.;޾/.{y{MNL.]97zqAs};>KwJ5RS\IENDB`icnV CSubsurface-4.0.2/packaging/macosx/make-package.sh000077500000000000000000000026261226345450700217200ustar00rootroot00000000000000#!/bin/sh # # this simply automates the steps to create a DMG we can ship # # for this to work you need to have a custom build of MacPorts / gtk / etc # with prefix=/Applications/Subsurface.app/Contents/Resources # yes, that's a major hack, but otherwise gettext cannot seem to find # the gtk related .mo files and localization is only partial # # run this from the top subsurface directory # install location of yourway-create-dmg DMGCREATE=../yoursway-create-dmg/create-dmg # same git version magic as in the Makefile # for the naming of volume and dmg we don't need the "always 3 digits" # darwin version - the 'regular' version that has 2 digits for releases # is better VERSION=$(./scripts/get-version linux) # first build and install Subsurface and then clean up the staging area sudo rm -rf ./Subsurface.app make sudo make mac-deploy # copy things into staging so we can create a nice DMG rm -rf ./staging mkdir ./staging cp -a ./Subsurface.app ./staging sudo sh ./packaging/macosx/sign if [ -f ./Subsurface-$VERSION.dmg ]; then rm ./Subsurface-$VERSION.dmg.bak mv ./Subsurface-$VERSION.dmg ./Subsurface-$VERSION.dmg.bak fi $DMGCREATE --background ./packaging/macosx/DMG-Background.png \ --window-size 500 300 --icon-size 96 --volname Subsurface-$VERSION \ --app-drop-link 380 205 \ --volicon ~/src/subsurface/packaging/macosx/Subsurface.icns \ --icon "Subsurface" 110 205 ./Subsurface-$VERSION.dmg ./staging Subsurface-4.0.2/packaging/macosx/sign000066400000000000000000000037171226345450700177400ustar00rootroot00000000000000#!/bin/bash # Hash is 3A8CE62A483083EDEA5581A61E770EC1FA8BECE8 but it doesn't seem to # find the key by hash echo -- signing staging/Subsurface.app cd staging echo -- signing Qt frameworks codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtCore.framework/Versions/4/QtCore codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtDeclarative.framework/Versions/4/QtDeclarative codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtGui.framework/Versions/4/QtGui codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtNetwork.framework/Versions/4/QtNetwork codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtScript.framework/Versions/4/QtScript codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtSql.framework/Versions/4/QtSql codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtSvg.framework/Versions/4/QtSvg codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtWebKit.framework/Versions/4/QtWebkit codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtXml.framework/Versions/4/QtXml codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app//Contents/Frameworks/QtXmlPatterns.framework/Versions/4/QtXmlPatterns echo -- signing plugins find ./Subsurface.app/Contents/PlugIns -name \*.dylib | xargs codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk echo -- finally sign .app codesign --keychain /Users/hohndel/Library/Keychains/login.keychain -s Dirk ./Subsurface.app Subsurface-4.0.2/packaging/macosx/subsurface.bundle000066400000000000000000000131451226345450700224060ustar00rootroot00000000000000 /Applications/Subsurface.app/Contents/Resources ./staging ${project}/subsurface.sh gtk+-2.0 ${project}/Info.plist ${project}/../../subsurface ${prefix}/lib/${gtkdir}/modules/*.so ${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/engines/*.so ${prefix}/lib/${gtkdir}/${pkg:${gtk}:gtk_binary_version}/printbackends/*.so ${prefix}/lib/gdk-pixbuf-2.0/2.10.0/loaders/*.so ${prefix}/share/locale ${prefix}/share/locale ${prefix}/xslt ${prefix}/share/themes ${prefix}/share/mime/mime.cache ${prefix}/lib/libjpeg.9.dylib ${project}/Subsurface.icns ${prefix}/share/themes/Mac/gtk-2.0-key/gtkrc Subsurface-4.0.2/packaging/macosx/subsurface.modules000066400000000000000000000040441226345450700226030ustar00rootroot00000000000000 Subsurface-4.0.2/packaging/macosx/subsurface.sh000077500000000000000000000131361226345450700215520ustar00rootroot00000000000000#!/bin/bash if test "x$GTK_DEBUG_LAUNCHER" != x; then set -x fi if test "x$GTK_DEBUG_GDB" != x; then EXEC="gdb --args" else EXEC=exec fi name=`basename "$0"` tmp="$0" tmp=`dirname "$tmp"` tmp=`dirname "$tmp"` bundle=`dirname "$tmp"` bundle_contents="$bundle"/Contents bundle_res="$bundle_contents"/Resources bundle_lib="$bundle_res"/lib bundle_bin="$bundle_res"/bin bundle_data="$bundle_res"/share bundle_etc="$bundle_res"/etc #export DYLD_LIBRARY_PATH="$bundle_lib" export XDG_CONFIG_DIRS="$bundle_etc"/xdg export XDG_DATA_DIRS="$bundle_data" export GTK_DATA_PREFIX="$bundle_res" export GTK_EXE_PREFIX="$bundle_res" export GTK_PATH="$bundle_res" export GTK2_RC_FILES="$bundle_etc/gtk-2.0/gtkrc" export GTK_IM_MODULE_FILE="$bundle_etc/gtk-2.0/gtk.immodules" export GDK_PIXBUF_MODULE_FILE="$bundle_etc/gtk-2.0/gdk-pixbuf.loaders" export PANGO_RC_FILE="$bundle_etc/pango/pangorc" APP=$name APPlower=`echo $APP | tr '[:upper:]' '[:lower:]'` I18NDIR="$bundle_data/locale" # Set the locale-related variables appropriately: unset LANG LC_MESSAGES LC_MONETARY LC_COLLATE # Has a language ordering been set? # If so, set LC_MESSAGES and LANG accordingly; otherwise skip it. # First step uses sed to clean off the quotes and commas, to change - to _, and change the names for the chinese scripts from "Hans" to CN and "Hant" to TW. APPLELANGUAGES=`defaults read .GlobalPreferences AppleLanguages | sed -En -e 's/\-/_/' -e 's/Hant/TW/' -e 's/Hans/CN/' -e 's/[[:space:]]*\"?([[:alnum:]_]+)\"?,?/\1/p' ` if test "$APPLELANGUAGES"; then # A language ordering exists. # Test, item per item, to see whether there is an corresponding locale. for L in $APPLELANGUAGES; do #test for exact matches: if test -f "$I18NDIR/${L}/LC_MESSAGES/${APPlower}.mo"; then export LANG=$L break fi #This is a special case, because often the original strings are in US #English and there is no translation file. if test "x$L" == "xen_US"; then export LANG=$L break fi #OK, now test for just the first two letters: if test -f "$I18NDIR/${L:0:2}/LC_MESSAGES/$APP.mo"; then export LANG=${L:0:2} break fi #Same thing, but checking for any english variant. if test "x${L:0:2}" == "xen"; then export LANG=$L break fi; done fi unset APPLELANGUAGES L # If we didn't get a language from the language list, try the Collation preference, in case it's the only setting that exists. APPLECOLLATION=`defaults read .GlobalPreferences AppleCollationOrder` if test -z ${LANG} -a -n $APPLECOLLATION; then if test -f "$I18NDIR/${APPLECOLLATION:0:2}/LC_MESSAGES/$APP.mo"; then export LANG=${APPLECOLLATION:0:2} fi fi if test ! -z $APPLECOLLATION; then export LC_COLLATE=$APPLECOLLATION fi unset APPLECOLLATION # Continue by attempting to find the Locale preference. APPLELOCALE=`defaults read .GlobalPreferences AppleLocale` if test -f "$I18NDIR/${APPLELOCALE:0:5}/LC_MESSAGES/$APP.mo"; then if test -z $LANG; then export LANG="${APPLELOCALE:0:5}" fi elif test -z $LANG -a -f "$I18NDIR/${APPLELOCALE:0:2}/LC_MESSAGES/$APP.mo"; then export LANG="${APPLELOCALE:0:2}" fi #Next we need to set LC_MESSAGES. If at all possible, we want a full #5-character locale to avoid the "Locale not supported by C library" #warning from Gtk -- even though Gtk will translate with a #two-character code. if test -n $LANG; then #If the language code matches the applelocale, then that's the message #locale; otherwise, if it's longer than two characters, then it's #probably a good message locale and we'll go with it. if test $LANG == ${APPLELOCALE:0:5} -o $LANG != ${LANG:0:2}; then export LC_MESSAGES=$LANG #Next try if the Applelocale is longer than 2 chars and the language #bit matches $LANG elif test $LANG == ${APPLELOCALE:0:2} -a $APPLELOCALE > ${APPLELOCALE:0:2}; then export LC_MESSAGES=${APPLELOCALE:0:5} #Fail. Get a list of the locales in $PREFIX/share/locale that match #our two letter language code and pick the first one, special casing #english to set en_US elif test $LANG == "en"; then export LC_MESSAGES="en_US" else LOC=`find $PREFIX/share/locale -name $LANG???` for L in $LOC; do export LC_MESSAGES=$L done fi else #All efforts have failed, so default to US english export LANG="en_US" export LC_MESSAGES="en_US" fi CURRENCY=`echo $APPLELOCALE | sed -En 's/.*currency=([[:alpha:]]+).*/\1/p'` if test "x$CURRENCY" != "x"; then #The user has set a special currency. Gtk doesn't install LC_MONETARY files, but Apple does in /usr/share/locale, so we're going to look there for a locale to set LC_CURRENCY to. if test -f /usr/local/share/$LC_MESSAGES/LC_MONETARY; then if test -a `cat /usr/local/share/$LC_MESSAGES/LC_MONETARY` == $CURRENCY; then export LC_MONETARY=$LC_MESSAGES fi fi if test -z "$LC_MONETARY"; then FILES=`find /usr/share/locale -name LC_MONETARY -exec grep -H $CURRENCY {} \;` if test -n "$FILES"; then export LC_MONETARY=`echo $FILES | sed -En 's%/usr/share/locale/([[:alpha:]_]+)/LC_MONETARY.*%\1%p'` fi fi fi #No currency value means that the AppleLocale governs: if test -z "$LC_MONETARY"; then LC_MONETARY=${APPLELOCALE:0:5} fi #For Gtk, which only looks at LC_ALL: export LC_ALL=$LC_MESSAGES unset APPLELOCALE FILES LOC if test -f "$bundle_lib/charset.alias"; then export CHARSETALIASDIR="$bundle_lib" fi # Extra arguments can be added in environment.sh. EXTRA_ARGS= if test -f "$bundle_res/environment.sh"; then source "$bundle_res/environment.sh" fi # Strip out the argument added by the OS. if /bin/expr "x$1" : '^x-psn_' > /dev/null; then shift 1 fi $EXEC "$bundle_contents/MacOS/$name-bin" "$@" $EXTRA_ARGS Subsurface-4.0.2/packaging/subsurface.changes000066400000000000000000000017611226345450700212540ustar00rootroot00000000000000------------------------------------------------------------------- Mon Oct 24 04:22:35 PDT 2011 - Dirk Hohndel 1.1-5 - apply the patches upstream and now start maintaining the spec file and changelog in the subsurface git ------------------------------------------------------------------- Mon Oct 24 02:12:27 PDT 2011 - Dirk Hohndel 1.1-4 - upgrade to subsurface 1.1 ------------------------------------------------------------------- Wed Oct 12 10:26:59 PDT 2011 - Dirk Hohndel 1.0-3 - beat desktop file and other install issues into submission ------------------------------------------------------------------- Tue Oct 11 21:21:10 PDT 2011 - Dirk Hohndel 1.0-2 - update to newer version that brings Makefile changes and desktop integration -------------------------------------------------------------------- Sun Oct 9 21:53:28 PDT 2011 - Dirk Hohndel 1.0-1 - create spec file for subsurface Subsurface-4.0.2/packaging/subsurface.spec000066400000000000000000000016331226345450700205740ustar00rootroot00000000000000Name: subsurface Summary: Simple Dive Log Program Version: 1.1 Release: 5 License: GPLv2 URL: http://subsurface.hohndel.org Source0: subsurface-1.1.tar.gz BuildRequires: pkgconfig gtk2-devel glib2-devel libxml2-devel libdivecomputer0-devel %if 0%{?suse_version} BuildRequires: gconf2-devel update-desktop-files %else BuildRequires: GConf2-devel %endif Group: Productivity/Other %description subsurface is a simple dive log program written in C %prep %setup -q %build make %clean rm -rf %{buildroot} %install make install prefix=%buildroot/usr %if 0%{?suse_version} %suse_update_desktop_file -r %{name} Utility SyncUtility %endif rm %{buildroot}/%{_datadir}/icons/hicolor/icon-theme.cache %files %defattr(-,root,root) %{_bindir}/subsurface %{_datadir}/applications/subsurface.desktop %{_datadir}/icons/hicolor/scalable/apps/subsurface-icon.svg %{_datadir}/man/man1/subsurface.1.gz %changelog Subsurface-4.0.2/packaging/windows/000077500000000000000000000000001226345450700172455ustar00rootroot00000000000000Subsurface-4.0.2/packaging/windows/mingw-make.sh000077500000000000000000000007571226345450700216510ustar00rootroot00000000000000#!/bin/sh # # just a small shell script that is used to invoke make with the right # parameters to cross compile a binary for Windows # # the paths work for the default mingw32 install on Fedora - adjust as # necessary # force recreation of the nsi file in order to get the correct version # number rm packaging/windows/subsurface.nsi > /dev/null 2>&1 export PATH=/usr/i686-w64-mingw32/sys-root/mingw/bin:$PATH mingw32-qmake-qt4 CROSS_PATH=/usr/i686-w64-mingw32/sys-root/mingw mingw32-make $@ Subsurface-4.0.2/packaging/windows/mingw-subsurface.spec000066400000000000000000000130601226345450700234020ustar00rootroot00000000000000%define __strip %{_mingw32_strip} %define __objdump %{_mingw32_objdump} %define _use_internal_dependency_generator 0 %define __find_requires %{_mingw32_findrequires} %define __find_provides %{_mingw32_findprovides} %define __os_install_post %{_mingw32_debug_install_post} \ %{_mingw32_install_post} Name: mingw32-subsurface Summary: Simple Dive Log Program Version: 1.1 Release: 5 License: GPLv2 URL: http://subsurface.hohndel.org Source0: subsurface-1.1.tar.gz BuildArch: noarch BuildRequires: mingw32-cross-pkg-config mingw32-cross-gcc BuildRequires: mingw32-gtk2-devel mingw32-glib2-devel mingw32-libxml2-devel BuildRequires: mingw32-libdivecomputer0-devel mingw32-gconf2-devel BuildRequires: mingw32-pthreads-devel BuildRequires: mingw32-gtk2 mingw32-glib2 mingw32-libxml2 BuildRequires: mingw32-libdivecomputer0 mingw32-gconf2 BuildRequires: mingw32-pthreads mingw32-zlib Group: Productivity/Other %description subsurface is a simple dive log program written in C %{_mingw32_debug_package} %prep %setup -q -n subsurface-1.1 %build make CC=%{_mingw32_target}-gcc PKGCONFIG=%{_mingw32_target}-pkg-config XML2CONFIG=%{_mingw32_bindir}/xml2-config NAME=subsurface.exe %clean #rm -rf %{buildroot} %install mkdir -p $RPM_BUILD_ROOT/%{_mingw32_bindir} mkdir -p $RPM_BUILD_ROOT/%{_mingw32_datadir} install -m 755 subsurface.exe $RPM_BUILD_ROOT/%{_mingw32_bindir}/subsurface.exe install -m 644 subsurface-icon.svg $RPM_BUILD_ROOT/%{_mingw32_datadir}/subsurface-icon.svg # this seems like a really ugly hack install -m 755 %{_mingw32_bindir}/libdivecomputer-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libdivecomputer-0.dll install -m 755 %{_mingw32_bindir}/libcairo-2.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libcairo-2.dll install -m 755 %{_mingw32_bindir}/libgconf-2-4.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgconf-2-4.dll install -m 755 %{_mingw32_bindir}/libgdk-win32-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgdk-win32-2.0-0.dll install -m 755 %{_mingw32_bindir}/libglib-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libglib-2.0-0.dll install -m 755 %{_mingw32_bindir}/libgtk-win32-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgtk-win32-2.0-0.dll install -m 755 %{_mingw32_bindir}/libpango-1.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libpango-1.0-0.dll install -m 755 %{_mingw32_bindir}/libpangocairo-1.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libpangocairo-1.0-0.dll install -m 755 %{_mingw32_bindir}/pthreadGC2.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/pthreadGC2.dll install -m 755 %{_mingw32_bindir}/libxml2-2.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libxml2-2.dll install -m 755 %{_mingw32_bindir}/libfontconfig-1.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libfontconfig-1.dll install -m 755 %{_mingw32_bindir}/libfreetype-6.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libfreetype-6.dll install -m 755 %{_mingw32_bindir}/libpixman-1-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libpixman-1-0.dll install -m 755 %{_mingw32_bindir}/libpng15-15.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libpng15-15.dll install -m 755 %{_mingw32_bindir}/zlib1.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/zlib1.dll install -m 755 %{_mingw32_bindir}/libintl-8.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libintl-8.dll install -m 755 %{_mingw32_bindir}/libgmodule-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgmodule-2.0-0.dll install -m 755 %{_mingw32_bindir}/libgdk_pixbuf-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgdk_pixbuf-2.0-0.dll install -m 755 %{_mingw32_bindir}/libgobject-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgobject-2.0-0.dll install -m 755 %{_mingw32_bindir}/libgio-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgio-2.0-0.dll install -m 755 %{_mingw32_bindir}/libjasper-1.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libjasper-1.dll install -m 755 %{_mingw32_bindir}/libgthread-2.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libgthread-2.0-0.dll install -m 755 %{_mingw32_bindir}/libffi-5.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libffi-5.dll install -m 755 %{_mingw32_bindir}/libjpeg-8.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libjpeg-8.dll install -m 755 %{_mingw32_bindir}/libtiff-3.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libtiff-3.dll install -m 755 %{_mingw32_bindir}/libpangoft2-1.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libpangoft2-1.0-0.dll install -m 755 %{_mingw32_bindir}/libpangowin32-1.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libpangowin32-1.0-0.dll install -m 755 %{_mingw32_bindir}/libatk-1.0-0.dll $RPM_BUILD_ROOT/%{_mingw32_bindir}/libatk-1.0-0.dll %files %defattr(-,root,root) %{_mingw32_bindir}/subsurface.exe %{_mingw32_bindir}/libdivecomputer-0.dll %{_mingw32_bindir}/libcairo-2.dll %{_mingw32_bindir}/libgconf-2-4.dll %{_mingw32_bindir}/libgdk-win32-2.0-0.dll %{_mingw32_bindir}/libglib-2.0-0.dll %{_mingw32_bindir}/libgtk-win32-2.0-0.dll %{_mingw32_bindir}/libpango-1.0-0.dll %{_mingw32_bindir}/libpangocairo-1.0-0.dll %{_mingw32_bindir}/pthreadGC2.dll %{_mingw32_bindir}/libxml2-2.dll %{_mingw32_bindir}/libfontconfig-1.dll %{_mingw32_bindir}/libfreetype-6.dll %{_mingw32_bindir}/libpixman-1-0.dll %{_mingw32_bindir}/libpng15-15.dll %{_mingw32_bindir}/zlib1.dll %{_mingw32_bindir}/libintl-8.dll %{_mingw32_bindir}/libgmodule-2.0-0.dll %{_mingw32_bindir}/libgdk_pixbuf-2.0-0.dll %{_mingw32_bindir}/libgobject-2.0-0.dll %{_mingw32_bindir}/libgio-2.0-0.dll %{_mingw32_bindir}/libjasper-1.dll %{_mingw32_bindir}/libgthread-2.0-0.dll %{_mingw32_bindir}/libffi-5.dll %{_mingw32_bindir}/libjpeg-8.dll %{_mingw32_bindir}/libtiff-3.dll %{_mingw32_bindir}/libpangoft2-1.0-0.dll %{_mingw32_bindir}/libpangowin32-1.0-0.dll %{_mingw32_bindir}/libatk-1.0-0.dll %{_mingw32_datadir}/subsurface-icon.svg %changelog Subsurface-4.0.2/packaging/windows/subsurface.ico000066400000000000000000000410761226345450700221130ustar00rootroot00000000000000@@ (B(@ Gƹȱ<˥z]_8T*K!J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J K"Q(Q(Q)S*Y1Y1Y1Z2vVȿ fL!J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J L!s ңcJ J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J!ȿNL!J J J J J J J J J J J J J J J J J J jHjIK"J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J Y0<ŤyXK K K K K K K K K K K K K K K K K K kK K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K xdz\4K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!˱U*K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!qNS(L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!ȭ²P#L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L![3M"L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!ƨĤL!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!P%L#L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"ĥrL"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"N"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"[M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"änGM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#b8N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#O$V)N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#ʳ}_O%N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#e=sNO#O#O#O#O#O#O#O#O#O#O#O#O#O#^5bd4̱rd̲}V^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/a1a2b2e4mB^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/`2^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/`0`1^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/^/b3_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/`0n_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/c4_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0vN sHwLmva1_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0e6`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0g:ad3a0`0a0a1`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0g7`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0a1a0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0h8a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1i;ec3a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1g7m=sDyKS_jƜwƛwʤ˥˥˥ɢƛwŚucRtFm=c3a1a1a1a1a1kЮg}PpAj:f6c3b2b2b2b2e5j:o?tDyKYhȟ|ϯĘs{O˹ƼR>۲󹽻¾ڪYʲPSubsurface-4.0.2/packaging/windows/subsurface.nsi.in000066400000000000000000000127211226345450700225320ustar00rootroot00000000000000# # Subsurface NSIS installer script # # This installer creator needs to be run with: # makensis subsurface.nsi # # It assumes that packaging/windows/dll is a symlink to # the directory in which the required Windows DLLs are installed # (in my case that's /usr/i686-w64-mingw32/sys-root/mingw/bin) # #-------------------------------- # Include Modern UI !include "MUI2.nsh" #-------------------------------- # General # Program version !define SUBSURFACE_VERSION "VERSIONTOKEN" # VIProductVersion requires version in x.x.x.x format !define SUBSURFACE_VIPRODUCTVERSION "PRODVTOKEN" # Installer name and filename Name "Subsurface" Caption "Subsurface ${SUBSURFACE_VERSION} Setup" OutFile "subsurface-${SUBSURFACE_VERSION}.exe" # Icon to use for the installer !define MUI_ICON "subsurface.ico" # Default installation folder InstallDir "$PROGRAMFILES\Subsurface" # Get installation folder from registry if available InstallDirRegKey HKCU "Software\Subsurface" "" # Request application privileges RequestExecutionLevel admin #-------------------------------- # Version information VIProductVersion "${SUBSURFACE_VIPRODUCTVERSION}" VIAddVersionKey "ProductName" "Subsurface" VIAddVersionKey "FileDescription" "Subsurface - an open source dive log program." VIAddVersionKey "FileVersion" "${SUBSURFACE_VERSION}" VIAddVersionKey "LegalCopyright" "GPL v.2" VIAddVersionKey "ProductVersion" "${SUBSURFACE_VERSION}" #-------------------------------- # Settings # Show a warn on aborting installation !define MUI_ABORTWARNING # Defines the target start menu folder !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\Subsurface" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" #-------------------------------- # Variables Var StartMenuFolder #-------------------------------- # Pages # Installer pages !insertmacro MUI_PAGE_LICENSE "..\..\gpl-2.0.txt" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES # Uninstaller pages !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES #-------------------------------- # Languages !insertmacro MUI_LANGUAGE "English" #-------------------------------- # Default installer section Section SetShellVarContext all # Installation path SetOutPath "$INSTDIR" # Delete any already installed DLLs to avoid buildup of various # versions of the same library when upgrading Delete "$INSTDIR\*.dll" # Files to include in installer File subsurface.exe File /r data File /r images File /r plugins File /r Documentation File /r translations File iconv.dll File libdivecomputer-0.dll File libpng16-16.dll File libjpeg-*.dll File libusb-1.0.dll File libxml2-2.dll File libxslt-1.dll File zlib1.dll File libzip*.dll File libsqlite3-0.dll File libgcc_s_sjlj-1.dll File libstdc++-6.dll File libmarblewidget*dll File libssl-10.dll File libeay32.dll File ssleay32.dll File Qt*4.dll File subsurface.ico File qt.conf # Store installation folder in registry WriteRegStr HKCU "Software\Subsurface" "" $INSTDIR # Create shortcuts !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Subsurface.lnk" "$INSTDIR\subsurface.exe" "" "$INSTDIR\subsurface.ico" 0 CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall Subsurface.lnk" "$INSTDIR\Uninstall.exe" CreateShortCut "$DESKTOP\Subsurface.lnk" "$INSTDIR\subsurface.exe" "" "$INSTDIR\subsurface.ico" 0 !insertmacro MUI_STARTMENU_WRITE_END # Create the uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Subsurface" \ "DisplayName" "Subsurface" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Subsurface" \ "DisplayIcon" "$INSTDIR\subsurface.ico" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Subsurface" \ "UninstallString" "$INSTDIR\Uninstall.exe" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Subsurface" \ "DisplayVersion" ${SUBSURFACE_VERSION} SectionEnd #-------------------------------- # Uninstaller section Section "Uninstall" SetShellVarContext all # Delete installed files Delete "$INSTDIR\*.dll" Delete "$INSTDIR\freetype-config" Delete "$INSTDIR\subsurface.exe" Delete "$INSTDIR\subsurface.ico" Delete "$INSTDIR\Uninstall.exe" Delete "$INSTDIR\qt.conf" RMDir /r "$INSTDIR\share" RMDir /r "$INSTDIR\data" RMDir /r "$INSTDIR\images" RMDir /r "$INSTDIR\translations" RMDir /r "$INSTDIR\oldshare" RMDir /r "$INSTDIR\plugins" RMDir /r "$INSTDIR\Documentation" RMDir "$INSTDIR" # Remove shortcuts !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\Subsurface.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall Subsurface.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" Delete "$DESKTOP\Subsurface.lnk" # Remove registry entries DeleteRegKey /ifempty HKCU "Software\Subsurface" DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Subsurface" SectionEnd Subsurface-4.0.2/parse-xml.c000066400000000000000000001321741226345450700157130ustar00rootroot00000000000000#include #include #include #include #include #include #include #define __USE_XOPEN #include #include #include #include #include #include "gettext.h" #include #include "dive.h" #include "device.h" int verbose, quit; static xmlDoc *test_xslt_transforms(xmlDoc *doc, const char **params, char **error); /* the dive table holds the overall dive list; target table points at * the table we are currently filling */ struct dive_table dive_table; struct dive_table *target_table = NULL; static void parser_error(char **error, const char *fmt, ...) { va_list args; char *tmp; if (!error) return; tmp = malloc(1024); va_start(args, fmt); vsnprintf(tmp, 1024, fmt, args); va_end(args); if (*error) { int len = strlen(*error) + strlen(tmp) + 1; *error = realloc(*error, len); strncat(*error, tmp, strlen(tmp)); free(tmp); } else { *error = tmp; } } /* * Add a dive into the dive_table array */ static void record_dive_to_table(struct dive *dive, struct dive_table *table) { assert(table != NULL); int nr = table->nr, allocated = table->allocated; struct dive **dives = table->dives; if (nr >= allocated) { allocated = (nr + 32) * 3 / 2; dives = realloc(dives, allocated * sizeof(struct dive *)); if (!dives) exit(1); table->dives = dives; table->allocated = allocated; } dives[nr] = fixup_dive(dive); table->nr = nr+1; } void record_dive(struct dive *dive) { record_dive_to_table(dive, &dive_table); } static void start_match(const char *type, const char *name, char *buffer) { if (verbose > 2) printf("Matching %s '%s' (%s)\n", type, name, buffer); } static void nonmatch(const char *type, const char *name, char *buffer) { if (verbose > 1) printf("Unable to match %s '%s' (%s)\n", type, name, buffer); } typedef void (*matchfn_t)(char *buffer, void *); static int match(const char *pattern, int plen, const char *name, matchfn_t fn, char *buf, void *data) { switch (name[plen]) { case '\0': case '.': break; default: return 0; } if (memcmp(pattern, name, plen)) return 0; fn(buf, data); return 1; } struct units xml_parsing_units; const struct units SI_units = SI_UNITS; const struct units IMPERIAL_units = IMPERIAL_UNITS; /* * Dive info as it is being built up.. */ static struct divecomputer *cur_dc; static struct dive *cur_dive; static dive_trip_t *cur_trip = NULL; static struct sample *cur_sample; static struct { int active; duration_t time; int type, flags, value; const char *name; } cur_event; static struct { struct { const char *model; uint32_t deviceid; const char *nickname, *serial_nr, *firmware; } dc; } cur_settings; static bool in_settings = FALSE; static struct tm cur_tm; static int cur_cylinder_index, cur_ws_index; static int lastndl, laststoptime, laststopdepth, lastcns, lastpo2, lastindeco; static int lastcylinderindex, lastsensor; /* * If we don't have an explicit dive computer, * we use the implicit one that every dive has.. */ static struct divecomputer *get_dc(void) { return cur_dc ? : &cur_dive->dc; } static enum import_source { UNKNOWN, LIBDIVECOMPUTER, DIVINGLOG, UDDF, } import_source; static void divedate(char *buffer, void *_when) { int d,m,y; int hh,mm,ss; timestamp_t *when = _when; hh = 0; mm = 0; ss = 0; if (sscanf(buffer, "%d.%d.%d %d:%d:%d", &d, &m, &y, &hh, &mm, &ss) >= 3) { /* This is ok, and we got at least the date */ } else if (sscanf(buffer, "%d-%d-%d %d:%d:%d", &y, &m, &d, &hh, &mm, &ss) >= 3) { /* This is also ok */ } else { fprintf(stderr, "Unable to parse date '%s'\n", buffer); return; } cur_tm.tm_year = y; cur_tm.tm_mon = m-1; cur_tm.tm_mday = d; cur_tm.tm_hour = hh; cur_tm.tm_min = mm; cur_tm.tm_sec = ss; *when = utc_mktime(&cur_tm); } static void divetime(char *buffer, void *_when) { int h,m,s = 0; timestamp_t *when = _when; if (sscanf(buffer, "%d:%d:%d", &h, &m, &s) >= 2) { cur_tm.tm_hour = h; cur_tm.tm_min = m; cur_tm.tm_sec = s; *when = utc_mktime(&cur_tm); } } /* Libdivecomputer: "2011-03-20 10:22:38" */ static void divedatetime(char *buffer, void *_when) { int y,m,d; int hr,min,sec; timestamp_t *when = _when; if (sscanf(buffer, "%d-%d-%d %d:%d:%d", &y, &m, &d, &hr, &min, &sec) == 6) { cur_tm.tm_year = y; cur_tm.tm_mon = m-1; cur_tm.tm_mday = d; cur_tm.tm_hour = hr; cur_tm.tm_min = min; cur_tm.tm_sec = sec; *when = utc_mktime(&cur_tm); } } enum ParseState {FINDSTART, FINDEND}; static void divetags(char *buffer, void *_tags) { struct tag_entry *tags = _tags; int i = 0, start = 0, end = 0; enum ParseState state = FINDEND; int len = buffer ? strlen(buffer) : 0; while(i < len) { if (buffer[i] == ',') { if (state == FINDSTART) { /* Detect empty tags */ } else if (state == FINDEND) { /* Found end of tag */ if (i > 0 && buffer[i - 1] != '\\') { buffer[i] = '\0'; state=FINDSTART; taglist_add_tag(tags, buffer+start); } else { state=FINDSTART; } } } else if (buffer[i] == ' ') { /* Handled */ } else { /* Found start of tag */ if (state == FINDSTART) { state = FINDEND; start = i; } else if (state == FINDEND) { end = i; } } i++; } if (state == FINDEND) { if (end < start) end = len - 1; if (len > 0) { buffer[end + 1] = '\0'; taglist_add_tag(tags, buffer + start); } } } enum number_type { NEITHER, FLOAT }; static enum number_type parse_float(const char *buffer, double *res, const char **endp) { double val; static bool first_time = TRUE; errno = 0; val = ascii_strtod(buffer, endp); if (errno || *endp == buffer) return NEITHER; if (**endp == ',') { if (val == rint(val)) { /* we really want to send an error if this is a Subsurface native file * as this is likely indication of a bug - but right now we don't have * that information available */ if (first_time) { fprintf(stderr, "Floating point value with decimal comma (%s)?\n", buffer); first_time = FALSE; } /* Try again in permissive mode*/ val = strtod_flags(buffer, endp, 0); } } *res = val; return FLOAT; } union int_or_float { double fp; }; static enum number_type integer_or_float(char *buffer, union int_or_float *res) { const char *end; return parse_float(buffer, &res->fp, &end); } static void pressure(char *buffer, void *_press) { double mbar = 0.0; pressure_t *pressure = _press; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: /* Just ignore zero values */ if (!val.fp) break; switch (xml_parsing_units.pressure) { case PASCAL: mbar = val.fp / 100; break; case BAR: /* Assume mbar, but if it's really small, it's bar */ mbar = val.fp; if (mbar < 5000) mbar = mbar * 1000; break; case PSI: mbar = psi_to_mbar(val.fp); break; } if (mbar > 5 && mbar < 500000) { pressure->mbar = mbar + 0.5; break; } /* fallthrough */ default: printf("Strange pressure reading %s\n", buffer); } } static void salinity(char *buffer, void *_salinity) { int *salinity = _salinity; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: *salinity = val.fp * 10.0 + 0.5; break; default: printf("Strange salinity reading %s\n", buffer); } } static void depth(char *buffer, void *_depth) { depth_t *depth = _depth; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: switch (xml_parsing_units.length) { case METERS: depth->mm = val.fp * 1000 + 0.5; break; case FEET: depth->mm = feet_to_mm(val.fp); break; } break; default: printf("Strange depth reading %s\n", buffer); } } static void weight(char *buffer, void *_weight) { weight_t *weight = _weight; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: switch (xml_parsing_units.weight) { case KG: weight->grams = val.fp * 1000 + 0.5; break; case LBS: weight->grams = lbs_to_grams(val.fp); break; } break; default: printf("Strange weight reading %s\n", buffer); } } static void temperature(char *buffer, void *_temperature) { temperature_t *temperature = _temperature; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: switch (xml_parsing_units.temperature) { case KELVIN: temperature->mkelvin = val.fp * 1000; break; case CELSIUS: temperature->mkelvin = C_to_mkelvin(val.fp); break; case FAHRENHEIT: temperature->mkelvin = F_to_mkelvin(val.fp); break; } break; default: printf("Strange temperature reading %s\n", buffer); } /* temperatures outside -40C .. +70C should be ignored */ if (temperature->mkelvin < ZERO_C_IN_MKELVIN - 40000 || temperature->mkelvin > ZERO_C_IN_MKELVIN + 70000) temperature->mkelvin = 0; } static void sampletime(char *buffer, void *_time) { int i; int min, sec; duration_t *time = _time; i = sscanf(buffer, "%d:%d", &min, &sec); switch (i) { case 1: sec = min; min = 0; /* fallthrough */ case 2: time->seconds = sec + min*60; break; default: printf("Strange sample time reading %s\n", buffer); } } static void duration(char *buffer, void *_time) { /* DivingLog 5.08 (and maybe other versions) appear to sometimes * store the dive time as 44.00 instead of 44:00; * This attempts to parse this in a fairly robust way */ if (!strchr(buffer,':') && strchr(buffer,'.')) { char *mybuffer = strdup(buffer); char *dot = strchr(mybuffer,'.'); *dot = ':'; sampletime(mybuffer, _time); free(mybuffer); } else { sampletime(buffer, _time); } } static void percent(char *buffer, void *_fraction) { fraction_t *fraction = _fraction; double val; const char *end; switch (parse_float(buffer, &val, &end)) { case FLOAT: /* Turn fractions into percent unless explicit.. */ if (val <= 1.0) { while (isspace(*end)) end++; if (*end != '%') val *= 100; } /* Then turn percent into our integer permille format */ if (val >= 0 && val <= 100.0) { fraction->permille = val * 10 + 0.5; break; } default: printf(translate("gettextFromC","Strange percentage reading %s\n"), buffer); break; } } static void gasmix(char *buffer, void *_fraction) { /* libdivecomputer does negative percentages. */ if (*buffer == '-') return; if (cur_cylinder_index < MAX_CYLINDERS) percent(buffer, _fraction); } static void gasmix_nitrogen(char *buffer, void *_gasmix) { /* Ignore n2 percentages. There's no value in them. */ } static void cylindersize(char *buffer, void *_volume) { volume_t *volume = _volume; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: volume->mliter = val.fp * 1000 + 0.5; break; default: printf("Strange volume reading %s\n", buffer); break; } } static void utf8_string(char *buffer, void *_res) { int size; char *res; while (isspace(*buffer)) buffer++; size = strlen(buffer); while (size && isspace(buffer[size-1])) size--; if (!size) return; res = malloc(size + 1); memcpy(res, buffer, size); res[size] = 0; *(char **)_res = res; } #define MATCH(pattern, fn, dest) \ match(pattern, strlen(pattern), name, fn, buf, dest) static void get_index(char *buffer, void *_i) { int *i = _i; *i = atoi(buffer); } static void get_rating(char *buffer, void *_i) { int *i = _i; int j = atoi(buffer); if (j >= 0 && j <= 5) { *i = j; } } static void double_to_permil(char *buffer, void *_i) { int *i = _i; *i = ascii_strtod(buffer, NULL) * 1000.0 + 0.5; } static void hex_value(char *buffer, void *_i) { uint32_t *i = _i; *i = strtoul(buffer, NULL, 16); } static void get_tripflag(char *buffer, void *_tf) { tripflag_t *tf = _tf; *tf = strcmp(buffer, "NOTRIP") ? TF_NONE : NO_TRIP; } /* * Divinglog is crazy. The temperatures are in celsius. EXCEPT * for the sample temperatures, that are in Fahrenheit. * WTF? * * Oh, and I think Diving Log *internally* probably kept them * in celsius, because I'm seeing entries like * * 32.0 * * in there. Which is freezing, aka 0 degC. I bet the "0" is * what Diving Log uses for "no temperature". * * So throw away crap like that. * * It gets worse. Sometimes the sample temperatures are in * Celsius, which apparently happens if you are in a SI * locale. So we now do: * * - temperatures < 32.0 == Celsius * - temperature == 32.0 -> garbage, it's a missing temperature (zero converted from C to F) * - temperatures > 32.0 == Fahrenheit */ static void fahrenheit(char *buffer, void *_temperature) { temperature_t *temperature = _temperature; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: /* Floating point equality is evil, but works for small integers */ if (val.fp == 32.0) break; if (val.fp < 32.0) temperature->mkelvin = C_to_mkelvin(val.fp); else temperature->mkelvin = F_to_mkelvin(val.fp); break; default: fprintf(stderr, "Crazy Diving Log temperature reading %s\n", buffer); } } /* * Did I mention how bat-shit crazy divinglog is? The sample * pressures are in PSI. But the tank working pressure is in * bar. WTF^2? * * Crazy stuff like this is why subsurface has everything in * these inconvenient typed structures, and you have to say * "pressure->mbar" to get the actual value. Exactly so that * you can never have unit confusion. * * It gets worse: sometimes apparently the pressures are in * bar, sometimes in psi. Dirk suspects that this may be a * DivingLog Uemis importer bug, and that they are always * supposed to be in bar, but that the importer got the * sample importing wrong. * * Sadly, there's no way to really tell. So I think we just * have to have some arbitrary cut-off point where we assume * that smaller values mean bar.. Not good. */ static void psi_or_bar(char *buffer, void *_pressure) { pressure_t *pressure = _pressure; union int_or_float val; switch (integer_or_float(buffer, &val)) { case FLOAT: if (val.fp > 400) pressure->mbar = psi_to_mbar(val.fp); else pressure->mbar = val.fp * 1000 + 0.5; break; default: fprintf(stderr, "Crazy Diving Log PSI reading %s\n", buffer); } } static int divinglog_fill_sample(struct sample *sample, const char *name, char *buf) { return MATCH("time.p", sampletime, &sample->time) || MATCH("depth.p", depth, &sample->depth) || MATCH("temp.p", fahrenheit, &sample->temperature) || MATCH("press1.p", psi_or_bar, &sample->cylinderpressure) || 0; } static void uddf_gasswitch(char *buffer, void *_sample) { struct sample *sample = _sample; int idx = atoi(buffer); int seconds = sample->time.seconds; struct dive *dive = cur_dive; struct divecomputer *dc = get_dc(); add_gas_switch_event(dive, dc, seconds, idx); } static int uddf_fill_sample(struct sample *sample, const char *name, char *buf) { return MATCH("divetime", sampletime, &sample->time) || MATCH("depth", depth, &sample->depth) || MATCH("temperature", temperature, &sample->temperature) || MATCH("tankpressure", pressure, &sample->cylinderpressure) || MATCH("ref.switchmix", uddf_gasswitch, sample) || 0; } static void eventtime(char *buffer, void *_duration) { duration_t *duration = _duration; sampletime(buffer, duration); if (cur_sample) duration->seconds += cur_sample->time.seconds; } static void try_to_match_autogroup(const char *name, char *buf) { int autogroupvalue; start_match("autogroup", name, buf); if (MATCH("state.autogroup", get_index, &autogroupvalue)) { set_autogroup(autogroupvalue); return; } nonmatch("autogroup", name, buf); } static void try_to_fill_dc_settings(const char *name, char *buf) { start_match("divecomputerid", name, buf); if (MATCH("model.divecomputerid", utf8_string, &cur_settings.dc.model)) return; if (MATCH("deviceid.divecomputerid", hex_value, &cur_settings.dc.deviceid)) return; if (MATCH("nickname.divecomputerid", utf8_string, &cur_settings.dc.nickname)) return; if (MATCH("serial.divecomputerid", utf8_string, &cur_settings.dc.serial_nr)) return; if (MATCH("firmware.divecomputerid", utf8_string, &cur_settings.dc.firmware)) return; nonmatch("divecomputerid", name, buf); } static void try_to_fill_event(const char *name, char *buf) { start_match("event", name, buf); if (MATCH("event", utf8_string, &cur_event.name)) return; if (MATCH("name", utf8_string, &cur_event.name)) return; if (MATCH("time", eventtime, &cur_event.time)) return; if (MATCH("type", get_index, &cur_event.type)) return; if (MATCH("flags", get_index, &cur_event.flags)) return; if (MATCH("value", get_index, &cur_event.value)) return; nonmatch("event", name, buf); } static int match_dc_data_fields(struct divecomputer *dc, const char *name, char *buf) { if (MATCH("maxdepth", depth, &dc->maxdepth)) return 1; if (MATCH("meandepth", depth, &dc->meandepth)) return 1; if (MATCH("max.depth", depth, &dc->maxdepth)) return 1; if (MATCH("mean.depth", depth, &dc->meandepth)) return 1; if (MATCH("duration", duration, &dc->duration)) return 1; if (MATCH("divetime", duration, &dc->duration)) return 1; if (MATCH("divetimesec", duration, &dc->duration)) return 1; if (MATCH("surfacetime", duration, &dc->surfacetime)) return 1; if (MATCH("airtemp", temperature, &dc->airtemp)) return 1; if (MATCH("watertemp", temperature, &dc->watertemp)) return 1; if (MATCH("air.temperature", temperature, &dc->airtemp)) return 1; if (MATCH("water.temperature", temperature, &dc->watertemp)) return 1; if (MATCH("pressure.surface", pressure, &dc->surface_pressure)) return 1; if (MATCH("salinity.water", salinity, &dc->salinity)) return 1; return 0; } /* We're in the top-level dive xml. Try to convert whatever value to a dive value */ static void try_to_fill_dc(struct divecomputer *dc, const char *name, char *buf) { start_match("divecomputer", name, buf); if (MATCH("date", divedate, &dc->when)) return; if (MATCH("time", divetime, &dc->when)) return; if (MATCH("model", utf8_string, &dc->model)) return; if (MATCH("deviceid", hex_value, &dc->deviceid)) return; if (MATCH("diveid", hex_value, &dc->diveid)) return; if (match_dc_data_fields(dc, name, buf)) return; nonmatch("divecomputer", name, buf); } void add_gas_switch_event(struct dive *dive, struct divecomputer *dc, int seconds, int idx) { /* The gas switch event format is insane. It will be fixed, I think */ int o2 = get_o2(&dive->cylinder[idx].gasmix); int he = get_he(&dive->cylinder[idx].gasmix); int value; o2 = (o2+5) / 10; he = (he+5) / 10; value = o2 + (he << 16); add_event(dc, seconds, 25, 0, value, "gaschange"); /* SAMPLE_EVENT_GASCHANGE2 */ } static void get_cylinderindex(char *buffer, void *_i) { int *i = _i; *i = atoi(buffer); if (lastcylinderindex != *i) { add_gas_switch_event(cur_dive, get_dc(), cur_sample->time.seconds, *i); lastcylinderindex = *i; } } static void get_sensor(char *buffer, void *_i) { int *i = _i; *i = atoi(buffer); lastsensor = *i; } /* We're in samples - try to convert the random xml value to something useful */ static void try_to_fill_sample(struct sample *sample, const char *name, char *buf) { int in_deco; start_match("sample", name, buf); if (MATCH("pressure.sample", pressure, &sample->cylinderpressure)) return; if (MATCH("cylpress.sample", pressure, &sample->cylinderpressure)) return; if (MATCH("cylinderindex.sample", get_cylinderindex, &sample->sensor)) return; if (MATCH("sensor.sample", get_sensor, &sample->sensor)) return; if (MATCH("depth.sample", depth, &sample->depth)) return; if (MATCH("temp.sample", temperature, &sample->temperature)) return; if (MATCH("temperature.sample", temperature, &sample->temperature)) return; if (MATCH("sampletime.sample", sampletime, &sample->time)) return; if (MATCH("time.sample", sampletime, &sample->time)) return; if (MATCH("ndl.sample", sampletime, &sample->ndl)) return; if (MATCH("in_deco.sample", get_index, &in_deco)) { sample->in_deco = (in_deco == 1); return; } if (MATCH("stoptime.sample", sampletime, &sample->stoptime)) return; if (MATCH("stopdepth.sample", depth, &sample->stopdepth)) return; if (MATCH("cns.sample", get_index, &sample->cns)) return; if (MATCH("po2.sample", double_to_permil, &sample->po2)) return; switch (import_source) { case DIVINGLOG: if (divinglog_fill_sample(sample, name, buf)) return; break; case UDDF: if (uddf_fill_sample(sample, name, buf)) return; break; default: break; } nonmatch("sample", name, buf); } static const char *country, *city; static void divinglog_place(char *place, void *_location) { char **location = _location; char buffer[1024], *p; int len; len = snprintf(buffer, sizeof(buffer), "%s%s%s%s%s", place, city ? ", " : "", city ? city : "", country ? ", " : "", country ? country : ""); p = malloc(len+1); memcpy(p, buffer, len+1); *location = p; city = NULL; country = NULL; } static int divinglog_dive_match(struct dive *dive, const char *name, char *buf) { return MATCH("divedate", divedate, &dive->when) || MATCH("entrytime", divetime, &dive->when) || MATCH("divetime", duration, &dive->dc.duration) || MATCH("depth", depth, &dive->dc.maxdepth) || MATCH("depthavg", depth, &dive->dc.meandepth) || MATCH("tanktype", utf8_string, &dive->cylinder[0].type.description) || MATCH("tanksize", cylindersize, &dive->cylinder[0].type.size) || MATCH("presw", pressure, &dive->cylinder[0].type.workingpressure) || MATCH("press", pressure, &dive->cylinder[0].start) || MATCH("prese", pressure, &dive->cylinder[0].end) || MATCH("comments", utf8_string, &dive->notes) || MATCH("names.buddy", utf8_string, &dive->buddy) || MATCH("name.country", utf8_string, &country) || MATCH("name.city", utf8_string, &city) || MATCH("name.place", divinglog_place, &dive->location) || 0; } /* * Uddf specifies ISO 8601 time format. * * There are many variations on that. This handles the useful cases. */ static void uddf_datetime(char *buffer, void *_when) { char c; int y,m,d,hh,mm,ss; timestamp_t *when = _when; struct tm tm = { 0 }; int i; i = sscanf(buffer, "%d-%d-%d%c%d:%d:%d", &y, &m, &d, &c, &hh, &mm, &ss); if (i == 7) goto success; ss = 0; if (i == 6) goto success; i = sscanf(buffer, "%04d%02d%02d%c%02d%02d%02d", &y, &m, &d, &c, &hh, &mm, &ss); if (i == 7) goto success; ss = 0; if (i == 6) goto success; bad_date: printf("Bad date time %s\n", buffer); return; success: if (c != 'T' && c != ' ') goto bad_date; tm.tm_year = y; tm.tm_mon = m - 1; tm.tm_mday = d; tm.tm_hour = hh; tm.tm_min = mm; tm.tm_sec = ss; *when = utc_mktime(&tm); } #define uddf_datedata(name, offset) \ static void uddf_##name(char *buffer, void *_when) \ { timestamp_t *when = _when; \ cur_tm.tm_##name = atoi(buffer) + offset; \ *when = utc_mktime(&cur_tm); } uddf_datedata(year, 0) uddf_datedata(mon, -1) uddf_datedata(mday, 0) uddf_datedata(hour, 0) uddf_datedata(min, 0) static int uddf_dive_match(struct dive *dive, const char *name, char *buf) { return MATCH("datetime", uddf_datetime, &dive->when) || MATCH("diveduration", duration, &dive->dc.duration) || MATCH("greatestdepth", depth, &dive->dc.maxdepth) || MATCH("year.date", uddf_year, &dive->when) || MATCH("month.date", uddf_mon, &dive->when) || MATCH("day.date", uddf_mday, &dive->when) || MATCH("hour.time", uddf_hour, &dive->when) || MATCH("minute.time", uddf_min, &dive->when) || 0; } /* * This parses "floating point" into micro-degrees. * We don't do exponentials etc, if somebody does * gps locations in that format, they are insane. */ static degrees_t parse_degrees(char *buf, char **end) { int sign = 1, decimals = 6, value = 0; degrees_t ret; while (isspace(*buf)) buf++; switch (*buf) { case '-': sign = -1; /* fallthrough */ case '+': buf++; } while (isdigit(*buf)) { value = 10*value + *buf - '0'; buf++; } /* Get the first six decimals if they exist */ if (*buf == '.') buf++; do { value *= 10; if (isdigit(*buf)) { value += *buf - '0'; buf++; } } while (--decimals); /* Rounding */ switch (*buf) { case '5' ... '9': value++; } while (isdigit(*buf)) buf++; *end = buf; ret.udeg = value * sign; return ret; } static void gps_lat(char *buffer, void *_dive) { char *end; struct dive *dive = _dive; dive->latitude = parse_degrees(buffer, &end); } static void gps_long(char *buffer, void *_dive) { char *end; struct dive *dive = _dive; dive->longitude = parse_degrees(buffer, &end); } static void gps_location(char *buffer, void *_dive) { char *end; struct dive *dive = _dive; dive->latitude = parse_degrees(buffer, &end); dive->longitude = parse_degrees(end, &end); } /* We're in the top-level dive xml. Try to convert whatever value to a dive value */ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf) { start_match("dive", name, buf); switch (import_source) { case DIVINGLOG: if (divinglog_dive_match(dive, name, buf)) return; break; case UDDF: if (uddf_dive_match(dive, name, buf)) return; break; default: break; } if (MATCH("number", get_index, &dive->number)) return; if (MATCH("tags", divetags, dive->tag_list)) return; if (MATCH("tripflag", get_tripflag, &dive->tripflag)) return; if (MATCH("date", divedate, &dive->when)) return; if (MATCH("time", divetime, &dive->when)) return; if (MATCH("datetime", divedatetime, &dive->when)) return; /* * Legacy format note: per-dive depths and duration get saved * in the first dive computer entry */ if (match_dc_data_fields(&dive->dc, name, buf)) return; if (MATCH("cylinderstartpressure", pressure, &dive->cylinder[0].start)) return; if (MATCH("cylinderendpressure", pressure, &dive->cylinder[0].end)) return; if (MATCH("gps", gps_location, dive)) return; if (MATCH("Place", gps_location, dive)) return; if (MATCH("latitude", gps_lat, dive)) return; if (MATCH("sitelat", gps_lat, dive)) return; if (MATCH("lat", gps_lat, dive)) return; if (MATCH("longitude", gps_long, dive)) return; if (MATCH("sitelon", gps_long, dive)) return; if (MATCH("lon", gps_long, dive)) return; if (MATCH("location", utf8_string, &dive->location)) return; if (MATCH("name.dive", utf8_string, &dive->location)) return; if (MATCH("suit", utf8_string, &dive->suit)) return; if (MATCH("divesuit", utf8_string, &dive->suit)) return; if (MATCH("notes", utf8_string, &dive->notes)) return; if (MATCH("divemaster", utf8_string, &dive->divemaster)) return; if (MATCH("buddy", utf8_string, &dive->buddy)) return; if (MATCH("rating.dive", get_rating, &dive->rating)) return; if (MATCH("visibility.dive", get_rating, &dive->visibility)) return; if (MATCH("size.cylinder", cylindersize, &dive->cylinder[cur_cylinder_index].type.size)) return; if (MATCH("workpressure.cylinder", pressure, &dive->cylinder[cur_cylinder_index].type.workingpressure)) return; if (MATCH("description.cylinder", utf8_string, &dive->cylinder[cur_cylinder_index].type.description)) return; if (MATCH("start.cylinder", pressure, &dive->cylinder[cur_cylinder_index].start)) return; if (MATCH("end.cylinder", pressure, &dive->cylinder[cur_cylinder_index].end)) return; if (MATCH("description.weightsystem", utf8_string, &dive->weightsystem[cur_ws_index].description)) return; if (MATCH("weight.weightsystem", weight, &dive->weightsystem[cur_ws_index].weight)) return; if (MATCH("weight", weight, &dive->weightsystem[cur_ws_index].weight)) return; if (MATCH("o2", gasmix, &dive->cylinder[cur_cylinder_index].gasmix.o2)) return; if (MATCH("o2percent", gasmix, &dive->cylinder[cur_cylinder_index].gasmix.o2)) return; if (MATCH("n2", gasmix_nitrogen, &dive->cylinder[cur_cylinder_index].gasmix)) return; if (MATCH("he", gasmix, &dive->cylinder[cur_cylinder_index].gasmix.he)) return; if (MATCH("air.divetemperature", temperature, &dive->airtemp)) return; nonmatch("dive", name, buf); } /* We're in the top-level trip xml. Try to convert whatever value to a trip value */ static void try_to_fill_trip(dive_trip_t **dive_trip_p, const char *name, char *buf) { start_match("trip", name, buf); dive_trip_t *dive_trip = *dive_trip_p; if (MATCH("date", divedate, &dive_trip->when)) return; if (MATCH("time", divetime, &dive_trip->when)) return; if (MATCH("location", utf8_string, &dive_trip->location)) return; if (MATCH("notes", utf8_string, &dive_trip->notes)) return; nonmatch("trip", name, buf); } /* * While in some formats file boundaries are dive boundaries, in many * others (as for example in our native format) there are * multiple dives per file, so there can be other events too that * trigger a "new dive" marker and you may get some nesting due * to that. Just ignore nesting levels. * On the flipside it is possible that we start an XML file that ends * up having no dives in it at all - don't create a bogus empty dive * for those. It's not entirely clear what is the minimum set of data * to make a dive valid, but if it has no location, no date and no * samples I'm pretty sure it's useless. */ static bool is_dive(void) { return (cur_dive && (cur_dive->location || cur_dive->when || cur_dive->dc.samples)); } static void reset_dc_info(struct divecomputer *dc) { lastcns = lastpo2 = lastndl = laststoptime = laststopdepth = lastindeco = 0; lastsensor = lastcylinderindex = 0; } static void reset_dc_settings(void) { free((void *)cur_settings.dc.model); free((void *)cur_settings.dc.nickname); free((void *)cur_settings.dc.serial_nr); free((void *)cur_settings.dc.firmware); cur_settings.dc.model = NULL; cur_settings.dc.nickname = NULL; cur_settings.dc.serial_nr = NULL; cur_settings.dc.firmware = NULL; cur_settings.dc.deviceid = 0; } static void settings_start(void) { in_settings = TRUE; } static void settings_end(void) { in_settings = FALSE; } static void dc_settings_start(void) { reset_dc_settings(); } static void dc_settings_end(void) { create_device_node(cur_settings.dc.model, cur_settings.dc.deviceid, cur_settings.dc.serial_nr, cur_settings.dc.firmware, cur_settings.dc.nickname); reset_dc_settings(); } static void dive_start(void) { if (cur_dive) return; cur_dive = alloc_dive(); reset_dc_info(&cur_dive->dc); memset(&cur_tm, 0, sizeof(cur_tm)); if (cur_trip) { add_dive_to_trip(cur_dive, cur_trip); cur_dive->tripflag = IN_TRIP; } } static void dive_end(void) { if (!cur_dive) return; if (!is_dive()) free(cur_dive); else record_dive_to_table(cur_dive, target_table); cur_dive = NULL; cur_dc = NULL; cur_cylinder_index = 0; cur_ws_index = 0; } static void trip_start(void) { if (cur_trip) return; dive_end(); cur_trip = calloc(sizeof(dive_trip_t),1); memset(&cur_tm, 0, sizeof(cur_tm)); } static void trip_end(void) { if (!cur_trip) return; insert_trip(&cur_trip); cur_trip = NULL; } static void event_start(void) { memset(&cur_event, 0, sizeof(cur_event)); cur_event.active = 1; } static void event_end(void) { struct divecomputer *dc = get_dc(); if (cur_event.name) { if (strcmp(cur_event.name, "surface") != 0) add_event(dc, cur_event.time.seconds, cur_event.type, cur_event.flags, cur_event.value, cur_event.name); free((void *)cur_event.name); } cur_event.active = 0; } static void cylinder_start(void) { } static void cylinder_end(void) { cur_cylinder_index++; } static void ws_start(void) { } static void ws_end(void) { cur_ws_index++; } static void sample_start(void) { cur_sample = prepare_sample(get_dc()); cur_sample->ndl.seconds = lastndl; cur_sample->in_deco = lastindeco; cur_sample->stoptime.seconds = laststoptime; cur_sample->stopdepth.mm = laststopdepth; cur_sample->cns = lastcns; cur_sample->po2 = lastpo2; cur_sample->sensor = lastsensor; } static void sample_end(void) { if (!cur_dive) return; finish_sample(get_dc()); lastndl = cur_sample->ndl.seconds; lastindeco = cur_sample->in_deco; laststoptime = cur_sample->stoptime.seconds; laststopdepth = cur_sample->stopdepth.mm; lastcns = cur_sample->cns; lastpo2 = cur_sample->po2; cur_sample = NULL; } static void divecomputer_start(void) { struct divecomputer *dc; /* Start from the previous dive computer */ dc = &cur_dive->dc; while (dc->next) dc = dc->next; /* Did we already fill that in? */ if (dc->samples || dc->model || dc->when) { struct divecomputer *newdc = calloc(1, sizeof(*newdc)); if (newdc) { dc->next = newdc; dc = newdc; } } /* .. this is the one we'll use */ cur_dc = dc; reset_dc_info(dc); } static void divecomputer_end(void) { if (!cur_dc->when) cur_dc->when = cur_dive->when; cur_dc = NULL; } static void entry(const char *name, char *buf) { if (in_settings) { try_to_fill_dc_settings(name, buf); try_to_match_autogroup(name, buf); return; } if (cur_event.active) { try_to_fill_event(name, buf); return; } if (cur_sample) { try_to_fill_sample(cur_sample, name, buf); return; } if (cur_dc) { try_to_fill_dc(cur_dc, name, buf); return; } if (cur_dive) { try_to_fill_dive(cur_dive, name, buf); return; } if (cur_trip) { try_to_fill_trip(&cur_trip, name, buf); return; } } static const char *nodename(xmlNode *node, char *buf, int len) { int levels = 2; char *p = buf; if (!node || !node->name) return "root"; if (node->parent && !strcmp(node->name, "text")) node = node->parent; /* Make sure it's always NUL-terminated */ p[--len] = 0; for(;;) { const char *name = node->name; char c; while ((c = *name++) != 0) { /* Cheaper 'tolower()' for ASCII */ c = (c >= 'A' && c <= 'Z') ? c - 'A' + 'a' : c; *p++ = c; if (!--len) return buf; } *p = 0; node = node->parent; if (!node || !node->name) return buf; *p++ = '.'; if (!--len) return buf; if (!--levels) return buf; } } #define MAXNAME 32 static void visit_one_node(xmlNode *node) { char *content; static char buffer[MAXNAME]; const char *name; content = node->content; if (!content || xmlIsBlankNode(node)) return; name = nodename(node, buffer, sizeof(buffer)); entry(name, content); } static void traverse(xmlNode *root); static void traverse_properties(xmlNode *node) { xmlAttr *p; for (p = node->properties; p; p = p->next) traverse(p->children); } static void visit(xmlNode *n) { visit_one_node(n); traverse_properties(n); traverse(n->children); } static void DivingLog_importer(void) { import_source = DIVINGLOG; /* * Diving Log units are really strange. * * Temperatures are in C, except in samples, * when they are in Fahrenheit. Depths are in * meters, an dpressure is in PSI in the samples, * but in bar when it comes to working pressure. * * Crazy f*%^ morons. */ xml_parsing_units = SI_units; } static void uddf_importer(void) { import_source = UDDF; xml_parsing_units = SI_units; xml_parsing_units.pressure = PASCAL; xml_parsing_units.temperature = KELVIN; } /* * I'm sure this could be done as some fancy DTD rules. * It's just not worth the headache. */ static struct nesting { const char *name; void (*start)(void), (*end)(void); } nesting[] = { { "divecomputerid", dc_settings_start, dc_settings_end }, { "settings", settings_start, settings_end }, { "dive", dive_start, dive_end }, { "Dive", dive_start, dive_end }, { "trip", trip_start, trip_end }, { "sample", sample_start, sample_end }, { "waypoint", sample_start, sample_end }, { "SAMPLE", sample_start, sample_end }, { "reading", sample_start, sample_end }, { "event", event_start, event_end }, { "mix", cylinder_start, cylinder_end }, { "gasmix", cylinder_start, cylinder_end }, { "cylinder", cylinder_start, cylinder_end }, { "weightsystem", ws_start, ws_end }, { "divecomputer", divecomputer_start, divecomputer_end }, { "P", sample_start, sample_end }, /* Import type recognition */ { "Divinglog", DivingLog_importer }, { "uddf", uddf_importer }, { NULL, } }; static void traverse(xmlNode *root) { xmlNode *n; for (n = root; n; n = n->next) { struct nesting *rule = nesting; if (!n->name) { visit(n); continue; } do { if (!strcmp(rule->name, n->name)) break; rule++; } while (rule->name); if (rule->start) rule->start(); visit(n); if (rule->end) rule->end(); } } /* Per-file reset */ static void reset_all(void) { /* * We reset the units for each file. You'd think it was * a per-dive property, but I'm not going to trust people * to do per-dive setup. If the xml does have per-dive * data within one file, we might have to reset it per * dive for that format. */ xml_parsing_units = SI_units; import_source = UNKNOWN; } /* divelog.de sends us xml files that claim to be iso-8859-1 * but once we decode the HTML encoded characters they turn * into UTF-8 instead. So skip the incorrect encoding * declaration and decode the HTML encoded characters */ const char *preprocess_divelog_de(const char *buffer) { char *ret = strstr(buffer, ""); if (ret) { xmlParserCtxtPtr ctx; char buf[] = ""; int i; for (i = 0; i < strlen(ret); ++i) if (!isascii(ret[i])) return buffer; ctx = xmlCreateMemoryParserCtxt(buf, sizeof(buf)); ret = xmlStringLenDecodeEntities(ctx, ret, strlen(ret), XML_SUBSTITUTE_REF, 0, 0, 0); return ret; } return buffer; } void parse_xml_buffer(const char *url, const char *buffer, int size, struct dive_table *table, const char **params, char **error) { xmlDoc *doc; const char *res = preprocess_divelog_de(buffer); target_table = table; doc = xmlReadMemory(res, strlen(res), url, NULL, 0); if (res != buffer) free((char *)res); if (!doc) { fprintf(stderr, translate("gettextFromC","Failed to parse '%s'.\n"), url); parser_error(error, translate("gettextFromC","Failed to parse '%s'"), url); return; } reset_all(); dive_start(); doc = test_xslt_transforms(doc, params, error); traverse(xmlDocGetRootElement(doc)); dive_end(); xmlFreeDoc(doc); } extern int dm4_events(void *handle, int columns, char **data, char **column) { event_start(); if(data[1]) cur_event.time.seconds = atoi(data[1]); if(data[2]) { switch (atoi(data[2])) { case 1: /* 1 Mandatory Safety Stop */ cur_event.name = strdup("safety stop (mandatory)"); break; case 3: /* 3 Deco */ /* What is Subsurface's term for going to * deco? */ cur_event.name = strdup("deco"); break; case 4: /* 4 Ascent warning */ cur_event.name = strdup("ascent"); break; case 5: /* 5 Ceiling broken */ cur_event.name = strdup("violation"); break; case 6: /* 6 Mandatory safety stop ceiling error */ cur_event.name = strdup("violation"); break; case 7: /* 7 Below deco floor */ cur_event.name = strdup("below floor"); break; case 8: /* 8 Dive time alarm */ cur_event.name = strdup("divetime"); break; case 9: /* 9 Depth alarm */ cur_event.name = strdup("maxdepth"); break; case 10: /* 10 OLF 80% */ case 11: /* 11 OLF 100% */ cur_event.name = strdup("OLF"); break; case 12: /* 12 High ppO2 */ cur_event.name = strdup("PO2"); break; case 13: /* 13 Air time */ cur_event.name = strdup("airtime"); break; case 18: /* 18 Ceiling error */ cur_event.name = strdup("ceiling"); break; case 19: /* 19 Surfaced */ cur_event.name = strdup("surface"); break; case 257: /* 257 Dive active */ /* This seems to be given after surface * when descending again. Ignoring it. */ break; case 258: /* 258 Bookmark */ if (data[3]) { cur_event.name = strdup("heading"); cur_event.value = atoi(data[3]); } else { cur_event.name = strdup("bookmark"); } break; default: cur_event.name = strdup("unknown"); cur_event.value = atoi(data[2]); break; } } event_end(); return 0; } extern int dm4_dive(void *param, int columns, char **data, char **column) { int i, interval, retval = 0; sqlite3 *handle = (sqlite3 *)param; float *profileBlob; unsigned char *tempBlob; int *pressureBlob; char *err = NULL; char get_events_template[] = "select * from Mark where DiveId = %d"; char get_events[64]; dive_start(); cur_dive->number = atoi(data[0]); cur_dive->when = (time_t)(atol(data[1])); if (data[2]) utf8_string(data[2], &cur_dive->notes); /* * DM4 stores Duration and DiveTime. It looks like DiveTime is * 10 to 60 seconds shorter than Duration. However, I have no * idea what is the difference and which one should be used. * Duration = data[3] * DiveTime = data[15] */ if (data[3]) cur_dive->duration.seconds = atoi(data[3]); if (data[15]) cur_dive->dc.duration.seconds = atoi(data[15]); /* * TODO: the deviceid hash should be calculated here. */ settings_start(); dc_settings_start(); if (data[4]) utf8_string(data[4], &cur_settings.dc.serial_nr); if (data[5]) utf8_string(data[5], &cur_settings.dc.model); cur_settings.dc.deviceid = 0xffffffff; dc_settings_end(); settings_end(); if (data[6]) cur_dive->dc.maxdepth.mm = atof(data[6]) * 1000; if (data[8]) cur_dive->dc.airtemp.mkelvin = C_to_mkelvin(atoi(data[8])); if (data[9]) cur_dive->dc.watertemp.mkelvin = C_to_mkelvin(atoi(data[9])); /* * TODO: handle multiple cylinders */ cylinder_start(); if (data[22] && atoi(data[22]) > 0) cur_dive->cylinder[cur_cylinder_index].start.mbar = atoi(data[22]); else if (data[10] && atoi(data[10]) > 0) cur_dive->cylinder[cur_cylinder_index].start.mbar = atoi(data[10]); if (data[23] && atoi(data[23]) > 0) cur_dive->cylinder[cur_cylinder_index].end.mbar = (atoi(data[23])); if (data[11] && atoi(data[11]) > 0) cur_dive->cylinder[cur_cylinder_index].end.mbar = (atoi(data[11])); if (data[12]) cur_dive->cylinder[cur_cylinder_index].type.size.mliter = (atof(data[12])) * 1000; if (data[13]) cur_dive->cylinder[cur_cylinder_index].type.workingpressure.mbar = (atoi(data[13])); if (data[20]) cur_dive->cylinder[cur_cylinder_index].gasmix.o2.permille = atoi(data[20]) * 10; if (data[21]) cur_dive->cylinder[cur_cylinder_index].gasmix.he.permille = atoi(data[21]) * 10; cylinder_end(); if (data[14]) cur_dive->dc.surface_pressure.mbar = (atoi(data[14]) * 1000); interval = data[16] ? atoi(data[16]) : 0; profileBlob = (float *)data[17]; tempBlob = (unsigned char *)data[18]; pressureBlob = (int *)data[19]; for (i=0; interval && i * interval < cur_dive->duration.seconds; i++) { sample_start(); cur_sample->time.seconds = i * interval; if (profileBlob) cur_sample->depth.mm = profileBlob[i] * 1000; else cur_sample->depth.mm = cur_dive->dc.maxdepth.mm; if (tempBlob) cur_sample->temperature.mkelvin = C_to_mkelvin(tempBlob[i]); if (data[19] && data[19][0]) cur_sample->cylinderpressure.mbar = pressureBlob[i] ; sample_end(); } snprintf(get_events, sizeof(get_events) - 1, get_events_template, cur_dive->number); retval = sqlite3_exec(handle, get_events, &dm4_events, 0, &err); if (retval != SQLITE_OK) { fprintf(stderr, "%s", translate("gettextFromC","Database query get_events failed.\n")); return 1; } dive_end(); /* for (i=0; iroot) && (strcasecmp(root_element->name, info->root) != 0)) { info++; } if (info->root) { attribute = xmlGetProp(xmlFirstElementChild(root_element), "name"); if (attribute) { if (strcasecmp(attribute, "subsurface") == 0) { free((void *)attribute); return doc; } free((void *)attribute); } xmlSubstituteEntitiesDefault(1); xslt = get_stylesheet(info->file); if (xslt == NULL) { parser_error(error, translate("gettextFromC","Can't open stylesheet %s"), info->file); return doc; } transformed = xsltApplyStylesheet(xslt, doc, params); xmlFreeDoc(doc); xsltFreeStylesheet(xslt); return transformed; } return doc; } Subsurface-4.0.2/planner.c000066400000000000000000000552351226345450700154440ustar00rootroot00000000000000/* planner.c * * code that allows us to plan future dives * * (c) Dirk Hohndel 2013 */ #include #include #include #include #include "dive.h" #include "divelist.h" #include "planner.h" #include "gettext.h" unsigned int decostoplevels[] = { 0, 3000, 6000, 9000, 12000, 15000, 18000, 21000, 24000, 27000, 30000, 33000, 36000, 39000, 42000, 45000, 48000, 51000, 54000, 57000, 60000, 63000, 66000, 69000, 72000, 75000, 78000, 81000, 84000, 87000, 90000, 100000, 110000, 120000, 130000, 140000, 150000, 160000, 170000, 180000, 190000, 200000, 220000, 240000, 260000, 280000, 300000, 320000, 340000, 360000, 380000 }; double plangflow, plangfhigh; char *disclaimer; #if DEBUG_PLAN void dump_plan(struct diveplan *diveplan) { struct divedatapoint *dp; struct tm tm; if (!diveplan) { printf ("Diveplan NULL\n"); return; } utc_mkdate(diveplan->when, &tm); printf("\nDiveplan @ %04d-%02d-%02d %02d:%02d:%02d (surfpres %dmbar):\n", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, diveplan->surface_pressure); dp = diveplan->dp; while (dp) { printf("\t%3u:%02u: %dmm gas: %d o2 %d h2\n", FRACTION(dp->time, 60), dp->depth, dp->o2, dp->he); dp = dp->next; } } #endif void set_last_stop(bool last_stop_6m) { if (last_stop_6m == TRUE) decostoplevels[1] = 6000; else decostoplevels[1] = 3000; } void get_gas_from_events(struct divecomputer *dc, int time, int *o2, int *he) { // we don't modify the values passed in if nothing is found // so don't call with uninitialized o2/he ! struct event *event = dc->events; while (event && event->time.seconds <= time) { if (!strcmp(event->name, "gaschange")) { *o2 = 10 * event->value & 0xffff; *he = 10 * event->value >> 16; } event = event->next; } } /* simple helper function to compare two permille values with * (rounded) percent granularity */ static inline bool match_percent(int a, int b) { return (a + 5) / 10 == (b + 5) / 10; } int get_gasidx(struct dive *dive, int o2, int he) { int gasidx = -1; /* we treat air as 0/0 because it is special */ if (is_air(o2, he)) o2 = 0; while (++gasidx < MAX_CYLINDERS) if (match_percent(dive->cylinder[gasidx].gasmix.o2.permille, o2) && match_percent(dive->cylinder[gasidx].gasmix.he.permille, he)) return gasidx; return -1; } void get_gas_string(int o2, int he, char *text, int len) { if (is_air(o2, he)) snprintf(text, len, "%s", translate("gettextFromC","air")); else if (he == 0) snprintf(text, len, translate("gettextFromC","EAN%d"), (o2 + 5) / 10); else snprintf(text, len, "(%d/%d)", (o2 + 5) / 10, (he + 5) / 10); } /* returns the tissue tolerance at the end of this (partial) dive */ double tissue_at_end(struct dive *dive, char **cached_datap, const char **error_string_p) { struct divecomputer *dc; struct sample *sample, *psample; int i, j, t0, t1, gasidx, lastdepth; int o2, he; double tissue_tolerance; static char buf[200]; if (!dive) return 0.0; if (*cached_datap) { tissue_tolerance = restore_deco_state(*cached_datap); } else { tissue_tolerance = init_decompression(dive); cache_deco_state(tissue_tolerance, cached_datap); } dc = &dive->dc; if (!dc->samples) return tissue_tolerance; psample = sample = dc->sample; lastdepth = t0 = 0; /* we always start with gas 0 (unless an event tells us otherwise) */ o2 = dive->cylinder[0].gasmix.o2.permille; he = dive->cylinder[0].gasmix.he.permille; for (i = 0; i < dc->samples; i++, sample++) { t1 = sample->time.seconds; get_gas_from_events(&dive->dc, t0, &o2, &he); if ((gasidx = get_gasidx(dive, o2, he)) == -1) { snprintf(buf, sizeof(buf),translate("gettextFromC","Can't find gas %d/%d"), (o2 + 5) / 10, (he + 5) / 10); *error_string_p = buf; gasidx = 0; } if (i > 0) lastdepth = psample->depth.mm; for (j = t0; j < t1; j++) { int depth = interpolate(lastdepth, sample->depth.mm, j - t0, t1 - t0); tissue_tolerance = add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[gasidx].gasmix, 1, sample->po2, dive); } psample = sample; t0 = t1; } return tissue_tolerance; } /* how many seconds until we can ascend to the next stop? */ static int time_at_last_depth(struct dive *dive, int o2, int he, unsigned int next_stop, char **cached_data_p, const char **error_string_p) { int depth, gasidx; double surface_pressure, tissue_tolerance; int wait = 0; struct sample *sample; if (!dive) return 0; surface_pressure = dive->dc.surface_pressure.mbar / 1000.0; tissue_tolerance = tissue_at_end(dive, cached_data_p, error_string_p); sample = &dive->dc.sample[dive->dc.samples - 1]; depth = sample->depth.mm; gasidx = get_gasidx(dive, o2, he); while (deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1) > next_stop) { wait++; tissue_tolerance = add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[gasidx].gasmix, 1, sample->po2, dive); } return wait; } void fill_default_cylinder(cylinder_t *cyl) { const char *cyl_name = prefs.default_cylinder != NULL ? prefs.default_cylinder : "AL80"; struct tank_info_t *ti = tank_info; struct tank_info_t *al80 = NULL; while (ti->name != NULL) { if (strcmp(ti->name, cyl_name) == 0) break; if (strcmp(ti->name, "AL80") == 0) al80 = ti; ti++; } if (ti->name == NULL) ti = al80; cyl->type.description = strdup(ti->name); if (ti->ml) { cyl->type.size.mliter = ti->ml; cyl->type.workingpressure.mbar = ti->bar * 1000; } else { cyl->type.workingpressure.mbar = psi_to_mbar(ti->psi); if (ti->psi) cyl->type.size.mliter = cuft_to_l(ti->cuft) * 1000 / bar_to_atm(psi_to_bar(ti->psi)); } } static int add_gas(struct dive *dive, int o2, int he) { int i; struct gasmix *mix; cylinder_t *cyl; for (i = 0; i < MAX_CYLINDERS; i++) { cyl = dive->cylinder + i; mix = &cyl->gasmix; if (cylinder_nodata(cyl)) break; if (match_percent(o2, mix->o2.permille) && match_percent(he, mix->he.permille)) return i; } if (i == MAX_CYLINDERS) { return -1; } /* let's make it our default cylinder */ fill_default_cylinder(cyl); mix->o2.permille = o2; mix->he.permille = he; return i; } struct dive *create_dive_from_plan(struct diveplan *diveplan, const char **error_string) { struct dive *dive; struct divedatapoint *dp; struct divecomputer *dc; struct sample *sample; int oldo2 = O2_IN_AIR, oldhe = 0; int oldpo2 = 0; int lasttime = 0; *error_string = NULL; if (!diveplan || !diveplan->dp) return NULL; #if DEBUG_PLAN & 4 printf("in create_dive_from_plan\n"); dump_plan(diveplan); #endif dive = alloc_dive(); dive->when = diveplan->when; dive->dc.surface_pressure.mbar = diveplan->surface_pressure; dc = &dive->dc; dc->model = "planned dive"; /* do not translate here ! */ dp = diveplan->dp; /* let's start with the gas given on the first segment */ if (dp->o2 || dp->he) { oldo2 = dp->o2; oldhe = dp->he; } sample = prepare_sample(dc); sample->po2 = dp->po2; finish_sample(dc); if (add_gas(dive, oldo2, oldhe) < 0) goto gas_error_exit; while (dp) { int o2 = dp->o2, he = dp->he; int po2 = dp->po2; int time = dp->time; int depth = dp->depth; if (time == 0) { /* special entries that just inform the algorithm about * additional gases that are available */ if (add_gas(dive, o2, he) < 0) goto gas_error_exit; dp = dp->next; continue; } if (!o2 && !he) { o2 = oldo2; he = oldhe; } /* Check for SetPoint change */ if (oldpo2 != po2) { if (lasttime) add_event(dc, lasttime, 20, 0, po2, "SP change"); // SAMPLE_EVENT_PO2 oldpo2 = po2; } /* Create new gas, and gas change event if necessary; * Sadly, we inherited our gaschange event from libdivecomputer which only * support percentage values, so round the entries */ if (o2 != oldo2 || he != oldhe) { int plano2 = (o2 + 5) / 10 * 10; int planhe = (he + 5) / 10 * 10; int idx; if ((idx = add_gas(dive, plano2, planhe)) < 0) goto gas_error_exit; add_gas_switch_event(dive, dc, lasttime, idx); oldo2 = o2; oldhe = he; } /* Create sample */ sample = prepare_sample(dc); /* set po2 at beginning of this segment */ /* and keep it valid for last sample - where it likely doesn't matter */ sample[-1].po2 = po2; sample->po2 = po2; sample->time.seconds = time; sample->depth.mm = depth; finish_sample(dc); lasttime = time; dp = dp->next; } if (dc->samples <= 1) { /* not enough there yet to create a dive - most likely the first time is missing */ free(dive); dive = NULL; } #if DEBUG_PLAN & 32 if (dive) save_dive(stdout, dive); #endif return dive; gas_error_exit: free(dive); *error_string = translate("gettextFromC","Too many gas mixes"); return NULL; } void free_dps(struct divedatapoint *dp) { while (dp) { struct divedatapoint *ndp = dp->next; free(dp); dp = ndp; } } struct divedatapoint *create_dp(int time_incr, int depth, int o2, int he, int po2) { struct divedatapoint *dp; dp = malloc(sizeof(struct divedatapoint)); dp->time = time_incr; dp->depth = depth; dp->o2 = o2; dp->he = he; dp->po2 = po2; dp->entered = FALSE; dp->next = NULL; return dp; } struct divedatapoint *get_nth_dp(struct diveplan *diveplan, int idx) { struct divedatapoint **ldpp, *dp = diveplan->dp; int i = 0; ldpp = &diveplan->dp; while (dp && i++ < idx) { ldpp = &dp->next; dp = dp->next; } while (i++ <= idx) { *ldpp = dp = create_dp(0, 0, 0, 0, 0); ldpp = &((*ldpp)->next); } return dp; } void add_to_end_of_diveplan(struct diveplan *diveplan, struct divedatapoint *dp) { struct divedatapoint **lastdp = &diveplan->dp; struct divedatapoint *ldp = *lastdp; int lasttime = 0; while (*lastdp) { ldp = *lastdp; if (ldp->time > lasttime) lasttime = ldp->time; lastdp = &(*lastdp)->next; } *lastdp = dp; if (ldp && dp->time != 0) dp->time += lasttime; } struct divedatapoint * plan_add_segment(struct diveplan *diveplan, int duration, int depth, int o2, int he, int po2) { struct divedatapoint *dp = create_dp(duration, depth, o2, he, po2); add_to_end_of_diveplan(diveplan, dp); return(dp); } struct gaschanges { unsigned int depth; int gasidx; }; static struct gaschanges *analyze_gaslist(struct diveplan *diveplan, struct dive *dive, int *gaschangenr) { int nr = 0; struct gaschanges *gaschanges = NULL; struct divedatapoint *dp = diveplan->dp; while (dp) { if (dp->time == 0) { int i = 0, j = 0; nr++; gaschanges = realloc(gaschanges, nr * sizeof(struct gaschanges)); while (i < nr - 1) { if (dp->depth < gaschanges[i].depth) { memmove(gaschanges + i + 1, gaschanges + i, (nr - i - 1) * sizeof(struct gaschanges)); break; } i++; } gaschanges[i].depth = dp->depth; gaschanges[i].gasidx = -1; do { if (dive->cylinder[j].gasmix.o2.permille == dp->o2 && dive->cylinder[j].gasmix.he.permille == dp->he) { gaschanges[i].gasidx = j; break; } j++; } while (j < MAX_CYLINDERS); assert(gaschanges[i].gasidx != -1); } dp = dp->next; } *gaschangenr = nr; #if DEBUG_PLAN & 16 for (nr = 0; nr < *gaschangenr; nr++) printf("gaschange nr %d: @ %5.2lfm gasidx %d (%d/%d)\n", nr, gaschanges[nr].depth / 1000.0, gaschanges[nr].gasidx, (dive->cylinder[gaschanges[nr].gasidx].gasmix.o2.permille + 5) / 10, (dive->cylinder[gaschanges[nr].gasidx].gasmix.he.permille + 5) / 10); #endif return gaschanges; } /* sort all the stops into one ordered list */ static unsigned int *sort_stops(unsigned int *dstops, int dnr, struct gaschanges *gstops, int gnr) { int i, gi, di; int total = dnr + gnr; unsigned int *stoplevels = malloc(total * sizeof(unsigned int)); /* no gaschanges */ if (gnr == 0) { memcpy(stoplevels, dstops, dnr * sizeof(unsigned int)); return stoplevels; } i = total - 1; gi = gnr - 1; di = dnr - 1; while (i >= 0) { if (dstops[di] > gstops[gi].depth) { stoplevels[i] = dstops[di]; di--; } else if (dstops[di] == gstops[gi].depth) { stoplevels[i] = dstops[di]; di--; gi--; } else { stoplevels[i] = gstops[gi].depth; gi--; } i--; if (di < 0) { while (gi >= 0) stoplevels[i--] = gstops[gi--].depth; break; } if (gi < 0) { while (di >= 0) stoplevels[i--] = dstops[di--]; break; } } while (i >= 0) stoplevels[i--] = 0; #if DEBUG_PLAN & 16 int k; for (k = gnr + dnr -1; k >= 0; k--) { printf("stoplevel[%d]: %5.2lfm\n", k, stoplevels[k]/1000.0); if (stoplevels[k] == 0) break; } #endif return stoplevels; } #if DO_WE_WANT_THIS_IN_QT static void add_plan_to_notes(struct diveplan *diveplan, struct dive *dive) { char buffer[20000]; int consumption[MAX_CYLINDERS] = { 0, }; int len, gasidx, lastdepth = 0, lasttime = 0; struct divedatapoint *dp = diveplan->dp; int o2, he; if (!dp) return; snprintf(buffer, sizeof(buffer), translate("gettextFromC","%s\nSubsurface dive plan\nbased on GFlow = %.0f and GFhigh = %.0f\n\n"), disclaimer, plangflow * 100, plangfhigh * 100); /* we start with gas 0, then check if that was changed */ o2 = dive->cylinder[0].gasmix.o2.permille; he = dive->cylinder[0].gasmix.he.permille; do { const char *depth_unit; char gas[64]; double depthvalue; int decimals; double used; int newo2 = o2, newhe = he; struct divedatapoint *nextdp; if (dp->time == 0) continue; depthvalue = get_depth_units(dp->depth, &decimals, &depth_unit); /* do we change gas after this segment? We need to look at the gas * for the next segment (that isn't just a record of available gas !!) * to find out */ nextdp = dp->next; while (nextdp && nextdp->time == 0) nextdp = nextdp->next; if (nextdp) { newo2 = nextdp->o2; newhe = nextdp->he; if (newhe == 0 && newo2 == 0) { /* same as last segment */ newo2 = o2; newhe = he; } } /* do we want to skip this leg as it is devoid of anything useful? */ if (!dp->entered && o2 == newo2 && he == newhe && nextdp && dp->depth != lastdepth && nextdp->depth != dp->depth) continue; get_gas_string(o2, he, gas, sizeof(gas)); gasidx = get_gasidx(dive, o2, he); len = strlen(buffer); if (dp->depth != lastdepth) { used = diveplan->bottomsac / 1000.0 * depth_to_mbar((dp->depth + lastdepth) / 2, dive) * (dp->time - lasttime) / 60; snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC","Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n"), decimals, depthvalue, depth_unit, FRACTION(dp->time - lasttime, 60), FRACTION(dp->time, 60), gas); } else { /* we use deco SAC rate during the calculated deco stops, bottom SAC rate everywhere else */ int sac = dp->entered ? diveplan->bottomsac : diveplan->decosac; used = sac / 1000.0 * depth_to_mbar(dp->depth, dive) * (dp->time - lasttime) / 60; snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC","Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n"), decimals, depthvalue, depth_unit, FRACTION(dp->time - lasttime, 60), FRACTION(dp->time, 60), gas); } if (gasidx != -1) consumption[gasidx] += used; get_gas_string(newo2, newhe, gas, sizeof(gas)); if (o2 != newo2 || he != newhe) { len = strlen(buffer); snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC","Switch gas to %s\n"), gas); } o2 = newo2; he = newhe; lasttime = dp->time; lastdepth = dp->depth; } while ((dp = dp->next) != NULL); len = strlen(buffer); snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC","Gas consumption:\n")); for (gasidx = 0; gasidx < MAX_CYLINDERS; gasidx++) { double volume; const char *unit; char gas[64]; if (consumption[gasidx] == 0) continue; len = strlen(buffer); volume = get_volume_units(consumption[gasidx], NULL, &unit); get_gas_string(dive->cylinder[gasidx].gasmix.o2.permille, dive->cylinder[gasidx].gasmix.he.permille, gas, sizeof(gas)); snprintf(buffer + len, sizeof(buffer) - len, translate("gettextFromC","%.0f%s of %s\n"), volume, unit, gas); } dive->notes = strdup(buffer); } #endif void plan(struct diveplan *diveplan, char **cached_datap, struct dive **divep, bool add_deco, const char **error_string_p) { struct dive *dive; struct sample *sample; int wait_time, o2, he, po2; int transitiontime, gi; unsigned int stopidx, depth, ceiling; double tissue_tolerance; struct gaschanges *gaschanges = NULL; int gaschangenr; unsigned int *stoplevels = NULL; set_gf(diveplan->gflow, diveplan->gfhigh, default_prefs.gf_low_at_maxdepth); if (!diveplan->surface_pressure) diveplan->surface_pressure = SURFACE_PRESSURE; if (*divep) delete_single_dive(dive_table.nr - 1); *divep = dive = create_dive_from_plan(diveplan, error_string_p); if (!dive) return; record_dive(dive); sample = &dive->dc.sample[dive->dc.samples - 1]; /* we start with gas 0, then check if that was changed */ o2 = dive->cylinder[0].gasmix.o2.permille; he = dive->cylinder[0].gasmix.he.permille; get_gas_from_events(&dive->dc, sample->time.seconds, &o2, &he); po2 = dive->dc.sample[dive->dc.samples - 1].po2; depth = dive->dc.sample[dive->dc.samples - 1].depth.mm; /* if all we wanted was the dive just get us back to the surface */ if (!add_deco) { transitiontime = depth / 75; /* this still needs to be made configurable */ plan_add_segment(diveplan, transitiontime, 0, o2, he, po2); /* re-create the dive */ delete_single_dive(dive_table.nr - 1); *divep = dive = create_dive_from_plan(diveplan, error_string_p); if (dive) record_dive(dive); return; } tissue_tolerance = tissue_at_end(dive, cached_datap, error_string_p); ceiling = deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1); #if DEBUG_PLAN & 4 printf("gas %d/%d\n", o2, he); printf("depth %5.2lfm ceiling %5.2lfm\n", depth / 1000.0, ceiling / 1000.0); #endif if (depth < ceiling) /* that's not good... */ depth = ceiling; if (depth == 0 && ceiling == 0) /* we are done here */ goto done; for (stopidx = 0; stopidx < sizeof(decostoplevels) / sizeof(int); stopidx++) if (decostoplevels[stopidx] >= ceiling) break; if (stopidx > 0) stopidx--; /* so now we know the first decostop level above us * NOTE, this could be the surface or a long list of potential stops * we do NOT start only at the ceiling, as the ceiling may come down * further during the ascent. * Next we need to figure out if there are better gases available * and at which depths we are supposed to switch to them */ gaschanges = analyze_gaslist(diveplan, dive, &gaschangenr); stoplevels = sort_stops(decostoplevels, stopidx + 1, gaschanges, gaschangenr); gi = gaschangenr - 1; stopidx += gaschangenr; if (depth > stoplevels[stopidx]) { /* right now all the transitions are at 30ft/min - this needs to be configurable */ transitiontime = (depth - stoplevels[stopidx]) / 150; #if DEBUG_PLAN & 2 printf("transitiontime %d:%02d to depth %5.2lfm\n", FRACTION(transitiontime, 60), stoplevels[stopidx] / 1000.0); #endif plan_add_segment(diveplan, transitiontime, stoplevels[stopidx], o2, he, po2); /* re-create the dive */ delete_single_dive(dive_table.nr - 1); *divep = dive = create_dive_from_plan(diveplan, error_string_p); if (!dive) goto error_exit; record_dive(dive); } while (stopidx > 0) { /* this indicates that we aren't surfacing directly */ /* if we are in a double-step, eg, when 3m/10ft stop is disabled, * just skip the first stop at that depth */ if (stoplevels[stopidx] == stoplevels[stopidx - 1]) { stopidx--; continue; } if (gi >= 0 && stoplevels[stopidx] == gaschanges[gi].depth) { o2 = dive->cylinder[gaschanges[gi].gasidx].gasmix.o2.permille; he = dive->cylinder[gaschanges[gi].gasidx].gasmix.he.permille; #if DEBUG_PLAN & 16 printf("switch to gas %d (%d/%d) @ %5.2lfm\n", gaschanges[gi].gasidx, (o2 + 5) / 10, (he + 5) / 10, gaschanges[gi].depth / 1000.0); #endif gi--; } wait_time = time_at_last_depth(dive, o2, he, stoplevels[stopidx - 1], cached_datap, error_string_p); /* typically deco plans are done in one minute increments; we may want to * make this configurable at some point */ wait_time = ((wait_time + 59) / 60) * 60; #if DEBUG_PLAN & 2 tissue_tolerance = tissue_at_end(dive, cached_datap, error_string_p); ceiling = deco_allowed_depth(tissue_tolerance, diveplan->surface_pressure / 1000.0, dive, 1); printf("waittime %d:%02d at depth %5.2lfm; ceiling %5.2lfm\n", FRACTION(wait_time, 60), stoplevels[stopidx] / 1000.0, ceiling / 1000.0); #endif if (wait_time) plan_add_segment(diveplan, wait_time, stoplevels[stopidx], o2, he, po2); /* right now all the transitions are at 30ft/min - this needs to be configurable */ transitiontime = (stoplevels[stopidx] - stoplevels[stopidx - 1]) / 150; #if DEBUG_PLAN & 2 printf("transitiontime %d:%02d to depth %5.2lfm\n", FRACTION(transitiontime, 60), stoplevels[stopidx - 1] / 1000.0); #endif plan_add_segment(diveplan, transitiontime, stoplevels[stopidx - 1], o2, he, po2); /* re-create the dive */ delete_single_dive(dive_table.nr - 1); *divep = dive = create_dive_from_plan(diveplan, error_string_p); if (!dive) goto error_exit; record_dive(dive); stopidx--; } done: #if DO_WE_WANT_THIS_IN_QT add_plan_to_notes(diveplan, dive); #endif error_exit: free(stoplevels); free(gaschanges); } /* * Get a value in tenths (so "10.2" == 102, "9" = 90) * * Return negative for errors. */ static int get_tenths(const char *begin, const char **endp) { char *end; int value = strtol(begin, &end, 10); if (begin == end) return -1; value *= 10; /* Fraction? We only look at the first digit */ if (*end == '.') { end++; if (!isdigit(*end)) return -1; value += *end - '0'; do { end++; } while (isdigit(*end)); } *endp = end; return value; } static int get_permille(const char *begin, const char **end) { int value = get_tenths(begin, end); if (value >= 0) { /* Allow a percentage sign */ if (**end == '%') ++*end; } return value; } int validate_gas(const char *text, int *o2_p, int *he_p) { int o2, he; if (!text) return 0; while (isspace(*text)) text++; if (!*text) return 0; if (!strcasecmp(text, translate("gettextFromC","air"))) { o2 = O2_IN_AIR; he = 0; text += strlen(translate("gettextFromC","air")); } else if (!strncasecmp(text, translate("gettextFromC","ean"), 3)) { o2 = get_permille(text+3, &text); he = 0; } else { o2 = get_permille(text, &text); he = 0; if (*text == '/') he = get_permille(text+1, &text); } /* We don't want any extra crud */ while (isspace(*text)) text++; if (*text) return 0; /* Validate the gas mix */ if (*text || o2 < 1 || o2 > 1000 || he < 0 || o2+he > 1000) return 0; /* Let it rip */ *o2_p = o2; *he_p = he; return 1; } int validate_po2(const char *text, int *mbar_po2) { int po2; if (!text) return 0; po2 = get_tenths(text, &text); if (po2 < 0) return 0; while (isspace(*text)) text++; while (isspace(*text)) text++; if (*text) return 0; *mbar_po2 = po2 * 100; return 1; } Subsurface-4.0.2/planner.h000066400000000000000000000012711226345450700154400ustar00rootroot00000000000000#ifndef PLANNER_H #define PLANNER_H #ifdef __cplusplus extern "C" { #endif extern int validate_gas(const char *text, int *o2_p, int *he_p); extern int validate_po2(const char *text, int *mbar_po2); extern timestamp_t current_time_notz(void); extern void show_planned_dive(char **error_string_p); extern void set_last_stop(bool last_stop_6m); extern void get_gas_from_events(struct divecomputer *dc, int time, int *o2, int *he); extern int get_gasidx(struct dive *dive, int o2, int he); extern struct diveplan diveplan; extern struct dive *planned_dive; extern char *cache_data; extern char *disclaimer; extern double plangflow, plangfhigh; #ifdef __cplusplus } #endif #endif /* PLANNER_H */ Subsurface-4.0.2/po/000077500000000000000000000000001226345450700142455ustar00rootroot00000000000000Subsurface-4.0.2/po/bg_BG.aliases000066400000000000000000000000031226345450700165410ustar00rootroot00000000000000bg Subsurface-4.0.2/po/bg_BG.po000066400000000000000000001477621226345450700155660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # neolit123 , 2013 # neolit123 , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 07:30+0000\n" "Last-Translator: neolit123 \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/subsurface/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nНяма събития\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Месец" #: webservice.c:289 msgid " Download" msgstr " Изтегли" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Моля изберете леководолазен компютър и устройство. " #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " начало" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " край" #: statistics-gtk.c:92 msgid "#" msgstr "№" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/мин" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s от %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s %3$s, %2$s, %4$d, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d %2$s %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %3$d %2$s, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %3$d %2$s, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d мин" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dд %dч %dмин" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dч %dмин" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nтаван %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nДеко:%uмин @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nДеко:неопр. време @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nВ деко" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nСтоп:%uмин @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nСтоп:неопр. време @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface планиране\nбазирано на GFlow = %.0f и GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fбара" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fбара" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fбара" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s събитие в %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Отговор от divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) или (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(щракнете за да редактирате време/дата)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(щракнете за да редактирате време/дата/дълбочина)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(няма гмуркания)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(нищо)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 кб.фута/мин" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 кб.фута/мин" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 л/мин" #: print.c:956 msgid "2 dives per page" msgstr "2 гмуркания на стр." #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "2 за цял костюм" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 л/мин" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3м увеличение за изчислен таван" #: print.c:952 msgid "6 dives per page" msgstr "6 гмуркания на стр." #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Добавете сегменти долу.\nВсеки ред отговаря на част от планираното гмуркане.\nВходни данни с дълбочина, време и газ, описват сегмент, който свършва в конкретна дълбочина, отнема определено време (пр. '+3:30' ако e относително или '@5:00' ако абсолютно) и изполва конкретен газ.\nПразен газ означава 'използвай предния газ' (или въздух).\nВходни данни с дъбочина и газ, но без време, информира системата за плануване, че газа се използва само за изкачването след като дълбочината е достигната.\nCC SetPoint означава CC (rebreather) гмуркания. Оставете празно за тип OC.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Въздух" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "За Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Добави" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Добави гмуркане..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Добави маркирано събитие тук" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Добави гмуркане" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Добави събитие за промяна на газ" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Добави събитие за промяна на газ в %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Добави в горно пътуване" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Добави контролна точка" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Атмосф. налягане" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Темп. на въздух" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Tемп. на въздуха в %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Винаги предпочитай изтегленото гмуркане" #: main.c:73 msgid "Apr" msgstr "Апр" #: main.c:74 msgid "Aug" msgstr "Авг" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Автоматично групиране" #: equipment.c:642 msgid "Available gases" msgstr "Достъпни газове" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Средно" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Средно" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Средно" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Средно" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Средна дълбочина" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Средна дълбочина (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Средно SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Средна темп." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Средно време" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Връщане към OC" #: gtk-gui.c:780 msgid "Bar" msgstr "Бара" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Партньор" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Не може да бъде намерен газ %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Не може да бъде зареден стилов файл (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Отмяна. Изпълняване на чист изход..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Отмяна..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Не може да се добави промяна за газ" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Не може да бъде напревен разряд!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Целзии" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Моля изберете XML файл по подразбиране" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Моля изберете XML файлове за вмъкване" #: gtk-gui.c:1611 msgid "Close" msgstr "Затвори" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Свиване на всички" #: webservice.c:121 msgid "Connecting..." msgstr "Свръзване..." #: webservice.c:25 msgid "Connection Error: " msgstr "Грешка при връзка: " #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Създай ново пътуване" #: gtk-gui.c:786 msgid "CuFt" msgstr "Кб.Фута" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Бут." #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Бутилка" #: planner.c:192 msgid "Cylinder for planning" msgstr "Бутилка за плануване" #: equipment.c:1603 msgid "Cylinders" msgstr "Бутилки" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "ВНИМАНИЕ: ТОВА Е НОВО ИЗПЪЛНЕНИЕ НА АГЛОРИТЪМА НА БУЛМАН И НА ПЛАНОВИКА, КОИТО НЕ СА ТЕСТВАНИ ДОСТАТЪЧНО. МОЛЯ НЕ ПЛАНУВАЙТЕ ИЗТИНСКИ ГМУРКАНИЯ БАЗИРАНИ НА ДАННИТЕ ТУК!" #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Няма връзка към базата данни '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Грешка при заява към база данни '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Базата данни не може да изпълни get_events.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Дата" #: info-gtk.c:824 msgid "Date and Time" msgstr "Дата и час" #: info-gtk.c:834 msgid "Date:" msgstr "Дата:" #: main.c:74 msgid "Dec" msgstr "Дек" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "XML файл по подразибране" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Изтрий данни за леководолазен компютър" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Изтрий гмуркане" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Изтрий гмуркания" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Дълбочина" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Надминат лимит на дълбочина" #: gtk-gui.c:774 msgid "Depth:" msgstr "Дълбочина:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Име на устройство" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Устройсто или входна точка" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Покажи невалидни гмуркания" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Гмуркане #%1$d - %2$s %3$02d/%4$02d/%5$04d в %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Гмуркане №%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Гмуркане №%d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Прякор на леководолазен компютър" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Информация" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Бележки" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "ГМУРКАЧЕСКИ ПЛАНОВИК - ТОВА Е САМО СИМУЛАЦИЯ. НЕ ИЗПОЛЗВАЙТЕ ЗА ИЗТИНСКИ ГМУРКАНИЯ" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Тагове" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Време" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Тревога: Време за гмуркане" #: uemis.c:226 msgid "Dive Time Info" msgstr "Времева Информация за гмуркане" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Марка и модел на гмуркачески комютър" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Грешка при вход на данни" #: gps.c:214 msgid "Dive locations" msgstr "Места за гмуркане" #: info-gtk.c:575 msgid "Dive master" msgstr "Водач" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Гмуркането започва кога?" #: print.c:502 msgid "Dive#" msgstr "Гмуркане №" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Шрифт за списъка на гмуркания" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Водач" #: statistics-gtk.c:542 msgid "Dives" msgstr "Гмуркания" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Местонахождения" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Изтегли от леководолазен компютър" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Изтегли от леководолазен компютър..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Изтегли от уеб услугата" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Изтегли от уеб услуга..." #: webservice.c:31 msgid "Download Success!" msgstr "Успешно изтегляне!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Продълж. (мин.)" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Продълж. (мин.)" #: info.c:312 msgid "E" msgstr "И" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Редактирай" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Редактирай имена на устройства" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Редактирай прякори на гмуркачерски комютри" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Редактиране на информация за пътуване" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Редактиране на обобщение за пътуване" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Редактирайте прякора на гмуркачески комютър като кликнете два пъти върху съответното поле" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Редактиране на гмуркане" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Редактирай дата/време на гмуркане" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Редактирай гмуркания" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Редактиране на гмуркания" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Редактиране на обобщение за пътуване" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Включване / изключване на събития" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Включи / Изключи Тагове" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Край" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Мин. дълбочина" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Въведете потребителски ключ и натиснете 'Изтегли'. След като е готово може да натиснете 'Прилагане' ако желаете на приложите промените." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Екипировка" #: divelist-gtk.c:1370 msgid "Error" msgstr "Грешка" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Грешка при прием на водна соленост" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Грешка при разряд на дата и час" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Грешка при рaзряд на време за гмуркане" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Грешка при рaзряд на газ микс" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Грешка при рaзряд на газ микс брой" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Грешка при рaзряд на максимална дълбочина" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Грешка при рaзряд на стойности" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Грешка при регистриране на направление за отменяне" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Грешка при регистриране на данни" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Грешка при регистриране на направление за събития" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Събитие: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Събитие: изчаквание на действие от потребителя" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Разшири всички" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Експорт като UDDF файл" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Експорт на UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Експортирай гмурканe (гмуркания) като UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Фаренхайт" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Не могат да бъдат отворени %i файла" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Не може да бъде напревен разбор на '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Не може да бъде напревен разбор на '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Не може да бъде прочетен '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Не може да бъде прочетен '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Фев" #: gtk-gui.c:776 msgid "Feet" msgstr "Фута" #: gtk-gui.c:1601 msgid "File" msgstr "Файл" #: gtk-gui.c:1604 msgid "Filter" msgstr "Филтър" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Изтегли всички гмуркания" #: main.c:64 msgid "Fri" msgstr "Пет" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh за план" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow за план" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 или GPS формат)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Използван Газ" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Използван газ" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Използван Газ" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Консумация на газ:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Газ микс" #: gtk-gui.c:767 msgid "General Settings" msgstr "Общи настройки" #: gtk-gui.c:1606 msgid "Help" msgstr "Помощ" #: webservice.c:296 msgid "Idle" msgstr "Режим на готовност" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Вмъкни файл (файлове)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Информация" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Започни връзка" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Въведи план" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Грешна дълбочина - не може да бъде направен разряд \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Грешна дълбочина - стойности по-големи от 400м не се поддържат" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Неправилен газ на ред %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Грешно стартово време" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Грешен потребителски ключ" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Ян" #: main.c:74 msgid "Jul" msgstr "Юли" #: main.c:73 msgid "Jun" msgstr "Юни" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Последен стоп на 20 фута" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Последен стоп на 6 метра" #: print.c:985 msgid "Layout Options" msgstr "Настройки на оформление" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Линус Торвалдс, Дирк Хондел и други, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Списък" #: gtk-gui.c:785 msgid "Liter" msgstr "Литра" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Местонахождение" #: gtk-gui.c:1602 msgid "Log" msgstr "Регистър" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Най-дълго" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Най-дълго гмуркане" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Тревога: слаба батерия" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Внимание: слаба батерия" #: gtk-gui.c:862 msgid "Map provider" msgstr "Доставчик на карти" #: main.c:73 msgid "Mar" msgstr "Март" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Маркирай като невалидни" #: gps.c:53 msgid "Mark location here" msgstr "Маркирай местонахождение" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Маркирай като валидни" #: uemis.c:230 msgid "Marker" msgstr "Маркер" #: print.c:502 msgid "Master" msgstr "Водач" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Внимание: Максимално време на сигнал за декомпресия" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Макс. дълбочина" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Макс. дълбочина (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Макс. SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Макс. темп." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Максимална дълбочина: %.*f %s\nПродължителност: %d мин\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Макс. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Макс. налягане" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Максимум" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Максимум" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Максимум" #: main.c:73 msgid "May" msgstr "Май" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Слей гмуркания" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Слей пътуване с горно пътуване" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Слей пътуване с долно пътуване" #: gtk-gui.c:775 msgid "Meter" msgstr "Метра" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Мин. дълбочина" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Мин. SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Мин. темп." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Минимум" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Минимум" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Минимум" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Общи настройки" #: gtk-gui.c:1512 msgid "Model" msgstr "Модел" #: main.c:64 msgid "Mon" msgstr "Пон" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Мултиплатформен, гмуркачески регистър-софтуер написан на C" #: info.c:311 msgid "N" msgstr "С" #: gtk-gui.c:1607 msgid "New" msgstr "Нов" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Нов стартов номер" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Следващ ГК" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Прякор" #: uemis.c:232 msgid "No Tank Data" msgstr "Няма информация за резервоар" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Няма бутилки към това гмуркане" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Бележки" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Височина на бележките (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Бележки от горе" #: main.c:74 msgid "Nov" msgstr "Нов" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Окт" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Грешка върната от phread" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Пътвърди изтриване на избраното?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Покажи само гмуркания с тези тагове:" #: gtk-gui.c:291 msgid "Open File" msgstr "Отвори файл" #: gtk-gui.c:1608 msgid "Open..." msgstr "Отвори..." #: print.c:995 msgid "Ordering" msgstr "Подредба" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Височина на други данни (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Кислород" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Тревога: покачване на парциално О2 налягане" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Внимание: покачване на парциално О2 налягане" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Внимание: парциално О2 налягане в зелената зона" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Парола" #: info-gtk.c:565 msgid "Pick on map" msgstr "Изберете на картата" #: gtk-gui.c:1605 msgid "Planner" msgstr "Плановик" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Моля въведете вашия потребител и парола за divelogs.de. Избраните гмуркяния ще бъдат добавени към акаунта ви." #: gtk-gui.c:752 msgid "Preferences" msgstr "Настройки" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Настройки..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Налягане" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Налягане:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Предишен ГК" #: print.c:989 msgid "Print in color" msgstr "Печатай в цвят" #: print.c:978 msgid "Print only selected dives" msgstr "Напечатай само избраните гмуркания" #: print.c:974 msgid "Print selection" msgstr "Напечатай селекцията" #: print.c:939 print.c:946 msgid "Print type" msgstr "Тип на печата" #: gtk-gui.c:1612 msgid "Print..." msgstr "Напечатай..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Профил" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Настройки на профила" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Височина на профила (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Профил от горе" #: gtk-gui.c:1625 msgid "Quit" msgstr "Изход" #: uemis.c:218 msgid "RGT Alert" msgstr "Тревога: оставащо газ-време" #: uemis.c:216 msgid "RGT Warning" msgstr "Внимание: оставащо газ-време" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Оценка" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Четене на гмуркане %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Премахни" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Изтрий пътуване" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Изтрий гмуркане от пътуване" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Премахни събитие тук" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Изтрий избраните гмуркания от пътуване" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Преномерирай" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Преномерирай..." #: download-dialog.c:153 msgid "Retry" msgstr "Опитай пак" #: info.c:311 msgid "S" msgstr "Ю" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC по време на деко. стоп" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "Добави гмуркане" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Нарушение на безопасно спиране" #: main.c:64 msgid "Sat" msgstr "Съб" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Запиши като..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Запиши промените?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Запиши файл като?" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Запиши като..." #: gtk-gui.c:1609 msgid "Save..." msgstr "Запиши..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Средно време" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Избери събития" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Избери събития..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Избери тагове..." #: main.c:74 msgid "Sep" msgstr "Сеп" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Кратък запис в req.txt файл\nUemis Zurich включен ли е правилно?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Най-късо" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Най-кратко гмуркане" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Покажи Колони" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Покажи EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Покажи MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Покажи калкулиран таван" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Покажи докладван таван в червено" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Покажи на картата" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Покажи pHе диаграма" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Покажи pN%s диаграма" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Покажи pO%s диаграма" #: planner.c:217 msgid "Simulated Dive" msgstr "Симулирано гмуркане" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Големина" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Оразмеряване на височини (%% от оформление)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Тревога: скорост" #: uemis.c:203 msgid "Speed Warning" msgstr "Внимание: скорост" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Старт" #: uemis-downloader.c:782 msgid "Start download" msgstr "Започни теглене" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Статистика" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Статистика %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Статистики" #: webservice.c:295 msgid "Status" msgstr "Статус" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Остани на %.*f %s за %d:%02d мин - времетраене %d:%02u на %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Неразпозната стойност за проценти %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Водолазен костюм" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Нед" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Време на повърхността" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Налягане на повърхността (м.бара)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Превключи газ на %s\n" #: print.c:960 msgid "Table print" msgstr "Печат на таблица" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Таговете се показват само ако идентични за всички гмуркания" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Предложение за смяна на резервоар" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Информация: налагане на резервоар" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "TEC настройки" #: gtk-gui.c:805 msgid "Temp" msgstr "Температура" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Температура:" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Температура:" #: gtk-gui.c:1631 msgid "Three" msgstr "Комбиниран" #: main.c:64 msgid "Thu" msgstr "Чет" #: info-gtk.c:841 msgid "Time" msgstr "Време" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "За да редактирате гмуркане\nщракнете два пъти върху него в гмуркаческия списък" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Превключване на зуум" #: planner.c:294 msgid "Too many gas mixes" msgstr "Твърде много газови смеси" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Твърде много контролни точки" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Общо време" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Общо време" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Тегло:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Преход към %.*f %s за %d:%02d мин - времетраене %d:%02u на %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Пътуване: %1$s, %3$d %2$s, %4$d (%5$d Гмуркане)" msgstr[1] "Пътуване: %1$s, %3$d %2$s, %4$d (%5$d Гмуркания)" #: main.c:64 msgid "Tue" msgstr "Вт" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Тип" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: файловата система е почти пълна\nИзлючете и свържете на ново леководолазния компютър\nи опитайте пак" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Файловата система е пълна\nИзлючете/Свържете на ново леководолазния компютър\nи опитайте пак" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemis не може да бъде зареден" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Не може да бъде създаден libdivecomputer контекст" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Не може да бъде създаден разряд за %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Не може да бъдe отворен %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Единици" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Качи гмуркане (гмуркания) на divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Качи на divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Качи на divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Маркирайте местонахождение с десния бутон на мишката" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Потребителски ключ" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Ръководство за потребителя" #: gtk-gui.c:1603 msgid "View" msgstr "Изглед" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Видимост" #: gtk-gui.c:784 msgid "Volume:" msgstr "Обем:" #: info.c:312 msgid "W" msgstr "З" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Внимание - прекалено дълги гмуркания могат да отнемат много време за калкулиране" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Внимание - плануването на прекалено дълбоки гмуркания може да отнеме много време" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Темп. на водата" #: webservice.c:163 msgid "Webservice" msgstr "Уеб услуга" #: main.c:64 msgid "Wed" msgstr "Ср" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Тежест" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Система за тежест" #: gtk-gui.c:794 msgid "Weight:" msgstr "Тегло:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML файл" #: statistics-gtk.c:92 msgid "Year" msgstr "Година" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Годишни статистики" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Вече имате въведен ГК от този модел\nнаименуван %s\nSubsurface може да поддържа прякор за това устройсто за да го различавате от вече съществуващо такова. По подразбиране това е модела и идентификатора показани долу.\nАко не желаете да да ползате прякор натиснете 'Отказване'." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Имате незаписани промени.\nЖелаете ли да ги запишете преди затваряне на файла?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Имате незаписани промени във файла %s.\nЖелаете ли да ги запишете преди затваряне на файла?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "въздух" #: libdivecomputer.c:153 msgid "airtime" msgstr "време за въздух" #: statistics.c:21 msgid "altitude" msgstr "височина" #: equipment.c:892 msgid "ankle" msgstr "глезен" #: libdivecomputer.c:149 msgid "ascent" msgstr "покачване" #: equipment.c:893 msgid "backplate weight" msgstr "нагръбна" #: dive.c:48 msgid "bar" msgstr "бара" #: equipment.c:891 msgid "belt" msgstr "колан" #: statistics.c:20 msgid "boat" msgstr "кораб" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "бележка" #: statistics.c:21 msgid "cave" msgstr "пещера" #: statistics.c:20 msgid "cavern" msgstr "каверна" #: libdivecomputer.c:149 msgid "ceiling" msgstr "таван" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "таван (безопасен стоп)" #: equipment.c:894 msgid "clip-on" msgstr "щипка" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "кб.фута" #: uemis-downloader.c:384 msgid "data" msgstr "данни" #: statistics.c:23 msgid "deco" msgstr "деко" #: libdivecomputer.c:149 msgid "deco stop" msgstr "деко. стоп" #: statistics.c:20 msgid "deep" msgstr "дълбоко" #: libdivecomputer.c:152 msgid "deepstop" msgstr "дълбочина на спиране" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "идент. за вписване в регистъра" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "идент. за вписване на местонахождение" #: libdivecomputer.c:152 msgid "divetime" msgstr "време за гмуркане" #: statistics.c:20 msgid "drift" msgstr "дрейф" #: uemis-downloader.c:589 msgid "drysuit" msgstr "сух костюм" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "за вички гмуркания" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "за гмуркане №%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "за гмуркания №" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "за избраните гмуркане" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "за избраните гмуркания" #: statistics.c:22 msgid "freshwater" msgstr "сладководно" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "фута" #: uemis-downloader.c:590 msgid "full suit" msgstr "пълен косюм" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "смяна на газ" #: libdivecomputer.c:153 msgid "heading" msgstr "посока" #: statistics.c:21 msgid "ice" msgstr "лед" #: equipment.c:890 msgid "integrated" msgstr "вградена" #: statistics.c:20 msgid "invalid" msgstr "невалидно" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "грешен номер на събитие" #: uemis-downloader.c:590 msgid "jacket" msgstr "яке" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "кг" #: dive.c:88 msgid "l" msgstr "л" #: statistics.c:21 msgid "lake" msgstr "езеро" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "паунда" #: uemis-downloader.c:590 msgid "long john" msgstr "лонг джон" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "м" #: gtk-gui.c:956 msgid "max ppO2" msgstr "макс ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "макс CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "макс. дълбочина" #: uemis-downloader.c:591 msgid "membrane" msgstr "мембрана" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "мин" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "повече данни за гмуркане" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "повече от %d дни" #: statistics.c:22 msgid "night" msgstr "вечер" #: libdivecomputer.c:154 msgid "non stop time" msgstr "нон стоп време" #: libdivecomputer.c:149 msgid "none" msgstr "няма" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHE праг" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s праг" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s праг" #: dive.c:44 msgid "pascal" msgstr "паскала" #: statistics.c:23 msgid "photo" msgstr "снимка" #: statistics.c:21 msgid "pool" msgstr "басейн" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "река" #: libdivecomputer.c:150 msgid "safety stop" msgstr "безопасен стоп" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "безопасен стоп (задължителен)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "безопасен стоп (свободен)" #: uemis-downloader.c:589 msgid "semidry" msgstr "полусух" #: statistics.c:20 msgid "shore" msgstr "бряг" #: uemis-downloader.c:590 msgid "shorty" msgstr "къс" #: libdivecomputer.c:150 msgid "surface" msgstr "повърхност" #: statistics.c:22 msgid "teaching" msgstr "учебно" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "внимание: ниво на тъканта" #: statistics.c:22 msgid "training" msgstr "тренировъчно" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Lubomir I. Ivanov" #: libdivecomputer.c:150 msgid "transmitter" msgstr "предавател" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "неизв." #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "неизвестно" #: equipment.c:540 msgid "unspecified" msgstr "неопределен" #: uemis-downloader.c:590 msgid "vest" msgstr "жилетка" #: statistics.c:23 msgid "video" msgstr "видео" #: libdivecomputer.c:150 msgid "violation" msgstr "нарушение" #: equipment.c:1545 msgid "weight" msgstr "тегло" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "мокър костюм" #: libdivecomputer.c:149 msgid "workload" msgstr "натовареност" #: statistics.c:21 msgid "wreck" msgstr "останки" Subsurface-4.0.2/po/ca_ES.aliases000066400000000000000000000000031226345450700165530ustar00rootroot00000000000000ca Subsurface-4.0.2/po/ca_ES.po000066400000000000000000001026571226345450700155720ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:53+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Catalan (Spain) (http://www.transifex.com/projects/p/subsurface/language/ca_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "" #: webservice.c:289 msgid " Download" msgstr "" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "" #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "" #: statistics-gtk.c:92 msgid "#" msgstr "" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "" #: print.c:322 #, c-format msgid "%s" msgstr "" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "" #: planner-gtk.c:415 msgid "17 l/min" msgstr "" #: print.c:956 msgid "2 dives per page" msgstr "" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "" #: planner-gtk.c:414 msgid "20 l/min" msgstr "" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "" #: print.c:952 msgid "6 dives per page" msgstr "" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "" #: planner-gtk.c:272 msgid "AIR" msgstr "" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "" #: gtk-gui.c:2116 msgid "Add" msgstr "" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "" #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "" #: statistics-gtk.c:608 msgid "Air Press" msgstr "" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "" #: main.c:73 msgid "Apr" msgstr "" #: main.c:74 msgid "Aug" msgstr "" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "" #: equipment.c:642 msgid "Available gases" msgstr "" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "" #: gtk-gui.c:780 msgid "Bar" msgstr "" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "" #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "" #: equipment.c:621 msgid "Cannot add gas change" msgstr "" #: webservice.c:29 msgid "Cannot parse response!" msgstr "" #: gtk-gui.c:790 msgid "Celsius" msgstr "" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "" #: gtk-gui.c:1611 msgid "Close" msgstr "" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "" #: webservice.c:121 msgid "Connecting..." msgstr "" #: webservice.c:25 msgid "Connection Error: " msgstr "" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "" #: gtk-gui.c:786 msgid "CuFt" msgstr "" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "" #: planner.c:192 msgid "Cylinder for planning" msgstr "" #: equipment.c:1603 msgid "Cylinders" msgstr "" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "" #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "" #: info-gtk.c:824 msgid "Date and Time" msgstr "" #: info-gtk.c:834 msgid "Date:" msgstr "" #: main.c:74 msgid "Dec" msgstr "" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "" #: gtk-gui.c:774 msgid "Depth:" msgstr "" #: gtk-gui.c:1517 msgid "Device Id" msgstr "" #: download-dialog.c:341 msgid "Device or mount point" msgstr "" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "" #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "" #: uemis.c:228 msgid "Dive Time Alert" msgstr "" #: uemis.c:226 msgid "Dive Time Info" msgstr "" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "" #: gps.c:214 msgid "Dive locations" msgstr "" #: info-gtk.c:575 msgid "Dive master" msgstr "" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "" #: print.c:502 msgid "Dive#" msgstr "" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "" #: info-gtk.c:1004 msgid "Divemaster" msgstr "" #: statistics-gtk.c:542 msgid "Dives" msgstr "" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "" #: webservice.c:260 msgid "Download From Web Service" msgstr "" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "" #: webservice.c:31 msgid "Download Success!" msgstr "" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "" #: info-gtk.c:911 msgid "Duration (min)" msgstr "" #: info.c:312 msgid "E" msgstr "" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "" #: planner-gtk.c:273 msgid "EAN32" msgstr "" #: planner-gtk.c:274 msgid "EAN36" msgstr "" #: info-gtk.c:99 msgid "Edit" msgstr "" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "" #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "" #: divelist-gtk.c:1370 msgid "Error" msgstr "" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "" #: main.c:73 msgid "Feb" msgstr "" #: gtk-gui.c:776 msgid "Feet" msgstr "" #: gtk-gui.c:1601 msgid "File" msgstr "" #: gtk-gui.c:1604 msgid "Filter" msgstr "" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "" #: main.c:64 msgid "Fri" msgstr "" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "" #: gtk-gui.c:997 msgid "GFlow" msgstr "" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "" #: gtk-gui.c:767 msgid "General Settings" msgstr "" #: gtk-gui.c:1606 msgid "Help" msgstr "" #: webservice.c:296 msgid "Idle" msgstr "" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "" #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "" #: main.c:74 msgid "Jul" msgstr "" #: main.c:73 msgid "Jun" msgstr "" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "" #: gtk-gui.c:1628 msgid "List" msgstr "" #: gtk-gui.c:785 msgid "Liter" msgstr "" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "" #: gtk-gui.c:1602 msgid "Log" msgstr "" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "" #: uemis.c:236 msgid "Low Battery Alert" msgstr "" #: uemis.c:234 msgid "Low Battery Warning" msgstr "" #: gtk-gui.c:862 msgid "Map provider" msgstr "" #: main.c:73 msgid "Mar" msgstr "" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "" #: gps.c:53 msgid "Mark location here" msgstr "" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "" #: uemis.c:230 msgid "Marker" msgstr "" #: print.c:502 msgid "Master" msgstr "" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "" #: equipment.c:1518 msgid "MaxPress" msgstr "" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "" #: main.c:73 msgid "May" msgstr "" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "" #: gtk-gui.c:775 msgid "Meter" msgstr "" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "" #: gtk-gui.c:1512 msgid "Model" msgstr "" #: main.c:64 msgid "Mon" msgstr "" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "" #: info.c:311 msgid "N" msgstr "" #: gtk-gui.c:1607 msgid "New" msgstr "" #: gtk-gui.c:1227 msgid "New starting number" msgstr "" #: gtk-gui.c:1634 msgid "Next DC" msgstr "" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "" #: uemis.c:232 msgid "No Tank Data" msgstr "" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "" #: print.c:1003 msgid "Notes on top" msgstr "" #: main.c:74 msgid "Nov" msgstr "" #: libdivecomputer.c:153 msgid "OLF" msgstr "" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "" #: main.c:74 msgid "Oct" msgstr "" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "" #: gtk-gui.c:291 msgid "Open File" msgstr "" #: gtk-gui.c:1608 msgid "Open..." msgstr "" #: print.c:995 msgid "Ordering" msgstr "" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "" #: print.c:173 #, c-format msgid "Oxygen" msgstr "" #: libdivecomputer.c:153 msgid "PO2" msgstr "" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "" #: gtk-gui.c:781 msgid "PSI" msgstr "" #: webservice.c:341 msgid "Password" msgstr "" #: info-gtk.c:565 msgid "Pick on map" msgstr "" #: gtk-gui.c:1605 msgid "Planner" msgstr "" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "" #: gtk-gui.c:752 msgid "Preferences" msgstr "" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "" #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "" #: gtk-gui.c:779 msgid "Pressure:" msgstr "" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "" #: print.c:989 msgid "Print in color" msgstr "" #: print.c:978 msgid "Print only selected dives" msgstr "" #: print.c:974 msgid "Print selection" msgstr "" #: print.c:939 print.c:946 msgid "Print type" msgstr "" #: gtk-gui.c:1612 msgid "Print..." msgstr "" #: gtk-gui.c:1629 msgid "Profile" msgstr "" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "" #: print.c:1000 msgid "Profile on top" msgstr "" #: gtk-gui.c:1625 msgid "Quit" msgstr "" #: uemis.c:218 msgid "RGT Alert" msgstr "" #: uemis.c:216 msgid "RGT Warning" msgstr "" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "" #: gtk-gui.c:2142 msgid "Remove" msgstr "" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "" #: gtk-gui.c:1218 msgid "Renumber" msgstr "" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "" #: download-dialog.c:153 msgid "Retry" msgstr "" #: info.c:311 msgid "S" msgstr "" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "" #: main.c:64 msgid "Sat" msgstr "" #: gtk-gui.c:1610 msgid "Save As..." msgstr "" #: gtk-gui.c:221 msgid "Save Changes?" msgstr "" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "" #: divelist-gtk.c:1710 msgid "Save as" msgstr "" #: gtk-gui.c:1609 msgid "Save..." msgstr "" #: planner-gtk.c:299 msgid "Segment Time" msgstr "" #: gtk-gui.c:1163 msgid "Select Events" msgstr "" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "" #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "" #: main.c:74 msgid "Sep" msgstr "" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "" #: gtk-gui.c:951 msgid "Show MOD" msgstr "" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "" #: planner.c:217 msgid "Simulated Dive" msgstr "" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "" #: uemis.c:200 msgid "Speed Alarm" msgstr "" #: uemis.c:203 msgid "Speed Warning" msgstr "" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "" #: uemis-downloader.c:782 msgid "Start download" msgstr "" #: statistics-gtk.c:532 msgid "Statistics" msgstr "" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "" #: gtk-gui.c:1865 msgid "Stats" msgstr "" #: webservice.c:295 msgid "Status" msgstr "" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "" #: print.c:960 msgid "Table print" msgstr "" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "" #: gtk-gui.c:805 msgid "Temp" msgstr "" #: statistics-gtk.c:92 msgid "Temperature" msgstr "" #: gtk-gui.c:789 msgid "Temperature:" msgstr "" #: gtk-gui.c:1631 msgid "Three" msgstr "" #: main.c:64 msgid "Thu" msgstr "" #: info-gtk.c:841 msgid "Time" msgstr "" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "" #: planner.c:294 msgid "Too many gas mixes" msgstr "" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "" #: statistics-gtk.c:551 msgid "Total Time" msgstr "" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "" msgstr[1] "" #: main.c:64 msgid "Tue" msgstr "" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "" #: gtk-gui.c:768 msgid "Units" msgstr "" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "" #: gtk-gui.c:1627 msgid "User Manual" msgstr "" #: gtk-gui.c:1603 msgid "View" msgstr "" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "" #: gtk-gui.c:784 msgid "Volume:" msgstr "" #: info.c:312 msgid "W" msgstr "" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "" #: webservice.c:163 msgid "Webservice" msgstr "" #: main.c:64 msgid "Wed" msgstr "" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "" #: gtk-gui.c:794 msgid "Weight:" msgstr "" #: gtk-gui.c:146 msgid "XML file" msgstr "" #: statistics-gtk.c:92 msgid "Year" msgstr "" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "" #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "" #: libdivecomputer.c:153 msgid "airtime" msgstr "" #: statistics.c:21 msgid "altitude" msgstr "" #: equipment.c:892 msgid "ankle" msgstr "" #: libdivecomputer.c:149 msgid "ascent" msgstr "" #: equipment.c:893 msgid "backplate weight" msgstr "" #: dive.c:48 msgid "bar" msgstr "" #: equipment.c:891 msgid "belt" msgstr "" #: statistics.c:20 msgid "boat" msgstr "" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "" #: statistics.c:21 msgid "cave" msgstr "" #: statistics.c:20 msgid "cavern" msgstr "" #: libdivecomputer.c:149 msgid "ceiling" msgstr "" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "" #: equipment.c:894 msgid "clip-on" msgstr "" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "" #: uemis-downloader.c:384 msgid "data" msgstr "" #: statistics.c:23 msgid "deco" msgstr "" #: libdivecomputer.c:149 msgid "deco stop" msgstr "" #: statistics.c:20 msgid "deep" msgstr "" #: libdivecomputer.c:152 msgid "deepstop" msgstr "" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "" #: libdivecomputer.c:152 msgid "divetime" msgstr "" #: statistics.c:20 msgid "drift" msgstr "" #: uemis-downloader.c:589 msgid "drysuit" msgstr "" #: planner.c:788 msgid "ean" msgstr "" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "" #: statistics.c:22 msgid "freshwater" msgstr "" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "" #: uemis-downloader.c:590 msgid "full suit" msgstr "" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "" #: libdivecomputer.c:153 msgid "heading" msgstr "" #: statistics.c:21 msgid "ice" msgstr "" #: equipment.c:890 msgid "integrated" msgstr "" #: statistics.c:20 msgid "invalid" msgstr "" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "" #: uemis-downloader.c:590 msgid "jacket" msgstr "" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "" #: dive.c:88 msgid "l" msgstr "" #: statistics.c:21 msgid "lake" msgstr "" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "" #: uemis-downloader.c:590 msgid "long john" msgstr "" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "" #: gtk-gui.c:956 msgid "max ppO2" msgstr "" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "" #: uemis-downloader.c:591 msgid "membrane" msgstr "" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "" #: statistics.c:22 msgid "night" msgstr "" #: libdivecomputer.c:154 msgid "non stop time" msgstr "" #: libdivecomputer.c:149 msgid "none" msgstr "" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "" #: dive.c:44 msgid "pascal" msgstr "" #: statistics.c:23 msgid "photo" msgstr "" #: statistics.c:21 msgid "pool" msgstr "" #: dive.c:52 msgid "psi" msgstr "" #: libdivecomputer.c:149 msgid "rbt" msgstr "" #: libdivecomputer.c:153 msgid "rgbm" msgstr "" #: statistics.c:22 msgid "river" msgstr "" #: libdivecomputer.c:150 msgid "safety stop" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "" #: uemis-downloader.c:589 msgid "semidry" msgstr "" #: statistics.c:20 msgid "shore" msgstr "" #: uemis-downloader.c:590 msgid "shorty" msgstr "" #: libdivecomputer.c:150 msgid "surface" msgstr "" #: statistics.c:22 msgid "teaching" msgstr "" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "" #: statistics.c:22 msgid "training" msgstr "" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "" #: libdivecomputer.c:150 msgid "transmitter" msgstr "" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "" #: equipment.c:540 msgid "unspecified" msgstr "" #: uemis-downloader.c:590 msgid "vest" msgstr "" #: statistics.c:23 msgid "video" msgstr "" #: libdivecomputer.c:150 msgid "violation" msgstr "" #: equipment.c:1545 msgid "weight" msgstr "" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "" #: libdivecomputer.c:149 msgid "workload" msgstr "" #: statistics.c:21 msgid "wreck" msgstr "" Subsurface-4.0.2/po/da_DK.aliases000066400000000000000000000000031226345450700165430ustar00rootroot00000000000000da Subsurface-4.0.2/po/da_DK.po000066400000000000000000001154771226345450700155660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # henrik , 2013 # jbi , 2013 # RuthKjar , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:55+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Danish (Denmark) (http://www.transifex.com/projects/p/subsurface/language/da_DK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: da_DK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "Måned" #: webservice.c:289 msgid " Download" msgstr "Download" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Vælg dykkercomputer og port." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "start" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "slut" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s of %s⏎\n\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s⏎\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s⏎\nBeregnet loft %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s⏎\nDeko:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s⏎\nDeko:unkn time @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s⏎\nEAD:%d%s⏎\nEND:%d%s⏎\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s⏎\nIn deko" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s⏎\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s⏎\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s⏎\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s⏎\nSikkerhedsstop:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s⏎\nSikkerhedsstop:Ukendt tid @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s⏎\nSubsurface dykkerplan⏎\nbaseret på GFlow = %.0f og GFhigh = %.0f⏎\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s⏎\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s⏎\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s⏎\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s⏎\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) eller (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(ingen dyk)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(tom)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cuft/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cuft/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 dyk pr side" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "2-delt heldragt" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3m intervaller for beregnet loft" #: print.c:952 msgid "6 dives per page" msgstr "6 dyk pr side" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "" #: planner-gtk.c:272 msgid "AIR" msgstr "LUFT" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Om Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Tilføj dyk..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Tilføj dyk" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Tilføj til tur over" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Tilføj waypoint" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Luft tryk" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Luft temperatur" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Luft temperatur i %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Foretræk altid downloaded dyk" #: main.c:73 msgid "Apr" msgstr "Apr" #: main.c:74 msgid "Aug" msgstr "Aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Grupér automatisk" #: equipment.c:642 msgid "Available gases" msgstr "" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Gennemsnit" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Gennemsnit" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Gennemsnit" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Gennemsnit" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Gnm. dybde" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Gnm SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Gnm. temperatur" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Gnm. tid" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Bailing out to OC" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Makker" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC Setpoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Kan ikke finde gas %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Annulleret, afbryder..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Afbrudt..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Kan ikke fortolke svar!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Vælg standard XML fil" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Vælg XML fil for import ind i den nuværende data fil" #: gtk-gui.c:1611 msgid "Close" msgstr "Luk" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Skjul alle" #: webservice.c:121 msgid "Connecting..." msgstr "Forbinder..." #: webservice.c:25 msgid "Connection Error: " msgstr "Forbindelses fejl:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Opret ny tur over" #: gtk-gui.c:786 msgid "CuFt" msgstr "CuFt" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Cyl" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Flaske" #: planner.c:192 msgid "Cylinder for planning" msgstr "Flaske for planlægning" #: equipment.c:1603 msgid "Cylinders" msgstr "Flasker " #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "ANSVARSFRISKRIVELSE: Dette er en ny implementering af BUHLMANN algoritmen og dykkerplaner og har kun haft begrænset tests. Vi anbefaler der stærkt at der ikke planlægges dyk ALENE baseret på dette resultat." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Dato" #: info-gtk.c:824 msgid "Date and Time" msgstr "Dato og Tid" #: info-gtk.c:834 msgid "Date:" msgstr "Dato:" #: main.c:74 msgid "Dec" msgstr "Dec" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Standard XML data fil" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Slet data ..." #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Slet dyk" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Slet dyk" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Dybde" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Dybde grænse overskredet" #: gtk-gui.c:774 msgid "Depth:" msgstr "Dybde:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Device Id" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Device or mount point" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Dyk #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Dyk %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Kælenavn for dykkercomputer" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Dyk info" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Dyk notater" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Dykkerplan - DETTE ER KUN EN SIMULATION. BRUG IKKE TIL DYKNING" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Dykker Tid" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Dykker Tid Alarm" #: uemis.c:226 msgid "Dive Time Info" msgstr "Dykker Tid info" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Dykkercomputer mærke og fabrikat" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Import fejl i dykker data" #: gps.c:214 msgid "Dive locations" msgstr "Dykker steder" #: info-gtk.c:575 msgid "Dive master" msgstr "Divemaster" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Dyk begynder hvornår?" #: print.c:502 msgid "Dive#" msgstr "Dyk nr:" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Dykkerliste font" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Dyk" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Dykkersteder" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Download fra dykkercomputer" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Download fra Dykkercomputer..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Download fra Web" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Download fra Web..." #: webservice.c:31 msgid "Download Success!" msgstr "Download succes!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Varighed" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Varighed (min)" #: info.c:312 msgid "E" msgstr "Ø" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Rediger" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Rediger enheds navne" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Rediger dykkercomputer navne" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Rediger tur info" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Rediger tur summering" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Rediger dyk" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Rediger dykker dato/tid" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Rediger dyk" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Rediger flere dyk" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Rediger tur summering" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Tænd / slut hændelser" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Slut" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Slut dybde" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Indtast bruger ID og tryk på 'Download'. Efter download kan du trykke på 'Tilføj' hvis du ønsker at tilføje ændringerne." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Udstyr" #: divelist-gtk.c:1370 msgid "Error" msgstr "Fejl" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Fejl i læsning af saltindhold i vandet" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Fejl ved fortolkning af dato/tid" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Fejl i fortolkning af dykkertid" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Fejl i fortolkning af gas blanding" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Fejl i fortolkning af antallet af gasser" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Fejl i fortolkning af max dybde" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Fejl i fortolkning af prøver" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Error registering the cancellation handler." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Fejl i registrering af data" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Error registering the event handler." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Event: waiting for user action" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Udvid alt" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Fejl i åbning %i filer." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Fejl i fortolkning af '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Fejl i læsning af '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "Fod" #: gtk-gui.c:1601 msgid "File" msgstr "Fil" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Tving download af alle dyk" #: main.c:64 msgid "Fri" msgstr "Fre" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh til plan" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow til plan" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 or GPS format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gas brugt" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gas brugt" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gas Brugt" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Gasforbrug:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gasblanding" #: gtk-gui.c:767 msgid "General Settings" msgstr "Indstillinger" #: gtk-gui.c:1606 msgid "Help" msgstr "Hjælp" #: webservice.c:296 msgid "Idle" msgstr "Idle" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "" #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Info" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Init Communication" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Input Plan" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ugyldig dybde - kunne ikke fortolke \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ugyldig dybde - dybder mere end 400 meter er ikke understøttet" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Ugyldig gas for række %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Ugyldig starttid" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Ugyldig bruger navn" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Jan" #: main.c:74 msgid "Jul" msgstr "Jul" #: main.c:73 msgid "Jun" msgstr "Jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel, og andre, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Liste" #: gtk-gui.c:785 msgid "Liter" msgstr "Liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Sted" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Længest" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Længste dyk" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Lav batteri alarm" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Lav batteri alarm" #: gtk-gui.c:862 msgid "Map provider" msgstr "" #: main.c:73 msgid "Mar" msgstr "Mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "" #: gps.c:53 msgid "Mark location here" msgstr "Set sted til her" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "" #: uemis.c:230 msgid "Marker" msgstr "Marker" #: print.c:502 msgid "Master" msgstr "Master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Max deko tid advarsel" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max dybde" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max temp" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Max dybde: %.*f %s⏎\nVarighed: %d min⏎\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "MaxPress" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Maximalt" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Maksimalt" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Maksimal" #: main.c:73 msgid "May" msgstr "Maj" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Flet dyk" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Flet tur med turen over" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Flet tur med turen under" #: gtk-gui.c:775 msgid "Meter" msgstr "Meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min dybde" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min Temp" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Minimum" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Flere valgmuligheder" #: gtk-gui.c:1512 msgid "Model" msgstr "Model" #: main.c:64 msgid "Mon" msgstr "Man" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Multi-platform dykkerlog log software i C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Ny" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nyt begyndelsesnummer" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Næste DC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Kaldenavn" #: uemis.c:232 msgid "No Tank Data" msgstr "Ingen flaske data" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Noter" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "" #: print.c:1003 msgid "Notes on top" msgstr "" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Odd pthread error return" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Slet det valgte?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "" #: gtk-gui.c:291 msgid "Open File" msgstr "Åben fil" #: gtk-gui.c:1608 msgid "Open..." msgstr "Åben..." #: print.c:995 msgid "Ordering" msgstr "" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Ilt" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "PO2 opstignings alarm" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "PO2 opstignings alarm" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "PO2 Grøn advarsel" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Password" #: info-gtk.c:565 msgid "Pick on map" msgstr "Vælg på kort" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planlægger" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "" #: gtk-gui.c:752 msgid "Preferences" msgstr "Indstillinger" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Indstillinger..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Tryk" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Tryk:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Forrige DC" #: print.c:989 msgid "Print in color" msgstr "Udskriv i farver" #: print.c:978 msgid "Print only selected dives" msgstr "Print kun valgte dyk" #: print.c:974 msgid "Print selection" msgstr "Print valgte" #: print.c:939 print.c:946 msgid "Print type" msgstr "" #: gtk-gui.c:1612 msgid "Print..." msgstr "Print..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profil indstillinger" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "" #: print.c:1000 msgid "Profile on top" msgstr "" #: gtk-gui.c:1625 msgid "Quit" msgstr "" #: uemis.c:218 msgid "RGT Alert" msgstr "" #: uemis.c:216 msgid "RGT Warning" msgstr "" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "" #: gtk-gui.c:2142 msgid "Remove" msgstr "Slet" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Fjern turen" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Fjern dyk fra turen" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Fjern valgte dyk fra turen" #: gtk-gui.c:1218 msgid "Renumber" msgstr "" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "" #: download-dialog.c:153 msgid "Retry" msgstr "" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "" #: main.c:64 msgid "Sat" msgstr "Lør" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Gem som..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Gem ændringer?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Gem filen som" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Gem som" #: gtk-gui.c:1609 msgid "Save..." msgstr "Gem..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "" #: gtk-gui.c:1163 msgid "Select Events" msgstr "" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "" #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "" #: main.c:74 msgid "Sep" msgstr "Sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Korteste dyk" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Vis EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Vis MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Vis på kort" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Vis pHe graf" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Vis pN%s graf" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Vis pO%s graf" #: planner.c:217 msgid "Simulated Dive" msgstr "Simuleret Dyk" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Størrelse" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "" #: uemis.c:200 msgid "Speed Alarm" msgstr "Hastighedsalam" #: uemis.c:203 msgid "Speed Warning" msgstr "Hastighedsalarm" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Begynd download" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistik" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistik for %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistik" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Dragt" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Søn" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Overflade interval" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Overflade tryk (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Skift gas til %s⏎\n" #: print.c:960 msgid "Table print" msgstr "Print tabel" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Flaske skift anbefalet" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Flaske tryk info" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tec opsætning" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatur" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatur:" #: gtk-gui.c:1631 msgid "Three" msgstr "Tre" #: main.c:64 msgid "Thu" msgstr "Tor" #: info-gtk.c:841 msgid "Time" msgstr "Tid" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "For at ændre dykker information⏎\ndouble click i dykke listen" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Skift Zoom" #: planner.c:294 msgid "Too many gas mixes" msgstr "For mange gas blandinger" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "For mange waypoints" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Total" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Total tid" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Total vægt:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "" msgstr[1] "" #: main.c:64 msgid "Tue" msgstr "Tir" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "" #: gtk-gui.c:768 msgid "Units" msgstr "" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Brugermanual" #: gtk-gui.c:1603 msgid "View" msgstr "" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Sigtbarhed" #: gtk-gui.c:784 msgid "Volume:" msgstr "" #: info.c:312 msgid "W" msgstr "V" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Vandtemperatur" #: webservice.c:163 msgid "Webservice" msgstr "" #: main.c:64 msgid "Wed" msgstr "Ons" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Vægt" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Vægtsystem" #: gtk-gui.c:794 msgid "Weight:" msgstr "Vægt:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML fil" #: statistics-gtk.c:92 msgid "Year" msgstr "År" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "" #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "luft" #: libdivecomputer.c:153 msgid "airtime" msgstr "" #: statistics.c:21 msgid "altitude" msgstr "" #: equipment.c:892 msgid "ankle" msgstr "ankel" #: libdivecomputer.c:149 msgid "ascent" msgstr "opstigning" #: equipment.c:893 msgid "backplate weight" msgstr "bagpladevægt" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "bælte" #: statistics.c:20 msgid "boat" msgstr "" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "bogmærke" #: statistics.c:21 msgid "cave" msgstr "grotte" #: statistics.c:20 msgid "cavern" msgstr "hule" #: libdivecomputer.c:149 msgid "ceiling" msgstr "" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "" #: equipment.c:894 msgid "clip-on" msgstr "" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "" #: uemis-downloader.c:384 msgid "data" msgstr "data" #: statistics.c:23 msgid "deco" msgstr "deco" #: libdivecomputer.c:149 msgid "deco stop" msgstr "deco stop" #: statistics.c:20 msgid "deep" msgstr "dybde" #: libdivecomputer.c:152 msgid "deepstop" msgstr "dybe stop" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "" #: libdivecomputer.c:152 msgid "divetime" msgstr "dykketid" #: statistics.c:20 msgid "drift" msgstr "" #: uemis-downloader.c:589 msgid "drysuit" msgstr "tørdragt" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "for alle dyk" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "for dyk #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "for dyk #" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "for det valgte dyk" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "for de valgte dyk" #: statistics.c:22 msgid "freshwater" msgstr "ferskvand" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "fod" #: uemis-downloader.c:590 msgid "full suit" msgstr "heldragt" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "gasskifte" #: libdivecomputer.c:153 msgid "heading" msgstr "" #: statistics.c:21 msgid "ice" msgstr "is" #: equipment.c:890 msgid "integrated" msgstr "integreret" #: statistics.c:20 msgid "invalid" msgstr "" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "" #: uemis-downloader.c:590 msgid "jacket" msgstr "" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "sø" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "pund (lbs)" #: uemis-downloader.c:590 msgid "long john" msgstr "" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "Maks. ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Maks. dybde" #: uemis-downloader.c:591 msgid "membrane" msgstr "membran" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min." #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "mere end %d dage" #: statistics.c:22 msgid "night" msgstr "nat" #: libdivecomputer.c:154 msgid "non stop time" msgstr "" #: libdivecomputer.c:149 msgid "none" msgstr "" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "fotografering" #: statistics.c:21 msgid "pool" msgstr "swimming pool" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "" #: libdivecomputer.c:153 msgid "rgbm" msgstr "" #: statistics.c:22 msgid "river" msgstr "flod" #: libdivecomputer.c:150 msgid "safety stop" msgstr "sikkerhedsstop" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "" #: uemis-downloader.c:589 msgid "semidry" msgstr "semidry" #: statistics.c:20 msgid "shore" msgstr "strand" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "overflade" #: statistics.c:22 msgid "teaching" msgstr "undervisning" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "" #: statistics.c:22 msgid "training" msgstr "kursus" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "" #: libdivecomputer.c:150 msgid "transmitter" msgstr "" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "" #: equipment.c:540 msgid "unspecified" msgstr "" #: uemis-downloader.c:590 msgid "vest" msgstr "" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "" #: equipment.c:1545 msgid "weight" msgstr "" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "våddragt" #: libdivecomputer.c:149 msgid "workload" msgstr "" #: statistics.c:21 msgid "wreck" msgstr "vrag" Subsurface-4.0.2/po/de_CH.aliases000066400000000000000000000000041226345450700165440ustar00rootroot00000000000000gsw Subsurface-4.0.2/po/de_CH.po000066400000000000000000001311351226345450700155530ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2012-2013 # Martin Gysel , 2012 # bearsh , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 22:06+0000\n" "Last-Translator: dirkhh \n" "Language-Team: German (Switzerland) (http://www.transifex.com/projects/p/subsurface/language/de_CH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de_CH\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nKeine Ereignisse\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Monat" #: webservice.c:289 msgid " Download" msgstr " herunterladen" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Bitte Tauchcomputer und Anschluss auswählen. " #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " Anfang" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " Ende" #: statistics-gtk.c:92 msgid "#" msgstr "Nr." #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s %4$d. %3$s %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nBerechneter tiefster Deko-Stopp %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeko:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeko:unbk Zeit @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nIn Deko" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nD:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nSicherheitsstopp:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nSicherheitsstopp:unbk Zeit @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface Tauchplan\nbasierend auf GFlow = %.0f und GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s Ereignis (%d:%02u)" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Antwort von divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) oder (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(um Datum/Zeit zu bearbeiten hier klicken)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(um Datum/Zeit/Tiefe zu bearbeiten hier klicken)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(keine Tauchgänge)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(nichts)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cuft/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cuft/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 Tauchgänge pro Seite" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "Zweiteiler" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3m Stufen für berechnete Deko-Stopps" #: print.c:952 msgid "6 dives per page" msgstr "6 Tauchgänge pro Seite" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Segmente hier hinzufügen.\nJede Zeile beschreibt einen Abschnitt des geplanten Tauchgangs.\nEin Eintrag mit Tiefe, Zeit und Atemgas beschreibt einen Abschnitt, der auf der angegeben Tiefe endet, die angegebene Zeit dauert (falls relativ, also '+3:30') oder zur angegebenen Zeit endet (falls absolut) und der das angegebene Atemgas verwendet.\nKeine Gasangabe bedeutet 'benutze vorheriges Atemgas' (oder Luft, falls kein Atemgas spezifiziert wurde).\nEin Eintrag mit Tiefe und Atemgas aber keiner Zeitangabe dient einem besonderen Zweck: er informiert den Plan-Algorithmus, dass das angegebene Atemgas für den Aufstieg verfügbar ist sobald die angegebene Tiefe erreicht ist.\nCC SetPoint ist fuer geschlossene Kreislaufgeräte; bitte nicht ausfüllen für Tauchgänge mit offenem Tauchgerät.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Luft" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Info zu Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Setze" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Tauchgang hinzufügen..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Markierung hier setzen" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Tauchgang hinzufügen" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Gaswechsel hier setzen" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Gaswechsel setzen bei %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Zur obigen Reise hinzufügen" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Weiteren Abschnitt hinzufügen" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Luftdruck" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Lufttemp." #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Lufttemp. in %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Immer heruntergeladene Tauchgänge bevorzugen" #: main.c:73 msgid "Apr" msgstr "Apr" #: main.c:74 msgid "Aug" msgstr "Aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automatisch gruppieren" #: equipment.c:642 msgid "Available gases" msgstr "Verfügbare Gase" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Ø" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Ø" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Ø" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Ø" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Ø Tiefe" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Ø Tiefe (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Ø SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Ø Temp" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Ø Dauer" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Notausstieg mit offenem System" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Partner" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Kann Gasgemisch %d/%d nicht finden" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Fehler beim Öffnen des Styleshhets (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Abgebrochen, beende..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Abgebrochen..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Kann keinen Gaswechsel setzen" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Verstehe die Antwort nicht!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Standard XML-Datei auswählen" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Bitte XML-Dateien auswählen, die in die aktuelle Datei eingefügt werden sollen" #: gtk-gui.c:1611 msgid "Close" msgstr "Schliessen" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Alle einfalten" #: webservice.c:121 msgid "Connecting..." msgstr "Verbinde..." #: webservice.c:25 msgid "Connection Error: " msgstr "Verbindungsfehler: " #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Neue Reise darüber einfügen" #: gtk-gui.c:786 msgid "CuFt" msgstr "cuft" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Flasche" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Flasche" #: planner.c:192 msgid "Cylinder for planning" msgstr "Flasche für Tauchplanung" #: equipment.c:1603 msgid "Cylinders" msgstr "Flaschen" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "T:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "HAFTUNGSAUSSCHLUSS / WARNUNG: DIES IST EINE NEUE IMPLEMENTATION DES BÜHLMANN-ALGORITHMUS UND EINES DARAUF BASIERENDEN TAUCHPLANERS, DIE NUR EINGESCHRÄNKT GETESTET WURDE. WIR RATEN DRINGENST, KEINE TAUCHGÄNGE DURCHZUFÜHREN, DIE NUR AUF DEN HIER ERSTELLTEN DATEN BERUHEN." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Datenbank Verbindung fehlgeschlagen '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Datenbank Anfrage fehlgeschlagen '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Datenbank Anfrage der Events fehlgeschlagen.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Datum" #: info-gtk.c:824 msgid "Date and Time" msgstr "Datum und Zeit" #: info-gtk.c:834 msgid "Date:" msgstr "Datum:" #: main.c:74 msgid "Dec" msgstr "Dez" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Standard XML Datei" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Lösche die Informationen zu einem Tauchcomputer" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Tauchgang löschen" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Tauchgänge löschen" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Tiefe" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Tiefenlimit überschritten" #: gtk-gui.c:774 msgid "Depth:" msgstr "Tiefe:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Gerätebezeichnung" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Gerät oder Einhängepunkt" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Ungültige Tauchgänge anzeigen" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Tauchgang #%1$d - %2$s %4$02d.%3$02d.%5$04d um %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Tauchgang #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Tauchgang Nr. %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Bezeichnung für den Tauchcomputer" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informationen" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notizen" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Tauchplan - DIES IST NUR EINE SUMULATION; NICHT ZUM TAUCHEN VERWENDEN" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Tauchgang Tags" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Dauer" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm: Tauchgangsdauer" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: Tauchgangsdauer" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Hersteller und Modell" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Fehler beim Importieren der Tauchgangsdaten" #: gps.c:214 msgid "Dive locations" msgstr "Tauchplätze" #: info-gtk.c:575 msgid "Dive master" msgstr "Tauchguide" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Wann beginnt der Tauchgang?" #: print.c:502 msgid "Dive#" msgstr "Tauchgang Nr." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Schriftart für Tauchliste" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Tauchguide" #: statistics-gtk.c:542 msgid "Dives" msgstr "Tauchgänge" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Tauchplätze" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Von Tauchcomputer laden" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Von Tauchcomputer laden..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Vom Webserver laden" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Vom Webserver laden..." #: webservice.c:31 msgid "Download Success!" msgstr "Erfolgreich geladen!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Dauer" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Dauer (min)" #: info.c:312 msgid "E" msgstr "O" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Bearbeiten" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Gerätename bearbeiten" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Tauchcomputer Bezeichnung bearbeiten" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Reise-Informationen bearbeiten" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Reise-Übersicht bearbeiten" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Der Name des Tauchcomputers kann durch Doppelklick bearbeitet werden" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Tauchgang bearbeiten" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Zeit des Tauchgangs bearbeiten" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Tauchgänge bearbeiten" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Mehrere Tauchgänge bearbeiten" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Reise-Übersicht bearbeiten" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Ereignisse Ein-/Ausblenden" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Tags Ein- / Ausschalten" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Ende" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Tiefe am Ende" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Benutzerkennung eingeben und 'Laden' drücken. Bei Erfolg 'Anwenden' drücken um die Daten zu übernehmen." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Ausrüstung" #: divelist-gtk.c:1370 msgid "Error" msgstr "Fehler" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Fehler beim Lesen des Salzgehalts" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Fehler beim Lesen des Datums" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Fehler beim Lesen der Dauer" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Fehler beim Lesen der Gasgemischs" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Fehler beim Lesen der Gasgemischszahl" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Fehler beim Lesen der maximalen Tiefe" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Fehler beim Lesen der Samples" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Fehler bei der Registrierung der Abbruchbehandlung" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Fehler beim Registrieren der Daten" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Fehler beim Registrieren der Ereignisbehandlung" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Ereignis: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Ereignis: warte auf Benutzeraktion" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Alle ausfalten" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Als UDDF Datei exportieren" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Exportiere UDDF ..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Exportiere Tauchgang/-gänge als UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Fehler beim Öffnen von %i Dateien" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Fehler beim Lesen von '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Fehler beim Lesen von '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Fehler beim Lesen von '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Fehler beim Lesen von '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "Fuss" #: gtk-gui.c:1601 msgid "File" msgstr "Datei" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Erzwinge erneutes Laden aller Tauchgänge" #: main.c:64 msgid "Fri" msgstr "Fr" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh für Tauchplan" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow für Tauchplan" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 oder GPS Format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gasverbrauch" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gasverbrauch" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Verw. Gas" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Gasverbrauch:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gasgemisch" #: gtk-gui.c:767 msgid "General Settings" msgstr "Allg. Einstellungen" #: gtk-gui.c:1606 msgid "Help" msgstr "Hilfe" #: webservice.c:296 msgid "Idle" msgstr "inaktiv" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importiere Datei(en)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informationen" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Verbindung aufbauen" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Plan eingeben" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ungültige Tiefe - kann \"%s\" nicht lesen" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ungültige Tiefe - Werte unterhalb 400m sind nicht unterstützt" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Ungültiges Gasgemisch in Zeile %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Ungültige Anfangszeit" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Ungültige Benutzerkennung" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Jan" #: main.c:74 msgid "Jul" msgstr "Jul" #: main.c:73 msgid "Jun" msgstr "Jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Letzter Stopp bei 20 Fuss" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Letzter Stopp bei 6 Meter" #: print.c:985 msgid "Layout Options" msgstr "Layout Einstellungen" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel und andere, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Liste" #: gtk-gui.c:785 msgid "Liter" msgstr "Liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Ort" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Max." #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Längster Tauchgang" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: Batterie schwach" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Warnung: Batterie schwach" #: gtk-gui.c:862 msgid "Map provider" msgstr "Kartenanbieter" #: main.c:73 msgid "Mar" msgstr "Mär" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Als ungültig markieren" #: gps.c:53 msgid "Mark location here" msgstr "Hier markieren" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Als gültig markieren" #: uemis.c:230 msgid "Marker" msgstr "Markierung" #: print.c:502 msgid "Master" msgstr "Guide" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Warnung: Maximale Deko Zeit" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max. Tiefe" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Max. Tiefe (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max. SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max. Temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Max. Tiefe: %.*f %s\nDauer: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Max. Druck" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Max." #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Max." #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Max." #: main.c:73 msgid "May" msgstr "Mai" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Tauchgänge zusammenführen" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Reise mit der darüber verbinden" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Reise mit der darunter verbinden" #: gtk-gui.c:775 msgid "Meter" msgstr "Meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min. Tiefe" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min. Temp." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Min." #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Min." #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Min." #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Verschiedene Optionen" #: gtk-gui.c:1512 msgid "Model" msgstr "Modell" #: main.c:64 msgid "Mon" msgstr "Mo" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Multi-Plattform Tauchprogramm in C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Neu" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Neue erste Nummer" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Nächster TC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Gerätename" #: uemis.c:232 msgid "No Tank Data" msgstr "Keine Flaschen Informationen" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Keine Flaschen für diesen Tauchgang" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notizen" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Höhe der Notizen (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notizen oben" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Unbekannter pthread Fehlercode" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Ausgewählten Eintrag löschen?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Zeige nur Tauchgänge mit diesen Tags:" #: gtk-gui.c:291 msgid "Open File" msgstr "Datei öffnen" #: gtk-gui.c:1608 msgid "Open..." msgstr "Öffnen..." #: print.c:995 msgid "Ordering" msgstr "Reihenfolge" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Höhe der anderen Daten (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Sauerstoff" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO₂" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: Aufstieg / PO₂" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Warnung: Aufstieg / PO₂" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Warnung: PO₂ Grün" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Passwort" #: info-gtk.c:565 msgid "Pick on map" msgstr "Auf Karte auswählen" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planer" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Bitte Benutzerkennung und Passwort für divelogs.de eingeben. Die ausgewählten Tauchgänge werden zum Benutzerkonto hinzugefügt." #: gtk-gui.c:752 msgid "Preferences" msgstr "Einstellungen" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Einstellungen..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Druck" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Druck:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Vorh. TC" #: print.c:989 msgid "Print in color" msgstr "In Farbe drucken" #: print.c:978 msgid "Print only selected dives" msgstr "Nur ausgewählte Tauchgänge drucken" #: print.c:974 msgid "Print selection" msgstr "Auswahl drucken" #: print.c:939 print.c:946 msgid "Print type" msgstr "Art des Ausdrucks" #: gtk-gui.c:1612 msgid "Print..." msgstr "Drucken..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profil Einstellungen" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Höhe des Profils (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil oben" #: gtk-gui.c:1625 msgid "Quit" msgstr "Beenden" #: uemis.c:218 msgid "RGT Alert" msgstr "Alarm: verbleibende Gas-Zeit" #: uemis.c:216 msgid "RGT Warning" msgstr "Warnung: verbleibende Gas-Zeit" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Bewertung" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Lese %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Entferne" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Reise entfernen" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Tauchgang aus Reise entfernen" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Ereignis hier entfernen" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Ausgewählte Tauchgänge aus Reise entfernen" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Neu nummerieren" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Neu nummerieren..." #: download-dialog.c:153 msgid "Retry" msgstr "Wiederholen" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC während Dekostopp" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC während des Tauchgangs" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Verletzung des Sicherheitsstopps" #: main.c:64 msgid "Sat" msgstr "Sa" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Speichern unter..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Änderungen speichern?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Datei speichern unter" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Speichern unter" #: gtk-gui.c:1609 msgid "Save..." msgstr "Speichern..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Segment Dauer" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Ereignisse auswählen" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Ereignisse auswählen..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Tags auswählen..." #: main.c:74 msgid "Sep" msgstr "Sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Unvollständiger Schreibvorgang der req.txt Datei\nIst der Uemis Zürich korrekt verbunden?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Min." #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Kürzester Tauchgang" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Spalten anzeigen" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "EAD, END, EADD anzeigen" #: gtk-gui.c:951 msgid "Show MOD" msgstr "MOD anzeigen" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Berechnete tiefste Deko-Stopps anzeigen" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Vom TC ausgelesene tiefste Deko-Stopps rot anzeigen" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Auf Karte zeigen" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "pHe Diagramm anzeigen" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "pN%s Diagramm anzeigen" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "pO%s Diagramm anzeigen" #: planner.c:217 msgid "Simulated Dive" msgstr "Simulierter Tauchgang" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Grösse" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Höhe (%% des Layouts)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: Geschwindigkeit" #: uemis.c:203 msgid "Speed Warning" msgstr "Warnung: Geschwindigkeit" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Beginne zu Laden" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistiken" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistiken %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistiken" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Verbleibe auf %.*f %s für %d:%02d min - Gesamtzeit %d:%02u mit %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Unverständliche Prozentangabe %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Anzug" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "So" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Oberflächenpause" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Oberflächendruck (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Gaswechsel zu %s\n" #: print.c:960 msgid "Table print" msgstr "Tabellendruck" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Tauchgang-Tags werden nur angezeigt, wenn sie in allen editierten Tauchgängen identisch waren" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Gaswechsel-Vorschlag" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Info: Flaschendruck" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tec-Einstellungen" #: gtk-gui.c:805 msgid "Temp" msgstr "Temperatur" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatur" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatur:" #: gtk-gui.c:1631 msgid "Three" msgstr "Drei" #: main.c:64 msgid "Thu" msgstr "Do" #: info-gtk.c:841 msgid "Time" msgstr "Zeit" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Zum Tauchgangsdaten bearbeiten\nDoppelklick in der Tauchgangsliste" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zoom ein-/ausschalten" #: planner.c:294 msgid "Too many gas mixes" msgstr "Zu viele Gasgemische" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Zu viele Abschnitte" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Gesamt" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Gesamtzeit" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Gesamtgewicht:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Auftauchen auf %.*f %s in %d:%02d min - Gesamtzeit %d:%02u mit %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Reise ab %1$s, %3$d. %2$s %4$d (%5$d Tauchgang)" msgstr[1] "Reise ab %1$s, %3$d. %2$s %4$d (%5$d Tauchgänge)" #: main.c:64 msgid "Tue" msgstr "Di" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Typ" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zürich: Dateisystem beinahe voll\nBitte den Tauchcomputer ausstecken, wieder einstecken\nund erneut versuchen" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zürich: Dateisystem voll.\nBitte den Tauchcomputer ausstecken, wieder einstecken\nund erneut versuchen" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemis-Initialisierung fehlgeschlagen" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Fehler beim Erzeugen des libdivecomputer Contexts" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Nicht in der Lage, einen Parser für %s %s zu erstellen" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Fehler beim Öffnen von %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Einheiten" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Tauchgang/-gänge zu divelogs.de hochladen" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Zu divelogs.de hochladen" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Lade zu divelogs.de hoch..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Der Tauchplatz kann mittels rechter Maustaste an der Mausposition markiert werden" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Benutzerkennung" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Benutzerhandbuch" #: gtk-gui.c:1603 msgid "View" msgstr "Ansicht" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Sicht" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volumen:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Warnung - extrem lange Tauchgänge können zu sehr langen Berechnungszeiten führen" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Warnung - extrem tiefe Tauchgänge können zu sehr langen Berechnungszeiten führen" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Wassertemperatur" #: webservice.c:163 msgid "Webservice" msgstr "Webservice" #: main.c:64 msgid "Wed" msgstr "Mi" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Gewicht" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Gewichtsystem" #: gtk-gui.c:794 msgid "Weight:" msgstr "Gewicht:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML-Datei" #: statistics-gtk.c:92 msgid "Year" msgstr "Jahr" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Jahresstatistiken" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Sie haben bereits einen Tauchcomputer dieses Modells\nmit Namen %s.\nSubsurface kann einen Namen für dieses Gerät verwalten, um die Geräte zu unterscheiden. Die Voreinstellung ist unten angezeigt.\nFalls kein Name gewünscht ist, bitte 'Abbrechen' klicken. Subsurface zeigt dann einfach den Produktnamen an (in diesem Fall können eventuell verschiedene Tauchcomputer nicht mehr in den angezeigten Daten unterschieden werden)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Nicht alle Änderungen wurden gespeichert.\nSollen Änderungen vor dem Schliessen der Datei gespeichert werden?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Nicht alle Änderungen in der Datei %s wurden gespeichert.\nSollen Änderungen vor dem Schliessen der Datei gespeichert werden?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "Luft" #: libdivecomputer.c:153 msgid "airtime" msgstr "verbleibende Atemzeit" #: statistics.c:21 msgid "altitude" msgstr "Berg" #: equipment.c:892 msgid "ankle" msgstr "Fussblei" #: libdivecomputer.c:149 msgid "ascent" msgstr "Aufstieg" #: equipment.c:893 msgid "backplate weight" msgstr "Backplate-Gewicht" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "Gürtel" #: statistics.c:20 msgid "boat" msgstr "Boot" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "Markierung" #: statistics.c:21 msgid "cave" msgstr "Höhle" #: statistics.c:20 msgid "cavern" msgstr "Kaverne" #: libdivecomputer.c:149 msgid "ceiling" msgstr "tiefster Deko-Stopp" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "Sicherheits-Stopp" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "cuft" #: uemis-downloader.c:384 msgid "data" msgstr "Daten" #: statistics.c:23 msgid "deco" msgstr "deko" #: libdivecomputer.c:149 msgid "deco stop" msgstr "Deko-Stopp" #: statistics.c:20 msgid "deep" msgstr "Tief" #: libdivecomputer.c:152 msgid "deepstop" msgstr "Tiefen-Stopp" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "Logbucheintrag mit ID" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "Tauchplatz Daten ID" #: libdivecomputer.c:152 msgid "divetime" msgstr "Tauchgangsdauer" #: statistics.c:20 msgid "drift" msgstr "Strömung" #: uemis-downloader.c:589 msgid "drysuit" msgstr "Trockentauchanzug" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "für alle Tauchgänge" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "für Tauchgang Nr. %d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "für Tauchgänge Nr." #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "für den ausgewählten Tauchgang" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "für die ausgewählten Tauchgänge" #: statistics.c:22 msgid "freshwater" msgstr "Süsswasser" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "vollständiger Tauchanzug" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "Gaswechsel" #: libdivecomputer.c:153 msgid "heading" msgstr "Richtung" #: statistics.c:21 msgid "ice" msgstr "Eis" #: equipment.c:890 msgid "integrated" msgstr "integriert" #: statistics.c:20 msgid "invalid" msgstr "ungültig" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "ungültige Ereignisnummer" #: uemis-downloader.c:590 msgid "jacket" msgstr "Jacke" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "See" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "US Pfund" #: uemis-downloader.c:590 msgid "long john" msgstr "Latzhose" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max. ppO₂" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "max. CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Max. Tiefe" #: uemis-downloader.c:591 msgid "membrane" msgstr "Membran" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "mehr Daten für Tauchgang ID" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "mehr als %d Tage" #: statistics.c:22 msgid "night" msgstr "Nacht" #: libdivecomputer.c:154 msgid "non stop time" msgstr "Nullzeit" #: libdivecomputer.c:149 msgid "none" msgstr "keine" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe Schwelle" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s Schwelle" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s Schwelle" #: dive.c:44 msgid "pascal" msgstr "Pa" #: statistics.c:23 msgid "photo" msgstr "Foto" #: statistics.c:21 msgid "pool" msgstr "Pool" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "Fluss" #: libdivecomputer.c:150 msgid "safety stop" msgstr "Sicherheitsstopp" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "Sicherheitsstopp (obligatorisch)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "Sicherheitsstopp (freiwillig)" #: uemis-downloader.c:589 msgid "semidry" msgstr "halbtrocken" #: statistics.c:20 msgid "shore" msgstr "Ufer" #: uemis-downloader.c:590 msgid "shorty" msgstr "Shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "Oberfläche" #: statistics.c:22 msgid "teaching" msgstr "Unterricht" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Gewebewarnung" #: statistics.c:22 msgid "training" msgstr "Übung" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Dirk Hohndel\nMartin Gysel" #: libdivecomputer.c:150 msgid "transmitter" msgstr "Sender" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "unbk" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "unbekannt" #: equipment.c:540 msgid "unspecified" msgstr "nicht angegeben" #: uemis-downloader.c:590 msgid "vest" msgstr "Weste" #: statistics.c:23 msgid "video" msgstr "Video" #: libdivecomputer.c:150 msgid "violation" msgstr "Verletzung" #: equipment.c:1545 msgid "weight" msgstr "Gewicht" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "Nass-Tauchanzug" #: libdivecomputer.c:149 msgid "workload" msgstr "Arbeit" #: statistics.c:21 msgid "wreck" msgstr "Wrack" Subsurface-4.0.2/po/de_DE.aliases000066400000000000000000000000031226345450700165410ustar00rootroot00000000000000de Subsurface-4.0.2/po/de_DE.po000066400000000000000000001311341226345450700155500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2012-2013 # bearsh , 2013 # Thomas_M, 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:54+0000\n" "Last-Translator: dirkhh \n" "Language-Team: German (Germany) (http://www.transifex.com/projects/p/subsurface/language/de_DE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de_DE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nKeine Ereignisse\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Monat" #: webservice.c:289 msgid " Download" msgstr " herunterladen" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Bitte Tauchcomputer und Anschluß auswählen. " #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " Anfang" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " Ende" #: statistics-gtk.c:92 msgid "#" msgstr "Nr." #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s %4$d. %3$s %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dt %dst %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dst %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nBerechneter tiefster Deko-Stopp %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeko:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeko:unbk Zeit @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nIn Deko" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nD:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nSicherheitsstopp:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nSicherheitsstopp:unbk Zeit @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface Tauchplan\nbasierend auf GFlow = %.0f und GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s Ereignis (%d:%02u)" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Antwort von divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) oder (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(um Datum/Zeit zu bearbeiten hier klicken)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(um Datum/Zeit/Tiefe zu bearbeiten hier klicken)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(keine Tauchgänge)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(nichts)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cu.ft./min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cu.ft./min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 Tauchgänge pro Seite" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "Zweiteiler" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3m Stufen für berechnete Deko-Stopps" #: print.c:952 msgid "6 dives per page" msgstr "6 Tauchgänge pro Seite" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Abschnitte des Tauchgangs hier hinzufügen.\nJede Zeile beschreibt einen Teil des geplanten Tauchgangs.\nEin Eintrag mit Tiefe, Dauer und Gas bestimmt einen Abschnitt der auf der angegebenen Tiefe endet, die angegebene Dauer hat (oder zur angegebenen Zeit endet, wenn relativ definiert: '+3:30', wenn absolut definiert: '@5:00') und das angegebene Gas benutzt.\nEin leerer Eintrag für Gas bedeutet \"benutze das vorherige Gas\" (oder LUFT falls kein Gas spezifiziert war).\nEin Eintrag der eine Tiefe und ein Gas angibt, aber keine Dauer ist ein Hinweis für den Algorithmus, dass beim Aufstieg auf dieser Tiefe ein Wechsel zum angegebenen Gas geplant ist.\nCC SetPoint ist für Tauchgänge mit Kreislaufgeräten gedacht, bitte für Tauchgänge mit traditioneller Ausrüstung leer lassen..\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Luft" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Info zu Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Setze" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Tauchgang hinzufügen..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Markierung hier setzen" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Tauchgang hinzufügen" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Gaswechsel hier setzen" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Gaswechsel setzen bei %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Zur obigen Reise hinzufügen" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Weiteren Abschnitt hinzufügen" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Luftdruck" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Lufttemp." #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Lufttemp. in %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Immer heruntergeladene Tauchgänge bevorzugen" #: main.c:73 msgid "Apr" msgstr "Apr" #: main.c:74 msgid "Aug" msgstr "Aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automatisch gruppieren" #: equipment.c:642 msgid "Available gases" msgstr "Verfügbare Gase" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Ø" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Ø" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Ø" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Ø" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Ø Tiefe" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Ø Tiefe (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Ø AMV" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Ø Temp" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Ø Dauer" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Notausstieg mit offenem System" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Partner" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Kann Gasgemisch %d/%d nicht finden" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Fehler beim Öffnen des Styleshhets (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Abgebrochen, beende..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Abgebrochen..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Kann keinen Gaswechsel setzen" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Verstehe die Antwort nicht!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Standard XML-Datei auswählen" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Bitte XML-Dateien auswählen, die in die aktuelle Datei eingefügt werden sollen" #: gtk-gui.c:1611 msgid "Close" msgstr "Schließen" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Alle einfalten" #: webservice.c:121 msgid "Connecting..." msgstr "Verbinde..." #: webservice.c:25 msgid "Connection Error: " msgstr "Verbindungsfehler: " #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Neue Reise darüber einfügen" #: gtk-gui.c:786 msgid "CuFt" msgstr "cuft" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Flasche" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Flasche" #: planner.c:192 msgid "Cylinder for planning" msgstr "Flasche für Tauchplanung" #: equipment.c:1603 msgid "Cylinders" msgstr "Flaschen" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "T:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "HAFTUNGSAUSSCHLUSS / WARNUNG: DIES IST EINE NEUE IMPLEMENTIERUNG DES \"BÜHLMANN ZH-L16\"-ALGORITHMUS UND EINES DARAUF AUFBAUENDEN TAUCHGANGPLANERS, DIE NUR EINGESCHRÄNKT GETESTET WURDE. WIR RATEN DRINGENST, KEINE TAUCHGÄNGE DURCHZUFÜHREN, DIE NUR AUF DEN HIER ERSTELLTEN DATEN BERUHEN." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Datenbank Verbindung fehlgeschlagen '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Datenbank Anfrage fehlgeschlagen '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Datenbank Anfrage 'get_events' fehlgeschlagen.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Datum" #: info-gtk.c:824 msgid "Date and Time" msgstr "Datum und Zeit" #: info-gtk.c:834 msgid "Date:" msgstr "Datum:" #: main.c:74 msgid "Dec" msgstr "Dez" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Standard XML Datei" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Lösche die Informationen zu einem Tauchcomputer" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Tauchgang löschen" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Tauchgänge löschen" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Tiefe" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Tiefenbegrenzung überschritten" #: gtk-gui.c:774 msgid "Depth:" msgstr "Tiefe:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Gerätebezeichnung" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Gerät oder Mount-Point" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Ungültige Tauchgänge anzeigen" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Tauchgang #%1$d - %2$s %4$02d.%3$02d.%5$04d um %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Tauchgang #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Tauchgang Nr. %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Bezeichnung für den Tauchcomputer" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informationen" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notizen" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Tauchplan - DIES IST NUR EINE SIMULATION; NICHT ZUM TAUCHEN VERWENDEN" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Tauchgangs-Typ" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Dauer" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm: Tauchgangsdauer" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: Tauchgangsdauer" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Hersteller und Modell" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Fehler beim Importieren der Tauchgangsdaten" #: gps.c:214 msgid "Dive locations" msgstr "Tauchplätze" #: info-gtk.c:575 msgid "Dive master" msgstr "Tauchgruppenleiter" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Wann beginnt der Tauchgang?" #: print.c:502 msgid "Dive#" msgstr "Tauchgang Nr." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Schriftart für Tauchliste" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Tauchgruppenleiter" #: statistics-gtk.c:542 msgid "Dives" msgstr "Tauchgänge" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Tauchplätze" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Von Tauchcomputer laden" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Von Tauchcomputer laden..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Vom Webserver laden" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Vom Webserver laden..." #: webservice.c:31 msgid "Download Success!" msgstr "Erfolgreich geladen!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Dauer" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Dauer (min)" #: info.c:312 msgid "E" msgstr "O" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Bearbeiten" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Gerätename bearbeiten" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Tauchcomputer Bezeichnung bearbeiten" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Reise-Informationen bearbeiten" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Reise-Übersicht bearbeiten" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Der Name des Tauchcomputers kann durch Doppelklick bearbeitet werden" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Tauchgang bearbeiten" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Zeit des Tauchgangs bearbeiten" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Tauchgänge bearbeiten" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Mehrere Tauchgänge bearbeiten" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Reise-Übersicht bearbeiten" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Ereignisse Ein-/Ausblenden" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "An- / Abwählen von Tauchgangs-Typen" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Ende" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Tiefe am Ende" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Benutzerkennung eingeben und 'Laden' drücken. Bei Erfolg 'Anwenden' drücken um die Daten zu übernehmen." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Ausrüstung" #: divelist-gtk.c:1370 msgid "Error" msgstr "Fehler" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Fehler beim Lesen des Salzgehalts" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Fehler beim Lesen des Datums" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Fehler beim Lesen der Dauer" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Fehler beim Lesen der Gasgemischs" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Fehler beim Lesen der Gasgemischszahl" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Fehler beim Lesen der maximalen Tiefe" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Fehler beim Lesen der Samples" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Fehler bei der Registrierung der Abbruchbehandlung" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Fehler beim Registrieren der Daten" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Fehler beim Registrieren der Ereignisbehandlung" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Ereignis: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Ereignis: warte auf Benutzeraktion" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Alle ausfalten" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Als UDDF Datei exportieren" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "UDDF Exportieren..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Tauchgang(gänge) als UDDF exportieren" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Fehler beim Öffnen von %i Dateien" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Fehler beim Lesen von '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Fehler beim Lesen von '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Fehler beim Lesen von '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Fehler beim Lesen von '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "Fuß" #: gtk-gui.c:1601 msgid "File" msgstr "Datei" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "(Erneutes) Laden aller Tauchgänge erzwingen" #: main.c:64 msgid "Fri" msgstr "Fr" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh für Tauchplan" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow für Tauchplan" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 oder GPS Format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gasverbrauch" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gasverbrauch" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Verw. Gas" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Gasverbrauch:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gasgemisch" #: gtk-gui.c:767 msgid "General Settings" msgstr "Allg. Einstellungen" #: gtk-gui.c:1606 msgid "Help" msgstr "Hilfe" #: webservice.c:296 msgid "Idle" msgstr "inaktiv" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Datei(en) importieren..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informationen" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Verbindung aufbauen" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Plan eingeben" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ungültige Tiefe - kann \"%s\" nicht lesen" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ungültige Tiefe - Werte unterhalb 400m sind nicht unterstützt" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Ungültiges Gasgemisch in Zeile %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Ungültige Anfangszeit" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Ungültige Benutzerkennung" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Jan" #: main.c:74 msgid "Jul" msgstr "Jul" #: main.c:73 msgid "Jun" msgstr "Jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Letzter Stopp auf 20 Fuß" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Letzter Stopp auf 6 Metern" #: print.c:985 msgid "Layout Options" msgstr "Layout Einstellungen" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel und andere, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Liste" #: gtk-gui.c:785 msgid "Liter" msgstr "Liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Ort" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Max." #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Längster Tauchgang" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: Batterie schwach" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Warnung: Batterie schwach" #: gtk-gui.c:862 msgid "Map provider" msgstr "Karten-Anbieter" #: main.c:73 msgid "Mar" msgstr "Mär" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Als ungültig markieren" #: gps.c:53 msgid "Mark location here" msgstr "Hier markieren" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Als gültig markieren" #: uemis.c:230 msgid "Marker" msgstr "Markierung" #: print.c:502 msgid "Master" msgstr "Leiter" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Warnung: Maximale Deko Zeit" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max. Tiefe" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Max. Tiefe (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max. AMV" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max. Temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Max. Tiefe: %.*f %s\nDauer: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Max. Druck" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Max." #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Max." #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Max." #: main.c:73 msgid "May" msgstr "Mai" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Tauchgänge zusammenführen" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Reise mit der darüber verbinden" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Reise mit der darunter verbinden" #: gtk-gui.c:775 msgid "Meter" msgstr "Meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min. Tiefe" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. AMV" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min. Temp." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Min." #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Min." #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Min." #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Verschiedene Optionen" #: gtk-gui.c:1512 msgid "Model" msgstr "Modell" #: main.c:64 msgid "Mon" msgstr "Mo" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Multi-Plattform Tauchprogramm in C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Neu" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Neue erste Nummer" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Nächster TC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Gerätename" #: uemis.c:232 msgid "No Tank Data" msgstr "Keine Flaschen Informationen" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Keine Flaschen für diesen Tauchgang" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notizen" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Höhe der Notizen (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notizen oben" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Unbekannter pthread Fehlercode" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Ausgewählten Eintrag löschen?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Nur Tauchgänge dieses Typs anzeigen:" #: gtk-gui.c:291 msgid "Open File" msgstr "Datei öffnen" #: gtk-gui.c:1608 msgid "Open..." msgstr "Öffnen..." #: print.c:995 msgid "Ordering" msgstr "Reihenfolge" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Höhe der anderen Daten (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Sauerstoff" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: Aufstieg / PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Warnung: Aufstieg / PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Warnung: PO2 Grün" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Passwort" #: info-gtk.c:565 msgid "Pick on map" msgstr "Auf Karte auswählen" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planer" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Bitte Benutzerkennung und Passwort für divelogs.de eingeben. Die ausgewählten Tauchgänge werden zum Benutzerkonto hinzugefügt." #: gtk-gui.c:752 msgid "Preferences" msgstr "Einstellungen" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Einstellungen..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Druck" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Druck:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Vorh. TC" #: print.c:989 msgid "Print in color" msgstr "Farbdruck" #: print.c:978 msgid "Print only selected dives" msgstr "Nur ausgewählte Tauchgänge drucken" #: print.c:974 msgid "Print selection" msgstr "Auswahl drucken" #: print.c:939 print.c:946 msgid "Print type" msgstr "Art des Ausdrucks" #: gtk-gui.c:1612 msgid "Print..." msgstr "Drucken..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profil Einstellungen" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Höhe des Profils (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil oben" #: gtk-gui.c:1625 msgid "Quit" msgstr "Beenden" #: uemis.c:218 msgid "RGT Alert" msgstr "Alarm: verbleibende Gas-Zeit" #: uemis.c:216 msgid "RGT Warning" msgstr "Warnung: verbleibende Gas-Zeit" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Bewertung" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Lese %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Entferne" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Reise entfernen" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Tauchgang aus Reise entfernen" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Entferne Ereignisse hier" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Ausgewählte Tauchgänge aus Reise entfernen" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Neu nummerieren" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Neu nummerieren..." #: download-dialog.c:153 msgid "Retry" msgstr "Wiederholen" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "AMV" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "AMV während Dekostopp" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "AMV während des Tauchgangs" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Verletzung des Sicherheitsstopps" #: main.c:64 msgid "Sat" msgstr "Sa" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Speichern unter..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Änderungen speichern?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Datei speichern unter" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Speichern unter" #: gtk-gui.c:1609 msgid "Save..." msgstr "Speichern..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Segment Dauer" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Ereignisse auswählen" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Ereignisse auswählen..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Typen auswählen..." #: main.c:74 msgid "Sep" msgstr "Sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Unvollständiger Schreibvorgang der req.txt Datei\nIst der Uemis Zürich korrekt verbunden?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Min." #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Kürzester Tauchgang" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Spalten anzeigen" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "EAD, END, EADD anzeigen" #: gtk-gui.c:951 msgid "Show MOD" msgstr "MOD anzeigen" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Berechnete tiefste Deko-Stopps anzeigen" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Vom TC ausgelesene tiefste Deko-Stopps rot anzeigen" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Auf Karte zeigen" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "pHe Diagramm anzeigen" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "pN%s Diagramm anzeigen" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "pO%s Diagramm anzeigen" #: planner.c:217 msgid "Simulated Dive" msgstr "Simulierter Tauchgang" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Größe" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Höhe (%% des Layouts)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: Geschwindigkeit" #: uemis.c:203 msgid "Speed Warning" msgstr "Warnung: Geschwindigkeit" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Beginne zu Laden" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistiken" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistiken %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistiken" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Verbleibe auf %.*f %s für %d:%02d min - Gesamtzeit %d:%02u mit %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Unverständliche Prozentangabe %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Anzug" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "So" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Oberflächenpause" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Oberflächendruck (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Gaswechsel zu %s\n" #: print.c:960 msgid "Table print" msgstr "Tabellendruck" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Tauchgang-Typen werden nur angezeigt, wenn sie in allen editierten Tauchgängen identisch waren" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Gaswechsel-Vorschlag" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Info: Flaschendruck" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tec-Einstellungen" #: gtk-gui.c:805 msgid "Temp" msgstr "Temperatur" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatur" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatur:" #: gtk-gui.c:1631 msgid "Three" msgstr "Drei" #: main.c:64 msgid "Thu" msgstr "Do" #: info-gtk.c:841 msgid "Time" msgstr "Zeit" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Zum Tauchgangsdaten bearbeiten\nDoppelklick in der Tauchgangsliste" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zoom ein-/ausschalten" #: planner.c:294 msgid "Too many gas mixes" msgstr "Zu viele Gasgemische" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Zu viele Abschnitte" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Gesamt" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Gesamtzeit" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Gesamtgewicht:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Tauchen auf %.*f %s in %d:%02d min - Gesamtzeit %d:%02u mit %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Reise ab %1$s, %3$d. %2$s %4$d (%5$d Tauchgang)" msgstr[1] "Reise ab %1$s, %3$d. %2$s %4$d (%5$d Tauchgänge)" #: main.c:64 msgid "Tue" msgstr "Di" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Typ" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zürich: Dateisystem beinahe voll\nBitte den Tauchcomputer ausstecken, wieder einstecken\nund erneut versuchen" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zürich: Dateisystem voll.\nBitte den Tauchcomputer ausstecken, wieder einstecken\nund erneut versuchen" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemis-Initialisierung fehlgeschlagen" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Fehler beim Erzeugen des libdivecomputer Contexts" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Nicht in der Lage, einen Parser für %s %s zu erstellen" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Fehler beim Öffnen von %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Einheiten" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Tauchgang(gänge) auf divelogs.de hochladen" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Auf divelogs.de hochladen" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Hochladen auf divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Der Tauchplatz kann mittels rechter Maustaste an der Mausposition markiert werden" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Benutzerkennung" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Benutzerhandbuch" #: gtk-gui.c:1603 msgid "View" msgstr "Ansicht" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Sicht" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volumen:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Warnung - extrem lange Tauchgänge können zu sehr langen Berechnungszeiten führen" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Warnung - extrem tiefe Tauchgänge können zu sehr langen Berechnungszeiten führen" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Wassertemperatur" #: webservice.c:163 msgid "Webservice" msgstr "Webservice" #: main.c:64 msgid "Wed" msgstr "Mi" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Gewicht" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Gewichtsystem" #: gtk-gui.c:794 msgid "Weight:" msgstr "Gewicht:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML-Datei" #: statistics-gtk.c:92 msgid "Year" msgstr "Jahr" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Jahresstatistiken" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Sie haben bereits einen Tauchcomputer dieses Modells\nmit Namen %s.\nSubsurface kann einen Namen für dieses Gerät verwalten, um die Geräte zu unterscheiden. Die Voreinstellung ist unten angezeigt.\nFalls kein Name gewünscht ist, bitte 'Abbrechen' klicken. Subsurface zeigt dann einfach den Produktnamen an (in diesem Fall können eventuell verschiedene Tauchcomputer nicht mehr in den angezeigten Daten unterschieden werden)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Nicht alle Änderungen wurden gespeichert.\nSollen Änderungen vor dem Schließen der Datei gespeichert werden?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Nicht alle Änderungen in der Datei %s wurden gespeichert.\nSollen Änderungen vor dem Schließen der Datei gespeichert werden?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "Luft" #: libdivecomputer.c:153 msgid "airtime" msgstr "verbleibende Atemzeit" #: statistics.c:21 msgid "altitude" msgstr "Berg" #: equipment.c:892 msgid "ankle" msgstr "Fußblei" #: libdivecomputer.c:149 msgid "ascent" msgstr "Aufstieg" #: equipment.c:893 msgid "backplate weight" msgstr "Backplate-Gewicht" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "Gürtel" #: statistics.c:20 msgid "boat" msgstr "Boot" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "Markierung" #: statistics.c:21 msgid "cave" msgstr "Höhle" #: statistics.c:20 msgid "cavern" msgstr "Kaverne" #: libdivecomputer.c:149 msgid "ceiling" msgstr "tiefster Deko-Stopp" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "Sicherheits-Stopp" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "cu.ft." #: uemis-downloader.c:384 msgid "data" msgstr "Daten" #: statistics.c:23 msgid "deco" msgstr "deko" #: libdivecomputer.c:149 msgid "deco stop" msgstr "Deko-Stopp" #: statistics.c:20 msgid "deep" msgstr "tief" #: libdivecomputer.c:152 msgid "deepstop" msgstr "Tiefen-Stopp" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "Logbucheintrag mit ID" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "Tauchplatz Daten ID" #: libdivecomputer.c:152 msgid "divetime" msgstr "Tauchgangsdauer" #: statistics.c:20 msgid "drift" msgstr "Strömung" #: uemis-downloader.c:589 msgid "drysuit" msgstr "Trockentauchanzug" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "für alle Tauchgänge" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "für Tauchgang Nr. %d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "für Tauchgänge Nr." #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "für den ausgewählten Tauchgang" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "für die ausgewählten Tauchgänge" #: statistics.c:22 msgid "freshwater" msgstr "Süsswasser" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "vollständiger Tauchanzug" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "Gaswechsel" #: libdivecomputer.c:153 msgid "heading" msgstr "Richtung" #: statistics.c:21 msgid "ice" msgstr "Eis" #: equipment.c:890 msgid "integrated" msgstr "integriert" #: statistics.c:20 msgid "invalid" msgstr "ungültig" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "ungültige Ereignisnummer" #: uemis-downloader.c:590 msgid "jacket" msgstr "Jacke" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "See" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "US Pfund" #: uemis-downloader.c:590 msgid "long john" msgstr "Latzhose" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max. ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "max. CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Max. Tiefe" #: uemis-downloader.c:591 msgid "membrane" msgstr "Membran" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "mehr Daten für Tauchgang ID" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "mehr als %d Tage" #: statistics.c:22 msgid "night" msgstr "Nacht" #: libdivecomputer.c:154 msgid "non stop time" msgstr "Nullzeit" #: libdivecomputer.c:149 msgid "none" msgstr "keine" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe Schwelle" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s Schwelle" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s Schwelle" #: dive.c:44 msgid "pascal" msgstr "Pa" #: statistics.c:23 msgid "photo" msgstr "Foto" #: statistics.c:21 msgid "pool" msgstr "Pool" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "Fluss" #: libdivecomputer.c:150 msgid "safety stop" msgstr "Sicherheitsstopp" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "Sicherheitsstopp (verpflichtend)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "Sicherheitsstopp (freiwillig)" #: uemis-downloader.c:589 msgid "semidry" msgstr "halbtrocken" #: statistics.c:20 msgid "shore" msgstr "Ufer" #: uemis-downloader.c:590 msgid "shorty" msgstr "Shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "Oberfläche" #: statistics.c:22 msgid "teaching" msgstr "Lehr" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Gewebewarnung" #: statistics.c:22 msgid "training" msgstr "Übung" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Dirk Hohndel" #: libdivecomputer.c:150 msgid "transmitter" msgstr "Sender" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "unbk" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "unbekannt" #: equipment.c:540 msgid "unspecified" msgstr "nicht angegeben" #: uemis-downloader.c:590 msgid "vest" msgstr "Weste" #: statistics.c:23 msgid "video" msgstr "Video" #: libdivecomputer.c:150 msgid "violation" msgstr "Verletzung" #: equipment.c:1545 msgid "weight" msgstr "Blei" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "Nass-Tauchanzug" #: libdivecomputer.c:149 msgid "workload" msgstr "Arbeit" #: statistics.c:21 msgid "wreck" msgstr "Wrack" Subsurface-4.0.2/po/es_ES.aliases000066400000000000000000000000031226345450700165770ustar00rootroot00000000000000es Subsurface-4.0.2/po/es_ES.po000066400000000000000000001331451226345450700156120ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Adolfo Jayme , 2013 # dirkhh , 2013 # Henrik Brautaset Aronsen , 2012 # Salvador Cuñat , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:57+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Spanish (Spain) (http://www.transifex.com/projects/p/subsurface/language/es_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nNo hay eventos\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "> Mes" #: webservice.c:289 msgid " Download" msgstr "Descargar" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Seleccione el ordenador de buceo y el dispositivo." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "comienzo" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "fin" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s de %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d minutos" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd, %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nTecho calculado %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeco:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeco:Tiempo desconocido @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nPEA:%d%s\nPNE:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nEn deco" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nParada de seguridad:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nParada de seguridad:tiempo desconocido @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nPlan de buceo de Subsurface\nbasado en GFbajo = %.0f y GFalto = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "Suceso: %s en %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Respuesta de divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) o (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(pulse para editar la fecha/hora)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(pulse para editar día/hora/profundidad)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(ninguna inmersión)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(nada)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 pie³/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 pie³/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 inmersiones por página" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "traje completo 2 piezas" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "Incrementos de 3m para el techo calculado" #: print.c:952 msgid "6 dives per page" msgstr "6 inmersiones por página" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Añadir segmentos debajo.\nCada línea describe parte de la inmersión planificada.\nUna entrada con profundidad, tiempo y gas describe un segmento que termina a la profundidad indicada, dura el tiempo señalado (si es tiempo relativo, por ejemplo '+3:30') o termina en el momento marcado (si es tiempo absoluto, por ejemplo, '@5:00'), y consume el gas dado.\nUn gas vacío significa 'utilizar el gas anterior' (o AIRE si no se especificó ninguno).\nUna entrada que tenga una profundidad y un gas, pero no tenga tiempo, es especial; informa al planificador de que el gas indicado está disponible para el ascenso, una vez que se haya alcanzado la profundidad marcada.\nCC Setpoint especifica inmersiones con circuito cerrado (rebreather), dejar vacío para circuito abierto.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "AIRE" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Acerca de Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Añadir" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Añadir inmersión…" #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Añadir marca aquí" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Añadir inmersión" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Añadir cambio de gas aquí" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Añadir cambio de gas en %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Añadir al viaje anterior" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Añadir punto de ruta" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Presión atmosférica" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temperatura del aire" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temperatura del aire en %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Preferir siempre la inmersión descargada" #: main.c:73 msgid "Apr" msgstr "Abr" #: main.c:74 msgid "Aug" msgstr "Ago" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Agrupar automáticamente" #: equipment.c:642 msgid "Available gases" msgstr "Gases disponibles" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Promedio" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Promedio" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Promedio" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Promedio" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Prof. media" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Prof. media (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "SAC medio" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Temp media" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Tiempo medio" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Cambio de emergencia a OC" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Compañero" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "No encuentro el gas %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "No se puede abrir la hoja de estilos (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Cancelado, saliendo…" #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Cancelado..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "No se puede añadir cambio de gas" #: webservice.c:29 msgid "Cannot parse response!" msgstr "No se puede analizar la respuesta." #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Seleccionar archivo XML predeterminado" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Elegir archivos XML para importar en archivo de datos actual" #: gtk-gui.c:1611 msgid "Close" msgstr "Cerrar" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Contraer todo" #: webservice.c:121 msgid "Connecting..." msgstr "Conectando…" #: webservice.c:25 msgid "Connection Error: " msgstr "Error de conexión:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Crear nuevo viaje por encima" #: gtk-gui.c:786 msgid "CuFt" msgstr "pie³" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Bot" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Botella" #: planner.c:192 msgid "Cylinder for planning" msgstr "Botella para planificar" #: equipment.c:1603 msgid "Cylinders" msgstr "Botellas" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "DESCARGO DE RESPONSABILIDAD / AVISO: ESTA ES UNA NUEVA IMPLEMENTACIÓN DEL ALGORITMO BUHLMANN Y UNA IMPLEMENTACIÓN DE UN PLANIFICADOR DE INMERSIÓN BASADO EN ÉL QUE SOLO HA SIDO PROBADA DE FORMA LIMITADA. RECOMENDAMOS FIRMEMENTE NO PLANIFICAR INMERSIONES BASADAS SIMPLEMENTE EN LOS RESULTADOS QUE SE OBTENGAN AQUÍ." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Falló la conexión a la base de datos '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Falló la petición a la base de datos '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Falló la petición get_events a la base de datos.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Fecha" #: info-gtk.c:824 msgid "Date and Time" msgstr "Fecha y hora" #: info-gtk.c:834 msgid "Date:" msgstr "Fecha:" #: main.c:74 msgid "Dec" msgstr "Dic" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Archivo de datos XML predeterminado" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Borrar la información de un ordenador" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Eliminar inmersión" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Eliminar inmersiones" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Profundidad" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Se superó el límite de profundidad" #: gtk-gui.c:774 msgid "Depth:" msgstr "Profundidad:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Identificador de dispositivo" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Dispositivo o punto de montaje" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Mostrar las inmersiones marcadas \"no validas\"" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Inmersión #%1$d - %2$s %3$02d/%4$02d/%5$04d a las %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Inmersión n.º %d –" #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Inmersión n.º %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Nombre del ordenador de Buceo" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Información de la inmersión" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notas de la inmersión" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Plan de inmersión – ESTO ES SOLO UNA SIMULACIÓN; NO LO USE PARA BUCEAR" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Etiquetas para la inmersión" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Duración de la inmersión" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alerta de duración de inmersión" #: uemis.c:226 msgid "Dive Time Info" msgstr "Información sobre la ruración de lainmersión" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Fabricante del ordenador y producto" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Error al importar datos de inmersiones" #: gps.c:214 msgid "Dive locations" msgstr "Ubicaciones de buceo" #: info-gtk.c:575 msgid "Dive master" msgstr "Guía" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "¿ Cuando comienza la inmersión ?" #: print.c:502 msgid "Dive#" msgstr "Inmersión n.º" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Fuente de lista de inmersiones" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Inmersiones" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Ubicaciones de buceo" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Descargar desde el ordenador de Buceo" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Descargar desde el ordenador de Buceo..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Descargar desde servicio web" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Descargar desde servicio web…" #: webservice.c:31 msgid "Download Success!" msgstr "Se ha completado la descarga correctamente." #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Duración" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Duración (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Editar" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Editar nombres del dispositivo" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Editar nombres de ordenador de buceo" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Editar el viaje" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Editar resumen del viaje" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Edita el nombre de un ordenador de buceo haciendo doble-clic en el campo del nombre correspondiente." #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Editar inmersión" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Editar fecha y hora de la inmersión" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Editar inmersiones" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Editar múltiples inmersiones" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Editar resumen del viaje" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Activar/desactivar eventos" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Activar/desactivar etiquetas" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Fin" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Profundidad final" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Escriba un identificador de usuario y pulse «Descargar». Una vez que se complete la descarga, puede pulsar en «Aplicar» si quiere aplicar los cambios." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Equipo" #: divelist-gtk.c:1370 msgid "Error" msgstr "Error" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Error al obtener salinidad del agua" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Error al analizar la fecha" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Error al analizar el tiempo de buceo" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Error al analizar la mezcla de gas" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Error al analizar el conteo de mezcla de gas" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Error al analizar la máxima profundidad" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Error al analizar las muestras" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Error al registrar el manejador de cancelación" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Error al registrar los datos" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Error al registrar el manejador de eventos" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Evento: Hora de sistema=%, Hora del dispositivo=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Evento: esperando acción del usuario" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Expandir todos" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Exportar como archivo UDDF" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Exportar a UDDF…" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Exportar inmersión(es) a UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "No se pudieron abrir %i archivos." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "No se pudo analizar «%s»" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "No se pudo analizar «%s».\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "No se pudo leer «%s»" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "No se pudo leer «%s».\n" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "Pies" #: gtk-gui.c:1601 msgid "File" msgstr "Archivo" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filtros" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Forzar descarga de todas las inmersiones" #: main.c:64 msgid "Fri" msgstr "Vi" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFAlto" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFalto para planificar" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFbajo" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFbajo para planificar" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS(formato WGS84 o GPS)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gas usado" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gas usado" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gas usado" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Consumo de gas:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Mezcla de gas" #: gtk-gui.c:767 msgid "General Settings" msgstr "Ajustes generales" #: gtk-gui.c:1606 msgid "Help" msgstr "Ayuda" #: webservice.c:296 msgid "Idle" msgstr "parado" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importar archivo(s)…" #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Info" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Iniciar comunicación" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Introducir Plan" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Profundidad no válida – No se puede analizar «%s»" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Profundidad no válida – no se admiten valores superiores a 400m" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Gas no válido en columna %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Hora de inicio no valida" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "El identificador de usuario no es válido." #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Ene" #: main.c:74 msgid "Jul" msgstr "Jul" #: main.c:73 msgid "Jun" msgstr "Jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Última parada a 20 pies" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Última parada a 6 metros" #: print.c:985 msgid "Layout Options" msgstr "Opciones de disposición" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel y otros, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Lista" #: gtk-gui.c:785 msgid "Liter" msgstr "Litro" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Ubicación" #: gtk-gui.c:1602 msgid "Log" msgstr "Registro" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Más prolongado" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Inmersión más prolongada" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alerta de batería baja" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Aviso de batería baja" #: gtk-gui.c:862 msgid "Map provider" msgstr "Proveedor de mapas" #: main.c:73 msgid "Mar" msgstr "Mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Marcar como no válida" #: gps.c:53 msgid "Mark location here" msgstr "Marcar ubicación aquí" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Marcar como válida" #: uemis.c:230 msgid "Marker" msgstr "Marcador" #: print.c:502 msgid "Master" msgstr "Guía" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Advertencia de tiempo max deco" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Profundidad max" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Prof. máxima (%s)" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Temp. máx." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Profundidad máxima: %.*f %s\nDuración :%d minutos\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Pres. max." #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Máxima" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Máximo" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Máxima" #: main.c:73 msgid "May" msgstr "Mayo" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Mezclar inmersiones" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Combinar viaje con el viaje de encima" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Combinar viaje con el viaje de abajo" #: gtk-gui.c:775 msgid "Meter" msgstr "Metro" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Profundidad mínima" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min Temp" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Mínima" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Mínimo" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Mínima" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Opciones varias" #: gtk-gui.c:1512 msgid "Model" msgstr "Modelo" #: main.c:64 msgid "Mon" msgstr "Lu" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Software para registro de buceo multiplataforma escrito en C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Nuevo" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Número de partida nuevo" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Siguiente DC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Nombre" #: uemis.c:232 msgid "No Tank Data" msgstr "No se degistran datos de botella" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "No se han especificado botellas para esta inmersión." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notas" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Altura de las notas (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notas arriba" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Oct" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Error de lectura" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "¿Está seguro de que quiere eliminar la entrada seleccionada?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Mostrar solo inmersiones con estas etiquetas:" #: gtk-gui.c:291 msgid "Open File" msgstr "Abrir archivo" #: gtk-gui.c:1608 msgid "Open..." msgstr "Abrir…" #: print.c:995 msgid "Ordering" msgstr "Ordenar" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Altura de los otros datos (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Oxigeno" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarma de ascenso de PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Aviso de ascenso de PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Aviso verde de PO2" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Contraseña" #: info-gtk.c:565 msgid "Pick on map" msgstr "Elegir en el mapa" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planificador" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Escriba su código de usuario y contraseña de divelogs.de. Las inmersiones seleccionadas se añadirán a su cuenta." #: gtk-gui.c:752 msgid "Preferences" msgstr "Preferencias" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Preferencias…" #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Presión" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Presión:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Anterior DC" #: print.c:989 msgid "Print in color" msgstr "Impresión en color" #: print.c:978 msgid "Print only selected dives" msgstr "Imprimir sólo inmersiones seleccionadas" #: print.c:974 msgid "Print selection" msgstr "Imprimir selección" #: print.c:939 print.c:946 msgid "Print type" msgstr "Tipo de impresión" #: gtk-gui.c:1612 msgid "Print..." msgstr "Imprimir…" #: gtk-gui.c:1629 msgid "Profile" msgstr "Perfil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Ajustes de perfil" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Altura del perfil (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Perfil arriba" #: gtk-gui.c:1625 msgid "Quit" msgstr "Salir" #: uemis.c:218 msgid "RGT Alert" msgstr "Alerta tiempo de gas restante" #: uemis.c:216 msgid "RGT Warning" msgstr "Aviso tiempo de gas restante" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Valoración" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Leyendo %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Eliminar" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Eliminar viaje" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Eliminar inmersión del viaje" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Eliminar evento" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Eliminar selección de inmersiones del viaje" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Renumerar" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Renumerar…" #: download-dialog.c:153 msgid "Retry" msgstr "Intentar de nuevo" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC en parada deco" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC en fondo" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Violación de parada de seguridad" #: main.c:64 msgid "Sat" msgstr "Sa" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Guardar como…" #: gtk-gui.c:221 msgid "Save Changes?" msgstr "¿Guardar los cambios?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Guardar archivo como" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Guardar como" #: gtk-gui.c:1609 msgid "Save..." msgstr "Guardar…" #: planner-gtk.c:299 msgid "Segment Time" msgstr "Duración del segmento" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Seleccionar eventos" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Seleccionar eventos…" #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Seleccionar etiquetas…" #: main.c:74 msgid "Sep" msgstr "Sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Escritura al archivo req.txt muy corta.\n¿Está el Uemis Zúrich correctamente conectado?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Más corta" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Inmersión más corta" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Mostrar columnas" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Mostrar PEA, PNE, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Mostrar MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Mostrar el techo calculado" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Mostrar en rojo el techo informado por el dc" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Mostrar en el mapa" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Mostrar gráfico de pHe" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Mostrar gráfico de pN%s" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Mostrar gráfico de pO%s" #: planner.c:217 msgid "Simulated Dive" msgstr "Inmersión simulada" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Tamaño" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Ajuste de alturas (%% de la distribución por inmersión)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarma de velocidad" #: uemis.c:203 msgid "Speed Warning" msgstr "Aviso de velocidad" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Inicio" #: uemis-downloader.c:782 msgid "Start download" msgstr "Iniciar la descarga" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Estadísticas" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Estadísticas %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Estadísticas" #: webservice.c:295 msgid "Status" msgstr "Estado" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Permanecer a %.*f %s durante %d:%02d min - runtime %d:%02u en %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Porcentaje extraño al leer %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Traje" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Do" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Interv. superf." #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Presión atmosférica (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Cambio de gas a %s\n" #: print.c:960 msgid "Table print" msgstr "Impresión de tabla" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Las etiquetas solo se muestran si son idénticas para todas las inmersiones editadas" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Sugerencia de cambio de botella" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Información sobre presión de botella" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Opciones técnicas" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatura" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatura:" #: gtk-gui.c:1631 msgid "Three" msgstr "Tres" #: main.c:64 msgid "Thu" msgstr "Ju" #: info-gtk.c:841 msgid "Time" msgstr "Hora de entrada" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Para editar la información de la inmersión\npulse dos veces sobre ella en la lista" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Activar/desactivar ampliación" #: planner.c:294 msgid "Too many gas mixes" msgstr "Demasiadas mezclas de gas" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Demasiados puntos de ruta" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Total" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Tiempo total" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Peso total:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Cambio de cota a %.*f %s en %d:%02d min - runtime %d:%02u con %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Viaje %1$s, %2$s %3$d, %4$d (%5$d inmersión)" msgstr[1] "Viaje %1$s, %2$s %3$d, %4$d (%5$d inmersiones)" #: main.c:64 msgid "Tue" msgstr "Ma" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Tipo" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: El sistema de archivos esta casi lleno \nDesconecte / conecte el ordenador de buceo \ne inténtelo de nuevo" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: sistema de archivos está lleno\nDesconectar / conectar el ordenador de buceo\ne inténtelo de nuevo" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Fallo al intentar iniciar Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "No es posible crear el contexto de libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "No es posible crear el analizador para %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "No se pudo abrir %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Unidades" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Enviar inmersión(es) a divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Enviar a divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Enviar a divelogs.de…" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Pulse con el botón derecho del ratón para marcar la ubicación con el cursor" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Identificador de usuario" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Manual de usuario" #: gtk-gui.c:1603 msgid "View" msgstr "Ver" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Visibilidad" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volumen:" #: info.c:312 msgid "W" msgstr "O" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Aviso - Inmersiones extremadamente largas pueden provocar tiempos de cálculo muy largos" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Aviso - Planificar inmersiones muy profundas puede costar cantidades de tiempo excesivas" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Temp. del agua" #: webservice.c:163 msgid "Webservice" msgstr "Servicio web" #: main.c:64 msgid "Wed" msgstr "Mi" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Peso" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Sistema de lastre" #: gtk-gui.c:794 msgid "Weight:" msgstr "Peso:" #: gtk-gui.c:146 msgid "XML file" msgstr "Archivo XML" #: statistics-gtk.c:92 msgid "Year" msgstr "Año" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Estadísticas anuales" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Ya tienes un ordenador de buceo de este modelo\nllamado %s\nSubsurface puede conservar otro nombre de este dispositivo para distinguirlo del que ya existe. Por defecto sería el modelo y el identificador tal como se muestran abajo.Si no quieres poner nombre a este ordenador haz clic en \"Cancelar\" y Subsurface, simplemente, mostrará como nombre su modelo (lo que podría suponer que no pudieras distinguir entre los ordenadores en los diarios)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Tiene cambios sin guardar\n¿Quiere guardar los cambios antes de cerrar el archivo de datos?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Tiene cambios sin guardar en el archivo: %s \n¿Quiere guardar los cambios antes de cerrar el archivo de datos?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "aire" #: libdivecomputer.c:153 msgid "airtime" msgstr "tiempo de aire" #: statistics.c:21 msgid "altitude" msgstr "altura" #: equipment.c:892 msgid "ankle" msgstr "tobillo" #: libdivecomputer.c:149 msgid "ascent" msgstr "ascenso" #: equipment.c:893 msgid "backplate weight" msgstr "lastre en el arnes" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "cinturón" #: statistics.c:20 msgid "boat" msgstr "barco" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "marcador" #: statistics.c:21 msgid "cave" msgstr "cueva" #: statistics.c:20 msgid "cavern" msgstr "caverna" #: libdivecomputer.c:149 msgid "ceiling" msgstr "techo" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "techo (parada de seguridad)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "pie³" #: uemis-downloader.c:384 msgid "data" msgstr "datos" #: statistics.c:23 msgid "deco" msgstr "deco" #: libdivecomputer.c:149 msgid "deco stop" msgstr "parada deco" #: statistics.c:20 msgid "deep" msgstr "profunda" #: libdivecomputer.c:152 msgid "deepstop" msgstr "parada de profundidad" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "identificador de entrada del diario" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "identificador del punto de buceo" #: libdivecomputer.c:152 msgid "divetime" msgstr "duración de inmersión" #: statistics.c:20 msgid "drift" msgstr "a la deriva" #: uemis-downloader.c:589 msgid "drysuit" msgstr "traje seco" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "Todas las inmersiones" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "para la inmersión n.º %d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "para las inmersiones n.º" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "para la inmersión seleccionada" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "para las inmersiones seleccionadas" #: statistics.c:22 msgid "freshwater" msgstr "agua dulce" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "traje completo" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "cambio de mezcla" #: libdivecomputer.c:153 msgid "heading" msgstr "encabezado" #: statistics.c:21 msgid "ice" msgstr "hielo" #: equipment.c:890 msgid "integrated" msgstr "integrado" #: statistics.c:20 msgid "invalid" msgstr "no válida" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "el número de evento no es válido" #: uemis-downloader.c:590 msgid "jacket" msgstr "chaleco" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "lago" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "lbs" #: uemis-downloader.c:590 msgid "long john" msgstr "long john" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "maxCNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Profundidad Max" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrana" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "modelo=%u (0x%08x), firmware=%u (0x%08x), n.º de serie=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "más datos para el identificador de inmersión" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "más de %d días" #: statistics.c:22 msgid "night" msgstr "noche" #: libdivecomputer.c:154 msgid "non stop time" msgstr "tiempo sin parada" #: libdivecomputer.c:149 msgid "none" msgstr "ninguno" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "umbral de pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "umbral de pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "umbral de pO%s" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "foto" #: statistics.c:21 msgid "pool" msgstr "piscina" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "río" #: libdivecomputer.c:150 msgid "safety stop" msgstr "parada de seguridad" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "parada de seguridad (obligatoria)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "parada de seguridad (voluntaria)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semiseco" #: statistics.c:20 msgid "shore" msgstr "orilla" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "superficie" #: statistics.c:22 msgid "teaching" msgstr "enseñanza" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Alarma de nivel de tejidos" #: statistics.c:22 msgid "training" msgstr "entrenamiento" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "José Ángel Tortosa Delfa\nPablo García Castro\nMatthias Kaehlcke\nSergio Schvezov\nAuni Somero\nHenrik Brautaset Aronsen (who doesn't speak Spanish)\nand Salvador Cuñat" #: libdivecomputer.c:150 msgid "transmitter" msgstr "transmisor" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "desc" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "desconocido" #: equipment.c:540 msgid "unspecified" msgstr "no especificado" #: uemis-downloader.c:590 msgid "vest" msgstr "chaleco" #: statistics.c:23 msgid "video" msgstr "vídeo" #: libdivecomputer.c:150 msgid "violation" msgstr "violación" #: equipment.c:1545 msgid "weight" msgstr "peso" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "traje húmedo" #: libdivecomputer.c:149 msgid "workload" msgstr "carga" #: statistics.c:21 msgid "wreck" msgstr "pecio" Subsurface-4.0.2/po/et_EE.aliases000066400000000000000000000000031226345450700165620ustar00rootroot00000000000000ee Subsurface-4.0.2/po/et_EE.po000066400000000000000000001045401226345450700155720ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Aret Leetsaar , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:53+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/subsurface/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "Kuu" #: webservice.c:289 msgid " Download" msgstr "" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "" #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "algus" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "lõpp" #: statistics-gtk.c:92 msgid "#" msgstr "" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dt %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s⏎ Decos" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s⏎ pHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s⏎ pN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s⏎ pO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) või (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(pole sukeldumisi)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(tühi)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "" #: planner-gtk.c:415 msgid "17 l/min" msgstr "" #: print.c:956 msgid "2 dives per page" msgstr "2 sukeldumist lehel" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "" #: planner-gtk.c:414 msgid "20 l/min" msgstr "" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "" #: print.c:952 msgid "6 dives per page" msgstr "6 sukeldumist lehel" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "" #: planner-gtk.c:272 msgid "AIR" msgstr "ÕHK" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "" #: gtk-gui.c:2116 msgid "Add" msgstr "" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Lisa Sukeldumine..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Lisa Sukeldumine" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "" #: statistics-gtk.c:608 msgid "Air Press" msgstr "" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "" #: main.c:73 msgid "Apr" msgstr "" #: main.c:74 msgid "Aug" msgstr "" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "" #: equipment.c:642 msgid "Available gases" msgstr "" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Keskmine" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Keskmine" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Keskmine" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Keskmine" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Semu" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "" #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "" #: equipment.c:621 msgid "Cannot add gas change" msgstr "" #: webservice.c:29 msgid "Cannot parse response!" msgstr "" #: gtk-gui.c:790 msgid "Celsius" msgstr "" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "" #: gtk-gui.c:1611 msgid "Close" msgstr "" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "" #: webservice.c:121 msgid "Connecting..." msgstr "Ühendab..." #: webservice.c:25 msgid "Connection Error: " msgstr "Viga ühendamisel:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "" #: gtk-gui.c:786 msgid "CuFt" msgstr "" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Balloon" #: planner.c:192 msgid "Cylinder for planning" msgstr "Balloon planeerimiseks" #: equipment.c:1603 msgid "Cylinders" msgstr "Balloonid" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "TÄHELEPANU: SIIN ON KASUTUSEL BUHLMANNI ALGORITMIL PÕHINEV SUKELDUMISTE PLANEERIJA, MIS ON NULLIST IMPLEMENTEERITUD JA SEDA ON HETKEL NAPILT KATSETATUD. SOOVITAME TUNGIVALT, MITTE PLANEERIDA OMA SUKELDUMIST AINULT SIIT SAADUD ANDMETE PÕHJAL." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Kuupäev" #: info-gtk.c:824 msgid "Date and Time" msgstr "Kuupäev ja aeg" #: info-gtk.c:834 msgid "Date:" msgstr "Kuupäev:" #: main.c:74 msgid "Dec" msgstr "" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Kustuta sukeldumine" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Sügavus" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Sügavus limiit ületatud" #: gtk-gui.c:774 msgid "Depth:" msgstr "Sügavus:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Seadme ID" #: download-dialog.c:341 msgid "Device or mount point" msgstr "" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "" #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "" #: uemis.c:228 msgid "Dive Time Alert" msgstr "" #: uemis.c:226 msgid "Dive Time Info" msgstr "" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "" #: gps.c:214 msgid "Dive locations" msgstr "" #: info-gtk.c:575 msgid "Dive master" msgstr "Dive master" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "" #: print.c:502 msgid "Dive#" msgstr "" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "" #: info-gtk.c:1004 msgid "Divemaster" msgstr "" #: statistics-gtk.c:542 msgid "Dives" msgstr "" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Lae kompuutrist alla" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "" #: webservice.c:260 msgid "Download From Web Service" msgstr "" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "" #: webservice.c:31 msgid "Download Success!" msgstr "" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Kestus" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Kestus (min)" #: info.c:312 msgid "E" msgstr "" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "" #: planner-gtk.c:273 msgid "EAN32" msgstr "" #: planner-gtk.c:274 msgid "EAN36" msgstr "" #: info-gtk.c:99 msgid "Edit" msgstr "" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Muuda seadmete nime" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Muuda kompuutri hüüdnime" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Muuda Tripi Infot" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Muuda Tripi Kokkuvõtet" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Muuda sukeldumist" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Muuda kuupäeva/aega" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Muuda sukeldumisi" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Muuda tripi kokkuvõtet" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Lõpp" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "" #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Varustus" #: divelist-gtk.c:1370 msgid "Error" msgstr "" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "" #: main.c:73 msgid "Feb" msgstr "" #: gtk-gui.c:776 msgid "Feet" msgstr "Jalg" #: gtk-gui.c:1601 msgid "File" msgstr "" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "" #: main.c:64 msgid "Fri" msgstr "" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "" #: gtk-gui.c:997 msgid "GFlow" msgstr "" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "" #: gtk-gui.c:767 msgid "General Settings" msgstr "" #: gtk-gui.c:1606 msgid "Help" msgstr "" #: webservice.c:296 msgid "Idle" msgstr "" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "" #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "" #: main.c:74 msgid "Jul" msgstr "" #: main.c:73 msgid "Jun" msgstr "" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "" #: gtk-gui.c:1628 msgid "List" msgstr "" #: gtk-gui.c:785 msgid "Liter" msgstr "" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "" #: gtk-gui.c:1602 msgid "Log" msgstr "" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "" #: uemis.c:236 msgid "Low Battery Alert" msgstr "" #: uemis.c:234 msgid "Low Battery Warning" msgstr "" #: gtk-gui.c:862 msgid "Map provider" msgstr "" #: main.c:73 msgid "Mar" msgstr "" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "" #: gps.c:53 msgid "Mark location here" msgstr "" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "" #: uemis.c:230 msgid "Marker" msgstr "" #: print.c:502 msgid "Master" msgstr "" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "" #: equipment.c:1518 msgid "MaxPress" msgstr "" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "" #: main.c:73 msgid "May" msgstr "" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "" #: gtk-gui.c:775 msgid "Meter" msgstr "" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "" #: gtk-gui.c:1512 msgid "Model" msgstr "" #: main.c:64 msgid "Mon" msgstr "" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "" #: info.c:311 msgid "N" msgstr "" #: gtk-gui.c:1607 msgid "New" msgstr "" #: gtk-gui.c:1227 msgid "New starting number" msgstr "" #: gtk-gui.c:1634 msgid "Next DC" msgstr "" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "" #: uemis.c:232 msgid "No Tank Data" msgstr "" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "" #: print.c:1003 msgid "Notes on top" msgstr "" #: main.c:74 msgid "Nov" msgstr "" #: libdivecomputer.c:153 msgid "OLF" msgstr "" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "" #: main.c:74 msgid "Oct" msgstr "" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "" #: gtk-gui.c:291 msgid "Open File" msgstr "" #: gtk-gui.c:1608 msgid "Open..." msgstr "" #: print.c:995 msgid "Ordering" msgstr "" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "" #: print.c:173 #, c-format msgid "Oxygen" msgstr "" #: libdivecomputer.c:153 msgid "PO2" msgstr "" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "" #: gtk-gui.c:781 msgid "PSI" msgstr "" #: webservice.c:341 msgid "Password" msgstr "" #: info-gtk.c:565 msgid "Pick on map" msgstr "" #: gtk-gui.c:1605 msgid "Planner" msgstr "" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "" #: gtk-gui.c:752 msgid "Preferences" msgstr "" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "" #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "" #: gtk-gui.c:779 msgid "Pressure:" msgstr "" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "" #: print.c:989 msgid "Print in color" msgstr "" #: print.c:978 msgid "Print only selected dives" msgstr "" #: print.c:974 msgid "Print selection" msgstr "" #: print.c:939 print.c:946 msgid "Print type" msgstr "" #: gtk-gui.c:1612 msgid "Print..." msgstr "" #: gtk-gui.c:1629 msgid "Profile" msgstr "" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "" #: print.c:1000 msgid "Profile on top" msgstr "" #: gtk-gui.c:1625 msgid "Quit" msgstr "" #: uemis.c:218 msgid "RGT Alert" msgstr "" #: uemis.c:216 msgid "RGT Warning" msgstr "" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "" #: gtk-gui.c:2142 msgid "Remove" msgstr "" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "" #: gtk-gui.c:1218 msgid "Renumber" msgstr "" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "" #: download-dialog.c:153 msgid "Retry" msgstr "" #: info.c:311 msgid "S" msgstr "" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "" #: main.c:64 msgid "Sat" msgstr "" #: gtk-gui.c:1610 msgid "Save As..." msgstr "" #: gtk-gui.c:221 msgid "Save Changes?" msgstr "" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "" #: divelist-gtk.c:1710 msgid "Save as" msgstr "" #: gtk-gui.c:1609 msgid "Save..." msgstr "" #: planner-gtk.c:299 msgid "Segment Time" msgstr "" #: gtk-gui.c:1163 msgid "Select Events" msgstr "" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "" #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "" #: main.c:74 msgid "Sep" msgstr "" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "" #: gtk-gui.c:951 msgid "Show MOD" msgstr "" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "" #: planner.c:217 msgid "Simulated Dive" msgstr "" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "" #: uemis.c:200 msgid "Speed Alarm" msgstr "" #: uemis.c:203 msgid "Speed Warning" msgstr "" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "" #: uemis-downloader.c:782 msgid "Start download" msgstr "" #: statistics-gtk.c:532 msgid "Statistics" msgstr "" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "" #: gtk-gui.c:1865 msgid "Stats" msgstr "" #: webservice.c:295 msgid "Status" msgstr "" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "" #: print.c:960 msgid "Table print" msgstr "" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "" #: gtk-gui.c:805 msgid "Temp" msgstr "" #: statistics-gtk.c:92 msgid "Temperature" msgstr "" #: gtk-gui.c:789 msgid "Temperature:" msgstr "" #: gtk-gui.c:1631 msgid "Three" msgstr "" #: main.c:64 msgid "Thu" msgstr "" #: info-gtk.c:841 msgid "Time" msgstr "" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "" #: planner.c:294 msgid "Too many gas mixes" msgstr "" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "" #: statistics-gtk.c:551 msgid "Total Time" msgstr "" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "" msgstr[1] "" #: main.c:64 msgid "Tue" msgstr "" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "" #: gtk-gui.c:768 msgid "Units" msgstr "" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "" #: gtk-gui.c:1627 msgid "User Manual" msgstr "" #: gtk-gui.c:1603 msgid "View" msgstr "" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "" #: gtk-gui.c:784 msgid "Volume:" msgstr "" #: info.c:312 msgid "W" msgstr "" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "" #: webservice.c:163 msgid "Webservice" msgstr "" #: main.c:64 msgid "Wed" msgstr "" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "" #: gtk-gui.c:794 msgid "Weight:" msgstr "" #: gtk-gui.c:146 msgid "XML file" msgstr "" #: statistics-gtk.c:92 msgid "Year" msgstr "" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "" #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "" #: libdivecomputer.c:153 msgid "airtime" msgstr "" #: statistics.c:21 msgid "altitude" msgstr "" #: equipment.c:892 msgid "ankle" msgstr "" #: libdivecomputer.c:149 msgid "ascent" msgstr "" #: equipment.c:893 msgid "backplate weight" msgstr "" #: dive.c:48 msgid "bar" msgstr "" #: equipment.c:891 msgid "belt" msgstr "" #: statistics.c:20 msgid "boat" msgstr "" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "" #: statistics.c:21 msgid "cave" msgstr "" #: statistics.c:20 msgid "cavern" msgstr "" #: libdivecomputer.c:149 msgid "ceiling" msgstr "" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "" #: equipment.c:894 msgid "clip-on" msgstr "" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "" #: uemis-downloader.c:384 msgid "data" msgstr "" #: statistics.c:23 msgid "deco" msgstr "" #: libdivecomputer.c:149 msgid "deco stop" msgstr "" #: statistics.c:20 msgid "deep" msgstr "" #: libdivecomputer.c:152 msgid "deepstop" msgstr "" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "" #: libdivecomputer.c:152 msgid "divetime" msgstr "" #: statistics.c:20 msgid "drift" msgstr "" #: uemis-downloader.c:589 msgid "drysuit" msgstr "" #: planner.c:788 msgid "ean" msgstr "" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "" #: statistics.c:22 msgid "freshwater" msgstr "" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "" #: uemis-downloader.c:590 msgid "full suit" msgstr "" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "" #: libdivecomputer.c:153 msgid "heading" msgstr "" #: statistics.c:21 msgid "ice" msgstr "" #: equipment.c:890 msgid "integrated" msgstr "" #: statistics.c:20 msgid "invalid" msgstr "" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "" #: uemis-downloader.c:590 msgid "jacket" msgstr "" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "" #: dive.c:88 msgid "l" msgstr "" #: statistics.c:21 msgid "lake" msgstr "" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "" #: uemis-downloader.c:590 msgid "long john" msgstr "" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "" #: gtk-gui.c:956 msgid "max ppO2" msgstr "" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "" #: uemis-downloader.c:591 msgid "membrane" msgstr "" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "" #: statistics.c:22 msgid "night" msgstr "" #: libdivecomputer.c:154 msgid "non stop time" msgstr "" #: libdivecomputer.c:149 msgid "none" msgstr "" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "" #: dive.c:44 msgid "pascal" msgstr "" #: statistics.c:23 msgid "photo" msgstr "" #: statistics.c:21 msgid "pool" msgstr "" #: dive.c:52 msgid "psi" msgstr "" #: libdivecomputer.c:149 msgid "rbt" msgstr "" #: libdivecomputer.c:153 msgid "rgbm" msgstr "" #: statistics.c:22 msgid "river" msgstr "" #: libdivecomputer.c:150 msgid "safety stop" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "" #: uemis-downloader.c:589 msgid "semidry" msgstr "" #: statistics.c:20 msgid "shore" msgstr "" #: uemis-downloader.c:590 msgid "shorty" msgstr "" #: libdivecomputer.c:150 msgid "surface" msgstr "" #: statistics.c:22 msgid "teaching" msgstr "" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "" #: statistics.c:22 msgid "training" msgstr "" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "" #: libdivecomputer.c:150 msgid "transmitter" msgstr "" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "" #: equipment.c:540 msgid "unspecified" msgstr "" #: uemis-downloader.c:590 msgid "vest" msgstr "" #: statistics.c:23 msgid "video" msgstr "" #: libdivecomputer.c:150 msgid "violation" msgstr "" #: equipment.c:1545 msgid "weight" msgstr "" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "" #: libdivecomputer.c:149 msgid "workload" msgstr "" #: statistics.c:21 msgid "wreck" msgstr "" Subsurface-4.0.2/po/fi_FI.aliases000066400000000000000000000000031226345450700165550ustar00rootroot00000000000000fi Subsurface-4.0.2/po/fi_FI.po000066400000000000000000001315041226345450700155650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # Linus Torvalds , 2012 # mturkia , 2013 # mturkia , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:56+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/subsurface/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nEi tapahtumia\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Kuukausi" #: webservice.c:289 msgid " Download" msgstr "Lataa" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Valitse sukellustietokone ja laitenimi." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "alku" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "loppu" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f %s (%s)\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s %2$s. %4$d. %3$skuuta %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %3$d. %2$skuuta %4$d, %5$d:%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d. %2$skuuta %4$d %5$2d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %3$d. %2$skuuta %4$d, %5$d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%d pv %d t %d min" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%d t %d min" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS: %u %%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nLaskettu katto %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeko: %u min @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeko: tuntem. aika @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD: %d %s\nEND: %d %s\nEADD: %d %s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\ndekossa" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD: %d %s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL: %u min" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP: %d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nTurvapysähdys: %u min @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nTurvapysähdys: tuntemat. aika @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurfacen laskema sukellussuunnitelma\nperustuu arvoihin GFlow = %.0f ja GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT: %.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe: %.2f bar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s: %.2f bar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s: %.2f bar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s tapahtuma %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: divelogs.de:n vastaus" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) tai (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(valitse muokataksesi ajankohtaa)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(valitse muokataksesi ajankohtaa tai syvyyttä)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(ei sukelluksia)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(ei mitään)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cft³/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 ft³/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "Kaksi sukellusta sivulle" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "Kaksiosainen kokopuku" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "Kolmen metrin portaat laskennalliselle kattosyvyydelle" #: print.c:952 msgid "6 dives per page" msgstr "Kuusi sukellusta sivulle" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Syötä suunnitellun sukelluksen vaiheet alla olevaan listaan.\nKukin rivi kuvaa yhtä sukelluksen vaihetta, joka päättyy annettuun syvyyteen ja aikaan sekä käyttää annettua kaasua. Aika voidaan määritellä joko suhteellisena edellisen vaiheen päättymisestä (+3:30) tai absoluuttisena sukelluksen alusta (@3:30).\nJos vaiheen kaasua ei ole määritelty, vaiheessa käytetään edellisen vaiheen kaasua. Suunnitelman alussa oletetaan käytettäväksi ilmaa ellei kaasua ole määritelty lainkaan.\nVoit määritellä nousua varten kaasun, joka otetaan käyttöön automaattisesti tietyssä syvyydessä. Jätä tällöin vaiheen kesto tyhjäksi ja syötä syvyys ja kaasu normaalisti.\nSaraketta CC käytetään ainoastaan suljetun kierron sukelluslaitteiden kanssa. Jos käytät avoimen kierron laitteita, jätä sarake tyhjäksi.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Ilma" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Tietoja Subsurfacesta" #: gtk-gui.c:2116 msgid "Add" msgstr "Lisää" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Lisää sukellus..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Lisää kirjanmerkki" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Lisää sukellus" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Lisää kaasun vaihto" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Lisää kaasun vaihto ajalle %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Liitä yllä olevaan retkeen" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Lisää uusi jakso" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Ilmanpaine" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Ilman lämpötila" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Ilman lämpötila (%s)" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Suosi aina ladattua sukellusta" #: main.c:73 msgid "Apr" msgstr "huhti" #: main.c:74 msgid "Aug" msgstr "elo" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automaattinen ryhmittely" #: equipment.c:642 msgid "Available gases" msgstr "Mahdolliset kaasut" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Keskim." #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Keskim." #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Keskim." #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Keskim." #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Keskisyvyys" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Keskisyvyys (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Pintakulutus" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Keskilämpötila" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Keskipituus" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Vaihto avoimeen ilman kiertoon" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Sukelluspari" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CCR-asetuspiste" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Seosta %d/%d ei löydy" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Konversiotiedoston avaus epäonnistui (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Peruutettu, poistutaan..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Peruttu..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Kaasun muutosta ei voida lisätä" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Vastauksen jäsentäminen ei onnistu!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Valitse oletustiedosto" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Valitse tietoihin liitettävät XML-tiedostot" #: gtk-gui.c:1611 msgid "Close" msgstr "Sulje" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Supista kaikki retket" #: webservice.c:121 msgid "Connecting..." msgstr "Yhdistetään..." #: webservice.c:25 msgid "Connection Error: " msgstr "Yhteysvirhe:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Liitä uuteen retkeen" #: gtk-gui.c:786 msgid "CuFt" msgstr "kuutiojalka" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Säiliöt" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Säiliö" #: planner.c:192 msgid "Cylinder for planning" msgstr "Suunnitelman säiliö" #: equipment.c:1603 msgid "Cylinders" msgstr "Säiliöt" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "S:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "VAROITUS: BUHLMANNIN ALGORITMIN TOTEUTUS JA SIIHEN PERUSTUVA SUKELLUSTEN SUUNNITTELUOMINAISUUS OVAT UUSIA, JOTEN NIITÄ ON TESTATTU VAIN RAJALLISESTI. SUKELLUKSIA SUUNNITELTAESSA EI TULE LUOTTAA VAIN NÄIHIN TULOKSIIN." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Tietokantayhteys epäonnistui '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Tietokantakysely epäonnistui '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Tietokantakysely 'get_events' (nouda tapahtumat) epäonnistui.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Ajankohta" #: info-gtk.c:824 msgid "Date and Time" msgstr "Päivä ja aika" #: info-gtk.c:834 msgid "Date:" msgstr "Päivä:" #: main.c:74 msgid "Dec" msgstr "joulu" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Oletustiedosto" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Poista sukellustietokoneen tiedot" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Poista sukellus" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Poista sukellukset" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Syvyys" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Syvyysraja ylitetty" #: gtk-gui.c:774 msgid "Depth:" msgstr "Syvyys:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Laitenimi" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Laite- tai hakemistopolku" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Näytä epäkelvot sukellukset" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Sukellus #%1$d - %2$s %4$02d.%3$02d.%5$04d, %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Sukellus #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Sukellus %1$d: %3$d. %2$skuuta %4$04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Sukellustietokoneen lempinimi" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Tiedot" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Muistiinpanot" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Sukelluksen suunnittelu - TÄMÄ ON SIMULAATIO; ÄLÄ KÄYTÄ SUKELLUKSEEN" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Sukellustyypit" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Sukellusaika" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Hälytys: sukellusaika" #: uemis.c:226 msgid "Dive Time Info" msgstr "Tiedotus: sukellusaika" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Sukellustietokoneen valmistaja ja laite" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Virhe sukellusten jäsentämisessä" #: gps.c:214 msgid "Dive locations" msgstr "Sukelluskohde" #: info-gtk.c:575 msgid "Dive master" msgstr "Sukellusvanhin" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Aloitusaika" #: print.c:502 msgid "Dive#" msgstr "Sukellus" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Sukelluslistan kirjasin" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Sukellusvanhin" #: statistics-gtk.c:542 msgid "Dives" msgstr "Sukelluskerrat" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Sukelluskohteet" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Hae sukellustietokoneelta" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Hae sukellustietokoneelta..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Hae verkkopalvelusta" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Hae verkkopalvelusta..." #: webservice.c:31 msgid "Download Success!" msgstr "Lataus onnistui!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Kesto" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Kesto (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Muuta" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Muokkaa laitenimeä" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Muokkaa sukellustietokoneiden lempinimiä" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Muuta retken tietoja" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Muuta retken tietoja" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Muokkaa sukellustietokoneen lempinimeä kaksoisnäpäyttämällä muokattavaa kenttää" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Muuta sukelluksen tietoja" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Muuta sukelluksen ajankohtaa" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Muuta sukellusten tietoja" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Muuta valittujen sukellusten tietoja" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Muuta retken tietoja" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Näytä / piilota tapahtumamerkit" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Näytä / piilota sukellustyypit" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Loppu" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Kohdesyvyys" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Syötä käyttäjätunnus ja paina \"Lataa\"-painiketta. Kun tiedot on ladattu, voit painaa 'Hyväksy', jos haluat ottaa muutokset käyttöön." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Varusteet" #: divelist-gtk.c:1370 msgid "Error" msgstr "Virhe" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Virhe veden suolapitoisuuden määrityksessä" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Virhe ajan jäsentämisessä" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Virhe sukelluksen keston jäsentämisessä" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Virhe kaasuseoksen jäsentämisessä" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Virhe kaasuseosten määrän jäsentämisessä" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Virhe maksimisyvyyden jäsentämisessä" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Virhe näytteiden tulkinnassa" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Virhe perumiskäsittelijän rekisteröinnissä." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Virhe tiedon rekisteröinnissä" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Virhe tapahtumakäsittelijän rekisteröinnissä." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Tapahtuma: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Tapahtuma: odotetaan käyttäjän toimia" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Laajenna kaikki retket" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Vienti UDDF-tiedostoon" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Vie UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Vie sukellukset UDDF-tiedostoon" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "%i tiedoston avaaminen epäonnistui." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Tiedoston '%s' lukeminen epäonnistui." #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Tiedoston '%s' lukeminen epäonnistui.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Tiedoston '%s' avaaminen epäonnistui" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Tiedoston '%s' lukeminen epäonnistui.\n" #: main.c:73 msgid "Feb" msgstr "helmi" #: gtk-gui.c:776 msgid "Feet" msgstr "jalka" #: gtk-gui.c:1601 msgid "File" msgstr "Tiedosto" #: gtk-gui.c:1604 msgid "Filter" msgstr "Suodattimet" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Lataa kaikki sukellukset" #: main.c:64 msgid "Fri" msgstr "pe" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84- tai GPS-muodossa)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Kulutus" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Ilmankulutus" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Kaasu" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Kaasun kulutus:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Kaasuseos" #: gtk-gui.c:767 msgid "General Settings" msgstr "Yleisasetukset" #: gtk-gui.c:1606 msgid "Help" msgstr "Ohje" #: webservice.c:296 msgid "Idle" msgstr "Toimeton" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Liitä tiedostot..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Tiedot" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Muodosta yhteys" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Suunnittele" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Virheellinen syvyys - seuraavan syötteen tulkinta epäonnistui: %s" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Virheellinen syvyys - yli neljänsadan metrin syvyisiä sukelluksia ei tueta" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Virheellinen kaasu rivillä %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Virhellinen aloitusaika" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Tuntematon käyttäjä!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "tammi" #: main.c:74 msgid "Jul" msgstr "heinä" #: main.c:73 msgid "Jun" msgstr "kesä" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Viimeinen pysähdys 20 jalassa" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Viimeinen pysähdys kuudessa metrissä" #: print.c:985 msgid "Layout Options" msgstr "Sommittelun asetukset" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel et al., 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Sukelluslista" #: gtk-gui.c:785 msgid "Liter" msgstr "litra" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Kohde" #: gtk-gui.c:1602 msgid "Log" msgstr "Loki" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Pisin" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Pisin sukellus" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Hälytys: heikko paristo" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Varoitus: heikko paristo" #: gtk-gui.c:862 msgid "Map provider" msgstr "Karttapohja" #: main.c:73 msgid "Mar" msgstr "maalis" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Merkitse epäkelvoksi" #: gps.c:53 msgid "Mark location here" msgstr "Valitse sijainti" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Merkitse kelpaavaksi" #: uemis.c:230 msgid "Marker" msgstr "merkki" #: print.c:502 msgid "Master" msgstr "Sukellusvanhin" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Varoitus: etappipysähdysaika" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Suurin syvyys" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Suurin syvyys (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Suurin pintakulutus" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Ylin lämpötila" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Suurin syvyys: %.*f %s\nKesto: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Nimellispaine" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Suurin" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Suurin" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Korkein" #: main.c:73 msgid "May" msgstr "touko" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Yhdistä sukellukset" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Liitä retki yllä olevaan retkeen" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Liitä retki alla olevaan retkeen" #: gtk-gui.c:775 msgid "Meter" msgstr "metri" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Pienin syvyys" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Pienin pintakulutus" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Alin lämpötila" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Pienin" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Pienin" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Alin" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Sekalaiset asetukset" #: gtk-gui.c:1512 msgid "Model" msgstr "Malli" #: main.c:64 msgid "Mon" msgstr "ma" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Usean laitealustan sukelluspäiväkirjaohjelma C-kielellä" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Uusi" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Uusi aloitusnumero" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Seuraava tietokone" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Lempinimi" #: uemis.c:232 msgid "No Tank Data" msgstr "Ei tietoja säiliöistä" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Sukellukselle ei ole määritetty säiliötä" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Muistiinpanot" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Muistiinpanojen korkeus (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Muistiinpanot yllä" #: main.c:74 msgid "Nov" msgstr "marras" #: libdivecomputer.c:153 msgid "OLF" msgstr "Happikertymä" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "Happikertymä" #: main.c:74 msgid "Oct" msgstr "loka" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Outo pthread-virheen paluukoodi" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Poistetaanko valittu merkintä?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Näytä vain valituntyyppiset sukellukset:" #: gtk-gui.c:291 msgid "Open File" msgstr "Avaa tiedosto" #: gtk-gui.c:1608 msgid "Open..." msgstr "Avaa..." #: print.c:995 msgid "Ordering" msgstr "Järjestys" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Muiden tietojen korkeus (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Happi" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Hälytys: hapen osapaine" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Varoitus: hapen osapaine" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Varoitus: hapen osapaine (green)" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Salasana" #: info-gtk.c:565 msgid "Pick on map" msgstr "Valitse kartalta" #: gtk-gui.c:1605 msgid "Planner" msgstr "Suunnittelu" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Syötä käyttäjätunnus ja salasana divelogs.de -sivustolle. Valitut sukellukset lisätään tunnuksellesi" #: gtk-gui.c:752 msgid "Preferences" msgstr "Asetukset" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Asetukset..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Paine" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Paine:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Edellinen tietokone" #: print.c:989 msgid "Print in color" msgstr "Väritulostus" #: print.c:978 msgid "Print only selected dives" msgstr "Tulosta valitut sukellukset" #: print.c:974 msgid "Print selection" msgstr "Tulosteen valinta" #: print.c:939 print.c:946 msgid "Print type" msgstr "Tulosteen tyyppi" #: gtk-gui.c:1612 msgid "Print..." msgstr "Tulosta..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profiilikuvaaja" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profiiliasetukset" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Profiilin korkeus (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profiili yllä" #: gtk-gui.c:1625 msgid "Quit" msgstr "Lopeta" #: uemis.c:218 msgid "RGT Alert" msgstr "Hälytys: kaasumäärä" #: uemis.c:216 msgid "RGT Warning" msgstr "Varoitus: kaasumäärä" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Yleisarvio" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Luetaan sukellusta %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Poista" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Poista retki" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Erota sukellus pois retkestä" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Lisää tapahtuma tähän" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Erota valitut sukellukset pois retkestä" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Uudellennumeroi" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Uudellennumeroi..." #: download-dialog.c:153 msgid "Retry" msgstr "Yritä uudestaan" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "Pintakulutus" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "Pintakulutus deko-pysähdyksessä" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "Pintakulutus sukelluksen aikana" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Turvapysähdyksen laiminlyönti" #: main.c:64 msgid "Sat" msgstr "la" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Tallenna nimellä..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Tallenna muutokset?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Tallenna nimellä" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Tallenna nimellä..." #: gtk-gui.c:1609 msgid "Save..." msgstr "Tallenna..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Aika" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Valitse tapahtumat" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Valitse tapahtumat..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Valitse sukellustyypit..." #: main.c:74 msgid "Sep" msgstr "syys" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Tiedoston req.txt kirjoittaminen epäonnistui.\nOnko Uemis Zurich kytketty oikein?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Lyhin" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Lyhin sukellus" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Näytä sarakkeet" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Näytä EAD, END sekä EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Näytä MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Näytä laskettu kattosyvyys" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Näytä sukellustietokoneen raportoima kattosyvyys punaisella" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Näytä kartalla" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Näytä pHe-kuvaaja" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Näytä pN%s-kuvaaja" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Näytä pO%s-kuvaaja" #: planner.c:217 msgid "Simulated Dive" msgstr "Simuloitu sukellus" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Tilavuus" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Korkeuksien määritys(%% pohjasta)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Hälytys: nousunopeus" #: uemis.c:203 msgid "Speed Warning" msgstr "Varoitus: nousunopeus" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Alku" #: uemis-downloader.c:782 msgid "Start download" msgstr "Aloita lataus" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Tilastot" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Tilastot %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Tilastot" #: webservice.c:295 msgid "Status" msgstr "Tila" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Pysy %.*f %s:n syvyydessä %d:%02d min - aika %d:%02u kaasulla %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Outo prosenttiosuus: %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Puku" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "su" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Pinta-aika" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Ilmanpaine pinnalla (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Vaihda kaasu seuraavaan: %s\n" #: print.c:960 msgid "Table print" msgstr "Taulukkotuloste" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Sukellustyypit näytetään vain jos ne ovat identtiset kaikissa muokattavissa sukelluksissa" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Säiliönvaihtoehdotus" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Tiedotus: säiliöpaine" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tekniikka-asetukset" #: gtk-gui.c:805 msgid "Temp" msgstr "Lämpötila" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Lämpötila" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Lämpötila:" #: gtk-gui.c:1631 msgid "Three" msgstr "Kaikki" #: main.c:64 msgid "Thu" msgstr "to" #: info-gtk.c:841 msgid "Time" msgstr "Kello" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Avaa sukellustietojen muokkausikkuna\nkaksoisnäpäyttämällä sukellusta listalla" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Venytä sukellusprofiilikuvaajaa" #: planner.c:294 msgid "Too many gas mixes" msgstr "Liian monta kaasuseosta" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Liikaa välietappeja" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Yhteensä" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Kokonaisaika" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Kokonaismassa:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Siirtymä %.*f %s:n syvyyteen ajassa %d:%02d - aika %d:%02u kaasulla %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Retki %1$s, %3$d. %2$skuuta %4$04d (%5$d sukellus)" msgstr[1] "Retki %1$s, %3$d. %2$skuuta %4$04d (%5$d sukellusta)" #: main.c:64 msgid "Tue" msgstr "ti" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Tyyppi" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: tiedostojärjestelmä on lähes täynnä.\nLiitä sukellustietokone uudestaan\nja yritä uudestaan." #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Tiedostojärjestelmä on täynnä.\nLiitä sukellustietokone uudestaan\nja yritä uudestaan." #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemiksen lukeminen epäonnistui" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "libdivecomputer-kontekstin luominen epäonnistui" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Jäsentäjän luominen %s %s epäonnistui" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Avaaminen epäonnistui: %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Yksiköt" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Lähetä sukellukset divelogs.de -sivustolle" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Lähetä divelogs.de -sivustolle" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Lähetä divelogs.de -sivustolle..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Näpäytä oikealla painikkeella merkitäksesi kursorin osoittaman sukelluskohteen" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Käyttäjätunniste" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Käyttöohje" #: gtk-gui.c:1603 msgid "View" msgstr "Näytä" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Näkyvyys" #: gtk-gui.c:784 msgid "Volume:" msgstr "Tilavuus:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Varoitus - hyvin pitkien sukellusten suunnitelman laskeminen voi kestää kohtuuttoman kauan" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Varoitus: hyvin syvien sukellusten suunnittelu voi kestää kohtuuttoman kauan" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Veden lämpötila" #: webservice.c:163 msgid "Webservice" msgstr "Verkkopalvelu" #: main.c:64 msgid "Wed" msgstr "ke" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Painot" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Painot" #: gtk-gui.c:794 msgid "Weight:" msgstr "Massa:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML-tiedosto" #: statistics-gtk.c:92 msgid "Year" msgstr "Vuosi" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Vuositilastot" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Sinulla on jo tämän mallinen sukellustietokone\nnimellä %s\nVoit halutessasi antaa laitteelle lempinimen. Lempinimen antaminen helpottaa sukellustietokoneen sekä sen lokien tunnistamisessa. Oletuksena laitteen nimenä käytetään sen mallia ja tunnistetta.\nJos et halua antaa laitteelle lempinimeä, paina \"Peru\"-painiketta." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Sinulla on tallentamattomia muutoksia.\nHaluatko tallentaa muutokset ennen tietojen sulkemista?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Tiedosto %s on muuttunut.\nHaluatko tallentaa muutokset ennen tietojen sulkemista?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "ilma" #: libdivecomputer.c:153 msgid "airtime" msgstr "Ilma-aika" #: statistics.c:21 msgid "altitude" msgstr "korkeus" #: equipment.c:892 msgid "ankle" msgstr "nilkkapaino" #: libdivecomputer.c:149 msgid "ascent" msgstr "nousu" #: equipment.c:893 msgid "backplate weight" msgstr "selkäpaino" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "vyöpaino" #: statistics.c:20 msgid "boat" msgstr "vene" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "kirjanmerkki" #: statistics.c:21 msgid "cave" msgstr "luola" #: statistics.c:20 msgid "cavern" msgstr "luola (cavern)" #: libdivecomputer.c:149 msgid "ceiling" msgstr "katto" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "katto (turvapysähdys)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "ft³" #: uemis-downloader.c:384 msgid "data" msgstr "tieto" #: statistics.c:23 msgid "deco" msgstr "deko" #: libdivecomputer.c:149 msgid "deco stop" msgstr "deko-pysähdys" #: statistics.c:20 msgid "deep" msgstr "syvä" #: libdivecomputer.c:152 msgid "deepstop" msgstr "syväpysähdys" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "id: sukelluslokimerkintä" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "id: lisää sijaintitietoa" #: libdivecomputer.c:152 msgid "divetime" msgstr "sukellusaika" #: statistics.c:20 msgid "drift" msgstr "virta" #: uemis-downloader.c:589 msgid "drysuit" msgstr "kuivapuku" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "kaikille sukelluksille" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "Sukellus #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "sukellukselle numero " #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "valittu sukellus" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "valitut sukellukset" #: statistics.c:22 msgid "freshwater" msgstr "makea vesi" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "kokopuku" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "Kaasun vaihto" #: libdivecomputer.c:153 msgid "heading" msgstr "suunta" #: statistics.c:21 msgid "ice" msgstr "jää" #: equipment.c:890 msgid "integrated" msgstr "integroitu" #: statistics.c:20 msgid "invalid" msgstr "epäkelpo" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "tuntematon tapahtumanumero" #: uemis-downloader.c:590 msgid "jacket" msgstr "takki" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "järvi" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "pauna" #: uemis-downloader.c:590 msgid "long john" msgstr "haalari" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "maxCNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Suurin syvyys" #: uemis-downloader.c:591 msgid "membrane" msgstr "laminaatti" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "malli=%u (0x%08x), firmware=%u (0x%08x), sarjanumero=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "id: lisää sukellusdataa" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "yli %d päivää" #: statistics.c:22 msgid "night" msgstr "yö" #: libdivecomputer.c:154 msgid "non stop time" msgstr "keskeytyksetön aika" #: libdivecomputer.c:149 msgid "none" msgstr "ei mitään" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe-kynnys" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s-kynnys" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s-kynnys" #: dive.c:44 msgid "pascal" msgstr "Pa" #: statistics.c:23 msgid "photo" msgstr "valokuva" #: statistics.c:21 msgid "pool" msgstr "uima-allas" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "pohja-aika" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "joki" #: libdivecomputer.c:150 msgid "safety stop" msgstr "turvapysähdys" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "turvapysähdys (pakollinen)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "turvapysähdys (vapaaehtoinen)" #: uemis-downloader.c:589 msgid "semidry" msgstr "puolikuiva" #: statistics.c:20 msgid "shore" msgstr "ranta" #: uemis-downloader.c:590 msgid "shorty" msgstr "lyhyt" #: libdivecomputer.c:150 msgid "surface" msgstr "pinta" #: statistics.c:22 msgid "teaching" msgstr "opetus" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "kudoskertymän varoitus" #: statistics.c:22 msgid "training" msgstr "harjoittelu" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Tommi Saviranta\nMiika Turkia" #: libdivecomputer.c:150 msgid "transmitter" msgstr "lähetin" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "tuntematon" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "tuntematon" #: equipment.c:540 msgid "unspecified" msgstr "määrittelemätön" #: uemis-downloader.c:590 msgid "vest" msgstr "liivi" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "rike" #: equipment.c:1545 msgid "weight" msgstr "Massa" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "märkäpuku" #: libdivecomputer.c:149 msgid "workload" msgstr "työmäärä" #: statistics.c:21 msgid "wreck" msgstr "hylky" Subsurface-4.0.2/po/fr_FR.aliases000066400000000000000000000000031226345450700165770ustar00rootroot00000000000000fr Subsurface-4.0.2/po/fr_FR.po000066400000000000000000001345641226345450700156200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # jnoel , 2012-2013 # Bakurt , 2013 # Kévin Raymond , 2013 # pingou , 2012-2013 # Stéphane Raimbault , 2012 # vavincavent , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:56+0000\n" "Last-Translator: dirkhh \n" "Language-Team: French (France) (http://www.transifex.com/projects/p/subsurface/language/fr_FR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr_FR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nAucun événement\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Mois" #: webservice.c:289 msgid " Download" msgstr " Télécharger" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Veuillez choisir un ordinateur de plongée et son périphérique associé." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " début" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " fin" #: statistics-gtk.c:92 msgid "#" msgstr "N°" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s de %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s %4$d %3$s %5$d, %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d %2$s, %4$d, %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d %2$s %4$d, %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s %3$d %2$s %4$d, %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%d j %d h %d min" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%d h %d min" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nSNC : %u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nPlafond calculé %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDécompression : %umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDécompression : durée inconnue @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD : %d%s\nEND : %d%s\nEADD : %d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nEn décompression" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD : %d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL : %umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP : %d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nArrêt de sécurité : %umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nArrêt de sécurité : durée inconnue @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface sumilation de plongée\nbasé sur un GFlow = %.0f et un GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT : %.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe : %.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s : %.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s : %.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s événement à %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Réponse de divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) ou (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(cliquer pour modifier la date et l'heure de la plongée)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(cliquer pour modifier la date, l'heure et la profondeur de la plongée)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(pas de plongées)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(rien)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.016 m³/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.02 m³/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 plongées par page" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "Combi 2 pièces" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "Pas de 3 m pour calculer le plafond" #: print.c:952 msgid "6 dives per page" msgstr "6 plongées par page" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Ajouter des sections ci-dessous.\nChaque ligne décrit une partie de la plongée prévue.\nUne ligne comprend la profondeur, le temps et le gaz utilisé pendant la section qui se termine à la profondeur désignée, dure le temps prévu (si durée relative : « +3:30 ») ou finit au temps prévu (si la durée est absolue) et utilise la quantité de gaz indiquée.\nSi aucun gaz n'est précisé, cela correspondra à « utiliser le gaz précédant » (ou à AIR si aucun gaz n'a été spécifié).\nUn entrée avec une profondeur et un gaz mais sans durée est particulière ; elle informe le planificateur que le volume de gaz indiqué sera disponible pour la remonté une fois la profondeur indiquée atteinte.\nLes repères CF sont pour les plongées en CF (circuit-fermé, avec recycleur), laisser vide pour les plongées en CO (circuit ouvert).\n" #: planner-gtk.c:272 msgid "AIR" msgstr "AIR" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "À propos de Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Ajouter" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Ajouter une plongée..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Ajouter un signet ici" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Ajouter une plongée" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Ajouter un changement de mélange ici" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Ajouter un changement de mélange à %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Ajouter au groupe au-dessus" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Ajouter des points de cheminement" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Pression athmosphérique" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temp. atmosphérique" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temp. atmosphérique en %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Choisir les plongées téléchargées par défaut" #: main.c:73 msgid "Apr" msgstr "Avril" #: main.c:74 msgid "Aug" msgstr "Août" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Grouper automatiquement" #: equipment.c:642 msgid "Available gases" msgstr "Gaz disponibles" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Moyenne" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Moyenne" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Moyenne" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Moyenne" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Profondeur moy." #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Profondeur moyenne (%s) :" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Consommation d'air moy." #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Temp. moy." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Tps moy." #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Passer en CO" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Binôme" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "repère CF" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Impossible de trouver le gaz %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Impossible d'ouvrir la feuille de style (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Annulé, sortie en cours..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Annulé..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Impossible d'ajouter un changement de mélange" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Impossible de lire la réponse" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Choisissez le fichier XML par défaut" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Choisissez le fichier XML à importer dans les données actuelles" #: gtk-gui.c:1611 msgid "Close" msgstr "Fermer" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Tout replier" #: webservice.c:121 msgid "Connecting..." msgstr "Connexion en cours..." #: webservice.c:25 msgid "Connection Error: " msgstr "Erreur de connexion : " #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Créer un nouveau groupe au-dessus" #: gtk-gui.c:786 msgid "CuFt" msgstr "Pieds³" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Blk" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Bloc" #: planner.c:192 msgid "Cylinder for planning" msgstr "Bloc pour la simulation" #: equipment.c:1603 msgid "Cylinders" msgstr "Blocs" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "P : %.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "ATTENTION : CECI EST UNE NOUVELLE IMPLÉMENTATION DE L'ALGORITHME DE BUHLMANN ET LE SIMULATEUR DE PLONGÉE N'A ÉTÉ TESTÉ QUE SOMMAIREMENT. IL EST FORTEMENT CONSEILLÉ DE NE PAS PLONGER EN SE BASANT UNIQUEMENT SUR LES INDICATIONS FOURNIES ICI." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Connexion à la base de données impossible '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Échec de la requête '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Échec de la requête.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Date" #: info-gtk.c:824 msgid "Date and Time" msgstr "Date et heure" #: info-gtk.c:834 msgid "Date:" msgstr "Date :" #: main.c:74 msgid "Dec" msgstr "Déc." #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Fichier XML par défaut" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Supprimer un ordinateur de plongée" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Supprimer la plongée" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Supprimer les plongées" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Profondeur" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Profondeur plafond dépassée" #: gtk-gui.c:774 msgid "Depth:" msgstr "Profondeur :" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Nom du périphérique" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Périphérique ou point de montage" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Afficher les plongées erronées" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Plongée n°%1$d - %2$s %4$02d/%3$02d/%5$04d à %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Plongée n°%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Plongée n°%d - %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Surnom de l'ordinateur de plongée" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Détails de plongée" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notes de plongée" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Planificateur de plongée - CECI EST UNE SIMULATION ; NE PAS L'UTILISER POUR PLONGER" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Étiquettes de plongée" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Temps de plongée" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alerte temps de plongée" #: uemis.c:226 msgid "Dive Time Info" msgstr "Temps de plongée" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Marque et modèle de l'ordinateur de plongée" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Erreur à l'import des données de plongées" #: gps.c:214 msgid "Dive locations" msgstr "Lieux" #: info-gtk.c:575 msgid "Dive master" msgstr "Chef de palanquée" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Début de la plongée ?" #: print.c:502 msgid "Dive#" msgstr "Plongée n°" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Police pour la liste de plongée" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Chef de palanquée" #: statistics-gtk.c:542 msgid "Dives" msgstr "Plongées" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Lieux" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Télécharger depuis l'ordinateur de plongée" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Télécharger depuis l'ordinateur de plongée..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Télécharger depuis le serveur" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Télécharger depuis le serveur..." #: webservice.c:31 msgid "Download Success!" msgstr "Téléchargement réussi" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Durée" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Durée (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "Nitrox%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "Nitrox32" #: planner-gtk.c:274 msgid "EAN36" msgstr "Nitrox36" #: info-gtk.c:99 msgid "Edit" msgstr "Modifier" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Modifier le nom du périphérique" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Modifier le surnom de l'ordinateur de plongée" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Modifier les informations du groupe" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Modifier le résumé du groupe" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Modifier le surnom de l'ordinateur de plongée en faisant un double-clic sur le champ du surnom." #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Modifier la plongée" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Modifier la date et l'heure de la plongée" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Modifier les plongées" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Modifier plusieurs plongées" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Modifier le résumé du groupe" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Activer/désactiver des événements" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Activer / Désactiver les étiquettes" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Fin" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Profondeur finale" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Entrer l'identifiant de l'utilisateur et appuyer sur « Télécharger ». Une fois le téléchargement complet vous pouvez appuyer sur « Appliquer » si vous voulez appliquer les modifications." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Équipement" #: divelist-gtk.c:1370 msgid "Error" msgstr "Erreur" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Impossible d'obtenir la salinité de l'eau" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Impossible d'analyser l'heure" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Impossible d'analyser le temps de plongée" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Impossible d'analyser le mélange gazeux" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Impossible d'analyser le nombre de mélange gazeux" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Impossible d'analyser la profondeux maximale" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Impossible d'analyser des échantillons" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Impossible d'enregistrer le gestionnaire d'annulation." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Impossible d'enregistrer les données" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Impossible d'enregistrer le gestionnaire d'événement." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Événement : systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Événement : attente d'une action de l'utilisateur" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Tout déplier" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Exporter comme un fichier UDDF" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Exporter UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Export de plongée(s) vers UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Impossible d'ouvrir %i fichiers." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Impossible d'analyser « %s »" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Impossible d'analyser « %s ».\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Impossible de la lecture « %s »" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Impossible de lire « %s ».\n" #: main.c:73 msgid "Feb" msgstr "Fév." #: gtk-gui.c:776 msgid "Feet" msgstr "Pieds" #: gtk-gui.c:1601 msgid "File" msgstr "Fichier" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filtrer" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Forcer le téléchargement de toutes les plongées" #: main.c:64 msgid "Fri" msgstr "Ven." #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhaut" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhaut pour la simulation" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFbas" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFbas pour la simulation" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (format WGS84 ou GPS)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Air utilisé" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gaz utilisé" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gaz utilisé" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Consommation de gaz :\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Mélange gazeux" #: gtk-gui.c:767 msgid "General Settings" msgstr "Préférences générales" #: gtk-gui.c:1606 msgid "Help" msgstr "Aide" #: webservice.c:296 msgid "Idle" msgstr "Inactif" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importer Fichier(s)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informations" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Initialisation de la communication" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Saisir le plan" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Profondeur invalide \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Profondeur invalide - les profondeurs inférieures à 400m ne sont pas supportées" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Gaz invalide ligne %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Heure de début invalide" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Identifiant utilisateur incorrect." #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Janv." #: main.c:74 msgid "Jul" msgstr "Juil." #: main.c:73 msgid "Jun" msgstr "Juin" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Dernier arrêt à 20 pieds" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Dernier arrêt à 6 mètres" #: print.c:985 msgid "Layout Options" msgstr "Options de mise en page" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel et autres, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Liste" #: gtk-gui.c:785 msgid "Liter" msgstr "Litre" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Lieu" #: gtk-gui.c:1602 msgid "Log" msgstr "Journal" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Plus longue" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Plongée la plus longue" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarme de batterie faible" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Avertissement de batterie faible" #: gtk-gui.c:862 msgid "Map provider" msgstr "Logiciel de cartographie" #: main.c:73 msgid "Mar" msgstr "Mar." #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Trace invalide" #: gps.c:53 msgid "Mark location here" msgstr "Sélectionner l'emplacement" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Trace valide" #: uemis.c:230 msgid "Marker" msgstr "Marqueur" #: print.c:502 msgid "Master" msgstr "Chef" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Avertissement de temps de décompression max" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Profondeur max." #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Profondeur maximale (%s) :" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Consommation d'air max." #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Temp. max." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Profondeur max. : %.*f %s\nDurée : %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "SNC Max." #: equipment.c:1518 msgid "MaxPress" msgstr "PressionMax" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Maximum" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Maximum" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Maximum" #: main.c:73 msgid "May" msgstr "Mai" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Fusionner les plongées" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Fusionner le groupe avec le groupe au dessus" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Fusionner le groupe avec le groupe en dessous" #: gtk-gui.c:775 msgid "Meter" msgstr "Mètre" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Profondeur min." #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Consommation d'air min." #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Temp. min." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Minimum" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Options diverses" #: gtk-gui.c:1512 msgid "Model" msgstr "Modèle" #: main.c:64 msgid "Mon" msgstr "Lun." #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Journal de plongée multi systèmes, écrit en C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Nouveau" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nouveau numéro de départ" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Ordinateur suivant" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Surnom" #: uemis.c:232 msgid "No Tank Data" msgstr "Pas d'information sur le bloc" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Pas de bloc listé pour cette plongée." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notes" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Hauteur des notes (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notes en haut" #: main.c:74 msgid "Nov" msgstr "Nov." #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Oct." #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Étrange erreur pthread retournée" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Supprimer cette entrée ?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "N'afficher que les plongées avec ces étiquettes:" #: gtk-gui.c:291 msgid "Open File" msgstr "Ouvrir un Fichier" #: gtk-gui.c:1608 msgid "Open..." msgstr "Ouvrir..." #: print.c:995 msgid "Ordering" msgstr "Classer" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Hauteur des autres données (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Oxygène" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarme PO2 ascendant" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Avertissement PO2 ascendant" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Avertissement PO2 Vert" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Mot de passe" #: info-gtk.c:565 msgid "Pick on map" msgstr "Sélectionner sur une carte" #: gtk-gui.c:1605 msgid "Planner" msgstr "Simulateur" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Entrer vos id et mot de passe pour divelogs.de. Les plongées sélectionnées seront ajoutées à votre compte." #: gtk-gui.c:752 msgid "Preferences" msgstr "Préférences" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Préférences..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Pression" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Pression :" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Ordinateur précédent" #: print.c:989 msgid "Print in color" msgstr "Imprimer en couleur" #: print.c:978 msgid "Print only selected dives" msgstr "Imprimer uniquement les plongées selectionnées" #: print.c:974 msgid "Print selection" msgstr "Imprimer la sélection" #: print.c:939 print.c:946 msgid "Print type" msgstr "Type d'impression" #: gtk-gui.c:1612 msgid "Print..." msgstr "Imprimer..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Préférences personnelles" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Hauteur du profil (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil en haut" #: gtk-gui.c:1625 msgid "Quit" msgstr "Quitter" #: uemis.c:218 msgid "RGT Alert" msgstr "Alerte temps air restant" #: uemis.c:216 msgid "RGT Warning" msgstr "Avertissement temps d'air restant" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Évaluation" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Lecture %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Enlever" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Supprimer groupe" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Retirer la plongée du groupe" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Retirer un événement ici" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Retirer les plongées sélectionnées du groupe" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Renuméroter" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Renuméroter..." #: download-dialog.c:153 msgid "Retry" msgstr "Essayer à nouveau" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "Consommation d'air" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "Consommation d'air pendant la décompression" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "Consommation d'air pendant la plongée" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Violation du palier de sécurité" #: main.c:64 msgid "Sat" msgstr "Sam." #: gtk-gui.c:1610 msgid "Save As..." msgstr "Enregistrer sous..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Enregistrement des changements ?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Enregistrer le fichier sous" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Enregistrer sous" #: gtk-gui.c:1609 msgid "Save..." msgstr "Enregistrer..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Fragmenter le temps" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Sélection des événements" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Sélection des événements..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Sélectionner des étiquettes..." #: main.c:74 msgid "Sep" msgstr "Sept." #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Écriture partielle des progrès dans le fichier req.txt\nEst-ce que votre Uemis Zurich est branché correctement ?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Plus courte" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Plongée la plus courte" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Afficher les colonnes" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Afficher EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Afficher MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Afficher le plafond calculé" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Afficher en rouge le plafond signalé par l'ordinateur" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Afficher sur une carte" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Afficher le graph pHe" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Afficher le graph pN%s" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Afficher le graph pO%s" #: planner.c:217 msgid "Simulated Dive" msgstr "Plongée simulée" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Taille" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Hauteurs (%% de la page)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarme de vitesse" #: uemis.c:203 msgid "Speed Warning" msgstr "Avertissement de vitesse" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Début" #: uemis-downloader.c:782 msgid "Start download" msgstr "Début du téléchargement" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistiques" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistiques %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Stats" #: webservice.c:295 msgid "Status" msgstr "Statut" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Rester à %.*f %s pour %d:%02d min - temps %d:%02u sur %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Valeur de pourcentage étrange %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Combinaison" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Dim." #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Tps entre plongées" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Pression en surface (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Changer pour du gaz %s\n" #: print.c:960 msgid "Table print" msgstr "Impression du tableau" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Les étiquettes ne sont affichées que si elles sont identiques pour toutes les plongées éditées" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Changement de bloc suggéré" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Pression du bloc" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Préférences techniques" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp." #: statistics-gtk.c:92 msgid "Temperature" msgstr "Température" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Température :" #: gtk-gui.c:1631 msgid "Three" msgstr "Trois" #: main.c:64 msgid "Thu" msgstr "Jeu." #: info-gtk.c:841 msgid "Time" msgstr "Temps" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Pour modifier les informations d'une plongée\nfaites un double-clic sur la plongée dans la liste" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Changer de zoom" #: planner.c:294 msgid "Too many gas mixes" msgstr "Trop de gaz différents" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Trop de points de cheminement" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Total" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Temps total" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Poids total :" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Transition vers %.*f %s en %d:%02d min - temps %d:%02u sur %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Groupe %1$s %3$d %2$s %4$d (%5$d plongée)" msgstr[1] "Groupe %1$s %3$d %2$s %4$d (%5$d plongées)" #: main.c:64 msgid "Tue" msgstr "Mar." #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Type" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich : le disque dur est presque plein\nDébranchez puis rebranchez l'ordinateur\nafin d'essayer à nouveau" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich : Le disque dur est plein\nDébranchez puis rebranchez l'ordinateur\nafin d'essayer à nouveau" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Impossible d'initialiser Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Impossible de créer un contexte libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Impossible de créer une analyse pour %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Impossible d'ouvrir %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Unités" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Télécharger plongée(s) vers divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Télécharger vers divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Télécharger vers divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Faites un clic droit pour marquer la position de la plongée au curseur" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Identifiant utilisateur" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Manuel utilisateur" #: gtk-gui.c:1603 msgid "View" msgstr "Vue" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Visibilité" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volume :" #: info.c:312 msgid "W" msgstr "O" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Attention - les très longues plongées entraînent de long temps de calcul" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Attention - la simulation de plongées très profondes peut durer un certain temps" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Temp. de l'eau" #: webservice.c:163 msgid "Webservice" msgstr "Serveur" #: main.c:64 msgid "Wed" msgstr "Mer." #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Poids" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Système de poids" #: gtk-gui.c:794 msgid "Weight:" msgstr "Poids:" #: gtk-gui.c:146 msgid "XML file" msgstr "Fichier XML" #: statistics-gtk.c:92 msgid "Year" msgstr "Année" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Statistiques annuelles" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Vous avez déjà un ordinateur de ce modèle\nnommé %s\nSubsurface peut donner un surnom à ce modèle pour le distinguer du précédant.Le modèle et l'identifiant du périphérique sont montré ci-dessous.\nSi vous ne voulez pas donner un surnom à ce modèle, appuyez sur « Annuler » et Subsurface utilisera son modèle (ce qui peut signifier que vous ne pourrez distinguer les deux ordinateurs)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Vous avez des changements non enregistrés.\nSouhaitez-vous enregistrer ces changements avant de fermer ?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Vous avez des changements non enregistrés dans le fichier : %s \nSouhaitez-vous enregistrer ces changements avant de le fermer ?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "air" #: libdivecomputer.c:153 msgid "airtime" msgstr "temps d'air" #: statistics.c:21 msgid "altitude" msgstr "altitude" #: equipment.c:892 msgid "ankle" msgstr "cheville" #: libdivecomputer.c:149 msgid "ascent" msgstr "ascension" #: equipment.c:893 msgid "backplate weight" msgstr "poids dorsaux" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "ceinture" #: statistics.c:20 msgid "boat" msgstr "bateau" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "marque-page" #: statistics.c:21 msgid "cave" msgstr "grotte" #: statistics.c:20 msgid "cavern" msgstr "grotte" #: libdivecomputer.c:149 msgid "ceiling" msgstr "plafond" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "plafond (palier de sécurité)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "pied³" #: uemis-downloader.c:384 msgid "data" msgstr "données" #: statistics.c:23 msgid "deco" msgstr "décompression" #: libdivecomputer.c:149 msgid "deco stop" msgstr "Arrêt de décompression" #: statistics.c:20 msgid "deep" msgstr "profondeur" #: libdivecomputer.c:152 msgid "deepstop" msgstr "Arrêt profond" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "identifiant de l'entrée dans le journal" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "identifiant du site de plongée" #: libdivecomputer.c:152 msgid "divetime" msgstr "Temps de plongée" #: statistics.c:20 msgid "drift" msgstr "dérivante" #: uemis-downloader.c:589 msgid "drysuit" msgstr "Combinaison sèche" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "pour toutes les plongées" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "pour la plongée n°%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "pour les plongées n°" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "uniquement la plongée sélectionnée" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "uniquement les plongées sélectionnées" #: statistics.c:22 msgid "freshwater" msgstr "eau douce" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "pied" #: uemis-downloader.c:590 msgid "full suit" msgstr "Combinaison intégrale" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "Changement de gas" #: libdivecomputer.c:153 msgid "heading" msgstr "entête" #: statistics.c:21 msgid "ice" msgstr "glace" #: equipment.c:890 msgid "integrated" msgstr "intégré" #: statistics.c:20 msgid "invalid" msgstr "Invalide" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "numéro d'événement non valide" #: uemis-downloader.c:590 msgid "jacket" msgstr "gilet" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "Lac" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "livre US" #: uemis-downloader.c:590 msgid "long john" msgstr "salopette de combinaison" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "ppO2 max" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "SNCmax" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "profondeur max" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrane" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "modèle = %u (0x%08x), firmware = %u (0x%08x), port série = %u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "plus d'identifiants de plongée" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "plus de %d jours" #: statistics.c:22 msgid "night" msgstr "nuit" #: libdivecomputer.c:154 msgid "non stop time" msgstr "temps sans arrêt" #: libdivecomputer.c:149 msgid "none" msgstr "aucun" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "limite pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "limite pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "limite pO%s" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "photo" #: statistics.c:21 msgid "pool" msgstr "piscine" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "rivière" #: libdivecomputer.c:150 msgid "safety stop" msgstr "palier de sécurité" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "palier de sécurité (obligatoire)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "palier de sécurité (volontaire)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semi-étanche" #: statistics.c:20 msgid "shore" msgstr "rivage" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "surface" #: statistics.c:22 msgid "teaching" msgstr "technique" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Avertissement de niveau « tissue »" #: statistics.c:22 msgid "training" msgstr "entraînement" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Pierre-Yves Chibon\nJean-Noël Rouchon\nStéphane Raimbault\nKévin Raymond\nSylvestre Ledru" #: libdivecomputer.c:150 msgid "transmitter" msgstr "transmetteur" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "inconnu" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "inconnu" #: equipment.c:540 msgid "unspecified" msgstr "non spécifié" #: uemis-downloader.c:590 msgid "vest" msgstr "veste" #: statistics.c:23 msgid "video" msgstr "vidéo" #: libdivecomputer.c:150 msgid "violation" msgstr "violation" #: equipment.c:1545 msgid "weight" msgstr "poids" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "combinaison humide" #: libdivecomputer.c:149 msgid "workload" msgstr "charge" #: statistics.c:21 msgid "wreck" msgstr "épave" Subsurface-4.0.2/po/hr_HR.aliases000066400000000000000000000000031226345450700166030ustar00rootroot00000000000000hr Subsurface-4.0.2/po/hr_HR.po000066400000000000000000001276431226345450700156240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2012 # dirkhh , 2012-2013 # ivanhabunek , 2013 # ivanhabunek , 2012 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:53+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Croatian (Croatia) (http://www.transifex.com/projects/p/subsurface/language/hr_HR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hr_HR\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nNema događaja\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Mjesec" #: webservice.c:289 msgid " Download" msgstr " preuzimanje" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Odaberite ronilačko računalo i naziv uređaja." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " započni" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " završi" #: statistics-gtk.c:92 msgid "#" msgstr "Br." #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s %4$d. %3$s %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dst %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nIzračunati strop %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeko:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeko:nepoznato vrijeme @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nU deko" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nD:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nSigurnosni zastanak:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nSigurnosni zastoj:nepoz.vrijeme @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface plan urona\ntemeljen na GFlow = %.0f i GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s događaj pri (%d:%02u)" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Odgovor od divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) ili (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(klikni za izmjenu datuma/vremena)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(klikni za izmjenu datuma/vremena/dubine)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(nema urona)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(nema)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cu.ft./min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cu.ft./min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 urona po stranici" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "dvodjelno odijelo" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "Inkrementi od 3m za izračun deko zastoja" #: print.c:952 msgid "6 dives per page" msgstr "6 urona po stranici" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Ovdje dodaj segmente urona.\nSvaka linija opisuje segment planiranog urona.\nZapis s zadanom dubinom, vremenom i količinom plina opisuje segment koji završava na zadanoj dubini, u danom vremenu (ako je unesena apsolutna vrijednost) ili traje zadano vrijeme (ako je unesena relativna vrijednost, npr '+3:30') i iskorištava zadanu količinu plina.\nAko plin nije zadan, koristit će se prethodna vrijednost (ili vrijednost za Zrak ako za plin nije specificirana).\nZapis koji ima zadanu dubinu i plin, ali nema vrijeme je poseban; informira osobu koja planira da je zadana količina plina dostupna za izron u trenutku kad je dosegnuta zadana dubina.\nCC SetPoint specificira CC (rebreather) urone, ostaviti prazno za OC.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Zrak" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "O programu Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Dodaj" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Dodaj uron..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Dodaj oznaku ovdje" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Dodaj uron" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Dodaj promjenu plina" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Dodaj promjenu plina u %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Dodaj u gornju grupu" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Dodaj međutočku" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Pritisak zraka" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temp. zraka" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temp. zraka u %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Uvijek preferiraj preuzete urone" #: main.c:73 msgid "Apr" msgstr "Tra" #: main.c:74 msgid "Aug" msgstr "Kol" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automatsko grupiranje" #: equipment.c:642 msgid "Available gases" msgstr "Dostupni plinovi" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Ø" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Ø" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Ø" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Ø" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Prosj. dubina" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Prosj. dubina (%s)" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Prosj. SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Prosj. temp." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Prosj. trajanje" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Neplanirani prelazak na OC sustav" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Buddy" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Ne mogu naći plin %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Ne mogu otvoriti stylesheet (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Otkazano, izlazak" #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Otkazano" #: equipment.c:621 msgid "Cannot add gas change" msgstr "Ne mogu dodati promjenu plina" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Ne mogu obraditi odziv" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celzijusa" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Odaberi defaultnu XML datoteku" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Odaberi XML datoteke za uvoz u trenutačnu datoteku" #: gtk-gui.c:1611 msgid "Close" msgstr "Zatvori" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Zatvori sve grupe" #: webservice.c:121 msgid "Connecting..." msgstr "Spajanje..." #: webservice.c:25 msgid "Connection Error: " msgstr "Greška u komunikaciji: " #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Kreiraj novu grupu iznad" #: gtk-gui.c:786 msgid "CuFt" msgstr "CuFt" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Boca" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Boca" #: planner.c:192 msgid "Cylinder for planning" msgstr "Boca za planiranje" #: equipment.c:1603 msgid "Cylinders" msgstr "Boce" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "UPOZORENJE: OVO JE NOVA IMPLEMENTACIJA BUHLMANN ALGORITMA I PLANERA TEMELJENOG NA NJEMU KOJA JE SAMO DJELOMIČNO TESTIRANA. NIKAKO SE NE PREPORUČA PLANIRANJE URONA TEMELJEM SAMO OVIH INFORMACIJA." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Neuspjelo spajanje na bazu '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Neuspjeo upit na bazu '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Neuspjeo get_events na bazi.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Datum" #: info-gtk.c:824 msgid "Date and Time" msgstr "Datum i vrijeme" #: info-gtk.c:834 msgid "Date:" msgstr "Datum:" #: main.c:74 msgid "Dec" msgstr "Pro" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Defaultna XML datoteka" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Obriši zapis o računalu za ronjenje" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Obriši uron" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Obriši urone" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Dubina" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Premašeno ograničenje dubine" #: gtk-gui.c:774 msgid "Depth:" msgstr "Dubina:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Naziv uređaja" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Uređaj ili mount lokacija" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Prikaži neispravne urone" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Uron #%1$d - %2$s %4$02d.%3$02d.%5$04d u %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Uron #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Uron #%d - %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informacije o uronu" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Bilješke" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Plan urona - OVO JE SAMO SIMULACIJA; NE KORISTITI ZA RONJENJE" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Oznake urona" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Trajanje" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm: Trajanje urona" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: Trajanje urona" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Proizvođač i model računala za ronjenje" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Greška pri uvozu podataka" #: gps.c:214 msgid "Dive locations" msgstr "Bilješke" #: info-gtk.c:575 msgid "Dive master" msgstr "Voditelj" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Kada počinje uron?" #: print.c:502 msgid "Dive#" msgstr "Uron br." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Font za listu urona" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Voditelj" #: statistics-gtk.c:542 msgid "Dives" msgstr "Uroni" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Lokacije urona" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Preuzmi s ronilačkog računala" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Preuzmi s ronilačkog računala..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Preuzmi s web servisa" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Preuzmi s web servisa..." #: webservice.c:31 msgid "Download Success!" msgstr "Preuzimanje uspješno!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Trajanje" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Trajanje (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Uredi" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Naziv uređaja" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Promijeni nazive računala" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Uredi informacije o grupi" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Uredi sažetak grupe" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Uredite ime računala duplim klikom u odgovarajuće polje za naziv računala" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Uredi uron" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Uredi uron" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Uredi urone" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Uredi više urona" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Uredi sažetak urona" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Uključi/isključi događaje" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Uključi / isključi oznake" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Kraj" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Krajnja dubina" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Unesite korisničku oznaki i pritisnite 'Preuzimanje'. Kad se preuzimanje završi možete pritisnuti 'Primjeni' ako želite primjeniti promjene." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Oprema" #: divelist-gtk.c:1370 msgid "Error" msgstr "Greška" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Greška pri dohvaćanju saliniteta vode" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Greška pri parsiranju datuma i vremena" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Greška pri parsiranju vremena urona" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Greška pri parsiranju mješavine plinova" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Greška pri parsiranju broja mješavina" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Greška pri parsiranju maksimalne dubine" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Greška pri parsiranju uzoraka" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Greška pri registraciji cancellation handlera" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Greška pri registraciji podataka" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Greška pri registraciji event handlera." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Događaj: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Događaj: čekanje na korisničku akciju" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Otvori sve" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Izvezi kao UDDF datoteku" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "UDDF izvoz..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Izvezi uron(e) u UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Nije uspjelo otvaranje %i datoteka" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Nije uspjelo parsiranje '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Nije uspjelo parsiranje '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Nije uspjelo čitanje '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Nije uspjelo čitanje '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Velj" #: gtk-gui.c:776 msgid "Feet" msgstr "Stope" #: gtk-gui.c:1601 msgid "File" msgstr "Datoteka" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Prisilno preuzimanje svih urona" #: main.c:64 msgid "Fri" msgstr "Pet" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh za plan urona" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow za plan urona" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 ili GPS format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Potrošeno plina" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Potrošeno plina" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Potrošeno plina" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Potrošnja plina:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Mješavina" #: gtk-gui.c:767 msgid "General Settings" msgstr "Glavne postavke" #: gtk-gui.c:1606 msgid "Help" msgstr "Pomoć" #: webservice.c:296 msgid "Idle" msgstr "U mirovanju" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Uvezi datoteku..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informacije" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Uspostavljanje veze" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Unesi plan urona" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Neispravna dubina - greška u parsiranju \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Greška u dubini - vrijednosti veće od 400m nisu podržane" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Neispravan plin za redak %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Neispravno vrijeme početka" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Neispravna korisnička oznaka" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Sij" #: main.c:74 msgid "Jul" msgstr "Srp" #: main.c:73 msgid "Jun" msgstr "Lip" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "Postavke prikaza" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel i drugi, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Popis" #: gtk-gui.c:785 msgid "Liter" msgstr "Litra" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Lokacija" #: gtk-gui.c:1602 msgid "Log" msgstr "Dnevnik" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Maks." #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Najduži uron" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: Baterija pri izmaku" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Upozorenje: Baterija pri izmaku" #: gtk-gui.c:862 msgid "Map provider" msgstr "Davatelj karte" #: main.c:73 msgid "Mar" msgstr "Ožu" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Označi kao neispravno" #: gps.c:53 msgid "Mark location here" msgstr "Označi ovu lokaciju" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Označi kao ispravno" #: uemis.c:230 msgid "Marker" msgstr "Oznaka" #: print.c:502 msgid "Master" msgstr "Master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Upozorenje: Max. vrijeme dekompresije" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max dubina" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Max dubina (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Najveća dubina: %.*f %s\nTrajanje: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Max pritisak" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Max." #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Max." #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Max." #: main.c:73 msgid "May" msgstr "Svi" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Spoji urone" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Spoji s grupom iznad" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Spoji s grupom ispod" #: gtk-gui.c:775 msgid "Meter" msgstr "Metar" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min dubina" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min temp." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Min." #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Min." #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Min." #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Ostale postavke" #: gtk-gui.c:1512 msgid "Model" msgstr "Model" #: main.c:64 msgid "Mon" msgstr "Pon" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Višeplatformski program za vođenje ronilačkog dnevnika pisan u C-u" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Novi" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Novi početni broj" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Sljedeće računalo" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Naziv uređaja" #: uemis.c:232 msgid "No Tank Data" msgstr "Nema podatka o boci" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Niti jedna boca nije odabrana za ovaj uron." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Bilješke" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Bilješke visina (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Bilješke na vrhu" #: main.c:74 msgid "Nov" msgstr "Stu" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Lis" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Nepoznata greška" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Obrisati odabrani zapis?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Prikaži samo urone sa ovim oznakama:" #: gtk-gui.c:291 msgid "Open File" msgstr "Otvori datoteku" #: gtk-gui.c:1608 msgid "Open..." msgstr "Otvori..." #: print.c:995 msgid "Ordering" msgstr "Redosljed" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Visina drugih podataka (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Kisik" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: Prebrzi izron / PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Upozorenje: Prebrzi izron / PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Upozorenje: PO2 Zeleno" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Lozinka" #: info-gtk.c:565 msgid "Pick on map" msgstr "Odaberi na karti" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planer" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Unesite korisničku oznaku i lozinku za divelogs.de. Odabrani uroni bit će dodani u vaš korisnički račun." #: gtk-gui.c:752 msgid "Preferences" msgstr "Postavke" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Postavke..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Pritisak" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Pritisak:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Prethodno računalo" #: print.c:989 msgid "Print in color" msgstr "Ispis u boji" #: print.c:978 msgid "Print only selected dives" msgstr "Ispiši odabrane urone" #: print.c:974 msgid "Print selection" msgstr "Ispiši odabrano" #: print.c:939 print.c:946 msgid "Print type" msgstr "Vrsta ispisa" #: gtk-gui.c:1612 msgid "Print..." msgstr "Ispis..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Postavke profila" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Visina profila (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil na vrhu" #: gtk-gui.c:1625 msgid "Quit" msgstr "Izlaz" #: uemis.c:218 msgid "RGT Alert" msgstr "RGT Alarm" #: uemis.c:216 msgid "RGT Warning" msgstr "RTG Upozorenje" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Ocjena" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Čitanje %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Ukloni" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Obriši grupu" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Ukloni uron iz grupe" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Obriši događaj" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Ukloni odabrane urone iz grupe" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Renumeriraj" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Renumeriraj..." #: download-dialog.c:153 msgid "Retry" msgstr "Pokušaj ponovo" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC tijekom dekompresijske stanke" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC tijekom urona" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Kršenje sigurnosne stanke" #: main.c:64 msgid "Sat" msgstr "Sub" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Spremi kao..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Spremi promjene?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Spremi datoteku kao" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Spremi kao" #: gtk-gui.c:1609 msgid "Save..." msgstr "Spremi..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Trajanje segmenta" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Odaberi događaje" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Odaberi događaje..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Odaberi oznake..." #: main.c:74 msgid "Sep" msgstr "Ruj" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Greška pri pisanju u datoteku req.txt\nJe li Uemis Zurich ispravno priključen?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Min." #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Najkraći uron" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Prikaži stupce" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Prikaži EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Prikaži MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Prikaži izračunati limit" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Prikaži limit prijavljen od računala u crvenom" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Prikaži na karti" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Prikaži pHe graf" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Prikaži pN%s graf" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Prikaži pO%s graf" #: planner.c:217 msgid "Simulated Dive" msgstr "Simulirani uron" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Veličina" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Dimenzioniranje visine (%% od prikaza)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: Brzina" #: uemis.c:203 msgid "Speed Warning" msgstr "Upozorenje: Brzina" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Početak" #: uemis-downloader.c:782 msgid "Start download" msgstr "Započni preuzimanje" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistika" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistike %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistike" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Stanka na %.*f %s u trajanju %d:%02d min - Ukupno vrijeme %d:%02u na %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Neobično očitanje postotka %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Odijelo" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Ned" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Površinski interval" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Površinski pritisak (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Prebaci plin na %s\n" #: print.c:960 msgid "Table print" msgstr "Tablični ispis" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Oznake su prikazane samo ako su iste za sve urone koji se uređuju" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Preporučena izmjena boce" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Podaci od pritisku u boci" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tec postavke" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatura" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatura:" #: gtk-gui.c:1631 msgid "Three" msgstr "Tri" #: main.c:64 msgid "Thu" msgstr "Čet" #: info-gtk.c:841 msgid "Time" msgstr "Vrijeme" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Duplo klikni na uron u popisu kako\nbi uredio podatke o uronu" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Uključi/isključi povećanje" #: planner.c:294 msgid "Too many gas mixes" msgstr "Previše mješavina plinova" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Previše međutočaka" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Ukupno" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Ukupno trajanje" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Ukupna težina:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Prelazak na %.*f %s u %d:%02d min - ukupno vrijeme %d:%02u na %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Grupa %1$s, %3$d. %2$s %4$d (%5$d uron)" msgstr[1] "Grupa %1$s, %3$d. %2$s %4$d (%5$d urona)" msgstr[2] "Grupa %1$s, %3$d. %2$s %4$d (%5$d urona)" #: main.c:64 msgid "Tue" msgstr "Uto" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Vrsta" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Datotečni sustav je skoro pun\nodspojite pa ponovo spojite ronilačko računalo\ni kliknite 'Retry'" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Datotečni sustav je pun\nIskopčajte i ponovo ukopčajte ronilačko računalo\ni pokušajte ponovo." #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemis greška pri inicijalizaciji" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Ne mogu kreirati libdivecomputer kontekst" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Ne mogu kreirati parser za %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Nije uspjelo otvaranje %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Jedinice" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Upload urona na divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Upload na divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Upload na divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Desnim klikom označite lokaciju kod kurzora" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Korisnička oznaka" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Korisnički priručnik" #: gtk-gui.c:1603 msgid "View" msgstr "Pregled" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Vidljivost" #: gtk-gui.c:784 msgid "Volume:" msgstr "Zapremnina:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Upozorenje - jako dugi uroni mogu izrokovati dugo trajanje proračuna" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Upozorenje - planiranje jako dubokih urona može trajati veoma dugo" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Temperatura vode" #: webservice.c:163 msgid "Webservice" msgstr "Web servis" #: main.c:64 msgid "Wed" msgstr "Sri" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Težina" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Težina" #: gtk-gui.c:794 msgid "Weight:" msgstr "Težina:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML datoteka" #: statistics-gtk.c:92 msgid "Year" msgstr "Godina" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Godišnje statistike" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Već imate ronilačko računalo ovog modela nazvano %s\nSubsurface može dodijeliti kratki naziv ovom uređaju kako biste ga razlikovali od postojećeg uređaja. Defaultni naziv je model i ID uređaja kao što je prikazano ispod.\nAko ne želite imenovati ronilačko računalo pritisnite 'Otkaži' i Subsurface će prikazati model i naziv uređaja (što znači da nećete moći razlikovati ta dva uređaja u dnevnicima)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Imate promjena koje nisu spremljene\nŽelite li ih spremiti prije zatvaranja datoteke?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Imate promjena koje nisu spremljene u datoteci: %s \nŽelite li ih spremiti prije zatvaranja datoteke?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "zrak" #: libdivecomputer.c:153 msgid "airtime" msgstr "preostalo trajanje zraka" #: statistics.c:21 msgid "altitude" msgstr "nadmorska visina" #: equipment.c:892 msgid "ankle" msgstr "gležanj" #: libdivecomputer.c:149 msgid "ascent" msgstr "izron" #: equipment.c:893 msgid "backplate weight" msgstr "backplate olova" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "pojas" #: statistics.c:20 msgid "boat" msgstr "brod" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "bookmark" #: statistics.c:21 msgid "cave" msgstr "špilja" #: statistics.c:20 msgid "cavern" msgstr "pećina" #: libdivecomputer.c:149 msgid "ceiling" msgstr "strop" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "strop (sigurnosni zastoj)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "cuft" #: uemis-downloader.c:384 msgid "data" msgstr "podaci" #: statistics.c:23 msgid "deco" msgstr "" #: libdivecomputer.c:149 msgid "deco stop" msgstr "deko zastoj" #: statistics.c:20 msgid "deep" msgstr "dubok" #: libdivecomputer.c:152 msgid "deepstop" msgstr "dubinska stanka" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "ID unosa u dnevniku" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "divespot data id" #: libdivecomputer.c:152 msgid "divetime" msgstr "trajanje urona" #: statistics.c:20 msgid "drift" msgstr "drift" #: uemis-downloader.c:589 msgid "drysuit" msgstr "suho odijelo" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "za sve urone" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "za uron #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "za urone #" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "za odabrani uron" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "za odabrane urone" #: statistics.c:22 msgid "freshwater" msgstr "slatka voda" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "puno odijelo" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "promjena plina" #: libdivecomputer.c:153 msgid "heading" msgstr "kurs" #: statistics.c:21 msgid "ice" msgstr "led" #: equipment.c:890 msgid "integrated" msgstr "integrirani" #: statistics.c:20 msgid "invalid" msgstr "neispravan" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "neispravan broj događaja" #: uemis-downloader.c:590 msgid "jacket" msgstr "kompenzator plovnosti" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "jezero" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "lbs" #: uemis-downloader.c:590 msgid "long john" msgstr "long john" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "maxCNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Max dubina" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrana" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "više podataka za ID urona" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "više od %d dana" #: statistics.c:22 msgid "night" msgstr "noć" #: libdivecomputer.c:154 msgid "non stop time" msgstr "non stop vrijeme" #: libdivecomputer.c:149 msgid "none" msgstr "nijedan" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe prag" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s prag" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s prag" #: dive.c:44 msgid "pascal" msgstr "Pa" #: statistics.c:23 msgid "photo" msgstr "fotografija" #: statistics.c:21 msgid "pool" msgstr "bazen" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "rijeka" #: libdivecomputer.c:150 msgid "safety stop" msgstr "sigurnosna stanka" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "sigurnosna stanka (obavezna)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "sigurnosna stanka (opcionalna)" #: uemis-downloader.c:589 msgid "semidry" msgstr "polusuho" #: statistics.c:20 msgid "shore" msgstr "obala" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "površina" #: statistics.c:22 msgid "teaching" msgstr "poduka" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "upozorenje tkivo" #: statistics.c:22 msgid "training" msgstr "trening" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Ivan Habunek" #: libdivecomputer.c:150 msgid "transmitter" msgstr "odašiljač" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "nepoznat" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "nepoznato" #: equipment.c:540 msgid "unspecified" msgstr "nije specificirano" #: uemis-downloader.c:590 msgid "vest" msgstr "jakna" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "povreda" #: equipment.c:1545 msgid "weight" msgstr "težina" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "mokro odijelo" #: libdivecomputer.c:149 msgid "workload" msgstr "opterećenje" #: statistics.c:21 msgid "wreck" msgstr "olupina" Subsurface-4.0.2/po/it_IT.aliases000066400000000000000000000000031226345450700166110ustar00rootroot00000000000000it Subsurface-4.0.2/po/it_IT.po000066400000000000000000001252161226345450700156240ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # _fil_ , 2012-2013 # dSpecialist , 2013 # vinc , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:53+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Italian (Italy) (http://www.transifex.com/projects/p/subsurface/language/it_IT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it_IT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nNessun evento\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Mese" #: webservice.c:289 msgid " Download" msgstr "Download" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Selezionare il computer e la periferica" #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "inizio" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "fine" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s di %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s %4$d. %3$s %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s %3$d. %2$s %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dt %dst %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dst %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s⏎ CNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s⏎ Deco:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s⏎ Deco:tempo sconosciuto @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s⏎ In decompressione" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s⏎ MOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s⏎ NDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s⏎ Sosta di sicurezza:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s⏎ Sosta di sicurezza:tempo sconosciuto @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s⏎ T:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s⏎ pHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s⏎ pN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s⏎ pO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) oder (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(clicca per modificare la data/il tempo)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(clicca per modificare data/tempo/profondità)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(nessuna immersione)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(niente)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cuft/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cuft/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 immersioni per pagina" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "Muta intera 2 pezzi" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "incrementi di 3m per calcolare il ceiling" #: print.c:952 msgid "6 dives per page" msgstr "6 immersioni per pagina" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "" #: planner-gtk.c:272 msgid "AIR" msgstr "ARIA" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Informazioni su Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Aggiungi Immersione..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Aggiungi immersione" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Aggiungi al viaggio sopra" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Aggiungi un punto intermedio" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Pressione aria" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temperatura aria" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temperatura aria in %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Preferisci sempre l'immersione scaricata" #: main.c:73 msgid "Apr" msgstr "Apr" #: main.c:74 msgid "Aug" msgstr "Ago" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Raggruppa" #: equipment.c:642 msgid "Available gases" msgstr "" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Media" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Media" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Media" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Media" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Profondità media" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Profontità media (%s)" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "CAS Medio" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Temperatura Media" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Tempo Medio" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Bailing out in corcuito aperto" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Compagno" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Non trovo il gas %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Non posso aprire il foglio di calcolo (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Cancellato, uscita in modo corretto..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Cancellato..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Non posso analizzare la risposta!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Selezionare il file XML di default" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Selezionare i files XML da importare nel file dei dati" #: gtk-gui.c:1611 msgid "Close" msgstr "Chiudi" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Minimizza tutto" #: webservice.c:121 msgid "Connecting..." msgstr "In connessione..." #: webservice.c:25 msgid "Connection Error: " msgstr "Errore di connessione:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Crea un nuovo viaggio sopra" #: gtk-gui.c:786 msgid "CuFt" msgstr "Piedi cubi" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Bombola" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Bombola" #: planner.c:192 msgid "Cylinder for planning" msgstr "Bombola per la pianificazione" #: equipment.c:1603 msgid "Cylinders" msgstr "Bombole" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "DISCLAIMER / AVVISO: QUESTA È UNA NUOVA IMPLEMENTAZIONE DELL'ALGORITMO DI BUHLMANN E DELL'IMPLEMENTAZIONE DEL PIANO DI IMMERSIONE BASATO SU CIÒ CHE HA TICEVUTO SOLO UNA LIMITATA QUANTITA DI TEST. E' ALTAMENTE RACCOMANDATO DI NON PIANIFICARE IMMERSIONI BASATE SEMPLICEMENTE SUI RISULTATI DATI QUI." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Data" #: info-gtk.c:824 msgid "Date and Time" msgstr "Data e Tempo" #: info-gtk.c:834 msgid "Date:" msgstr "Data:" #: main.c:74 msgid "Dec" msgstr "Dic" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "File XML di default" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Cancella le informazini del computer date qui" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Cancella immersione" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Cancella immersioni" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Profondità" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Limite Profondità Superato" #: gtk-gui.c:774 msgid "Depth:" msgstr "Profondità:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Nome periferica" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Periferica o punto di mount" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Immersione #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Immersione #%d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Soprannome del computer" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informazioni sull'immersione" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Note dell'immersione" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Piano d'immersione - QUESTA E' SOLO UNA SIMULAZIONE; NON USARE PER IMMERGERSI " #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Tempo d'Immersione" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Allarme: Tempo d'Immersione" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: Tempo d'Immersione" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Marca e modello del computer subacqueo" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Errore importazione dati immersione" #: gps.c:214 msgid "Dive locations" msgstr "Luoghi immersione" #: info-gtk.c:575 msgid "Dive master" msgstr "Dive master" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "L'immersione quando comincia ?" #: print.c:502 msgid "Dive#" msgstr "Immersione n." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Carattere Immersione" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Immersioni" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Posizione dell'immersione" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Scarica dal Computer" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Scarica dal Computer..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Scarica da Web Service" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Scarica da Web Service..." #: webservice.c:31 msgid "Download Success!" msgstr "Donload effettuato!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Durata" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Durata (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Modifica" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Modifica il nome della periferica" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Modifica il soprannome del computer" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Modifica Informazioni Viaggio" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Modifica Riepilogo Viaggio" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Modifica il soprannome del computer con un doppio click nel campo del soprannome" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Modifica Immersione" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Modifica la data/il tempo di immersione" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Modifica Immersioni" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Modifica più immerisoni" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Modifica il riepilogo di viaggio" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Abilita / Disabilita Eventi" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Fine" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Profondità finale" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Inserire l'identificativo dell'utente e premere 'Download'. Una volta che il download è completato puoi premere 'Applica' se vuoi applicare le modifiche." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Attrezzatura" #: divelist-gtk.c:1370 msgid "Error" msgstr "" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Errore nell'ottenimento della salinità dell'acqua" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Errore analizzando la data/il tempo" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Errore analizzando il tempo di immersione" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Errore analizzando la miscela di gas" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Errore analizzando il conteggio della miscela di gas" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Errore analizzando la profondità massima" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Errore analizzando i campioni" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Errore registrando il gestore della cancellazione." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Errore registrando la data" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Errore registrando il gestore degli eventi." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Evento: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Evento: in attesa dell' azione dell'utente." #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Espandi tutto" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Impossibile aprire i file %i" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Impossibile analizzare '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Impossibile analizzare '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Impossibile leggere '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Impossibile leggere '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "Piedi" #: gtk-gui.c:1601 msgid "File" msgstr "File" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filtro" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Forza il download di tutte le immersioni" #: main.c:64 msgid "Fri" msgstr "Ven" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh del piano" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow del piano" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (in formato WGS84 o GPS)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gas Usato" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gas Usato" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gas Usato" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Consumo gas:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Miscela di gas" #: gtk-gui.c:767 msgid "General Settings" msgstr "Preferenze genrali" #: gtk-gui.c:1606 msgid "Help" msgstr "Aiuto" #: webservice.c:296 msgid "Idle" msgstr "Inattivo" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "" #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informazioni" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Inizializzo la comunicazione" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Piano in ingresso" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Profondità invalida - impossibile analizzare \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Profondità invalida - i valori più profondi di 400m non sono supportati " #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Gas non valido per la riga %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Tempo di partenza non valido" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Identificatore dell'utente non valido!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Gen" #: main.c:74 msgid "Jul" msgstr "Lug" #: main.c:73 msgid "Jun" msgstr "Giu" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel, e altri, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Lista" #: gtk-gui.c:785 msgid "Liter" msgstr "Litri" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Luogo" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Più lunga" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Immersione più lunga" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Allarme: Batteria scarica" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Avviso: Batteria Scarica" #: gtk-gui.c:862 msgid "Map provider" msgstr "Provider delle mappe" #: main.c:73 msgid "Mar" msgstr "Mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "" #: gps.c:53 msgid "Mark location here" msgstr "Marca la posizione qui" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "" #: uemis.c:230 msgid "Marker" msgstr "Marcatore" #: print.c:502 msgid "Master" msgstr "Master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Avviso: Massimo tempo di decompressione" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Profondità Massima" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Profondità massima (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "CAS Massimo" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Temperatura Massima" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Profontià massima: %.*f %s\nDurata: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "CNS massimo" #: equipment.c:1518 msgid "MaxPress" msgstr "Pressione Massima" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Massimo" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Massimo" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Massimo" #: main.c:73 msgid "May" msgstr "Mag" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Unisci immersioni" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Raggruppa il viaggio con il viaggio sopra" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Raggruppa il viaggio con il viaggio sotto" #: gtk-gui.c:775 msgid "Meter" msgstr "Metro" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Profondità Minima" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. CAS" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Temperatura Minima" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Minimo" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Minimo" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Minimo" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Opzioni" #: gtk-gui.c:1512 msgid "Model" msgstr "Modello" #: main.c:64 msgid "Mon" msgstr "Lun" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Programma Multi-piattaforma in C per il log delle immersioni" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Nuovo" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nuovo numero di inizio" #: gtk-gui.c:1634 msgid "Next DC" msgstr "DC successivo" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Nickname" #: uemis.c:232 msgid "No Tank Data" msgstr "Nessun dato sulla bombola" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Note" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "" #: print.c:1003 msgid "Notes on top" msgstr "" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Ott" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Errore di ditorno del pthread dispari" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Ok per cancellare le voci selezionate?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "" #: gtk-gui.c:291 msgid "Open File" msgstr "Apri File" #: gtk-gui.c:1608 msgid "Open..." msgstr "Apri..." #: print.c:995 msgid "Ordering" msgstr "" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Ossigeno" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Allarme Incremento PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Avviso Incremento PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Avviso PO2 Verde" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "" #: info-gtk.c:565 msgid "Pick on map" msgstr "Segliere sulla mappa" #: gtk-gui.c:1605 msgid "Planner" msgstr "Pianificatore" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "" #: gtk-gui.c:752 msgid "Preferences" msgstr "Preferenze" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Preferenze..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Pressione" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Pressione:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "DC precedente" #: print.c:989 msgid "Print in color" msgstr "" #: print.c:978 msgid "Print only selected dives" msgstr "Stampa solo le immersioni selezionate" #: print.c:974 msgid "Print selection" msgstr "Stampa selezione" #: print.c:939 print.c:946 msgid "Print type" msgstr "Stampa tipo" #: gtk-gui.c:1612 msgid "Print..." msgstr "Stampa..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profilo" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Impostazioni profilo" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "" #: print.c:1000 msgid "Profile on top" msgstr "" #: gtk-gui.c:1625 msgid "Quit" msgstr "Esci" #: uemis.c:218 msgid "RGT Alert" msgstr "Allarme RGT" #: uemis.c:216 msgid "RGT Warning" msgstr "Avviso RGT" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Valutazione" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Sto leggendo %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Rimuovi Viaggio" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Rimuovi immersione dal viaggio" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Rimuovi le immersioni selezionate dal viaggio" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Rinumera" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Rinumera..." #: download-dialog.c:153 msgid "Retry" msgstr "Riprova" #: info.c:311 msgid "S" msgstr "" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "CAS" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "CAS durante la sosta di deco" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "CAS durante l'immersione" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Violazione della tappa di sicurezza" #: main.c:64 msgid "Sat" msgstr "Sab" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Salva Come..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Salvare le modifiche?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Salvare il File come" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Salva come" #: gtk-gui.c:1609 msgid "Save..." msgstr "Salva..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Segmento di tempo" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Seleziona eventi" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Seleziona eventi..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "" #: main.c:74 msgid "Sep" msgstr "Set" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Scrittura breve sul file req.txt\nLo Uemis Zurich e' collegato correttamente?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Più corto" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Immersione più corta" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Visualizza Colonne" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Visualizza EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Visualizza MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Mostra il ceiling calcolato" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Mostra in rosso il DC segnalato dal ceiling" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Visualizza nella mappa" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Visualizza la pHe nel il grafo" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Visualizza la pN%s nel grafo" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Visualizza la pO%s nel grafo" #: planner.c:217 msgid "Simulated Dive" msgstr "Immersione simulata" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Dimensione" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "" #: uemis.c:200 msgid "Speed Alarm" msgstr "Allarme Risalita Veloce" #: uemis.c:203 msgid "Speed Warning" msgstr "Avviso Risalita Veloce" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Inizio" #: uemis-downloader.c:782 msgid "Start download" msgstr "Inizio download" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistiche" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistiche %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistiche" #: webservice.c:295 msgid "Status" msgstr "Stato" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Fermati a %.*f %s per %d:%02d min - tempo trascorso %d:%02u su %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Lettura di strane percentuali %s\n\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Muta" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Dom" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Intervallo di Superficie" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Pressione di superfice (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Cambiare gas a %s\n" #: print.c:960 msgid "Table print" msgstr "Stampa Tabella" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Suggerito Cambio Bombola" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Informazione Pressione della bombola" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Impostazioni tec" #: gtk-gui.c:805 msgid "Temp" msgstr "Temperatura" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatura" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatura:" #: gtk-gui.c:1631 msgid "Three" msgstr "Albero" #: main.c:64 msgid "Thu" msgstr "Gio" #: info-gtk.c:841 msgid "Time" msgstr "Tempo" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Per modificare le informazioni dell'immersione\ndoppio click nella lista immersioni" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zoom Alternativo" #: planner.c:294 msgid "Too many gas mixes" msgstr "Troppe miscele gas" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Troppi punti di riferimento" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Totale" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Tempo Totale" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Peso totale:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Viaggio %1$s, %3$d. %2$s %4$d (%5$d Immersione)" msgstr[1] "Viaggio %1$s, %3$d. %2$s %4$d (%5$d Immersioni)" #: main.c:64 msgid "Tue" msgstr "Mar" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Tipo" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Il File System è quasi pieno\nDisconnettere/riconnettere il computer subacqueo\ne cliccare \"Riprova\"" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: File System pieno\nDisconnettere/connettere il computer\ne riprovare" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Impossibile inizializzare l'Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Impossibile creare un parser per %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Impossibile aprire %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Unità" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Usare il pulsante destro per marcare un sito d'Immersione" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Identificatore utente" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Manuale Utente" #: gtk-gui.c:1603 msgid "View" msgstr "Visualizza" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Visibilità" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volume:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Avviso - immersioni estremamente lunghe possono causare un lungo tempo di elaborazione" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Avviso - pianificare immersioni molto profonde può impiegare un tempo eccessiso" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Temperatura dell'acqua" #: webservice.c:163 msgid "Webservice" msgstr "Webservice" #: main.c:64 msgid "Wed" msgstr "Mer" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Peso" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Sistema di Zavorra" #: gtk-gui.c:794 msgid "Weight:" msgstr "Peso:" #: gtk-gui.c:146 msgid "XML file" msgstr "File XML" #: statistics-gtk.c:92 msgid "Year" msgstr "Anno" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Statistiche Annuali" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Già possiedi un computer subacqueo di questo modello⏎ chiamato %s⏎ Subsurface può mantenere il soprannome di questa periferica per distinguerla da quella esistente. Il modello di default e l'ID della periferica sono mostrati sotto.⏎ Se non vuoi dare un nome a questo computer subacqueo clicca 'Cancella' e Subsurface mostrerà semplicemente il suo modello e il suo nome (il che può significare che non si può distinguere i due computer subacquei a parte che nei logs) " #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Non hai salvato le modifiche.\nVuoi salvare prima di chiudere il file dei dati?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Non hai salvato le modifiche al file %s.\nVuoi salvare prima di chiudere il file dei dati?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "aria" #: libdivecomputer.c:153 msgid "airtime" msgstr "tempo in aria" #: statistics.c:21 msgid "altitude" msgstr "" #: equipment.c:892 msgid "ankle" msgstr "caviglia" #: libdivecomputer.c:149 msgid "ascent" msgstr "risalita" #: equipment.c:893 msgid "backplate weight" msgstr "peso della piastra" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "cintura" #: statistics.c:20 msgid "boat" msgstr "" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "segnalibro" #: statistics.c:21 msgid "cave" msgstr "" #: statistics.c:20 msgid "cavern" msgstr "" #: libdivecomputer.c:149 msgid "ceiling" msgstr "ceiling" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "ceiling (sosta di sicurezza)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "piedi cubi" #: uemis-downloader.c:384 msgid "data" msgstr "data" #: statistics.c:23 msgid "deco" msgstr "" #: libdivecomputer.c:149 msgid "deco stop" msgstr "deco stop" #: statistics.c:20 msgid "deep" msgstr "" #: libdivecomputer.c:152 msgid "deepstop" msgstr "deepstop" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "id del log d'immersione" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "" #: libdivecomputer.c:152 msgid "divetime" msgstr "durata immersione" #: statistics.c:20 msgid "drift" msgstr "" #: uemis-downloader.c:589 msgid "drysuit" msgstr "Muta stagna" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "per tutte le immersioni" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "per l'immersione #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "per l'immersione #" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "per l'immersione selezionata" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "per le immersioni selezionate" #: statistics.c:22 msgid "freshwater" msgstr "" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "muta intera" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "cambio gas" #: libdivecomputer.c:153 msgid "heading" msgstr "intestazione" #: statistics.c:21 msgid "ice" msgstr "" #: equipment.c:890 msgid "integrated" msgstr "integrato" #: statistics.c:20 msgid "invalid" msgstr "" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "numero evento non valido" #: uemis-downloader.c:590 msgid "jacket" msgstr "GAV" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "lbs" #: uemis-downloader.c:590 msgid "long john" msgstr "long john" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "max CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "profondità massima" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrana" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "modello=%u (0x%08x), firmware=%u (0x%08x), numero di serie=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "più di %d giorni" #: statistics.c:22 msgid "night" msgstr "" #: libdivecomputer.c:154 msgid "non stop time" msgstr "tempo di non stop" #: libdivecomputer.c:149 msgid "none" msgstr "nessuno" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "limite pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "limite pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "limite pO%s" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "" #: statistics.c:21 msgid "pool" msgstr "" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "" #: libdivecomputer.c:150 msgid "safety stop" msgstr "sosta di sicurezza" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "sosta di sicurezza (obbligatoria)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "sosta di sicurezza (facoltativa)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semi stagna" #: statistics.c:20 msgid "shore" msgstr "" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "superficie" #: statistics.c:22 msgid "teaching" msgstr "" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "avviso del livello dei tessuti" #: statistics.c:22 msgid "training" msgstr "" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Filippo Moser" #: libdivecomputer.c:150 msgid "transmitter" msgstr "trasmettitore" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "sconosciuto" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "sconosciuto" #: equipment.c:540 msgid "unspecified" msgstr "non specificato" #: uemis-downloader.c:590 msgid "vest" msgstr "maglia" #: statistics.c:23 msgid "video" msgstr "" #: libdivecomputer.c:150 msgid "violation" msgstr "violazione" #: equipment.c:1545 msgid "weight" msgstr "peso" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "muta umida" #: libdivecomputer.c:149 msgid "workload" msgstr "carico di lavoro" #: statistics.c:21 msgid "wreck" msgstr "" Subsurface-4.0.2/po/nb_NO.aliases000066400000000000000000000000111226345450700165730ustar00rootroot00000000000000nb nn no Subsurface-4.0.2/po/nb_NO.po000066400000000000000000001255671226345450700156200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # henrik , 2013 # Henrik Brautaset Aronsen , 2012 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:56+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/subsurface/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nIngen hendelser\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Måned" #: webservice.c:289 msgid " Download" msgstr "Last ned" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Velg dykkecomputer og enhet" #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " start" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " slutt" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s av %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %4$d. %3$s %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s. %3$d. %2$s %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s. %3$d. %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s. %3$d. %2$s %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dt %dt %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dt %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nKalkulert tak %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeko:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeko:ukjent tid @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nI deko" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nSikkerhetsstopp:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nSikkerhetsstopp: ukjent tid @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface dykkeplan\nbasert på GFlow = %.0f og GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s kl %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Resultat fra divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) eller (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(klikk for å redigere dato/tid)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(klikk for å redigere dato/tid/dybde)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(ingen dykk)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(ingenting)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 ft³/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 ft³/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 dykk per side" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "todelt drakt" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3m intervaller for kalkulert tak" #: print.c:952 msgid "6 dives per page" msgstr "6 dykk per side" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Legg til segmenter.\nHver rad beskriver en del av det planlagte dykket.\nEn rad med dybde, tid og gass beskriver et segment som slutter på den gitte dybden, tar den gitte tiden (hvis relativ tid er brukt, som '+3:30') eller slutter på den gitte tiden (hvis absolutt tid er brukt, som '@5:00'), og bruker den angitte gassen.\nEt tomt gassfelt betyr 'bruk forrige gass' (eller luft hvis det ikke var noen tidligere gass). En rad som har dybde og gass, men ikke tid er spesiell: planleggeren vet da at gassen er tilgjengelig når den oppgitte dybden nåes.\nCC setpoint spesifiserer rebreather-dykk, ikke bruk ved åpent system (OC).\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Luft" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Om Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Legg til" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Nytt dykk..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Legg til bokmerke her" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Nytt dykk" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Legg til gassbytte her" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Legg til gassbytte ved %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Legg til i turen over" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Legg til rad" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Lufttrykk" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Lufttemp." #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Lufttemp i %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Foretrekk alltid nedlastet dykk" #: main.c:73 msgid "Apr" msgstr "apr" #: main.c:74 msgid "Aug" msgstr "aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Grupper automatisk" #: equipment.c:642 msgid "Available gases" msgstr "Tilgjengelige gasser" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Gjennomsnitt" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Gjennomsnitt" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Gjennomsnitt" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Gjennomsnitt" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Snittdybde" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Snittdybde (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Snitt-SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Snitt-temp." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Snitt-tid" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Bytter til OC" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Buddy" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC setpoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Finner ikke gassen %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Kan ikke åpne stilark (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Avbrutt, går ut..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Avbrutt..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Kunne ikke legge til gassbytte" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Kan ikke lese svar!" #: gtk-gui.c:790 msgid "Celsius" msgstr "celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Velg standard XML-fil" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Velg hvilke XML-filer du vil importere" #: gtk-gui.c:1611 msgid "Close" msgstr "Lukk" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Fold sammen turer" #: webservice.c:121 msgid "Connecting..." msgstr "Kobler til..." #: webservice.c:25 msgid "Connection Error: " msgstr "Feil med forbindelse" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Lag ny tur" #: gtk-gui.c:786 msgid "CuFt" msgstr "ft³" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Flaske" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Flaske" #: planner.c:192 msgid "Cylinder for planning" msgstr "Tank fra plan" #: equipment.c:1603 msgid "Cylinders" msgstr "Flasker" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "Advarsel! Dette er en ny implementasjon av Bühlmann-algoritmen, og en dykkeplanlegger som ikke har blitt testet noe særlig. Vi anbefaler på det sterkeste å ikke planlegge dykk utelukkende med data herfra." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Databaseforbindelse feiled '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Databasespørring feilen '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Databasespørring get_eventes feilet.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Dato" #: info-gtk.c:824 msgid "Date and Time" msgstr "Dato og tid" #: info-gtk.c:834 msgid "Date:" msgstr "Dato:" #: main.c:74 msgid "Dec" msgstr "des" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Standard XML-fil" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Slett informasjon om dykkecomputer" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Slett dykk" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Slett dykk" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Dybde" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Maksgrense for dybde overskredet" #: gtk-gui.c:774 msgid "Depth:" msgstr "Dybde:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Enhets-ID" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Enhet eller disk" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Vis ugyldige dykk" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Dykk #%1$d - %2$s %4$02d. %3$02d %5$04d %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Dykk #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Dykk #%d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Navn på dykkecomputer" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informasjon" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Dykk" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Dykkeplan - DETTE ER KUN EN SIMULERING, IKKE BRUK TIL DYKKING" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Emneord" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Starttid" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm: dykketid" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: dykketid" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Dykkecomputerleverandør og -modell" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Feil ved import av dykkedata" #: gps.c:214 msgid "Dive locations" msgstr "Dykkesteder" #: info-gtk.c:575 msgid "Dive master" msgstr "Dykkeleder" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Når starter dykket?" #: print.c:502 msgid "Dive#" msgstr "Dykk nr." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Skrifttype for liste" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Dykkeleder" #: statistics-gtk.c:542 msgid "Dives" msgstr "Dykk" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Dykkesteder" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Last ned fra dykkecomputer" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Last ned fra dykkecomputer..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Last ned fra nettjeneste" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Last ned fra nettsted…" #: webservice.c:31 msgid "Download Success!" msgstr "Ferdig å laste ned" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Varighet" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Varighet (min)" #: info.c:312 msgid "E" msgstr "Ø" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Rediger" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Rediger enhetsnavn" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Rediger navn for dykkecomputer" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Rediger turinformasjon" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Rediger tursammendrag" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Rediger navn for dykkecomputer ved å dobbeltklikke på det" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Rediger dykk" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Rediger dato og tid" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Rediger dykk" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Rediger flere dykk" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Rediger tursammendrag" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Skru på/av hendelser" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Vis / skjul emneord" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Slutt" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Sluttdybde" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Skriv inn brukeridentifikator og trykk 'Last ned'. Trykk 'Bruk' når nedlastinga er ferdig hvis du vil lagre endringene." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Utstyr" #: divelist-gtk.c:1370 msgid "Error" msgstr "Feil" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Feil ved lesing av salthetsgrad" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Feil ved lesing av dato" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Feil ved lesing av dykketid" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Feil ved lesing av gassmiks" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Feil ved lesing av gassmiksantall" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Feil ved lesing av maksdybde" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Feil ved lesing av detaljer" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Feil ved registrering av avbruddshåndterer." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Feil ved registrering av data" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Feil ved registrering av hendelseshåndterer." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Hendelse: systime%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Hendelse: Venter på bruker" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Fold ut turer" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Eksporter som UDDF" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Eksporter UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Eksporter dykk til UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Fikk ikke åpnet %i filer." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Kunne ikke lese '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Kunne ikke lese '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Kunne ikke åpne '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Kunne ikke åpne '%s'.\n" #: main.c:73 msgid "Feb" msgstr "feb" #: gtk-gui.c:776 msgid "Feet" msgstr "fot" #: gtk-gui.c:1601 msgid "File" msgstr "Fil" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Tvungen nedlasting av alle dykk" #: main.c:64 msgid "Fri" msgstr "fre" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh for plan" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow for plan" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84- eller GPS-format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gass brukt" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gassforbruk" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gass" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Gasskonsum:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gassmiks" #: gtk-gui.c:767 msgid "General Settings" msgstr "Generelle innstillinger" #: gtk-gui.c:1606 msgid "Help" msgstr "Hjelp" #: webservice.c:296 msgid "Idle" msgstr "Inaktiv" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importer fil(er)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Info" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Start kommunikasjon" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Legg inn plan" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ugyldig dybde - kunne ikke lese \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ugyldig dybde - dykk dypere enn 400m støttes ikke" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Ugyldig gass i rad %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Ugyldig starttid" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Ugyldig brukeridentifikator!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "jan" #: main.c:74 msgid "Jul" msgstr "jul" #: main.c:73 msgid "Jun" msgstr "jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Siste stopp ved 20 fot" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Siste stopp ved 6 meter" #: print.c:985 msgid "Layout Options" msgstr "Valg for utseende" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel med flere, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Liste" #: gtk-gui.c:785 msgid "Liter" msgstr "liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Sted" #: gtk-gui.c:1602 msgid "Log" msgstr "Logg" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Lengste" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Lengste dykk" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: dårlig batteri" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Advarsel: dårlig batteri" #: gtk-gui.c:862 msgid "Map provider" msgstr "Karttilbyder" #: main.c:73 msgid "Mar" msgstr "mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Merk som ugyldig" #: gps.c:53 msgid "Mark location here" msgstr "Sett posisjon her" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Marker som gyldig" #: uemis.c:230 msgid "Marker" msgstr "markering" #: print.c:502 msgid "Master" msgstr "master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Advarsel: maks dekotid" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Maks. dybde" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Maksdybde (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Maks. SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Maks. temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Maks. dybde: %.*f %s\nTid: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Maks CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Maks. trykk" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Maksimum" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Maksimum" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Maksimum" #: main.c:73 msgid "May" msgstr "mai" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Slå sammen dykk" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Slå samme tur med turen over" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Slå sammen tur med turen under" #: gtk-gui.c:775 msgid "Meter" msgstr "meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min. dybde" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min. temp" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Minimum" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Ymse valg" #: gtk-gui.c:1512 msgid "Model" msgstr "Modell" #: main.c:64 msgid "Mon" msgstr "man" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Dykkelogg i C for flere plattformer" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Ny" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nytt startnummer" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Neste DC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Navn" #: uemis.c:232 msgid "No Tank Data" msgstr "Ingen tankinformasjon" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Dette dykket har ingen flasker." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notater" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Notathøyde (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notater øverst" #: main.c:74 msgid "Nov" msgstr "nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Feil ved retur fra pthread" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Er det greit å slette valgte oppføring?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Bare vis dykk med disse emneordene:" #: gtk-gui.c:291 msgid "Open File" msgstr "Åpne fil" #: gtk-gui.c:1608 msgid "Open..." msgstr "Åpne..." #: print.c:995 msgid "Ordering" msgstr "Sortering" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Høyde på andre data (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Oksygen" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: oppstigning / PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Advarsel: oppstigning /PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Advarsel: grønn / PO2" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Passord" #: info-gtk.c:565 msgid "Pick on map" msgstr "Velg på kart" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planlegger" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Legg inn brukerid og passord for divelogs.de. De valgte dykkene blir lastet opp." #: gtk-gui.c:752 msgid "Preferences" msgstr "Valg" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Valg..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Trykk" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Trykk:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Forrige DC" #: print.c:989 msgid "Print in color" msgstr "Fargeutskrift" #: print.c:978 msgid "Print only selected dives" msgstr "Skriv ut valgte dykk" #: print.c:974 msgid "Print selection" msgstr "Skriv ut valg" #: print.c:939 print.c:946 msgid "Print type" msgstr "Utskriftstype" #: gtk-gui.c:1612 msgid "Print..." msgstr "Skriv ut..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profilinnstillinger" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Profilhøyde (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil øverst" #: gtk-gui.c:1625 msgid "Quit" msgstr "Avslutt" #: uemis.c:218 msgid "RGT Alert" msgstr "Alarm: gjenværende gasstid" #: uemis.c:216 msgid "RGT Warning" msgstr "Advarsel: gjenværende gasstid" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Vurdering" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Leser %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Fjern" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Fjern tur" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Fjern dykk fra tur" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Fjern hendelse her" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Fjern valgte dykk fra tur" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Oppdater nummerering" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Oppdater nummerering..." #: download-dialog.c:153 msgid "Retry" msgstr "Prøv igjen" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC under dekostopp" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC under dykk" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Brudd på sikkerhetsstopp" #: main.c:64 msgid "Sat" msgstr "lør" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Lagre som..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Lagre endringer?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Lagre fil som" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Lagre som" #: gtk-gui.c:1609 msgid "Save..." msgstr "Lagre..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Deltid" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Velg hendelser" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Velg hendelser…" #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Velg emneord..." #: main.c:74 msgid "Sep" msgstr "sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Fikk ikke skrevet ferdig req.txt\nEr Uemis Zurich plugget i ordentlig?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Korteste" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Korteste dykk" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Vis kolonner" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Vis EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Vis MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Vis kalkulert tak" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Tak fra computer i rødt" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Vis i kart" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Vis graf for pHe" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Vis graf for pN%s" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Vis graf for pO%s" #: planner.c:217 msgid "Simulated Dive" msgstr "Simulert dykk" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Størrelse" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Størrelse på høyder (i %% av layout)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: oppstigningshastighet" #: uemis.c:203 msgid "Speed Warning" msgstr "Advarsel: oppstigningshastighet" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Start nedlasting" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistikk" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistikk %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistikk" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Bli ved %.*f %s i %d:%02d min - kjøretid %d:%02u på %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Rar lesing av prosent %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Drakt" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "søn" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Overflateintervall" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Overflatetrykk (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Bytt gass til %s\n" #: print.c:960 msgid "Table print" msgstr "Tabellutskrift" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Emneord vises bare hvis de er identiske i alle redigerte dykk" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Tankbytte foreslått" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Info: tanktrykk" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tek-innstillinger" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatur" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatur:" #: gtk-gui.c:1631 msgid "Three" msgstr "Alle" #: main.c:64 msgid "Thu" msgstr "tor" #: info-gtk.c:841 msgid "Time" msgstr "Tid" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Dobbeltklikk oppføring i lista\nfor å redigere et dykk." #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zoom av/på" #: planner.c:294 msgid "Too many gas mixes" msgstr "For mange gassmikser" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "For mange rader" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Total" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Total tid" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Total vekt:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Overgang til %.*f %s i %d:%02d min - kjøretid %d:%02u på %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Tur %1$s. %3$d. %2$s %4$d (%5$d dykk)" msgstr[1] "Tur %1$s. %3$d. %2$s %4$d (%5$d dykk)" #: main.c:64 msgid "Tue" msgstr "tir" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Type" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Filsystem er nesten fullt\nKoble fra og til dykkecomputeren og\nklikk 'Prøv igjen'" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Fullt filsystem\nKoble fra og til dykkecomputeren\nog prøv igjen" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Klarer ikke å lese fra Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Kunne ikke opprette kontekst for libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Kunne ikke lage parser for %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Fikk ikke åpnet %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Enheter" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Last opp dykk til divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Last opp til divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Last opp til divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Høyreklikk for å velge dykkested" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Brukeridentifikator" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Brukermanual" #: gtk-gui.c:1603 msgid "View" msgstr "Vis" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Sikt" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volum:" #: info.c:312 msgid "W" msgstr "V" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Advarsel - ekstremt lange dykk tar lang tid å prosessere" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Advarsel - svært dype dykk tar lang tid å prosessere" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Vanntemperatur" #: webservice.c:163 msgid "Webservice" msgstr "Nettjeneste" #: main.c:64 msgid "Wed" msgstr "ons" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Vekt" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Vektsystem" #: gtk-gui.c:794 msgid "Weight:" msgstr "Vekt:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML-fil" #: statistics-gtk.c:92 msgid "Year" msgstr "År" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Årsstatistikk" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Du har allerede en dykkecomputer med denne\nmodellen ved navn %s\nSubsurface kan vedlikeholde et navn for denne computeren for å skille den fra en annen. Standarden er modell og enhets-ID som vist under.\nHvis du ikke har lyst til å gi et navn til denne computeren, trykk 'Avbryt' og Subsurface vil vise modellen som navn. Dette kan bety at du ikke ser forskjell på to like computere i loggen." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Du har endringer som ikke er lagret.\nVil du lagre disse før du lukker datafila?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Du har endringer som ikke er lagret i %s.\nVil du lagre disse før du lukker fila?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "luft" #: libdivecomputer.c:153 msgid "airtime" msgstr "lufttid" #: statistics.c:21 msgid "altitude" msgstr "høydedykk" #: equipment.c:892 msgid "ankle" msgstr "ankelvekt" #: libdivecomputer.c:149 msgid "ascent" msgstr "oppstigning" #: equipment.c:893 msgid "backplate weight" msgstr "p-vekt" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "vektbelte" #: statistics.c:20 msgid "boat" msgstr "båt" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "bokmerke" #: statistics.c:21 msgid "cave" msgstr "grotte" #: statistics.c:20 msgid "cavern" msgstr "hule" #: libdivecomputer.c:149 msgid "ceiling" msgstr "tak" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "tak (sikkerhetsstopp)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "ft³" #: uemis-downloader.c:384 msgid "data" msgstr "data" #: statistics.c:23 msgid "deco" msgstr "deko" #: libdivecomputer.c:149 msgid "deco stop" msgstr "dekostopp" #: statistics.c:20 msgid "deep" msgstr "dypdykk" #: libdivecomputer.c:152 msgid "deepstop" msgstr "dypstopp" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "id for oppføring i logg" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "id for dykkesteddata" #: libdivecomputer.c:152 msgid "divetime" msgstr "dykketid" #: statistics.c:20 msgid "drift" msgstr "strømdykk" #: uemis-downloader.c:589 msgid "drysuit" msgstr "tørrdrakt" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "for alle dykk" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "for dykk #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "for dykk #" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "for valgte dykk" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "for valgte dykk" #: statistics.c:22 msgid "freshwater" msgstr "ferskvann" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "hel drakt" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "gassbytte" #: libdivecomputer.c:153 msgid "heading" msgstr "retning" #: statistics.c:21 msgid "ice" msgstr "isdykk" #: equipment.c:890 msgid "integrated" msgstr "integrert bly" #: statistics.c:20 msgid "invalid" msgstr "ugyldig" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "ugyldig hendelsesnummer" #: uemis-downloader.c:590 msgid "jacket" msgstr "overdel" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "innsjø" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "pund" #: uemis-downloader.c:590 msgid "long john" msgstr "ermeløs våtdrakt" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "maks ppO₂" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "maks CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "maksdybde" #: uemis-downloader.c:591 msgid "membrane" msgstr "skalldrakt" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "Min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "modell=%u (0x%08x), firmware=%u (0x%08x), serienr=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "mer data dykke-id" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "mer enn %d dager" #: statistics.c:22 msgid "night" msgstr "nattdykk" #: libdivecomputer.c:154 msgid "non stop time" msgstr "tid uten stopp" #: libdivecomputer.c:149 msgid "none" msgstr "ingen" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "grense for pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "grense for pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "grense for pO%s" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "foto" #: statistics.c:21 msgid "pool" msgstr "basseng" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "elv" #: libdivecomputer.c:150 msgid "safety stop" msgstr "sikkerhetsstopp" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "sikkerhetsstopp (obligatorisk)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "sikkerhetsstopp (frivillig)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semidry" #: statistics.c:20 msgid "shore" msgstr "landdykk" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "overflate" #: statistics.c:22 msgid "teaching" msgstr "undervisning" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Advarsel: nivå i vev" #: statistics.c:22 msgid "training" msgstr "trening" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Henrik Brautaset Aronsen" #: libdivecomputer.c:150 msgid "transmitter" msgstr "sender" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "ukjent" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "ukjent" #: equipment.c:540 msgid "unspecified" msgstr "ikke spesifisert" #: uemis-downloader.c:590 msgid "vest" msgstr "vest" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "brudd" #: equipment.c:1545 msgid "weight" msgstr "Vekt" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "våtdrakt" #: libdivecomputer.c:149 msgid "workload" msgstr "arbeidsbelastning" #: statistics.c:21 msgid "wreck" msgstr "vrakdykk" Subsurface-4.0.2/po/nl_NL.aliases000066400000000000000000000000031226345450700166030ustar00rootroot00000000000000nl Subsurface-4.0.2/po/nl_NL.po000066400000000000000000001305611226345450700156150ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2012-2013 # Jacco van Koll , 2012 # rnt , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 22:11+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Dutch (Netherlands) (http://www.transifex.com/projects/p/subsurface/language/nl_NL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl_NL\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nGeen gebeurtenissen\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Maand" #: webservice.c:289 msgid " Download" msgstr "Download" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Selecteer duikcomputer en aansluiting. " #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " begin" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " eind" #: statistics-gtk.c:92 msgid "#" msgstr "Nr." #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s %4$d %3$s %5$d %6$02d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s %3$d %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s %3$d %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s %3$d %2$s %4$d %5$02d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %du %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%du %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nBerekend plafond %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeco:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeco:onbek.tijd @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nIn deco" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nVeiligheidsstop:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nVeiligheidsstop:onbek.tijd @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface duikplan\nGebaseerd op GFlow = %.0f en GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s gebeurtenis om %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Antwoord van divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) of (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(klik om datum/tijd te bewerken)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(klik om datum/tijd/diepte te bewerken)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(geen duiken)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(niets)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cuft/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cuft/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17L/min" #: print.c:956 msgid "2 dives per page" msgstr "2 duiken per bladzijde" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "2-delig pak" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20L/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "stappen van 3m voor berekend plafond" #: print.c:952 msgid "6 dives per page" msgstr "6 duiken per bladzijde" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Voeg etappes hieronder toe.\nElke invoerregel beschrijft een deel van de geplande duik.\nEen invoerregel met diepte, tijd en gas beschrijft een etappe die eindigt op de gegeven diepte, de gegeven tijd duurt (indien relatief, bijv. '+3:30') of eindigt op de gegeven tijd (indien absoluut) en gebruik maakt van het opgegeven gasmengsel.\nEen leeggelaten gasmengsel betekent 'gebruik vorig gasmengsel' (of AIR als geen gasmengsel opgegeven is).\nEen invoer die een diepte en een gas heeft, maar geen tijd, is speciaal: het vertelt de planner dat het opgegeven gasmengsel beschikbaar is voor de opstijging wanneer de opgegeven diepte is bereikt.\nCC Instelpunt specificeert CC (rebreather) duiken, dit veld wordt niet ingevuld voor OC.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "AIR" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Over Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Toevoegen" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Duik toevoegen..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Voeg bladwijzer hier toe" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Duik Toevoegen" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Voeg gaswissel hier toe" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Voeg gaswissel toe op %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Trip hierboven toevoegen" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Voeg routepunt toe." #: statistics-gtk.c:608 msgid "Air Press" msgstr "Luchtdruk" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Luchttemp." #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Luchttemp. in %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Prefereer altijd de gedownloadde duik" #: main.c:73 msgid "Apr" msgstr "apr" #: main.c:74 msgid "Aug" msgstr "aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automatisch groeperen" #: equipment.c:642 msgid "Available gases" msgstr "Beschikbare gasmengsels" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Gemiddelde" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Gemiddelde" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Gemiddelde" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Gemiddelde" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Gem. diepte" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Gem. Diepte (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Gem. gasverbruik" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Gem. temp." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Gem. tijd" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Schakel om naar OC" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Buddy" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC Instelpunt" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Kan gasmengsel %d/%d niet vinden" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Kan stylesheet (%s)/%s niet openen" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Geännuleerd, zonder problemen afgesloten..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Geännuleerd..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Gaswissel kan niet toegevoegd worden" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Kan antwoord niet parsen!" #: gtk-gui.c:790 msgid "Celsius" msgstr "celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Kies standaard XML bestand" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Kies de XML bestanden om te importeren in huidig data bestand" #: gtk-gui.c:1611 msgid "Close" msgstr "Sluiten" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Alles inklappen" #: webservice.c:121 msgid "Connecting..." msgstr "Verbinding wordt opgezet." #: webservice.c:25 msgid "Connection Error: " msgstr "Verbindingsfout:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Nieuwe trip hierboven invoegen" #: gtk-gui.c:786 msgid "CuFt" msgstr "cuft" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Fles" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Fles" #: planner.c:192 msgid "Cylinder for planning" msgstr "Fles voor planning" #: equipment.c:1603 msgid "Cylinders" msgstr "Flessen" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "NIET-AANSPRAKELIJKHEIDSVERKLARING / WAARSCHUWING: DIT IS EEN NIEUWE IMPLEMENTATIE VAN HET BUHLMANN ALGORITME EN EEN IMPLEMENTATIE VAN EEN DUIKPLANNER DIE HIEROP GEBASEERD IS. BEIDE IMPLEMENTATIES HEBBEN MAAR EEN BEPERKTE MATE VAN TESTEN ONDERGAAN. WIJ RADEN MET KLEM AF DUIKEN UIT TE VOEREN DIE GEBASEERD ZIJN OP DE RESULTATEN DIE HIER GETOOND WORDEN." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Databaseconnectie is mislukt '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Database-query mislukt: '%s'\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Database-query get_events mislukt.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Datum" #: info-gtk.c:824 msgid "Date and Time" msgstr "Datum en tijd" #: info-gtk.c:834 msgid "Date:" msgstr "Datum:" #: main.c:74 msgid "Dec" msgstr "dec" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Standaard XML bestand" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Verwijder duikcomputerinformatie" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Duik verwijderen" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Duiken verwijderen" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Diepte" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Dieptelimiet overschreden" #: gtk-gui.c:774 msgid "Depth:" msgstr "Diepte:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Apparaat-ID" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Device of mountpoint" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Geef ongeldige duiken weer" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Duik nr. %1$d - %2$s %4$02d-%3$02d-%5$04d om %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Duik nr. %d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Duik nr. %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Duikcomputer naam" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Duikinformatie" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Duiknotities" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Duikplan - DIT IS ENKEL EEN SIMULATIE; NIET GEBRUIKEN VOOR EEN WERKELIJKE DUIK" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Duik trefwoorden" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Duiktijd" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm: Duiktijd" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: Duiktijd" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Duikcomputer merk en model" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Fout bij importeren van duikdata" #: gps.c:214 msgid "Dive locations" msgstr "Duiklocaties" #: info-gtk.c:575 msgid "Dive master" msgstr "Duikleider" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Wanneer begint de duik?" #: print.c:502 msgid "Dive#" msgstr "Duik nr." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Duiklijst font" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Duikleider" #: statistics-gtk.c:542 msgid "Dives" msgstr "Duiken" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Duiklocaties" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Download uit duikcomputer" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Download uit duikcomputer..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Download van Webservice" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Download van Webservice..." #: webservice.c:31 msgid "Download Success!" msgstr "Laden succesvol voltooid!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Duur" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Duur (min)" #: info.c:312 msgid "E" msgstr "O" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Bewerken" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Apparaatnamen bewerken" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Bewerk duikcomputer apparaatnamen" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Trip informatie bewerken" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Trip overzicht bewerken" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Bewerk een duikcomputernaam door te dubbelklikken in het relevante apparaatnaamveld." #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Duik bewerken" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Datum/tijd van duik bewerken" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Duiken bewerken" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Bewerk meerdere duiken" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Trip overzicht bewerken" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "In-/uitschakelen gebeurtenissen" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "In/-uitschakelen trefwoorden" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Einde" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Einddiepte" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Voer een gebruikers-ID in en klik op \"Download\". Wanneer de download voltooid is kunt u op \"Toepassen\" klikken als u de veranderingen wilt uitvoeren." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Uitrusting" #: divelist-gtk.c:1370 msgid "Error" msgstr "Fout" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Fout bij het verkrijgen van het zoutgehalte" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Fout bij verwerken van de datum en tijd" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Fout bij verwerken van de duikduur" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Fout bij het verwerken van het gasmengsel" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Fout bij het verwerken van het aantal gasmengsels" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Fout bij het verwerken van de maximum duikdiepte" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Fout bij het verwerken van de samples" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Fout bij het registreren van de cancellation handler." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Fout bij het registreren van de data" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Fout bij het registreren van de event handler." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Event: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Event: wachten op handeling van gebruiker" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Alles uitklappen" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Exporteer naar UDDF-bestand" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Exporteer UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Exporteer duik(en) naar UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Fout bij openen van %i bestanden." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Fout bij analyse van '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Fout bij analyseren van '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Fout bij lezen van '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Fout bij lezen van '%s'.\n" #: main.c:73 msgid "Feb" msgstr "feb" #: gtk-gui.c:776 msgid "Feet" msgstr "voet" #: gtk-gui.c:1601 msgid "File" msgstr "Bestand" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Forceer download van alle duiken" #: main.c:64 msgid "Fri" msgstr "Vr" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh voor plan" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow voor plan" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 of GPS-formaat)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gas verbruikt" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gas verbruikt" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gas gebruikt" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Gasverbruik:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gasmengsel" #: gtk-gui.c:767 msgid "General Settings" msgstr "Algemene Instellingen" #: gtk-gui.c:1606 msgid "Help" msgstr "Help" #: webservice.c:296 msgid "Idle" msgstr "Inactief" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importeer bestand(en)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informatie" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Initialiseer communicatie" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Voer plan in" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ongeldige diepte: kan \"%s\" niet verwerken" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ongeldige diepte: dieptes groter dan 400m worden niet ondersteund" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Ongeldig gasmengsel voor regel %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Ongeldige starttijd" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Ongeldige gebruikersidentificatie" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "jan" #: main.c:74 msgid "Jul" msgstr "jul" #: main.c:73 msgid "Jun" msgstr "jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Laatste stop op 20 voet" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Laatste stop op 6 meter" #: print.c:985 msgid "Layout Options" msgstr "Opmaakopties" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel en anderen, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Lijst" #: gtk-gui.c:785 msgid "Liter" msgstr "liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Locatie" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Langste" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Langste duik" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: Lege batterij" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Waarschuwing:Lege batterij" #: gtk-gui.c:862 msgid "Map provider" msgstr "Kaartaanbieder" #: main.c:73 msgid "Mar" msgstr "mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Markeer als ongeldig" #: gps.c:53 msgid "Mark location here" msgstr "Markeer locatie hier" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Markeer als geldig" #: uemis.c:230 msgid "Marker" msgstr "Markering" #: print.c:502 msgid "Master" msgstr "Master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Waarschuwing: Maximale deco-tijd" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max. diepte" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Max. diepte (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max. gasverbruik" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max. temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Max. diepte: %.*f %s\nDuur: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Max. druk" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Grootste" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Grootste" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Grootste" #: main.c:73 msgid "May" msgstr "mei" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Duiken samenvoegen" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Trip met bovenstaande samenvoegen" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Trip met onderstaande samenvoegen" #: gtk-gui.c:775 msgid "Meter" msgstr "meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min. diepte" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. gasverbruik" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min. temp." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Kleinste" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Kleinste" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Kleinste" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Diverse opties" #: gtk-gui.c:1512 msgid "Model" msgstr "Model" #: main.c:64 msgid "Mon" msgstr "Ma" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Multi-platform Duikprogramma in C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Nieuw" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nieuw beginnummer" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Volgende DC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Apparaatnaam" #: uemis.c:232 msgid "No Tank Data" msgstr "Geen flesinformatie" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Geen flessen opgegeven voor deze duik." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notities" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Hoogte van notities (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notities bovenaan" #: main.c:74 msgid "Nov" msgstr "nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Onbekende pthread foutmelding" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Geselecteerde gegevens wissen?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Toon enkel duiken met de volgende trefwoorden:" #: gtk-gui.c:291 msgid "Open File" msgstr "Bestand openen" #: gtk-gui.c:1608 msgid "Open..." msgstr "Openen..." #: print.c:995 msgid "Ordering" msgstr "Volgorde" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Hoogte van overige data (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Zuurstof" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: Opstijging / PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Waarschuwing: Opstijging / PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Waarschuwing: PO2 Groen" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Wachtwoord" #: info-gtk.c:565 msgid "Pick on map" msgstr "Kies op kaart" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planner" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Voer uw gebruikersnaam en wachtwoord voor divelogs.de in. De geselecteerde duiken zullen aan uw account worden toegevoegd." #: gtk-gui.c:752 msgid "Preferences" msgstr "Instellingen" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Instellingen..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Druk" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Druk:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Vorige DC" #: print.c:989 msgid "Print in color" msgstr "Afdrukken in kleur" #: print.c:978 msgid "Print only selected dives" msgstr "Alleen geselecteerde duiken afdrukken" #: print.c:974 msgid "Print selection" msgstr "Selectie afdrukken" #: print.c:939 print.c:946 msgid "Print type" msgstr "Afdruktype" #: gtk-gui.c:1612 msgid "Print..." msgstr "Afdrukken..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profiel" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profiel" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Hoogte van profiel (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profiel bovenaan" #: gtk-gui.c:1625 msgid "Quit" msgstr "Afsluiten" #: uemis.c:218 msgid "RGT Alert" msgstr "Alarm: resterende gas-tijd" #: uemis.c:216 msgid "RGT Warning" msgstr "Waarschuwing: resterende gas-tijd" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Waardering" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Lezen %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Verwijderen" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Trip verwijderen" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Duik uit trip verwijderen" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Verwijder gebeurtenis hier" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Geselecteerde duiken uit trip verwijderen" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Hernummeren" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Hernummeren..." #: download-dialog.c:153 msgid "Retry" msgstr "Opnieuw" #: info.c:311 msgid "S" msgstr "Z" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "Gasverbruik" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "Gasverbruik tijdens decostop" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "Gasverbruik tijdens duik" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "veiligheidsstop overtreding" #: main.c:64 msgid "Sat" msgstr "Za" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Opslaan als..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Aanpassingen opslaan?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Bestand opslaan als" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Opslaan als..." #: gtk-gui.c:1609 msgid "Save..." msgstr "Opslaan..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Segment duur" #: gtk-gui.c:1163 msgid "Select Events" msgstr "gebeurtenissen selecteren" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "gebeurtenissen selecteren..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Selecteer trefwoorden..." #: main.c:74 msgid "Sep" msgstr "sept" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Gedeeltelijke schrijfvoortgang naar req.txt bestand\nIs de Uemis Zurich correkt aangesloten?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Kortste" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Kortste duik" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Kolommen afbeelden" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Toon EAD, END en EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Toon MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Toon berekend plafond" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Toon door duikcomputer aangegeven plafond in rood" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Toon op kaart" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Toon pHe-grafiek" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Toon pN%s-grafiek" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Toon pO%s-grafiek" #: planner.c:217 msgid "Simulated Dive" msgstr "Gesimuleerde duik" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Grootte" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Instellen hoogtes (%% van opmaak)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: snelheid" #: uemis.c:203 msgid "Speed Warning" msgstr "Waarschuwing: snelheid" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Begin download" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistieken" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistieken %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistieken" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Blijft op %.*f %s gedurende %d:%02d min - looptijd %d:%02u op %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Vreemde percentage %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Pak" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Zo" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Oppervlaktetijd" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Luchtdruk (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Gaswissel naar %s\n" #: print.c:960 msgid "Table print" msgstr "Afdrukken in tabelvorm" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Trefwoorden worden alleen getoond als zij identiek zijn voor alle te bewerken duiken" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Fleswissel voorgesteld" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Info: Flesdruk" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tec instellingen" #: gtk-gui.c:805 msgid "Temp" msgstr "Temperatuur" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatuur" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatuur:" #: gtk-gui.c:1631 msgid "Three" msgstr "Drie" #: main.c:64 msgid "Thu" msgstr "Do" #: info-gtk.c:841 msgid "Time" msgstr "Tijd" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Om duikinformatie te bewerken\ndubbelklik op de duik in de duiklijst" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zoom in-/uitschakelen" #: planner.c:294 msgid "Too many gas mixes" msgstr "Teveel gasmengsels" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Teveel routepunten" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Totale" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Totale tijd" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Totaal gewicht:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Ga naar %.*f %s over %d:%02d min - looptijd %d:%02u op %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Trip %1$s %3$d %2$s %4$d (%5$d duik)" msgstr[1] "Trip %1$s %3$d %2$s %4$d (%5$d duiken)" #: main.c:64 msgid "Tue" msgstr "Di" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Type" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Bestandssysteem bijna vol\nAUB de duikcomputer loskoppelen en weer aansluiten\nen klik op 'Opnieuw'" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Bestandssysteem vol\nAUB de duikcomputer loskoppellen en weer aansluiten\nen probeer opnieuw" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemis niet geïnitialiseerd" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Kan geen context creëren voor libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Kan geen parser creëren voor %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Fout bij openen van %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Eenheden" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Upload duik(en) naar divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Upload naar divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Upload naar divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Gebruik de rechtermuisknop om een duiklocatie te markeren" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Gebruikersidentificatie" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Gebruikershandleiding" #: gtk-gui.c:1603 msgid "View" msgstr "Weergave" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Zicht" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volume:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Waarschuwing: bijzonder lange duiken kunnen lange berekentijd kosten" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Waarschuwing: het plannen van extreem diepe duiken kan bijzonder veel tijd kosten" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Watertemp." #: webservice.c:163 msgid "Webservice" msgstr "Webservice" #: main.c:64 msgid "Wed" msgstr "Wo" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Gewicht" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Gewichtssysteem" #: gtk-gui.c:794 msgid "Weight:" msgstr "Gewicht:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML bestand" #: statistics-gtk.c:92 msgid "Year" msgstr "Jaar" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Jaarlijkse statistieken" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "U heeft al een duikcomputer van dit model met naam %s\nSubsurface kan een bijnaam voor dit apparaat gebruiken zodat het onderscheiden kan worden van de reeds bestaande. De standaardnaam is het model en het apparaat ID zoals hieronder getoond.\nAls u geen bijnaam voor deze duikcomputer wilt gebruiken, klik dan op \"Annuleren\" en Subsurface zal dan het model als de naam gebruiken (wat kan betekenen dat u de twee duikcomputers niet van elkaar kunt onderscheiden in het logboek)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "U heeft onopgeslagen wijzigingen.\nWilt u deze opslaan voordat u het databestand afsluit?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "U heeft onopgeslagen wijzigingen in bestand: %s \nWilt u deze opslaan voordat u het databestand afsluit?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "lucht" #: libdivecomputer.c:153 msgid "airtime" msgstr "resterende luchttijd" #: statistics.c:21 msgid "altitude" msgstr "hoogte" #: equipment.c:892 msgid "ankle" msgstr "enkel" #: libdivecomputer.c:149 msgid "ascent" msgstr "opstijging" #: equipment.c:893 msgid "backplate weight" msgstr "backplate-gewicht" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "riem" #: statistics.c:20 msgid "boat" msgstr "boot" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "bladwijzer" #: statistics.c:21 msgid "cave" msgstr "grot" #: statistics.c:20 msgid "cavern" msgstr "spelonk" #: libdivecomputer.c:149 msgid "ceiling" msgstr "plafond" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "plafond (veiligheidsstop)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "cuft" #: uemis-downloader.c:384 msgid "data" msgstr "gegevens" #: statistics.c:23 msgid "deco" msgstr "decompressie" #: libdivecomputer.c:149 msgid "deco stop" msgstr "decompressiestop" #: statistics.c:20 msgid "deep" msgstr "diep" #: libdivecomputer.c:152 msgid "deepstop" msgstr "diepe stop" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "Duiklog gegeven ID" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "Duiklocatie data ID" #: libdivecomputer.c:152 msgid "divetime" msgstr "duiktijd" #: statistics.c:20 msgid "drift" msgstr "drift" #: uemis-downloader.c:589 msgid "drysuit" msgstr "droogpak" #: planner.c:788 msgid "ean" msgstr "EAN" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "voor alle duiken" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "Voor duik nr. %d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "voor duik nr." #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "voor de geselecteerde duik" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "voor de geselecteerde duiken" #: statistics.c:22 msgid "freshwater" msgstr "zoetwater" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "tweedelig pak" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "gaswissel" #: libdivecomputer.c:153 msgid "heading" msgstr "koers" #: statistics.c:21 msgid "ice" msgstr "ijs" #: equipment.c:890 msgid "integrated" msgstr "Geïntegreerd" #: statistics.c:20 msgid "invalid" msgstr "Ongeldig" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "ongeldig event-nummer" #: uemis-downloader.c:590 msgid "jacket" msgstr "jack" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "meer" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "US pond" #: uemis-downloader.c:590 msgid "long john" msgstr "long john" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max. pp02" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "max. CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Max. diepte" #: uemis-downloader.c:591 msgid "membrane" msgstr "membraan droogpak" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serienummer=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "meer data voor duik ID" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "meer dan %d dagen" #: statistics.c:22 msgid "night" msgstr "nacht" #: libdivecomputer.c:154 msgid "non stop time" msgstr "nultijd" #: libdivecomputer.c:149 msgid "none" msgstr "geen" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe grenswaarde" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s grenswaarde" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s grenswaarde" #: dive.c:44 msgid "pascal" msgstr "Pa" #: statistics.c:23 msgid "photo" msgstr "foto" #: statistics.c:21 msgid "pool" msgstr "zwembad" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "RBT" #: libdivecomputer.c:153 msgid "rgbm" msgstr "RGBM" #: statistics.c:22 msgid "river" msgstr "rivier" #: libdivecomputer.c:150 msgid "safety stop" msgstr "veiligheidsstop" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "veiligheidsstop (verplicht)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "veiligheidsstop (vrijwillig)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semidroog" #: statistics.c:20 msgid "shore" msgstr "kust" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "oppervlakte" #: statistics.c:22 msgid "teaching" msgstr "lesgeven" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "waarschuwing stikstofbelasting" #: statistics.c:22 msgid "training" msgstr "training" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Jacco van Koll\nReinout Hoornweg" #: libdivecomputer.c:150 msgid "transmitter" msgstr "zender" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "onbek" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "onbekend" #: equipment.c:540 msgid "unspecified" msgstr "Niet gespecificeerd" #: uemis-downloader.c:590 msgid "vest" msgstr "vest" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "schending" #: equipment.c:1545 msgid "weight" msgstr "Gewicht" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "natpak" #: libdivecomputer.c:149 msgid "workload" msgstr "werklast" #: statistics.c:21 msgid "wreck" msgstr "wrak" Subsurface-4.0.2/po/pl_PL.aliases000066400000000000000000000000031226345450700166070ustar00rootroot00000000000000pl Subsurface-4.0.2/po/pl_PL.po000066400000000000000000001320351226345450700156170ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # karent , 2013 # Krzysztof Arentowicz , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:57+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Polish (Poland) (http://www.transifex.com/projects/p/subsurface/language/pl_PL/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl_PL\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nbrak zdarzeń\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > miesiąc" #: webservice.c:289 msgid " Download" msgstr "Pobierz" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Proszę wybrać komputer nurkowy i urządzenie" #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " początek" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " koniec" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s z %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nObliczony sufit %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeco:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeco:nieznany czas @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\ndekompresja" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nPrzyst. bezp.:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nPrzyst. bezp.:nieznany czas @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface - Plan Nurkownia\nw oparciu o GFlow = %.0f oraz GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s w %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: odpowiedź z divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) lub (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(kliknij by edytować datę/czas)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(kliknij by edytować datę/czas/głębokość)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(brak nurkowań)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(nic)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 cuft/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 cuft/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 nurkowania na stronę" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "pełna dwuczęściowa" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "Pokazuj sufit z krokiem co 3m" #: print.c:952 msgid "6 dives per page" msgstr "6 nurkowań na stronę" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Dodaj segmenty nurkowania poniżej.\nKażda linia opisuje fragment planowanego nurkowania.\nWpis z podaniem głębokości, czasu i rodzaju gazu oznacza fragment nurkowania kończący się na danej głębokości, trwający dany czas (gdy czas podano względem poprzedniego, np.'+3:30') lub kończący o podanym czasie (gdy podano czas bezwzględny, np.'@5:00') i z użyciem podanego gazu. \nJeśli nie podasz rodzaju gazu dla danego segmentu oznacza to użycie tego samego rodzaju gazu, co w poprzednim segmencie (jeśli w ogóle nie określisz gazu, domyślnie przyjmowane jest powietrze).\nWpis z podaniem głębokości i rodzaju gazu ale bez podania czasu ma specjalne znaczenie; informuje to Planer, że dany gaz jest dostępny podczas wynurzania po osiągnięciu danej głębokości. \nCC SetPoint dotyczy nurkowań na obiegu zamkniętym (rebreather) - pole należy pozostawić puste dla nurkowania na obiegu otwartym \n" #: planner-gtk.c:272 msgid "AIR" msgstr "POWIETRZE" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "O Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Dodaj" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Dodaj nurkowanie..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Dodaj zakładkę" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Dodaj nurkowanie" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Dodaj zmianę gazu" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Dodaj zmianę gazu w %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Dodaj do grupy powyżej" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Dodaj punkt" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Ciśnienie atm." #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temp. powietrza" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temperatura powietrza w %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Preferuj pobierane nurkowania" #: main.c:73 msgid "Apr" msgstr "Kwi" #: main.c:74 msgid "Aug" msgstr "Sie" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automatyczne grupowanie" #: equipment.c:642 msgid "Available gases" msgstr "Dostępne gazy" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "średnia" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "średni" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "średni" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "średnia" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Śr. głębokość " #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Śr. głębokość (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Śr. SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Śr. temp." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Średni czas" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Przejście na obieg otwarty" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Partner" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Nie znaleziono gazu %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Nie można otworzyć arkusza stylów (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Anulowano" #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Anulowano..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Nie można dodać zmiany gazu" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Nie można przetworzyć odpowiedzi!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsjusz" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Wybierz domyślmy plik XML" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Wybierz plik XML, z którego zaimportować dane" #: gtk-gui.c:1611 msgid "Close" msgstr "Zamknij" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Zwiń wszystkie" #: webservice.c:121 msgid "Connecting..." msgstr "Łączenie..." #: webservice.c:25 msgid "Connection Error: " msgstr "Błąd połączenia:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Utwórz nową grupę powyżej" #: gtk-gui.c:786 msgid "CuFt" msgstr "cuft" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Butle" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Butla" #: planner.c:192 msgid "Cylinder for planning" msgstr "butle do zaplanowania" #: equipment.c:1603 msgid "Cylinders" msgstr "Butle" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "Gł:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "OSTRZEŻENIE: TEN PLANER POSŁUGUJE SIĘ IMPLEMENTACJĄ ALGORYTMU BUHLMANNA, KTÓRA JEST NOWA I ZOSTAŁA PRZETESTOWANA W BARDZO OGRANICZONYM ZAKRESIE. ZDECYDOWANIE ODRADZAMY PLANOWANIE NURKOWANIA JEDYNIE W OPARCIU O REZULTATY DZIAŁANIA TEGO PROGRAMU." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Błąd połączenia z bazą danych '%s'.⏎\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Błąd komunikacji z bazą danych '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Zapytanie bazy danych get_events nie powiodło się.⏎\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Data" #: info-gtk.c:824 msgid "Date and Time" msgstr "Data i czas" #: info-gtk.c:834 msgid "Date:" msgstr "Data:" #: main.c:74 msgid "Dec" msgstr "Gru" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Domyślny plik XML" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Usuń informacje o komputerze nurkowym" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Usuń nurkowanie" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Usuń nurkowania" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Głębokość" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Przekroczenie limitu głębokości" #: gtk-gui.c:774 msgid "Depth:" msgstr "Głębokość:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Id urządzenia" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Urządzenie lub punkt montowania" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Wyświetlaj niepoprawne nurkowania" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Nurkowanie #%1$d - %2$s %3$02d/%4$02d/%5$04d o %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Nurkowanie nr %d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Nurkowanie %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Nazwa komputera nurkowego" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informacje" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notatki" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Plan nurkowania - SYMULACJA; NIE UŻYWAĆ DO NURKOWANIA." #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Etykiety" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Czas nurkowania" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm: czas nurkowania" #: uemis.c:226 msgid "Dive Time Info" msgstr "Informacja: czas nurkowania" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Producent i model komputera nurkowego" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Błąd podczas importowania danych" #: gps.c:214 msgid "Dive locations" msgstr "Miejsca nurkowe" #: info-gtk.c:575 msgid "Dive master" msgstr "Divemaster" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Początek nurkowania za:" #: print.c:502 msgid "Dive#" msgstr "Nurkowanie nr" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Czcionka listy nurkowań" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Nurkowania" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Miejsca nurkowe" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Pobierz z komputera nurkowego" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Pobierz z komputera nurkowego" #: webservice.c:260 msgid "Download From Web Service" msgstr "Pobierz z Web Service" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Pobierz z Web Service" #: webservice.c:31 msgid "Download Success!" msgstr "Pobieranie zakończone sukcesem!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Czas" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Czas trwania(min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Edytuj" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Edycja nazw komputerów nurkowych" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Edycja nazw komputerów nurkowych" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Edytuj informacje o grupie" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Edytuj podsumowanie grupy nurkowań" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Aby edytować nazwę komputera nurkowego kliknij dwukrotnie odpowiednie pole z nazwą" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Edytuj nurkowanie" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Edytuj datę/czas nurkowania" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Edycja wielu nurkowań" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Edycja wielu nurkowań" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Edytuj podsumowanie grupy nurkowań" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Pokazuj zdarzenia:" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Wybór etykiet" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Koniec" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Głębokość końcowa" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Podaj identyfikator użytkownika i wybierz 'Pobierz'. Po zakończeniu pobierania możesz wybrać 'Zastosuj' w celu zastosowania zmian." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Wyposażenie" #: divelist-gtk.c:1370 msgid "Error" msgstr "Błąd" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Błąd podczas przetwarzania danych o zasoleniu" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Błąd podczas przetwarzania daty i czasu" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Błąd podczas przetwarzania czasu nurkowania" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Błąd podczas przetwarzania danych o użytym rodzaju gazu" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Błąd podczas przetwarzania danych o ilości użytych rodzajów gazu" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Błąd podczas przetwarzania głębokości" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Błąd podczas przetwarzania próbek" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Błąd rejestracji uchwytu (cancellation handler)" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Błąd podczas przetwarzania danych" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Błąd rejestracji uchwytu (event handler)" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Event: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Oczekiwanie na działanie użytkownika" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Rozwiń wszystkie" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Eksportuj jako plik UDDF" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Eksportuj UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Eksportuj nurkowania do UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Nie udało się otworzyć %i plików." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Nie udało się przetworzyć '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Nie udało się przetworzyć '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Błąd odczytu '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Błąd odczytu '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Lut" #: gtk-gui.c:776 msgid "Feet" msgstr "Stopy" #: gtk-gui.c:1601 msgid "File" msgstr "Plik" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filtr" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Wymuś pobranie wszystkich nurkowań" #: main.c:64 msgid "Fri" msgstr "Pią" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh dla planu" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow dla planu" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (format WGS84 lub GPS)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Użyty gaz" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Zużyty gaz" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Użyty gaz" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Zużycie gazu:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gaz" #: gtk-gui.c:767 msgid "General Settings" msgstr "Ogólne" #: gtk-gui.c:1606 msgid "Help" msgstr "Pomoc" #: webservice.c:296 msgid "Idle" msgstr "Bezczynny" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importuj plik(i)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Informacje" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Nawiązywanie łączności" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Wprowadź plan" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Niepoprawna głębokość - nie można zinterpretować \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Niepoprawna głębokość - głębokości poniżej 400m nie są obsługiwane" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Niepoprawny gaz w linijce %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Niepoprawny czas początku nurkowania" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Niepoprawny identyfikator użytkownika!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Sty" #: main.c:74 msgid "Jul" msgstr "Lip" #: main.c:73 msgid "Jun" msgstr "Cze" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Ostatni przystanek na głębokości 20 stóp" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Ostatni przystanek na głębokości 6 metrów" #: print.c:985 msgid "Layout Options" msgstr "Układ" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel i inni, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Lista" #: gtk-gui.c:785 msgid "Liter" msgstr "Litry" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Miejsce" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "max." #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Najdłuższe nurkowanie" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: niski poziom baterii" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Ostrzeżenie: niski poziom baterii" #: gtk-gui.c:862 msgid "Map provider" msgstr "Źródło map" #: main.c:73 msgid "Mar" msgstr "Mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Oznacz jak nieprawidłowe" #: gps.c:53 msgid "Mark location here" msgstr "Zaznacz położenie" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Oznacz jak prawidłowe" #: uemis.c:230 msgid "Marker" msgstr "Znacznik" #: print.c:502 msgid "Master" msgstr "Divemaster" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Ostrzeżenie: maksymalny czas dekompresji" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max głębokość " #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Max głębokość (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Max głębokość : %.*f %s\nCzas: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Ciśnienie max" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "max." #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "max." #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "max." #: main.c:73 msgid "May" msgstr "Maj" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Połącz nurkowania" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Połącz grupę z grupą powyżej" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Połącz grupę z grupą poniżej" #: gtk-gui.c:775 msgid "Meter" msgstr "Metry" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min głębokość " #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min temp." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "min." #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "min." #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "min." #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Różne" #: gtk-gui.c:1512 msgid "Model" msgstr "Model" #: main.c:64 msgid "Mon" msgstr "Pon" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Wieloplatformowy log nurkowy napisany w C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Nowy" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nowy numer początkowy" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Następny komputer" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Nazwa" #: uemis.c:232 msgid "No Tank Data" msgstr "Brak danych o butli" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Nie podano butli dla tego nurkowania." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notatki" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "wysokość notatek (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Notatki na górze" #: main.c:74 msgid "Nov" msgstr "Lis" #: libdivecomputer.c:153 msgid "OLF" msgstr "Ekspozycja tlenowa" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Paź" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Błąd pthread" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Na pewno usunąć zaznaczony wpis?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Wyświetlaj tylko nurkowania z tymi etykietami:" #: gtk-gui.c:291 msgid "Open File" msgstr "Otwórz plik" #: gtk-gui.c:1608 msgid "Open..." msgstr "Otwórz..." #: print.c:995 msgid "Ordering" msgstr "Kolejność" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "wysokość pozostałych danych (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Tlen" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: wynurzanie / PO2 " #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Ostrzeżenie: wynurzanie / PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Ostrzeżenie: PO2 zielone" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Hasło" #: info-gtk.c:565 msgid "Pick on map" msgstr "Wskaż na mapie" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planowanie" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Proszę podać swoją nazwę użytkownika i hasło dla divelogs.de. Zaznaczone nurkowania zostaną dodane do Twojego konta. " #: gtk-gui.c:752 msgid "Preferences" msgstr "Ustawienia" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Ustawienia..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Ciśnienie" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Ciśnienie:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Poprzedni komputer" #: print.c:989 msgid "Print in color" msgstr "Drukuj w kolorze" #: print.c:978 msgid "Print only selected dives" msgstr "Drukuj tylko zaznaczone nurkowania" #: print.c:974 msgid "Print selection" msgstr "Wybór danych do druku" #: print.c:939 print.c:946 msgid "Print type" msgstr "Rodzaj wydruku" #: gtk-gui.c:1612 msgid "Print..." msgstr "Drukuj..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Konfiguracja profilu" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "wysokość profilu (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil na górze" #: gtk-gui.c:1625 msgid "Quit" msgstr "Wyjście" #: uemis.c:218 msgid "RGT Alert" msgstr "Alarm: ilość gazu" #: uemis.c:216 msgid "RGT Warning" msgstr "Ostrzeżenie: ilość gazu" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Ocena" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Czytanie %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Usuń" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Usuń grupę" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Usuń nurkowanie z grupy" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Usuń to wydarzenie" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Usuń wybrane nurkowania z grupy" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Zmień numerację" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Zmień numerację..." #: download-dialog.c:153 msgid "Retry" msgstr "Ponów" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC podczas dekompresji" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC podczas nurkowania" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Pominięcie przystanku bezpieczeństwa" #: main.c:64 msgid "Sat" msgstr "Sob" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Zapisz jako.." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Zapisać zmiany?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Zapisz jako" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Zapisz jako" #: gtk-gui.c:1609 msgid "Save..." msgstr "Zapisz..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Czas segmentu" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Wybór zdarzeń" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Wybór zdarzeń..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Wybór etykiet..." #: main.c:74 msgid "Sep" msgstr "Wrz" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Nieudany zapis do pliku req.txt \nCzy Uemis Zurich jest podłączony poprawnie?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "min." #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Najkrótsze nurkowanie" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Pokazuj kolumny" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "pokazuj EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "pokazuj MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Pokazuj obliczony sufit" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Pokazuj sufit z komputera nurkowego na czerwono" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Pokaż na mapie" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "pokazuj wykres pHe" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "pokazuj wykres pN%s" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "pokazuj wykres pO%s" #: planner.c:217 msgid "Simulated Dive" msgstr "Symulowane nurkowanie" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Pojemność" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Wysokości (%% strony)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm prędkości wynurzania" #: uemis.c:203 msgid "Speed Warning" msgstr "Ostrzeżenie: prędkość wynurzania" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Rozpocznij pobieranie" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statystyka" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statystyka %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statystyka" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Pozostań na %.*f %s przez %d:%02d min - runtime %d:%02u z %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Podejrzany skład procentowy %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Skafander" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Nie" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Przerwa pow." #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Ciśnienie atmosferyczne (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Zmiana gazu na %s\n" #: print.c:960 msgid "Table print" msgstr "Tabela" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Etykiety są pokazywane tylko gdy są takie same dla wszystkich edytowanych nurkowań" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Zalecana zmiana gazu" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Ciśnienie w butli" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Ustawienia Tec" #: gtk-gui.c:805 msgid "Temp" msgstr "Temperatura" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatura" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatura:" #: gtk-gui.c:1631 msgid "Three" msgstr "Potrójny" #: main.c:64 msgid "Thu" msgstr "Czw" #: info-gtk.c:841 msgid "Time" msgstr "Czas" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Aby edytować informacje o nurkowaniu\ndwukrotnie kliknij na jego wpisie na liście nurkowań" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Skalowanie wykresu" #: planner.c:294 msgid "Too many gas mixes" msgstr "Zbyt wiele rodzajów gazu" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Zbyt wiele punktów" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "całkowity" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Całkowity czas" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Całkowity balast:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Przejście do %.*f %s w %d:%02d min - runtime %d:%02u z %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Grupa %1$s, %2$s %3$d, %4$d (%5$d nurkowanie)" msgstr[1] "Grupa %1$s, %2$s %3$d, %4$d (%5$d nurkowania)" msgstr[2] "Grupa %1$s, %2$s %3$d, %4$d (%5$d nurkowań)" #: main.c:64 msgid "Tue" msgstr "Wto" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Rodzaj" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: System plików jest prawie pełen\nOdłącz i podłącz ponownie komputer nurkowy \ni wybierz 'Ponów'" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: System plików jest pełen\nOdłącz i podłącz ponownie komputer nurkowy\ni spróbuj jeszcze raz." #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Błąd inicjalizacji Uemis " #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Nie można utworzyć kontekstu libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Nie udało się utworzyć parsera dla %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Nie udało się otworzyć %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Jednostki" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Wyślij nurkowania do divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Wyślij do divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Wyślij do divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Kliknij prawym przyciskiem, by zaznaczyć miejsce nurkowania" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Identyfikator użytkownika" #: gtk-gui.c:1627 msgid "User Manual" msgstr "instrukcja obsługi" #: gtk-gui.c:1603 msgid "View" msgstr "Widok" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Widoczność" #: gtk-gui.c:784 msgid "Volume:" msgstr "Objętość:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Ostrzeżenie - ekstremalnie długie nurkowanie może spowodować znaczne wydłużenie czasu obliczeń" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Ostrzeżenie - planowanie bardzo głębokich nurkowań może spowodować znaczne wydłużenie czasu obliczeń" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Temp. wody" #: webservice.c:163 msgid "Webservice" msgstr "Webservice" #: main.c:64 msgid "Wed" msgstr "Śro" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Balast" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Rodzaj balastu" #: gtk-gui.c:794 msgid "Weight:" msgstr "Waga:" #: gtk-gui.c:146 msgid "XML file" msgstr "plik XML" #: statistics-gtk.c:92 msgid "Year" msgstr "Rok" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Statystyka roczna" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Istnieje już zdefiniowany komputer nurkowy tego typu\nnazwany %s\nSubsurface może nadać nazwę temu urządzeniu, która pozwoli go odróżnić od już istniejącego. Domyślna nazwa to model i ID pokazane poniżej.\nJeśli nie chcesz podawać własnej nazwy wybierz 'Anuluj' a Subsurface będzie używać modelu jako nazwy (może to oznaczać, że w logach nie da się odróżnić obu komputerów od siebie)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Istnieją niezapisane zmiany \nCzy chcesz zapisać zmiany przed zamknięciem pliku?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Istnieją niezapisane zmiany w pliku %s\nCzy chcesz zapisać te zmiany przed zamknięciem pliku?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "powietrze" #: libdivecomputer.c:153 msgid "airtime" msgstr "Pozostały czas oddychania" #: statistics.c:21 msgid "altitude" msgstr "wysokość" #: equipment.c:892 msgid "ankle" msgstr "na kostkach" #: libdivecomputer.c:149 msgid "ascent" msgstr "wynurzanie" #: equipment.c:893 msgid "backplate weight" msgstr "na płycie" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "pas balastowy" #: statistics.c:20 msgid "boat" msgstr "z łodzi" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "zakładka" #: statistics.c:21 msgid "cave" msgstr "jaskiniowe" #: statistics.c:20 msgid "cavern" msgstr "kawerna" #: libdivecomputer.c:149 msgid "ceiling" msgstr "sufit" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "sufit (przystanek bezpieczeństwa)" #: equipment.c:894 msgid "clip-on" msgstr "doczepiany" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "cuft" #: uemis-downloader.c:384 msgid "data" msgstr "dane" #: statistics.c:23 msgid "deco" msgstr "deco" #: libdivecomputer.c:149 msgid "deco stop" msgstr "przystanek deco" #: statistics.c:20 msgid "deep" msgstr "głębokie" #: libdivecomputer.c:152 msgid "deepstop" msgstr "deepstop" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "wpis dziennika nurkowego id" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "dane o miejscu nurkowania id" #: libdivecomputer.c:152 msgid "divetime" msgstr "czas nurkowania" #: statistics.c:20 msgid "drift" msgstr "w dryfie" #: uemis-downloader.c:589 msgid "drysuit" msgstr "suchy" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "dla wszystkich nurkowań" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "dla nurkowania #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "dla nurkowania nr" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "dla wybranego nurkowania" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "dla wybranych nurkowań" #: statistics.c:22 msgid "freshwater" msgstr "słodkowodne" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "pełna" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "zmiana gazu" #: libdivecomputer.c:153 msgid "heading" msgstr "kierunek" #: statistics.c:21 msgid "ice" msgstr "podlodowe" #: equipment.c:890 msgid "integrated" msgstr "zintegrowany" #: statistics.c:20 msgid "invalid" msgstr "niepoprawne" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "niepoprawny znacznik" #: uemis-downloader.c:590 msgid "jacket" msgstr "kurtka" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "jezioro" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "lbs" #: uemis-downloader.c:590 msgid "long john" msgstr "długi" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "maxCNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Max głębokość" #: uemis-downloader.c:591 msgid "membrane" msgstr "membranowy" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), numer seryjny=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "dane nurkowania id" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "więcej niż %d dni" #: statistics.c:22 msgid "night" msgstr "nocne" #: libdivecomputer.c:154 msgid "non stop time" msgstr "czas bezdekompresyjny" #: libdivecomputer.c:149 msgid "none" msgstr "brak" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "próg pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "próg pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "próg pO%s " #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "fotografia" #: statistics.c:21 msgid "pool" msgstr "basen" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "pozostały czas na dnie" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "rzeka" #: libdivecomputer.c:150 msgid "safety stop" msgstr "przystanek bezpieczeństwa" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "przystanek bezpieczeństwa (obowiązkowy)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "przystanek bezpieczeństwa (opcjonalny)" #: uemis-downloader.c:589 msgid "semidry" msgstr "półsuchy" #: statistics.c:20 msgid "shore" msgstr "z brzegu" #: uemis-downloader.c:590 msgid "shorty" msgstr "krótki" #: libdivecomputer.c:150 msgid "surface" msgstr "powierzchnia" #: statistics.c:22 msgid "teaching" msgstr "nauczanie" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Ostrzeżenie: poziom nasycenia tkanek" #: statistics.c:22 msgid "training" msgstr "szkolenie" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Krzysztof Arentowicz" #: libdivecomputer.c:150 msgid "transmitter" msgstr "nadajnik" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "nie podano" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "nieznana" #: equipment.c:540 msgid "unspecified" msgstr "nieokreślony" #: uemis-downloader.c:590 msgid "vest" msgstr "kamizelka" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "naruszenie" #: equipment.c:1545 msgid "weight" msgstr "waga" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "mokry" #: libdivecomputer.c:149 msgid "workload" msgstr "wysiłek" #: statistics.c:21 msgid "wreck" msgstr "wrakowe" Subsurface-4.0.2/po/pt_BR.aliases000066400000000000000000000000031226345450700166070ustar00rootroot00000000000000br Subsurface-4.0.2/po/pt_BR.po000066400000000000000000001061621226345450700156210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # Rodrigo Padula , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:57+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/subsurface/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "> Mês" #: webservice.c:289 msgid " Download" msgstr "Download" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Por favor, selecione o seu dispositivo e computador de mergulho." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "início" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "fim" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s de %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeco:tempo desconhecido @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nPlano de Mergulho Subsurface\nbaseado em GFlow = %.0f e GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "" #: planner-gtk.c:415 msgid "17 l/min" msgstr "" #: print.c:956 msgid "2 dives per page" msgstr "" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "" #: planner-gtk.c:414 msgid "20 l/min" msgstr "" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "" #: print.c:952 msgid "6 dives per page" msgstr "6 mergulhos por página" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "" #: planner-gtk.c:272 msgid "AIR" msgstr "AR" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Sobre o Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Adicionar mergulho..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Adicionar mergulho..." #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Pressão do Ar" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temperatura do Ar" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temperatuda do ar em %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "" #: main.c:73 msgid "Apr" msgstr "Abr" #: main.c:74 msgid "Aug" msgstr "Ago" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "" #: equipment.c:642 msgid "Available gases" msgstr "" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Média" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Média" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Média" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Média" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Profundidade Média" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "SAC Média" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Temperatura Média" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "" #: gtk-gui.c:780 msgid "Bar" msgstr "" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Parceiro" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "" #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "" #: equipment.c:621 msgid "Cannot add gas change" msgstr "" #: webservice.c:29 msgid "Cannot parse response!" msgstr "" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "" #: gtk-gui.c:1611 msgid "Close" msgstr "Fechar" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "" #: webservice.c:121 msgid "Connecting..." msgstr "Conectando..." #: webservice.c:25 msgid "Connection Error: " msgstr "Erro de conexão:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "" #: gtk-gui.c:786 msgid "CuFt" msgstr "" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Cilindro" #: planner.c:192 msgid "Cylinder for planning" msgstr "Cilindro para planejamento" #: equipment.c:1603 msgid "Cylinders" msgstr "Cilindros" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "" #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Data" #: info-gtk.c:824 msgid "Date and Time" msgstr "Data e Hora" #: info-gtk.c:834 msgid "Date:" msgstr "Data:" #: main.c:74 msgid "Dec" msgstr "" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Remover mergulho" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Remover mergulhos" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Profundidade" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Limite de profundidade excedido" #: gtk-gui.c:774 msgid "Depth:" msgstr "Profundidade:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "ID do dispositivo" #: download-dialog.c:341 msgid "Device or mount point" msgstr "" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "" #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Apelido do computador de mergulho" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Info do mergulho" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notas do mergulho" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Tempo de mergulho" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alerta de tempo de mergulho" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info de tempo de mergulho" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Fabricante do computador e produto" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "" #: gps.c:214 msgid "Dive locations" msgstr "Pontos de mergulho" #: info-gtk.c:575 msgid "Dive master" msgstr "Professor de mergulho" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Quando começa o mergulho?" #: print.c:502 msgid "Dive#" msgstr "Mergulho#" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Instrutor de Mergulho" #: statistics-gtk.c:542 msgid "Dives" msgstr "" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "" #: webservice.c:260 msgid "Download From Web Service" msgstr "" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "" #: webservice.c:31 msgid "Download Success!" msgstr "" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "" #: info-gtk.c:911 msgid "Duration (min)" msgstr "" #: info.c:312 msgid "E" msgstr "" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "" #: planner-gtk.c:273 msgid "EAN32" msgstr "" #: planner-gtk.c:274 msgid "EAN36" msgstr "" #: info-gtk.c:99 msgid "Edit" msgstr "Editar" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Editar mergulho" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Editar mergulhos" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Editar múltiplos mergulhos" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "" #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "" #: divelist-gtk.c:1370 msgid "Error" msgstr "Erro" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "" #: main.c:73 msgid "Feb" msgstr "" #: gtk-gui.c:776 msgid "Feet" msgstr "" #: gtk-gui.c:1601 msgid "File" msgstr "Arquivo" #: gtk-gui.c:1604 msgid "Filter" msgstr "" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "" #: main.c:64 msgid "Fri" msgstr "" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "" #: gtk-gui.c:997 msgid "GFlow" msgstr "" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "" #: gtk-gui.c:767 msgid "General Settings" msgstr "" #: gtk-gui.c:1606 msgid "Help" msgstr "" #: webservice.c:296 msgid "Idle" msgstr "" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importar arquivo(s)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "" #: main.c:74 msgid "Jul" msgstr "" #: main.c:73 msgid "Jun" msgstr "" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "Opções de layout" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "" #: gtk-gui.c:1628 msgid "List" msgstr "" #: gtk-gui.c:785 msgid "Liter" msgstr "" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Local" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alerta de nível de bateria" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Aviso de nível de bateria" #: gtk-gui.c:862 msgid "Map provider" msgstr "" #: main.c:73 msgid "Mar" msgstr "" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "" #: gps.c:53 msgid "Mark location here" msgstr "" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "" #: uemis.c:230 msgid "Marker" msgstr "Marcador" #: print.c:502 msgid "Master" msgstr "" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "" #: equipment.c:1518 msgid "MaxPress" msgstr "" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Máximo" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Máximo" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Máximo" #: main.c:73 msgid "May" msgstr "Mai" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Mesclar mergulhos" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "" #: gtk-gui.c:775 msgid "Meter" msgstr "Metro" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Profundidade mínima" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Temperatura Mínima" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "" #: gtk-gui.c:1512 msgid "Model" msgstr "" #: main.c:64 msgid "Mon" msgstr "" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "" #: info.c:311 msgid "N" msgstr "" #: gtk-gui.c:1607 msgid "New" msgstr "" #: gtk-gui.c:1227 msgid "New starting number" msgstr "" #: gtk-gui.c:1634 msgid "Next DC" msgstr "" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Apelido" #: uemis.c:232 msgid "No Tank Data" msgstr "" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "" #: print.c:1003 msgid "Notes on top" msgstr "Notas no topo" #: main.c:74 msgid "Nov" msgstr "" #: libdivecomputer.c:153 msgid "OLF" msgstr "" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "" #: main.c:74 msgid "Oct" msgstr "" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "" #: gtk-gui.c:291 msgid "Open File" msgstr "Abrir arquivo" #: gtk-gui.c:1608 msgid "Open..." msgstr "" #: print.c:995 msgid "Ordering" msgstr "" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "" #: print.c:173 #, c-format msgid "Oxygen" msgstr "" #: libdivecomputer.c:153 msgid "PO2" msgstr "" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "" #: gtk-gui.c:781 msgid "PSI" msgstr "" #: webservice.c:341 msgid "Password" msgstr "Senha" #: info-gtk.c:565 msgid "Pick on map" msgstr "" #: gtk-gui.c:1605 msgid "Planner" msgstr "" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "" #: gtk-gui.c:752 msgid "Preferences" msgstr "" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "" #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "" #: gtk-gui.c:779 msgid "Pressure:" msgstr "" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "" #: print.c:989 msgid "Print in color" msgstr "" #: print.c:978 msgid "Print only selected dives" msgstr "" #: print.c:974 msgid "Print selection" msgstr "" #: print.c:939 print.c:946 msgid "Print type" msgstr "" #: gtk-gui.c:1612 msgid "Print..." msgstr "" #: gtk-gui.c:1629 msgid "Profile" msgstr "Perfil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Configurações de perfil" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "" #: print.c:1000 msgid "Profile on top" msgstr "Perfil no topo" #: gtk-gui.c:1625 msgid "Quit" msgstr "" #: uemis.c:218 msgid "RGT Alert" msgstr "" #: uemis.c:216 msgid "RGT Warning" msgstr "" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "" #: gtk-gui.c:2142 msgid "Remove" msgstr "Remover" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "" #: gtk-gui.c:1218 msgid "Renumber" msgstr "" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "" #: download-dialog.c:153 msgid "Retry" msgstr "" #: info.c:311 msgid "S" msgstr "" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "" #: main.c:64 msgid "Sat" msgstr "" #: gtk-gui.c:1610 msgid "Save As..." msgstr "" #: gtk-gui.c:221 msgid "Save Changes?" msgstr "" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Salvar aquivo como" #: divelist-gtk.c:1710 msgid "Save as" msgstr "" #: gtk-gui.c:1609 msgid "Save..." msgstr "" #: planner-gtk.c:299 msgid "Segment Time" msgstr "" #: gtk-gui.c:1163 msgid "Select Events" msgstr "" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "" #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "" #: main.c:74 msgid "Sep" msgstr "" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "" #: gtk-gui.c:951 msgid "Show MOD" msgstr "" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "" #: planner.c:217 msgid "Simulated Dive" msgstr "" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "" #: uemis.c:200 msgid "Speed Alarm" msgstr "" #: uemis.c:203 msgid "Speed Warning" msgstr "" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "" #: uemis-downloader.c:782 msgid "Start download" msgstr "" #: statistics-gtk.c:532 msgid "Statistics" msgstr "" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "" #: gtk-gui.c:1865 msgid "Stats" msgstr "" #: webservice.c:295 msgid "Status" msgstr "" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "" #: print.c:960 msgid "Table print" msgstr "" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "" #: gtk-gui.c:805 msgid "Temp" msgstr "" #: statistics-gtk.c:92 msgid "Temperature" msgstr "" #: gtk-gui.c:789 msgid "Temperature:" msgstr "" #: gtk-gui.c:1631 msgid "Three" msgstr "" #: main.c:64 msgid "Thu" msgstr "" #: info-gtk.c:841 msgid "Time" msgstr "" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "" #: planner.c:294 msgid "Too many gas mixes" msgstr "" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "" #: statistics-gtk.c:551 msgid "Total Time" msgstr "" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "" msgstr[1] "" #: main.c:64 msgid "Tue" msgstr "" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "" #: gtk-gui.c:768 msgid "Units" msgstr "Unidades" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "" #: gtk-gui.c:1627 msgid "User Manual" msgstr "" #: gtk-gui.c:1603 msgid "View" msgstr "Visualizar" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Visibilidade" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volume:" #: info.c:312 msgid "W" msgstr "" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "" #: webservice.c:163 msgid "Webservice" msgstr "" #: main.c:64 msgid "Wed" msgstr "" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "" #: gtk-gui.c:794 msgid "Weight:" msgstr "" #: gtk-gui.c:146 msgid "XML file" msgstr "" #: statistics-gtk.c:92 msgid "Year" msgstr "Ano" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "" #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "ar" #: libdivecomputer.c:153 msgid "airtime" msgstr "" #: statistics.c:21 msgid "altitude" msgstr "altitude" #: equipment.c:892 msgid "ankle" msgstr "" #: libdivecomputer.c:149 msgid "ascent" msgstr "" #: equipment.c:893 msgid "backplate weight" msgstr "" #: dive.c:48 msgid "bar" msgstr "" #: equipment.c:891 msgid "belt" msgstr "cinto" #: statistics.c:20 msgid "boat" msgstr "barco" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "favorito" #: statistics.c:21 msgid "cave" msgstr "" #: statistics.c:20 msgid "cavern" msgstr "caverna" #: libdivecomputer.c:149 msgid "ceiling" msgstr "" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "" #: equipment.c:894 msgid "clip-on" msgstr "" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "" #: uemis-downloader.c:384 msgid "data" msgstr "data" #: statistics.c:23 msgid "deco" msgstr "deco" #: libdivecomputer.c:149 msgid "deco stop" msgstr "" #: statistics.c:20 msgid "deep" msgstr "profundo" #: libdivecomputer.c:152 msgid "deepstop" msgstr "" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "" #: libdivecomputer.c:152 msgid "divetime" msgstr "" #: statistics.c:20 msgid "drift" msgstr "" #: uemis-downloader.c:589 msgid "drysuit" msgstr "roupa seca" #: planner.c:788 msgid "ean" msgstr "" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "para todos os mergulhos" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "" #: statistics.c:22 msgid "freshwater" msgstr "águar gelada" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "" #: uemis-downloader.c:590 msgid "full suit" msgstr "" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "" #: libdivecomputer.c:153 msgid "heading" msgstr "" #: statistics.c:21 msgid "ice" msgstr "gelo" #: equipment.c:890 msgid "integrated" msgstr "integrado" #: statistics.c:20 msgid "invalid" msgstr "inválido" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "numero de evento inválido" #: uemis-downloader.c:590 msgid "jacket" msgstr "colete" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "lago" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "lbs" #: uemis-downloader.c:590 msgid "long john" msgstr "" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "maxdepth" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrana" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "" #: statistics.c:22 msgid "night" msgstr "noite" #: libdivecomputer.c:154 msgid "non stop time" msgstr "" #: libdivecomputer.c:149 msgid "none" msgstr "" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "" #: dive.c:44 msgid "pascal" msgstr "" #: statistics.c:23 msgid "photo" msgstr "foto" #: statistics.c:21 msgid "pool" msgstr "piscina" #: dive.c:52 msgid "psi" msgstr "" #: libdivecomputer.c:149 msgid "rbt" msgstr "" #: libdivecomputer.c:153 msgid "rgbm" msgstr "" #: statistics.c:22 msgid "river" msgstr "rio" #: libdivecomputer.c:150 msgid "safety stop" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "" #: uemis-downloader.c:589 msgid "semidry" msgstr "" #: statistics.c:20 msgid "shore" msgstr "" #: uemis-downloader.c:590 msgid "shorty" msgstr "" #: libdivecomputer.c:150 msgid "surface" msgstr "" #: statistics.c:22 msgid "teaching" msgstr "ensinando" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "" #: statistics.c:22 msgid "training" msgstr "treinando" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "créditos-de-tradução" #: libdivecomputer.c:150 msgid "transmitter" msgstr "" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "" #: equipment.c:540 msgid "unspecified" msgstr "" #: uemis-downloader.c:590 msgid "vest" msgstr "" #: statistics.c:23 msgid "video" msgstr "vídeo" #: libdivecomputer.c:150 msgid "violation" msgstr "" #: equipment.c:1545 msgid "weight" msgstr "" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "" #: libdivecomputer.c:149 msgid "workload" msgstr "" #: statistics.c:21 msgid "wreck" msgstr "" Subsurface-4.0.2/po/pt_PT.aliases000066400000000000000000000000031226345450700166270ustar00rootroot00000000000000pt Subsurface-4.0.2/po/pt_PT.po000066400000000000000000001257151226345450700156460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # Henrik Brautaset Aronsen , 2012 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:57+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/subsurface/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "> Mês" #: webservice.c:289 msgid " Download" msgstr "Transferir" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Por favor, seleccione o computador de mergulho." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "iniciar" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "fim" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s de %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d minutos" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd, %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nTecto calculado %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeco:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeco:Tempo desconhecido @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nPEA:%d%s\nPNE:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nEm deco" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nParagem de segurança:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nParagem de segurança:tempo desconhecido @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nPlano de mergulho Subsurface\nbaseado em GFinferior = %.0f y GFsuperior = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) ou (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(nenhum mergulho)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(vazio)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 pés³/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 pés³/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 mergulhos por página" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "Fato completo 2 peças" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "Incrementos de 3m para o tecto calculado" #: print.c:952 msgid "6 dives per page" msgstr "6 imersões por página" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "" #: planner-gtk.c:272 msgid "AIR" msgstr "AR" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Sobre Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Adicionar mergulho ..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Adicionar mergulho" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Adicionar à expedição de mergulho anterior" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Adicionar ponto da rota" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Pressão atmosférica" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Temperatura do ar" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Temperatura do ar em %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Preferir sempre mergulho transferido" #: main.c:73 msgid "Apr" msgstr "Abr" #: main.c:74 msgid "Aug" msgstr "Ago" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Auto Agrupar" #: equipment.c:642 msgid "Available gases" msgstr "" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Média" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Média" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Média" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Média" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Prof. média" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "SAC médio" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Temp média" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Tempo médio" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Troca de emergência para OC" #: gtk-gui.c:780 msgid "Bar" msgstr "Bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Parceiro" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Não encontro o gás %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Cancelado, a fechar ..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Cancelado..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Não consigo analisar a resposta !" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Seleccionar arquivo XML predeterminado" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Seleccionar ficheiro XML para importar para arquivo de dados actual" #: gtk-gui.c:1611 msgid "Close" msgstr "Encerrar" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Colapsar" #: webservice.c:121 msgid "Connecting..." msgstr "Ligar ..." #: webservice.c:25 msgid "Connection Error: " msgstr "Erro de ligação:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Atribuir a uma nova expedição de mergulho" #: gtk-gui.c:786 msgid "CuFt" msgstr "pé^3" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Cil" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Garrafa" #: planner.c:192 msgid "Cylinder for planning" msgstr "Garrafa para planear" #: equipment.c:1603 msgid "Cylinders" msgstr "Garrafas" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "P:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "CLÁUSULA DE DESRESPONSABILIZAÇÃO/AVISO:ESTA É UMA NOVA IMPLEMENTAÇÃO DO ALGORITMO BUHLMANN E DO SEU PLANEADOR DE MERGULHOS DERIVADO AO QUAL SÓ FORAM REALIZADOS TESTES DE FORMA LIMITADA. RECOMENDAMOS FORTEMENTE PARA NUNCA PLANEAR MERGULHOS BASEADOS SIMPLESMENTE NOS RESULTADOS OBTIDOS AQUI." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Data" #: info-gtk.c:824 msgid "Date and Time" msgstr "Data e hora" #: info-gtk.c:834 msgid "Date:" msgstr "Data:" #: main.c:74 msgid "Dec" msgstr "Dez" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Ficheiro XML por omissão" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Eliminar entrada do computador de mergulho" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Eliminar mergulho" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Eliminar mergulhos" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Profundidade" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Limite de profundidade ultrapassado" #: gtk-gui.c:774 msgid "Depth:" msgstr "Profundidade:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Identificador de dispositivo" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Dispositivo ou \"mount point\"" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Mergulho #%d -" #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Mergulho #%d:%s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Nome do computador de mergulho" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informação do mergulho" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Notas do mergulho" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Plano de Mergulho - ISTO UMA SIMULAÇÃO; NÃO USAR PARA MERGULHAR" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Duração do mergulho" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alerta de duração de mergulho" #: uemis.c:226 msgid "Dive Time Info" msgstr "Informação sobre a duração do mergulho" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Fabricante e modelo" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Erro na importação dos dados do mergulho" #: gps.c:214 msgid "Dive locations" msgstr "Locais de mergulho" #: info-gtk.c:575 msgid "Dive master" msgstr "Dive master" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Quando inicia o mergulho ?" #: print.c:502 msgid "Dive#" msgstr "Mergulho #" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Fonte da lista de mergulhos" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Mergulhos" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Locais de Mergulho" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Transferir do Computador de Mergulho" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Transferir do Computador de Mergulho..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Transferir do serviço web" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Transferir do serviço web ..." #: webservice.c:31 msgid "Download Success!" msgstr "Operação de transferência bem sucedida!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Duração" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Duração (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Editar" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Editar nomes do dispositivo" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Editar nomes do computador de mergulho" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Editar informação da expedição de mergulho" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Editar resumo da expedição de mergulho" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Editar o nome de um computador de mergulho por duplo clique no campo do nome correspondente" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Editar mergulho" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Editar data e hora de mergulho" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Editar mergulhos" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Editar múltiplos mergulhos" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Editar resumo da expedição de mergulho" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Activar / Desactivar eventos" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Fim" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Profundidade final" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Introduzir uma identificação do utilizador e seleccionar \"Transferir\". Após terminar seleccionar \"Aplicar\"." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Equipamento" #: divelist-gtk.c:1370 msgid "Error" msgstr "" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Erro na obtenção da salinidade da água." #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Erro na análise da data" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Erro na análise do tempo de mergulho" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Erro na análise da mistura de gás" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Erro na análise na contagem da mistura de gás" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Erro na análise da profundidade máxima" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Erro na análise das amostras" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Erro no registo do \"cancellation handler\"." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Erro no registo de dados" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Erro no registo do \"event handler\"." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Evento: Hora de sistema=%, Hora do dispositivo=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Evento: à espera de acção do utilizador" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Expandir todos" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "" #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Falha ao abrir %i ficheiros." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Falha na análise de '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Falha na análise de '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Falha na leitura de '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Falha na leitura de '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "Pés" #: gtk-gui.c:1601 msgid "File" msgstr "Ficheiro" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filtros" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Forçar a transferência de todos os mergulhos" #: main.c:64 msgid "Fri" msgstr "Sex" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFAlto" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFalto para planear" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFbaixo" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFbaixo para planear" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS(formato WGS84 ou GPS)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gás usado" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gás usado" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gás usado" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Consumo de gás:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Mistura de gás" #: gtk-gui.c:767 msgid "General Settings" msgstr "Definições Gerais" #: gtk-gui.c:1606 msgid "Help" msgstr "Ajuda" #: webservice.c:296 msgid "Idle" msgstr "parado" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "" #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Info" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Iniciar Comunicação" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Introduzir Plano" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Profundidade inválida - Falha na análise \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Profundidade inválida - Não são suportadas profundidades superiores a 400m" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Gás inválido na coluna %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Hora de início inválida" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Identificação de utilizador inválida !" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Jan" #: main.c:74 msgid "Jul" msgstr "Jul" #: main.c:73 msgid "Jun" msgstr "Jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "" #: print.c:985 msgid "Layout Options" msgstr "" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel y otros, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Lista" #: gtk-gui.c:785 msgid "Liter" msgstr "Litro" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Localização" #: gtk-gui.c:1602 msgid "Log" msgstr "Registos" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Mais Prolongado" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Mergulho mais prolongado" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alerta de Bateria Baixa" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Advertência de Bateria Baixa" #: gtk-gui.c:862 msgid "Map provider" msgstr "" #: main.c:73 msgid "Mar" msgstr "Mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "" #: gps.c:53 msgid "Mark location here" msgstr "Marcar localização aquí" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "" #: uemis.c:230 msgid "Marker" msgstr "Marcador" #: print.c:502 msgid "Master" msgstr "Guía" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Advertência de tempo máx deco" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Profundidade máx" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Máx SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Máx. Temp." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Profundidade Máxima: %.*f %s\nDuração :%d minutos\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Máx. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Press. máx." #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Máxima" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Máximo" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Máxima" #: main.c:73 msgid "May" msgstr "Maio" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Juntar mergulhos" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Integrar expedição à de cima" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Integrar expedição à de baixo" #: gtk-gui.c:775 msgid "Meter" msgstr "Metro" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Profundidad mínima" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Mín SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Mín Temp" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Mínima" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Mínimo" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Mínima" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Opções diversas" #: gtk-gui.c:1512 msgid "Model" msgstr "Modelo" #: main.c:64 msgid "Mon" msgstr "Seg" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "DiveLog multi-plataforma escrito em C " #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Novo" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Novo número de início" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Seguinte DC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Nome" #: uemis.c:232 msgid "No Tank Data" msgstr "Sem dados registados da garrafa" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "" #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Notas" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "" #: print.c:1003 msgid "Notes on top" msgstr "" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Out" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Erro \"pthread\" estranho" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Ok para remover entrada seleccionada ?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "" #: gtk-gui.c:291 msgid "Open File" msgstr "Abrir Ficheiro" #: gtk-gui.c:1608 msgid "Open..." msgstr "Abrir..." #: print.c:995 msgid "Ordering" msgstr "" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Oxigénio" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarme de Subida PpO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Aviso de Ascenção PpO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Aviso Verde PpO2" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "" #: info-gtk.c:565 msgid "Pick on map" msgstr "Seleccionar no mapa" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planeamento" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "" #: gtk-gui.c:752 msgid "Preferences" msgstr "Preferências" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Preferências..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Pressão" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Pressão:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Anterior DC" #: print.c:989 msgid "Print in color" msgstr "" #: print.c:978 msgid "Print only selected dives" msgstr "Imprimir apenas mergulhos seleccionados" #: print.c:974 msgid "Print selection" msgstr "Imprimir selecção" #: print.c:939 print.c:946 msgid "Print type" msgstr "Tipo de impressão" #: gtk-gui.c:1612 msgid "Print..." msgstr "Imprimir..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Perfil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Ajustes de perfil" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "" #: print.c:1000 msgid "Profile on top" msgstr "" #: gtk-gui.c:1625 msgid "Quit" msgstr "Sair" #: uemis.c:218 msgid "RGT Alert" msgstr "Alerta de tempo de gás restante" #: uemis.c:216 msgid "RGT Warning" msgstr "Aviso tempo de gás restante" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Classificação" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "A ler %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Eliminar expedição de mergulho" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Eliminar mergulho da expedição" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Remover mergulhos da expedição seleccionada" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Alterar numeração" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Alterar numeração..." #: download-dialog.c:153 msgid "Retry" msgstr "Repetir" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC em paragem deco" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC em fundo" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Transgressão na paragem de segurança" #: main.c:64 msgid "Sat" msgstr "Sáb" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Guardar como..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Guardar alterações?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Guardar Ficheiro Como" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Guardar como..." #: gtk-gui.c:1609 msgid "Save..." msgstr "Guardar..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Duração do segmento" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Seleccionar Eventos" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Seleccionar Eventos..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "" #: main.c:74 msgid "Sep" msgstr "Set" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Escrita do ficheiro req.txt curta.\nEstá Uemis Zúrich correctamente ligado?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Mais curto" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Mergulho mais curto" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Mostrar Colunas" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Mostrar PEA, PNE, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Mostrar MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Mostrar o tecto calculado" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Mostrar a vermelho o tecto reportado pelo dc" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Mostrar no mapa" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Mostrar gráfico de pHe" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Mostrar gráfico de pN%s" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Mostrar gráfico de pO%s" #: planner.c:217 msgid "Simulated Dive" msgstr "Mergulho simulado" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Tamanho" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarme de Velocidade" #: uemis.c:203 msgid "Speed Warning" msgstr "Advertência de velocidade" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Início" #: uemis-downloader.c:782 msgid "Start download" msgstr "Começar transferência" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Estatísticas" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Estatísticas %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Estatísticas" #: webservice.c:295 msgid "Status" msgstr "Estado" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Permanecer a %.*f %s durante %d:%02d min - runtime %d:%02u a %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Fato" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Dom" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Interv. Superf." #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Pressão atmosférica (mbar) " #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Alterar gás para %s\n" #: print.c:960 msgid "Table print" msgstr "Imprimir tabela" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Sugestão de troca de garrafa" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Informação da pressão da garrafa" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Definições técnicas" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatura" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatura:" #: gtk-gui.c:1631 msgid "Three" msgstr "Todo" #: main.c:64 msgid "Thu" msgstr "Qui" #: info-gtk.c:841 msgid "Time" msgstr "Tempo" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Para editar esta informação do mergulho\nseleccione-o na lista abaixo com duplo clique." #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Activar / Desactivar Zoom" #: planner.c:294 msgid "Too many gas mixes" msgstr "Demasiadas misturas de gás" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Demasiados pontos na rota" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Total" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Tempo total" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Peso total:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Transição de cota %.*f %s em %d:%02d min - runtime %d:%02u com %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Expedição %1$s, %2$s %3$d, %4$d (%5$d mergulho)" msgstr[1] "Viagem %1$s, %2$s %3$d, %4$d (%5$d mergulhos)" #: main.c:64 msgid "Tue" msgstr "Ter" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Tipo" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: O sistema de ficheiros está quase cheio\nDesligue / religue o computador de mergulho\ne clique em \"Repetir\"" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: sistema de ficheiros está cheio\nDesligue / religue o computador de mergulho\ne tentar novamente" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Falha ao iniciar Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Não é possivel criar contexto do libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Não é possivel criar o \"parser\" para %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Não se consegue abrir %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Unidades" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "" #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Usar clique direito para marcar no cursor a localização do mergulho" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Identificador de utilizador" #: gtk-gui.c:1627 msgid "User Manual" msgstr "" #: gtk-gui.c:1603 msgid "View" msgstr "Ver" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Visibilidade" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volume:" #: info.c:312 msgid "W" msgstr "O" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Aviso - Mergulhos extremamente longos podem provocar tempos de cálculos demorados" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Aviso - Planear mergulhos muito profundos pode demorar demasiado tempo" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Temp. de Água" #: webservice.c:163 msgid "Webservice" msgstr "Serviço web" #: main.c:64 msgid "Wed" msgstr "Qua" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Peso" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Sistema de lastro" #: gtk-gui.c:794 msgid "Weight:" msgstr "Peso:" #: gtk-gui.c:146 msgid "XML file" msgstr "Ficheiro XML " #: statistics-gtk.c:92 msgid "Year" msgstr "Ano" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Estatísticas anuais" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Tem já um computador de mergulho deste modelo\nchamado %s\n Subsurface pode manter um diminutivo para este aparelho para o distinguir do já existente. Por omissão o modelo e identificador do aparelho usado é como mostrado em baixo.\nSe não pretender atribuir um nome a este computador de mergulho, seleccione 'Cancelar'. Subsurface irá simplesmente mostrar como nome, o seu modelo (isto significa que não terá meio de distinguir ambos no registo de mergulho)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Existem alterações ainda não gravadas\nDeseja as guardar antes de fechar o ficheiro de dados ?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Existem alterações por guardar no ficheiro: %s \nDeseja guardar antes de fechar o ficheiro de dados ?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "ar" #: libdivecomputer.c:153 msgid "airtime" msgstr "tempo de ar" #: statistics.c:21 msgid "altitude" msgstr "" #: equipment.c:892 msgid "ankle" msgstr "tornozelo" #: libdivecomputer.c:149 msgid "ascent" msgstr "subida" #: equipment.c:893 msgid "backplate weight" msgstr "lastro no arnês" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "cinto" #: statistics.c:20 msgid "boat" msgstr "" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "favorito" #: statistics.c:21 msgid "cave" msgstr "" #: statistics.c:20 msgid "cavern" msgstr "" #: libdivecomputer.c:149 msgid "ceiling" msgstr "tecto" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "tecto (paragem de segurança)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "pés^3" #: uemis-downloader.c:384 msgid "data" msgstr "dados" #: statistics.c:23 msgid "deco" msgstr "deco" #: libdivecomputer.c:149 msgid "deco stop" msgstr "paragem de deco" #: statistics.c:20 msgid "deep" msgstr "" #: libdivecomputer.c:152 msgid "deepstop" msgstr "paragem de profundidade" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "identificador no diário de mergulho" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "identificação do local de mergulho" #: libdivecomputer.c:152 msgid "divetime" msgstr "duração do mergulho" #: statistics.c:20 msgid "drift" msgstr "" #: uemis-downloader.c:589 msgid "drysuit" msgstr "fato seco" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "para todos os mergulhos" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "para mergulho #%d -" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "para mergulhos #" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "para mergulho seleccionado" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "para mergulhos seleccionados" #: statistics.c:22 msgid "freshwater" msgstr "" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "pés" #: uemis-downloader.c:590 msgid "full suit" msgstr "fato completo" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "mudança de gás" #: libdivecomputer.c:153 msgid "heading" msgstr "cabeçalho" #: statistics.c:21 msgid "ice" msgstr "" #: equipment.c:890 msgid "integrated" msgstr "integrado" #: statistics.c:20 msgid "invalid" msgstr "" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "Número de evento inválido" #: uemis-downloader.c:590 msgid "jacket" msgstr "colete" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "libra" #: uemis-downloader.c:590 msgid "long john" msgstr "long john" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "máx ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "máxCNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Profundidade Máx" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrana" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "modelo=%u (0x%08x), firmware=%u (0x%08x), Nº de série=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "mais dados do identificador de mergulho" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "mais de %d dias" #: statistics.c:22 msgid "night" msgstr "" #: libdivecomputer.c:154 msgid "non stop time" msgstr "tempo sem paragem" #: libdivecomputer.c:149 msgid "none" msgstr "nenhum" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "limiar de pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "limiar de pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "limiar de pO%s" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "" #: statistics.c:21 msgid "pool" msgstr "" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "" #: libdivecomputer.c:150 msgid "safety stop" msgstr "paragem de segurança" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "paragem de segurança (obrigatória)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "paragem de segurança (voluntária)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semiseco" #: statistics.c:20 msgid "shore" msgstr "" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "superfície" #: statistics.c:22 msgid "teaching" msgstr "" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "Alarme do nível nos tecidos" #: statistics.c:22 msgid "training" msgstr "" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "José Ángel Tortosa Delfa\nPablo García Castro\nMatthias Kaehlcke\nSergio Schvezov\nAuni Somero\nHenrik Brautaset Aronsen (who doesn't speak Spanish)\nand Salvador Cuñat" #: libdivecomputer.c:150 msgid "transmitter" msgstr "transmissor" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "desc" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "desconhecido" #: equipment.c:540 msgid "unspecified" msgstr "não especificado" #: uemis-downloader.c:590 msgid "vest" msgstr "camisola" #: statistics.c:23 msgid "video" msgstr "" #: libdivecomputer.c:150 msgid "violation" msgstr "transgressão" #: equipment.c:1545 msgid "weight" msgstr "peso" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "fato húmido" #: libdivecomputer.c:149 msgid "workload" msgstr "carga" #: statistics.c:21 msgid "wreck" msgstr "" Subsurface-4.0.2/po/ru_RU.aliases000066400000000000000000000000031226345450700166350ustar00rootroot00000000000000ru Subsurface-4.0.2/po/ru_RU.po000066400000000000000000001474201226345450700156510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # Sergey Starosek , 2013 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 08:30+0000\n" "Last-Translator: Sergey Starosek \n" "Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/subsurface/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru_RU\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nНет событий\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr "> Месяц" #: webservice.c:289 msgid " Download" msgstr "Загрузить" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Выберите модель компьютера и устройство." #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr " начало" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr " конец" #: statistics-gtk.c:92 msgid "#" msgstr "№" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/мин" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s %2$s, %4$d %3$s, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %3$d %2$s %4$d %5$d:%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %3$d %2$s %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %3$d %2$s %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d мин" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dд %dч %dмин" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dч %dмин" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nРасчетный потолок %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nДеко:%uмин @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nДеко:неизв. время @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nВ деко" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%uмин" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nОст.безоп:%uмин @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nОст.безоп:неизв. время @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nПлан погружения Subsurface\nна основе значений нижний ГФ = %.0f и верхний ГФ = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fбар" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fбар" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fбар" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s (событие в %d:%02u)" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Ответ divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) или (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(нажмите для редактирования даты/времени)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(нажмите для редактирования даты/времени/глубины)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(нет погружений)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(отсутствует)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 куб.фут/мин" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 куб.фут/мин" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 л/мин" #: print.c:956 msgid "2 dives per page" msgstr "2 погр. на стр." #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "полный из 2-х" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 л/мин" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3м шаг для расчетного потолка" #: print.c:952 msgid "6 dives per page" msgstr "6 погр. на стр." #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Добавляйте сегменты ниже.\nКаждая строка - это часть планируемого погружения.\nЗапись с глубиной, временем и смесью описывает сегмент, который заканчивается на заданной глубине, длится (указано относительное время, т.е. '+3:30') либо заканчивается (указано абсолютное время, т.е. '@5:00', 'runtime') в указанное время, и использует указанную смесь.\nЕсли смесь не указана, то будет использоваться предыдущая смесь (или воздух, если смесь не была задана).\nСтрока с указанными глубиной и смесью, но без времени, - особая; она сообщает планировщику, что данная смесь доступна при подъеме по достижении указанной глубины.\nНастройка СС помечает погружения с ребризером, оставьте пустым для обычных погружений.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "воздух" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "О Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Добавить" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Добавить погружение..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Добавить событие \"закладка\"" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Добавить погружение" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Добавить событие \"замена смеси\"" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Добавить событие \"замена смеси\" в %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Добавить к поездке выше" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Добавить путевую точку" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Давл. возд." #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Темп. возд." #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Темп. воздуха в %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Приоритет загруженных погружений" #: main.c:73 msgid "Apr" msgstr "Апр" #: main.c:74 msgid "Aug" msgstr "Авг" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Автогруппировка" #: equipment.c:642 msgid "Available gases" msgstr "Доступные смеси" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Средняя" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Средняя" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Среднее" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Средняя" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Ср. глуб." #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Ср. глубина (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Сред. SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Ср. темп." #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Ср. время" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Переход на Откр. Цикл" #: gtk-gui.c:780 msgid "Bar" msgstr "Бар" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Партнер" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "Настройка СС" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Не найдена смесь %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Невозможно открыть файл преобразования (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Отменено, выход..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Отменено..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Невозможно добавить \"замена смеси\"" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Невозможно разобрать ответ!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Цельсий" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Выберите XML файл по умолчанию" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Выберите XML файлы для импорта в текущий файл данных" #: gtk-gui.c:1611 msgid "Close" msgstr "Закрыть" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Свернуть все" #: webservice.c:121 msgid "Connecting..." msgstr "Соединение..." #: webservice.c:25 msgid "Connection Error: " msgstr "Ошибка соединения:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Создать поездку выше" #: gtk-gui.c:786 msgid "CuFt" msgstr "куб. фут" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Баллон" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Баллон" #: planner.c:192 msgid "Cylinder for planning" msgstr "Баллон планировщика" #: equipment.c:1603 msgid "Cylinders" msgstr "Баллоны" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "Г:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ / ВНИМАНИЕ: В ПЛАНИРОВЩИКЕ ИСПОЛЬЗУЕТСЯ НОВАЯ РЕАЛИЗАЦИЯ АЛГОРИТМА БЮЛЬМАНА, КОТОРАЯ БЫЛА НЕДОСТАТОЧНО ПРОТЕСТИРОВАНА. МЫ НАСТОЯТЕЛЬНО РЕКОМЕНДУЕМ НЕ ПЛАНИРОВАТЬ ПОГРУЖЕНИЯ ТОЛЬКО НА ОСНОВЕ ЭТИХ РЕЗУЛЬТАТОВ." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Ошибка соединения с БД '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Ошибка запроса к БД '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Ошибка запроса get_events в БД.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Дата" #: info-gtk.c:824 msgid "Date and Time" msgstr "Дата и время" #: info-gtk.c:834 msgid "Date:" msgstr "Дата:" #: main.c:74 msgid "Dec" msgstr "Дек" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "XML файл по умолчанию" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Удалить дайвкомпьютер" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Удалить погружение" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Удалить погружения" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Глуб." #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Превышен лимит глубины" #: gtk-gui.c:774 msgid "Depth:" msgstr "Глубина:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Идентификатор" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Устройство или точка монтирования" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Показывать ошибочные погружения" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Погружение №%1$d - %2$s %4$02d.%3$02d.%5$04d в %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Погр. №%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Погружение %d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Название дайвкомпьютера" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Информация" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Погружение" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "План погружения - ЭТО ТОЛЬКО ИМИТАЦИЯ; НЕ ИСПОЛЬЗУЙТЕ ДЛЯ ПОГРУЖЕНИЯ" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Метки погружения" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Время погр." #: uemis.c:228 msgid "Dive Time Alert" msgstr "Тревога: время погружения" #: uemis.c:226 msgid "Dive Time Info" msgstr "Время погружения" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Производитель и модель" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Ошибка импорта данных погружения" #: gps.c:214 msgid "Dive locations" msgstr "Места погружений" #: info-gtk.c:575 msgid "Dive master" msgstr "Инструктор" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Начало погружения" #: print.c:502 msgid "Dive#" msgstr "Погр#" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Шрифт списка" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Инструктор" #: statistics-gtk.c:542 msgid "Dives" msgstr "Погружения" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Места погружений" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Загрузка из дайвкомпьютера" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Загрузка из дайвкомпьютера..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Загрузка из вебсервиса" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Загрузка из вебсервиса..." #: webservice.c:31 msgid "Download Success!" msgstr "Успешная загрузка!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Длительность" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Длительность (мин)" #: info.c:312 msgid "E" msgstr "В" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Редактировать" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Список дайвкомпьютеров" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Редактирование названий дайвкомпьютеров" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Редактирование поездки" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Краткие данные о поездке" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Чтобы редактировать название компьютера, дважды щелкните на нем мышью в поле названия" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Редактировать погружение" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Редактировать дату/время" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Редактировать погружения" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Множественное редактирование" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Редактировать данные поездки" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Показать / скрыть события" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Показать / скрыть метки" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Конец" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Конечная глубина" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Введите идентификатор пользователя и нажмите 'Загрузить'. По окончании загрузки вы можете нажать 'Применить' чтобы внести изменения." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Снаряжение" #: divelist-gtk.c:1370 msgid "Error" msgstr "Ошибка" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Ошибка получения солености воды" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Ошибка разбора даты/времени" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Ошибка разбора времени погружения" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Ошибка разбора смеси" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Ошибка разбора счетчика смесей" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Ошибка разбора макс. глубины" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Ошибка разбора выборки" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Ошибка регистрации обработчика завершения." #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Ошибка регистрации данных" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Ошибка регистрации обработчика событий." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Событие: сис.время=%, уст.время=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Событие: ожидание действия пользователя" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Развернуть все" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Экспортировать как файл UDDF" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Экспорт UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Экспорт погружения (-ий) в UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Фаренгейт" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Не получилось открыть %i файлов." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Ошибка разбора '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Ошибка разбора '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Ошибка чтения '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Ошибка чтения '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Фев" #: gtk-gui.c:776 msgid "Feet" msgstr "Фут" #: gtk-gui.c:1601 msgid "File" msgstr "Файл" #: gtk-gui.c:1604 msgid "Filter" msgstr "Фильтр" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Принудительная загрузка всех погружений" #: main.c:64 msgid "Fri" msgstr "Птн" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "верхний ГФ" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "верхний ГФ для плана" #: gtk-gui.c:997 msgid "GFlow" msgstr "нижний ГФ" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "нижний ГФ для плана" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (формат WGS84 или GPS)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Расход" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Расход" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Смесь" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Потребление смеси:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Смесь" #: gtk-gui.c:767 msgid "General Settings" msgstr "Общие настройки" #: gtk-gui.c:1606 msgid "Help" msgstr "Справка" #: webservice.c:296 msgid "Idle" msgstr "Простаивает" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Импорт файлов..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Информация" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Инициализация связи" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Ввести план" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ошибка разбора глубины \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ошибка - глубины более 400м не поддерживаются" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Неверная смесь в строке %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Неверное время старта" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Неверный идентификатор пользователя!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Янв" #: main.c:74 msgid "Jul" msgstr "Июл" #: main.c:73 msgid "Jun" msgstr "Июн" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Последняя остановка на 20 футах" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Последняя остановка на 6 метрах" #: print.c:985 msgid "Layout Options" msgstr "Параметры макета" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Линус Торвальдс, Дирк Хондел и другие, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Список" #: gtk-gui.c:785 msgid "Liter" msgstr "Литр" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Местонахождение" #: gtk-gui.c:1602 msgid "Log" msgstr "Журнал" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Максимум" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Самый долгий" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Тревога: заряд батареи" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Внимание: заряд батареи" #: gtk-gui.c:862 msgid "Map provider" msgstr "Поставщик карт" #: main.c:73 msgid "Mar" msgstr "Мар" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Пометить как ошибочное" #: gps.c:53 msgid "Mark location here" msgstr "Пометить точку здесь" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Пометить как верное" #: uemis.c:230 msgid "Marker" msgstr "Метка" #: print.c:502 msgid "Master" msgstr "Инструктор" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Внимание: макс. время деко" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Макс. глуб." #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Макс. глубина (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Макс. SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Макс. темп." #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Макс. глубина: %.*f %s\nДлительность: %d мин\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Макс. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Макс. давл." #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Максимум" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Максимум" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Максимум" #: main.c:73 msgid "May" msgstr "Май" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Объединить погружения" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Объединить с поездкой выше" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Объединить с поездкой ниже" #: gtk-gui.c:775 msgid "Meter" msgstr "Метр" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Мин. глуб." #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Мин. SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Мин. темп." #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Минимум" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Минимум" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Минимум" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Прочие настройки" #: gtk-gui.c:1512 msgid "Model" msgstr "Модель" #: main.c:64 msgid "Mon" msgstr "Пнд" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Кроссплатформенный журнал погружений" #: info.c:311 msgid "N" msgstr "С" #: gtk-gui.c:1607 msgid "New" msgstr "Новый" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Начать нумерацию с" #: gtk-gui.c:1634 msgid "Next DC" msgstr "След. ДК" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Имя устройства" #: uemis.c:232 msgid "No Tank Data" msgstr "Нет данных о баллоне" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Для этого погружения не указаны баллоны." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Примечания" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Высота примечаний (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Примечания наверху" #: main.c:74 msgid "Nov" msgstr "Ноя" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Окт" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Необычная ошибка возврата pthread" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Удалить выбранную запись?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Показывать только погружения с метками:" #: gtk-gui.c:291 msgid "Open File" msgstr "Открыть файл" #: gtk-gui.c:1608 msgid "Open..." msgstr "Открыть..." #: print.c:995 msgid "Ordering" msgstr "Макет страницы" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Высота прочих данных (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Кислород" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Тревога: PO2 при подъеме" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Внимание: PO2 при подъеме" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Внимание: PO2 (зеленый)" #: gtk-gui.c:781 msgid "PSI" msgstr "PSI" #: webservice.c:341 msgid "Password" msgstr "Пароль" #: info-gtk.c:565 msgid "Pick on map" msgstr "Выбрать на карте" #: gtk-gui.c:1605 msgid "Planner" msgstr "Планировщик" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Укажите свой логин и пароль для divelogs.de. Выбранные погружения будут добавлены к вашей учетной записи." #: gtk-gui.c:752 msgid "Preferences" msgstr "Предпочтения" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Предпочтения..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Давление" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Давление:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Пред. ДК" #: print.c:989 msgid "Print in color" msgstr "Цветная печать" #: print.c:978 msgid "Print only selected dives" msgstr "Печать выбранных погружений" #: print.c:974 msgid "Print selection" msgstr "Печать выделенных" #: print.c:939 print.c:946 msgid "Print type" msgstr "Настройки печати" #: gtk-gui.c:1612 msgid "Print..." msgstr "Печать..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Профиль" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Настройки профиля" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Высота профиля (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Профиль наверху" #: gtk-gui.c:1625 msgid "Quit" msgstr "Выход" #: uemis.c:218 msgid "RGT Alert" msgstr "Тревога: RGT" #: uemis.c:216 msgid "RGT Warning" msgstr "Внимание: RGT" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Оценка" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Чтение %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Удалить" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Удалить поездку" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Удалить из поездки" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Удалить событие здесь" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Удалить выделенные из поездки" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Перенумеровать" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Перенумеровать..." #: download-dialog.c:153 msgid "Retry" msgstr "Повторить" #: info.c:311 msgid "S" msgstr "Ю" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC при декостоп" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC при погружении" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Нарушение остановки безопасности" #: main.c:64 msgid "Sat" msgstr "Суб" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Сохранить как..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Сохранить изменения?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Сохранить файл как" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Сохранить как" #: gtk-gui.c:1609 msgid "Save..." msgstr "Сохранить..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Время сегмента" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Выбрать события" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Выбрать события..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Выбрать метки..." #: main.c:74 msgid "Sep" msgstr "Снт" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Прервана запись в файл req.txt\nПроверьте подключение Uemis Zurich." #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Минимум" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Самый короткий" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Показать колонки" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Показать EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Показать MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Показать расчетный потолок" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Показать потолок компьютера красным" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Показать на карте" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "График pHe" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "График pN%s" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "График pO%s" #: planner.c:217 msgid "Simulated Dive" msgstr "Моделирование погружения" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Объем" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Высота областей (%% oт макета)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Тревога: скорость" #: uemis.c:203 msgid "Speed Warning" msgstr "Внимание: скорость" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Начало" #: uemis-downloader.c:782 msgid "Start download" msgstr "Начать загрузку" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Статистика" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Статистика %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Статистика" #: webservice.c:295 msgid "Status" msgstr "Состояние" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Оставаться на %.*f %s в течение %d:%02d мин - рантайм %d:%02u на смеси %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Странное значение процентов %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Костюм" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Вск" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Пов. инт." #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Давление на поверхности (мбар)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Замена смеси на %s\n" #: print.c:960 msgid "Table print" msgstr "Таблица" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Метки отображаются только если они одинаковые для всех редактируемых погружений" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Предложена смена баллона" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Давление в баллоне" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Техн. настройки" #: gtk-gui.c:805 msgid "Temp" msgstr "Темп." #: statistics-gtk.c:92 msgid "Temperature" msgstr "Температура" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Температура:" #: gtk-gui.c:1631 msgid "Three" msgstr "Три панели" #: main.c:64 msgid "Thu" msgstr "Чтв" #: info-gtk.c:841 msgid "Time" msgstr "Время" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Для редактирования погружения\nдважды щелкните мышью на нем в списке" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Изменить масштаб" #: planner.c:294 msgid "Too many gas mixes" msgstr "Слишком много смесей" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Слишком много путевых точек" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Общая" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Общее время" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Общий вес:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Переход на %.*f %s за %d:%02d мин - рантайм %d:%02u на смеси %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Поездка %1$s, %3$d %2$s %4$d (%5$d погружение)" msgstr[1] "Поездка %1$s, %3$d %2$s %4$d (%5$d погружения)" msgstr[2] "Trip %1$s, %3$d %2$s %4$d (%5$d погружений)" #: main.c:64 msgid "Tue" msgstr "Втр" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Тип" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Файловая система почти заполнена\nОтсоедините и подключите дайв-компьютер\nи нажмите \"Повторить\"" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Файловая система заполнена\nОтсоедините и подключите дайв-компьютер\nи попробуйте заново" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Ошибка инициализации Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Невозможно создать контекст libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Невозможно создать анализатор для %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Невозможно открыть %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Единицы" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Выгрузить погружение (-я) на divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Выгрузить на divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Выгрузить на divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Для отметки нажмите правую кнопку мыши" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Идентификатор пользователя" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Руководство пользователя" #: gtk-gui.c:1603 msgid "View" msgstr "Вид" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Видимость" #: gtk-gui.c:784 msgid "Volume:" msgstr "Объем:" #: info.c:312 msgid "W" msgstr "З" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Внимание - расчет очень долгих погружений может занять много времени" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Внимание - расчет очень глубоких погружений может занять много времени" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Темп. воды" #: webservice.c:163 msgid "Webservice" msgstr "Вебсервис" #: main.c:64 msgid "Wed" msgstr "Срд" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Груз" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Грузовая система" #: gtk-gui.c:794 msgid "Weight:" msgstr "Вес:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML файл" #: statistics-gtk.c:92 msgid "Year" msgstr "Год" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Статистика за год" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "У вас уже есть дайвкомпьютер этой модели,\nкоторый называется %s.Subsurface позволяет именовать компьютеры чтобы различать их. По умолчанию это модель и идентификатор, указанные ниже.\nЕсли вы не хотите именовать этот компьютер, нажмите 'Отмена' и Subsurface будет показывать его модель вместо имени (и вы не сможете отличить их друг от друга в журналах)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "У вас есть несохраненные изменения.\nХотите ли вы их сохранить перед закрытием журнала?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "У вас есть несохраненные изменения в файле %s.\nХотите ли вы их сохранить перед закрытием журнала?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "воздух" #: libdivecomputer.c:153 msgid "airtime" msgstr "оставшееся время по воздуху" #: statistics.c:21 msgid "altitude" msgstr "высокогорье" #: equipment.c:892 msgid "ankle" msgstr "груз на ноги" #: libdivecomputer.c:149 msgid "ascent" msgstr "подъем" #: equipment.c:893 msgid "backplate weight" msgstr "груз на пластину" #: dive.c:48 msgid "bar" msgstr "Бар" #: equipment.c:891 msgid "belt" msgstr "пояс" #: statistics.c:20 msgid "boat" msgstr "с лодки" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "закладка" #: statistics.c:21 msgid "cave" msgstr "пещера" #: statistics.c:20 msgid "cavern" msgstr "каверна" #: libdivecomputer.c:149 msgid "ceiling" msgstr "потолок" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "потолок (остановка безопасности)" #: equipment.c:894 msgid "clip-on" msgstr "карабины" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "куб. фут" #: uemis-downloader.c:384 msgid "data" msgstr "данные" #: statistics.c:23 msgid "deco" msgstr "деко стоп" #: libdivecomputer.c:149 msgid "deco stop" msgstr "деко стоп" #: statistics.c:20 msgid "deep" msgstr "глубокое" #: libdivecomputer.c:152 msgid "deepstop" msgstr "глубокая остановка" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "ид. записи журнала" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "ид. места погружения" #: libdivecomputer.c:152 msgid "divetime" msgstr "время погружения" #: statistics.c:20 msgid "drift" msgstr "течение" #: uemis-downloader.c:589 msgid "drysuit" msgstr "сухой" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "для всех погружений" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "для погружения №%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "для погружений №" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "для выбранного погружения" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "для выбранных погружений" #: statistics.c:22 msgid "freshwater" msgstr "в пресной воде" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "фут" #: uemis-downloader.c:590 msgid "full suit" msgstr "полный" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "замена смеси" #: libdivecomputer.c:153 msgid "heading" msgstr "направление" #: statistics.c:21 msgid "ice" msgstr "подледное" #: equipment.c:890 msgid "integrated" msgstr "интегрированный" #: statistics.c:20 msgid "invalid" msgstr "ошибочное" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "неверный номер события" #: uemis-downloader.c:590 msgid "jacket" msgstr "куртка" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "кг" #: dive.c:88 msgid "l" msgstr "л" #: statistics.c:21 msgid "lake" msgstr "в озере" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "фунт" #: uemis-downloader.c:590 msgid "long john" msgstr "комбинезон" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "м" #: gtk-gui.c:956 msgid "max ppO2" msgstr "макс. ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "макс.CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "макс. глуб." #: uemis-downloader.c:591 msgid "membrane" msgstr "мембрана" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "мин" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "модель=%u (0x%08x), прошивка=%u (0x%08x), серийный номер=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "ид. дополнительных данных погружения" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "более %d дней" #: statistics.c:22 msgid "night" msgstr "ночное" #: libdivecomputer.c:154 msgid "non stop time" msgstr "время без остановки" #: libdivecomputer.c:149 msgid "none" msgstr "отсутствует" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "порог pHe" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "порог pN%s" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "порог pO%s" #: dive.c:44 msgid "pascal" msgstr "Па" #: statistics.c:23 msgid "photo" msgstr "фото" #: statistics.c:21 msgid "pool" msgstr "бассейн" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "оставшееся время на дне" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "в реке" #: libdivecomputer.c:150 msgid "safety stop" msgstr "остановка безопасности" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "остановка безопасности (обязательно)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "остановка безопасности (добровольно)" #: uemis-downloader.c:589 msgid "semidry" msgstr "полусухой" #: statistics.c:20 msgid "shore" msgstr "с берега" #: uemis-downloader.c:590 msgid "shorty" msgstr "короткий" #: libdivecomputer.c:150 msgid "surface" msgstr "поверхность" #: statistics.c:22 msgid "teaching" msgstr "обучение" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "насыщение тканей" #: statistics.c:22 msgid "training" msgstr "тренировка" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Sergey Starosek" #: libdivecomputer.c:150 msgid "transmitter" msgstr "передатчик" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "неизв" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "неизвестно" #: equipment.c:540 msgid "unspecified" msgstr "не указано" #: uemis-downloader.c:590 msgid "vest" msgstr "жилет" #: statistics.c:23 msgid "video" msgstr "видео" #: libdivecomputer.c:150 msgid "violation" msgstr "нарушение" #: equipment.c:1545 msgid "weight" msgstr "вес" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "мокрый" #: libdivecomputer.c:149 msgid "workload" msgstr "нагрузка" #: statistics.c:21 msgid "wreck" msgstr "рэк" Subsurface-4.0.2/po/sk_SK.aliases000066400000000000000000000000031226345450700166130ustar00rootroot00000000000000sk Subsurface-4.0.2/po/sk_SK.po000066400000000000000000001302171226345450700156230ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2012 # Dodiak , 2013 # Jozef Ivanecký , 2012 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:53+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/subsurface/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nBez záznamov\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Mesiac" #: webservice.c:289 msgid " Download" msgstr "Načítať" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr "Voľba typu počítača a zariadenia. " #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "začiatok" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "koniec" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s z %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dh %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dh %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nVypočítaná hladina %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeco:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeco:nezn. čas @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\nIn deco" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nBezpečnostná zastávka:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nBezpečnostná zastávka:nezn. čas @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface plan ponoru\nzrátaný s GFlow = %.0f a GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s udalosť o %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Odpoveď z " #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) alebo (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(klikni na zmenu dátumu/času)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(klikni na zmenu dátumu/času/hĺbky)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(žiadné ponory)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(nič)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 kubst/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 kubst/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 ponory na stránku" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "2 dielny oblek" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "3m krok pre výpočet hladiny" #: print.c:952 msgid "6 dives per page" msgstr "6 ponorov na stránku" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Pridaj segment nižšie.\nKaždý riadok predstavuje časť plánovaného ponoru.\nRiadok s hĺbkou, časom a dýchacou zmesou popisuje segment, ktorý končí v zadanej hĺbke, trvá zadaný čas (ak zadaný relatívne, napr. '+3:30') alebo končí v zadaný čas (ak zadaný absolútne, napr. '@5:00'), a používa zadanú zmes.\nNezadaná zmes znamená 'použi predchádzajúcu zmes' (alebo vzduch, ak žiadna zmes nebola zadaná).\nRiadok, ktorý ma zadanú hĺbku a dýchaciu zmes, no nemá zadaný čas, je špeciálny; informuje plánovač, že daná zmes je plánovaná len pre výstup po dosiahnutí zadanej hĺbky.\nCC SetPoint špecifikuje CC (rebreather) ponory, čiže nevypĺňať pre OC.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "Vzduch" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "O Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Pridať" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Pridať Ponor..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Pridaj poznámku" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Pridať ponor" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Pridaj zmenu zmesi" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Pridaj zmenu zmesi o %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Pridať do akcie vyššie" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Pridaj zastávku" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Tlak vzduchu" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Teplota vzduchu" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Teplota vzduchu v %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Vždycky preferuje nahratý ponor" #: main.c:73 msgid "Apr" msgstr "Apr" #: main.c:74 msgid "Aug" msgstr "Aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Automatické zgrupovanie" #: equipment.c:642 msgid "Available gases" msgstr "Zmesi k dispozícii" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Priemer" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Priemer" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Priemer" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Priemer" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Priemerná hĺbka" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Priem. hĺbka (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Priemerná spotreba" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Priemerná teplota" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Priemerný čas" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Záchrana na OC" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Partner" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Neviem nájsť zmes %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Nemôžem otvoriť stylesheet (%s)/%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Zrušené, korektne ukončenie..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Zrušené..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Nemôžem pridať zmenu zmesi" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Nemôžem spracovať odpoveď!" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Vyber default XML súbor" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Vyber XML súbor pre import do aktuálneho data súboru" #: gtk-gui.c:1611 msgid "Close" msgstr "Zatvoriť" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Zredukovať všetky" #: webservice.c:121 msgid "Connecting..." msgstr "Pripájam..." #: webservice.c:25 msgid "Connection Error: " msgstr "Chyba spojenia" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Vytvoriť novú akciu nad" #: gtk-gui.c:786 msgid "CuFt" msgstr "kubická stopa" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Fľaša" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Fľaša" #: planner.c:192 msgid "Cylinder for planning" msgstr "Fľaša pre plánovanie" #: equipment.c:1603 msgid "Cylinders" msgstr "Fľaše" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "H:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "VAROVANIE: TOTO JE NOVÁ IMPLEMENTÁCIA BUHLMANOVHO ALGORITMU A NA ŇOM IMPLEMENTOVANÝ PLÁNOVAČ PONOROV, KTORÝ VŠAK BOL MINIMÁLNE TESTOVANÝ. V ŽIADNOM PRÍPADE SA NEDOPORUČUJE PLÁNOVAŤ SKUTOČNÉ PONORY LEN POMOCOU TOHTO PROGRAMU." #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Spojenie s databázou zlýhalo '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Požiadavka na databázu zlyhala '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Neúspešná požiadavka: get_events.⏎\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Dátum" #: info-gtk.c:824 msgid "Date and Time" msgstr "Dátum a čas" #: info-gtk.c:834 msgid "Date:" msgstr "Dátum:" #: main.c:74 msgid "Dec" msgstr "Dec" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Default XML Súbor" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Zmaž údaje o počítači" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Zmazať ponor" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Zmazať ponory" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Hĺbka" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Prekročená Maximálna Hĺbka" #: gtk-gui.c:774 msgid "Depth:" msgstr "Hĺbka:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Id zariadenia" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Zariadenie alebo bod pripojenia" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Zobraz neplatné ponory" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Ponor #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Ponor #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Ponor #%d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Voliteľný názov počítača" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Informácie" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Poznámky" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Plán ponoru - TOTO JE LEN SIMULÁCIA; NEPOUŽÍVAJ NA POTÁPANIE" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Označenia ponorov" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Čas Ponoru" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Alarm Času Ponoru" #: uemis.c:226 msgid "Dive Time Info" msgstr "Info: Čas Ponoru" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Počítač - výrobca a produkt" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Chyba importu dát" #: gps.c:214 msgid "Dive locations" msgstr "Miesto ponoru" #: info-gtk.c:575 msgid "Dive master" msgstr "Divemaster" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "Začiatok ponoru?" #: print.c:502 msgid "Dive#" msgstr "Ponor č." #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Font pre ponory" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Ponory" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Miesta ponorov" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Nahratie údajov z počítača" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Nahratie údajov z počítača..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Nahratie údajov z internetu" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Nahratie údajov z internetu..." #: webservice.c:31 msgid "Download Success!" msgstr "Nahrávanie úspešne ukončené!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Dĺžka (min)" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Dĺžka (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Editovať" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Edituj názov zariadenia" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Zmena voliteľného mena počítača" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Editovať akciu" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Editovať sumár" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Zmeň voliteľný názov počítača dvojitým kliknutím na jeho meno" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Editovať ponor" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Editovať dátum/čas" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Editovať ponory" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Editovať viac ponorov" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Editovať sumár" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Povoliť / zakázať udalosti" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Povoľ / Zakaž označenia" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Koniec" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Cieľová hĺbka" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Zadaj identifikačné údaje užívateľa a použi 'Download'. Po ukončení nahrávania údajov môžeš použiť 'Apply' ak si praješ aplikovať zmeny." #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Výstroj" #: divelist-gtk.c:1370 msgid "Error" msgstr "Chyba" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Chyba získania slanosti vody" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Chyba spracovania času" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Chyba spracovania času ponoru" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Chyba spracovania zmesi plynu" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Chyba spracovania dýchacích zmesí" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Chyba spracovania maximálnej hĺbky" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Chyba spracovania vzoriek" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Chyba registrácie správcu ukončenia" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Chyba registrácie dát" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Chyba registrácia správcu udalosti." #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Udalosť: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Udalosť: Čakanie na vstup uživateľa" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Expandovať všetky" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Exportuj ako UDDF súbor" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "UDDF export ..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Exportuj ponor(y) do UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Chyba pri otváraní %i súborov" #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Chyba pri spracovaní '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Chyba pri spracovaní '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Chyba pri načítaní '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Chyba pri načítaní '%s'.\n" #: main.c:73 msgid "Feb" msgstr "Feb" #: gtk-gui.c:776 msgid "Feet" msgstr "stopa" #: gtk-gui.c:1601 msgid "File" msgstr "Súbor" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Vynútiť načítanie všetkých ponorov" #: main.c:64 msgid "Fri" msgstr "Pi" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh pre plán" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow pre plán" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 alebo GPS format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Použitá zmes" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Použitá zmes" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Použitá zmes" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Spotreba plynu:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Zmes" #: gtk-gui.c:767 msgid "General Settings" msgstr "Všeobecné nastavenia" #: gtk-gui.c:1606 msgid "Help" msgstr "Pomoc" #: webservice.c:296 msgid "Idle" msgstr "Nečinnosť" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importuj súbor(y)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Info" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Inicializácia komunikácie" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Plánovanie" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Neplatná hĺbka - nemožnosť spracovať \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Neplatná hĺbka - hodnoty pod 400m nie sú podporované" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Neplatná zmes na riadku %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Neplatný čas začiatku" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Neplatný identifikátor užívateľa!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "Jan" #: main.c:74 msgid "Jul" msgstr "Jul" #: main.c:73 msgid "Jun" msgstr "Jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Posledná zastávka v 20 stopách" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Posledná zastávka v 6 metroch" #: print.c:985 msgid "Layout Options" msgstr "Možnosti rozmiestnenia" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel a ďalší, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Zoznam" #: gtk-gui.c:785 msgid "Liter" msgstr "liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Miesto" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Najdlhší" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Najdlhší ponor" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Alarm: Slabá batéria" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Upozornenie: Slabá batéria" #: gtk-gui.c:862 msgid "Map provider" msgstr "Zdroj máp" #: main.c:73 msgid "Mar" msgstr "Mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Označ ako neplatný" #: gps.c:53 msgid "Mark location here" msgstr "Označ pozíciu" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Označ ako platný" #: uemis.c:230 msgid "Marker" msgstr "Značka" #: print.c:502 msgid "Master" msgstr "Master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Upozornenie: Max. dekompresný čas" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Max. hĺbka" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Max. hĺbka (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max. spotreba" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max. teplota" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Max. hĺbka: %.*f %s\nDĺžka: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Max. tlak" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Maximum" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Maximum" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Maximum" #: main.c:73 msgid "May" msgstr "Máj" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Zlučiť ponory" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Spoj akciu s akciou nad" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Spoj akciu s akciou pod" #: gtk-gui.c:775 msgid "Meter" msgstr "meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min. hĺbka" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. spotreba" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min. teplota" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Minimum" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Rôzne voľby" #: gtk-gui.c:1512 msgid "Model" msgstr "Model" #: main.c:64 msgid "Mon" msgstr "Po" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Multiplatformový SW na správu ponorov v C" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Nový" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nové začiatočné číslo" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Nasledujúci DC" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Voliteľný názov" #: uemis.c:232 msgid "No Tank Data" msgstr "Žiadne informácie o fľaši" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Pre tento ponor neboli zvolené žiadne fľaše." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Poznámky" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Výška poznámok (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Poznámky na vrchu" #: main.c:74 msgid "Nov" msgstr "Nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "Okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Nešpecifikovaná PTHREAD chyba" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Môžem zmazať položku?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Zobraz ponory s nasledujúcimi označeniami:" #: gtk-gui.c:291 msgid "Open File" msgstr "Otvoriť súbor" #: gtk-gui.c:1608 msgid "Open..." msgstr "Otvoriť..." #: print.c:995 msgid "Ordering" msgstr "Radenie" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Výška pre ostatné údaje (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Kyslik" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "PO2 Alarm: Výstup" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "PO2 Upozornenie: Výstup" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "PO2 Upozornenie: Zelená" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Heslo" #: info-gtk.c:565 msgid "Pick on map" msgstr "Vyber na mape" #: gtk-gui.c:1605 msgid "Planner" msgstr "Plánovač" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Zadaj užívateľské meno a heslo pre divelogs.de. Vybrané ponory budú pridané k Tvojmu účtu" #: gtk-gui.c:752 msgid "Preferences" msgstr "Nastavenia" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Nastavenia..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Tlak" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Tlak:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Predchádzajúci DC" #: print.c:989 msgid "Print in color" msgstr "Farebná tlač" #: print.c:978 msgid "Print only selected dives" msgstr "Tlačiť vybrané ponory" #: print.c:974 msgid "Print selection" msgstr "Tlačiť výber" #: print.c:939 print.c:946 msgid "Print type" msgstr "Druh tlače" #: gtk-gui.c:1612 msgid "Print..." msgstr "Tlačiť..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Nastavenia profilu" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Výška profilu (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil na vrchu" #: gtk-gui.c:1625 msgid "Quit" msgstr "Koniec" #: uemis.c:218 msgid "RGT Alert" msgstr "Alarm: zostávajúci čas plynu" #: uemis.c:216 msgid "RGT Warning" msgstr "Upozornenie: zostávajúci čas plynu" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Hodnotenie" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Načítavam %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Zmaž" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Vymaž akciu" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Vymaž ponor z akcie" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Zmaž túto udalosť" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Vymaž vybrané ponory z akcie" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Prečíslovanie" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Prečíslovanie..." #: download-dialog.c:153 msgid "Retry" msgstr "Skús znovu" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "Spotreba plynu" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC počas dekompresnej zastávky" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC počas ponoru" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Nedodržaná bezpečnostná zastávka" #: main.c:64 msgid "Sat" msgstr "So" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Uložiť ako..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Uložiť zmeny?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Uložiť súbor ako" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Uložiť ako" #: gtk-gui.c:1609 msgid "Save..." msgstr "Uložiť..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Časový segment" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Voľba udalosti" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Voľba udalosti..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Zvoľ označenia..." #: main.c:74 msgid "Sep" msgstr "Sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Čiastočný zápis do req.txt súboru\nJe Uemis Zurich korektne pripojený?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Najkratší" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Najkratší ponor" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Zobraz stĺpce" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Zobraz EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Zobraz MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Zobraz vypočítanú hladinu" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Zobraz počítačom hlásenú hladinu červenou" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Zobraz na mape" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Zobraz pHe graf" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Zobraz pN%s graf" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Zobraz pO%s graf" #: planner.c:217 msgid "Simulated Dive" msgstr "Simulovaný Ponor" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Veľkosť" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Rozdelenie výšky (%% celej plochy)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: Rýchlosť" #: uemis.c:203 msgid "Speed Warning" msgstr "Upozornenie: Rýchlosť" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Štart" #: uemis-downloader.c:782 msgid "Start download" msgstr "Začať nahrávanie" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Štatistika" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Štatistika %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Štatistiky" #: webservice.c:295 msgid "Status" msgstr "Stav" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Zostaň v %.*f %s na %d:%02d min - runtime %d:%02u na %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Zvláštne percenta v %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Oblek" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "Ne" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Povrchový interval" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Tlak na hladine (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Zmena plynu na %s\n" #: print.c:960 msgid "Table print" msgstr "Tlač tabuľky" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Označenia sú zobrazené len ak sú identické pre všetky editované ponory" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Odporúčaná zmena fľaše" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Info: Tlak vo fľaši" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tec nastavenia" #: gtk-gui.c:805 msgid "Temp" msgstr "Teplota" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Teplota" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Teplota:" #: gtk-gui.c:1631 msgid "Three" msgstr "Kombinovaný" #: main.c:64 msgid "Thu" msgstr "Št" #: info-gtk.c:841 msgid "Time" msgstr "Čas" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Na editovanie informácii o ponore\nklikni 2x na ponor v zozname" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zmeň veľkosť" #: planner.c:294 msgid "Too many gas mixes" msgstr "Príliš veľa zmesí" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "Príliš veľa zastávok" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Celkový čas" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Celkový čas" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Celková hmotnosť:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Prechod na %.*f %s v %d:%02d min - runtime %d:%02u na %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Akcia %1$s, %2$s %3$d, %4$d (%5$d ponor)" msgstr[1] "Akcia %1$s, %2$s %3$d, %4$d (%5$d ponorov)" msgstr[2] "Akcia %1$s, %2$s %3$d, %4$d (%5$d ponorov)" #: main.c:64 msgid "Tue" msgstr "Ut" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Typ" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Súborovy systém takmer plný\nOdpoj/znovu pripoj počítač\na klikni na 'Retry'" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Súborový systém plný\nOdpoj a znovu pripoj počítač\na skus znovu" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Uemis - inicializácia neúspešná" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Problém inicializácie libdivecomputer" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Nie je možné spracovať %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Nie je možné otvoriť %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Jednotky" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Nahraj ponor(y) na divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Nahraj na divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Nahraj na divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Použi pravé tlačidlo na označenie miesta ponor pod kurzorom" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Identifikátor Uživateľa" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Užívateľská príručka" #: gtk-gui.c:1603 msgid "View" msgstr "Náhľad" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Viditeľnosť" #: gtk-gui.c:784 msgid "Volume:" msgstr "Objem:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Upozornenie - príliš dlhý ponor, výpočet môže trvať dlhšie" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Upozornenie - príliš hlboký ponor, môže trvať príliš dlho" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Teplota vody" #: webservice.c:163 msgid "Webservice" msgstr "Webservis" #: main.c:64 msgid "Wed" msgstr "St" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Závažie" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Závažie" #: gtk-gui.c:794 msgid "Weight:" msgstr "Závažie:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML súbor" #: statistics-gtk.c:92 msgid "Year" msgstr "Rok" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Ročná štatistika" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Už máš jeden počítač tohto druhu\npomenovaný ako %s\nSubsurface vie pracovať s voliteľnými menami pre rovnaké typy počítačov, aby bolo možné ich navzájom oddeliť. Prednastavený je model s identifikáciou zobrazený nižšie.\nAk nechceš pomenovať tento počítač, klikni na 'Cancel' a Subsurface jednoducho zobrazí model počítača ako jeho meno (čo môže znamenať, že budeš mať problém identifikovať počítač medzi záznamami o ponoroch)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Máš neuložené zmeny.\nChceš ich uložiť pred zatvorením súboru?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Máš neuložené zmeny v súbore %s \nChceš ich uložiť pred zatvorením súboru?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "vzduch" #: libdivecomputer.c:153 msgid "airtime" msgstr "čas na vzduchu" #: statistics.c:21 msgid "altitude" msgstr "výškovy" #: equipment.c:892 msgid "ankle" msgstr "členok" #: libdivecomputer.c:149 msgid "ascent" msgstr "výstup" #: equipment.c:893 msgid "backplate weight" msgstr "backplate závažie" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "opasok" #: statistics.c:20 msgid "boat" msgstr "z lode" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "poznámka" #: statistics.c:21 msgid "cave" msgstr "jaskyňa" #: statistics.c:20 msgid "cavern" msgstr "dutina" #: libdivecomputer.c:149 msgid "ceiling" msgstr "strop" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "strop (bezpečnostná zastávka)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "cuft" #: uemis-downloader.c:384 msgid "data" msgstr "data" #: statistics.c:23 msgid "deco" msgstr "" #: libdivecomputer.c:149 msgid "deco stop" msgstr "dekompresná zastávka" #: statistics.c:20 msgid "deep" msgstr "hlboký" #: libdivecomputer.c:152 msgid "deepstop" msgstr "hĺbková zastávka" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "id položky logu" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "id dát miesta ponoru" #: libdivecomputer.c:152 msgid "divetime" msgstr "čas ponoru" #: statistics.c:20 msgid "drift" msgstr "prúdový" #: uemis-downloader.c:589 msgid "drysuit" msgstr "suchý oblek" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "pre všetky ponory" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "pre ponor #%d" #: statistics.c:217 #, c-format msgid "for dives #" msgstr "pre ponory" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "pre vybraný ponor" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "pre vybrané ponory" #: statistics.c:22 msgid "freshwater" msgstr "sladká voda" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "celotelový oblek" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "zmena plynu" #: libdivecomputer.c:153 msgid "heading" msgstr "smer" #: statistics.c:21 msgid "ice" msgstr "ľad" #: equipment.c:890 msgid "integrated" msgstr "integrované" #: statistics.c:20 msgid "invalid" msgstr "neplatný" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "neplatné číslo udalosti" #: uemis-downloader.c:590 msgid "jacket" msgstr "vesta" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "jazero" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "US libra" #: uemis-downloader.c:590 msgid "long john" msgstr "long john" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max. ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "max. CNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "max. hĺbka" #: uemis-downloader.c:591 msgid "membrane" msgstr "membrana" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "id ďalších dát ponoru" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "viac než %d dní" #: statistics.c:22 msgid "night" msgstr "nočný" #: libdivecomputer.c:154 msgid "non stop time" msgstr "non stop čas" #: libdivecomputer.c:149 msgid "none" msgstr "žiaden" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe hranica" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s hranica" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s hranica" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "fotenie" #: statistics.c:21 msgid "pool" msgstr "bazén" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "rieka" #: libdivecomputer.c:150 msgid "safety stop" msgstr "bezpečnostná zastávka" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "bezpečnostná zastávka (povinná)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "bezpečnostná zastávka (dobrovoľná)" #: uemis-downloader.c:589 msgid "semidry" msgstr "polosuchý" #: statistics.c:20 msgid "shore" msgstr "z brehu" #: uemis-downloader.c:590 msgid "shorty" msgstr "krátky" #: libdivecomputer.c:150 msgid "surface" msgstr "povrch" #: statistics.c:22 msgid "teaching" msgstr "výuka" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "upozornenie nasýtenia tkanív" #: statistics.c:22 msgid "training" msgstr "tréning" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Jozef (Ďoďo) Ivanecký" #: libdivecomputer.c:150 msgid "transmitter" msgstr "vysielač" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "nez." #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "neznámy" #: equipment.c:540 msgid "unspecified" msgstr "nešpecifikovaný" #: uemis-downloader.c:590 msgid "vest" msgstr "vesta" #: statistics.c:23 msgid "video" msgstr "kamera" #: libdivecomputer.c:150 msgid "violation" msgstr "prekročenie" #: equipment.c:1545 msgid "weight" msgstr "hmotnosť" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "neoprén" #: libdivecomputer.c:149 msgid "workload" msgstr "záťaž" #: statistics.c:21 msgid "wreck" msgstr "vrak" Subsurface-4.0.2/po/sv_SE.aliases000066400000000000000000000000031226345450700166200ustar00rootroot00000000000000sv Subsurface-4.0.2/po/sv_SE.po000066400000000000000000001260131226345450700156270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: # dirkhh , 2013 # stone4x4 , 2013 # Henrik Brautaset Aronsen , 2012 msgid "" msgstr "" "Project-Id-Version: subsurface\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-05-14 21:53-0400\n" "PO-Revision-Date: 2013-05-15 01:57+0000\n" "Last-Translator: dirkhh \n" "Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/subsurface/language/sv_SE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv_SE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: gtk-gui.c:1179 msgid "" "\n" "No Events\n" msgstr "\nInga händelser\n" #: statistics-gtk.c:94 msgctxt "Stats" msgid " > Month" msgstr " > Månad" #: webservice.c:289 msgid " Download" msgstr "Ladda ned" #: download-dialog.c:385 msgid " Please select dive computer and device. " msgstr " Välj dykdator och enhet" #: profile.c:429 msgctxt "Starts with space!" msgid " begin" msgstr "start" #: profile.c:430 msgctxt "Starts with space!" msgid " end" msgstr "slut" #: statistics-gtk.c:92 msgid "#" msgstr "#" #: print.c:267 print.c:326 #, c-format msgid "%.*f %s" msgstr "%.*f %s" #: print.c:344 #, c-format msgid "%.*f %s\n" msgstr "%.*f %s\n" #: statistics-gtk.c:170 statistics-gtk.c:396 statistics-gtk.c:498 #: statistics-gtk.c:500 statistics-gtk.c:502 #, c-format msgid "%.*f %s/min" msgstr "%.*f %s/min" #: planner.c:589 #, c-format msgid "%.0f%s of %s\n" msgstr "%.0f%s av %s\n" #. ++GETTEXT 80 chars: lead text ("" or localized "Dive #%d - ") weekday, #. monthname, day, year, hour, min #: print.c:88 #, c-format msgid "%1$s%2$s, %3$s %4$d, %5$d %6$d:%7$02d" msgstr "%1$s%2$s, %4$d %3$s, %5$d %6$d:%7$02d" #. ++GETTEXT 160 chars: weekday, monthname, day, year, hour, min #: print.c:566 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$dh%6$02d" msgstr "%1$s, %3$d %2$s, %4$d %5$dh%6$02d" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, hour:min #: divelist.c:565 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$02d:%6$02d" msgstr "%1$s, %3$d %2$s, %4$d %5$02d:%6$02d" #. ++GETTEXT 80 chars: weekday, monthname, day, year, hour, min #: statistics-gtk.c:349 #, c-format msgid "%1$s, %2$s %3$d, %4$d %5$2d:%6$02d" msgstr "%1$s, %3$d %2$s, %4$d %5$2d:%6$02d" #: print.c:582 statistics-gtk.c:356 #, c-format msgid "%d min" msgstr "%d min" #: statistics.c:204 #, c-format msgid "%dd %dh %dmin" msgstr "%dd %dt %dmin" #: statistics.c:206 #, c-format msgid "%dh %dmin" msgstr "%dt %dmin" #: print.c:322 #, c-format msgid "%s" msgstr "%s" #: profile.c:2191 #, c-format msgid "" "%s\n" "CNS:%u%%" msgstr "%s\nCNS:%u%%" #: profile.c:2159 #, c-format msgid "" "%s\n" "Calculated ceiling %.0f %s" msgstr "%s\nBeräknat tak %.0f %s" #: profile.c:2175 #, c-format msgid "" "%s\n" "Deco:%umin @ %.0f %s" msgstr "%s\nDeko:%umin @ %.0f %s" #: profile.c:2178 #, c-format msgid "" "%s\n" "Deco:unkn time @ %.0f %s" msgstr "%s\nDeko:okänd tid @ %.0f %s" #: profile.c:2215 #, c-format msgid "" "%s\n" "EAD:%d%s\n" "END:%d%s\n" "EADD:%d%s" msgstr "%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s" #: profile.c:2184 #, c-format msgid "" "%s\n" "In deco" msgstr "%s\ni deko" #: profile.c:2208 #, c-format msgid "" "%s\n" "MOD:%d%s" msgstr "%s\nMOD:%d%s" #: profile.c:2187 #, c-format msgid "" "%s\n" "NDL:%umin" msgstr "%s\nNDL:%umin" #: profile.c:2149 #, c-format msgid "" "%s\n" "P:%d %s" msgstr "%s\nP:%d %s" #: profile.c:2167 #, c-format msgid "" "%s\n" "Safetystop:%umin @ %.0f %s" msgstr "%s\nSåkerhetsstopp:%umin @ %.0f %s" #: profile.c:2170 #, c-format msgid "" "%s\n" "Safetystop:unkn time @ %.0f %s" msgstr "%s\nSäkerhetsstopp:okänd tid @ %.0f %s" #: planner.c:509 #, c-format msgid "" "%s\n" "Subsurface dive plan\n" "based on GFlow = %.0f and GFhigh = %.0f\n" "\n" msgstr "%s\nSubsurface dykplan\nbaserad på GFlow = %.0f och GFhigh = %.0f\n\n" #: profile.c:2154 #, c-format msgid "" "%s\n" "T:%.1f %s" msgstr "%s\nT:%.1f %s" #: profile.c:2203 #, c-format msgid "" "%s\n" "pHe:%.2fbar" msgstr "%s\npHe:%.2fbar" #: profile.c:2199 #, c-format msgid "" "%s\n" "pN%s:%.2fbar" msgstr "%s\npN%s:%.2fbar" #: profile.c:2195 #, c-format msgid "" "%s\n" "pO%s:%.2fbar" msgstr "%s\npO%s:%.2fbar" #: gtk-gui.c:2101 #, c-format msgid "%s event at %d:%02u" msgstr "%s händelse vid %d:%02u" #: divelist-gtk.c:1370 #, c-format msgid "%s: Response from divelogs.de" msgstr "%s: Svar från divelogs.de" #: dive.c:921 #, c-format msgid "(%s) or (%s)" msgstr "(%s) eller (%s)" #: info-gtk.c:489 msgid "(click to edit date/time)" msgstr "(klicka för att ändra datum/tid)" #: info-gtk.c:491 msgid "(click to edit date/time/depth)" msgstr "(klicka för att ändra datum/tid/djup)" #: statistics.c:265 #, c-format msgid "(no dives)" msgstr "(inga dyk)" #: gtk-gui.c:2373 msgid "(nothing)" msgstr "(inget)" #: planner-gtk.c:410 msgid "0.6 cuft/min" msgstr "0.6 ft³/min" #: planner-gtk.c:409 msgid "0.7 cuft/min" msgstr "0.7 ft³/min" #: planner-gtk.c:415 msgid "17 l/min" msgstr "17 l/min" #: print.c:956 msgid "2 dives per page" msgstr "2 dyk per sida" #: uemis-downloader.c:590 msgid "2 pcs full suit" msgstr "2 pcs full suit" #: planner-gtk.c:414 msgid "20 l/min" msgstr "20 l/min" #: gtk-gui.c:989 msgid "3m increments for calculated ceiling" msgstr "beräknat tak i 3m steg" #: print.c:952 msgid "6 dives per page" msgstr "6 dyk per sida" #: planner-gtk.c:346 msgid "" "Add segments below.\n" "Each line describes part of the planned dive.\n" "An entry with depth, time and gas describes a segment that ends at the given depth, takes the given time (if relative, e.g. '+3:30') or ends at the given time (if absolute e.g '@5:00', 'runtime'), and uses the given gas.\n" "An empty gas means 'use previous gas' (or AIR if no gas was specified).\n" "An entry that has a depth and a gas given but no time is special; it informs the planner that the gas specified is available for the ascent once the depth given has been reached.\n" "CC SetPoint specifies CC (rebreather) dives, leave empty for OC.\n" msgstr "Lägg till dyksegment nedan. Var rad beskriver en del av den planerade dykningen. En rad med djup, tid och gas-information beskriver ett segment som slutar på det givna djupet, efter den givna tiden (om relativ tid, t.ex. '+3:30') eller vid den givna tiden (om absolut), och använder den givna gasen. En tom gas betyder 'samma gas som tidigare segment'' (eller luft om det inte fanns en tidigare gas). En rad som har ett djup och gas men ingen tid är speciell; det informerar planeraren att den gasen kan användas för planering när planen överskrider det givna djpet. CC SetPoint används for CC (rebreather) dykningar, lämna tomt för OC.\n" #: planner-gtk.c:272 msgid "AIR" msgstr "LUFT" #: gtk-gui.c:1273 gtk-gui.c:1626 msgid "About Subsurface" msgstr "Om Subsurface" #: gtk-gui.c:2116 msgid "Add" msgstr "Lägg till" #: gtk-gui.c:1618 msgid "Add Dive..." msgstr "Nytt dyk..." #: gtk-gui.c:2170 msgid "Add bookmark event here" msgstr "Lägg till ett bokmärke här" #: divelist-gtk.c:1662 msgid "Add dive" msgstr "Nytt dyk" #: gtk-gui.c:2165 msgid "Add gas change event here" msgstr "Lägg till gasbyte här" #: equipment.c:633 #, c-format msgid "Add gaschange event at %d:%02u" msgstr "Lägg till gasbyte här vid %d:%02u" #: divelist-gtk.c:1781 msgid "Add to trip above" msgstr "Kombinera med resan ovan" #: planner-gtk.c:434 msgid "Add waypoint" msgstr "Lägg till" #: statistics-gtk.c:608 msgid "Air Press" msgstr "Lufttryck" #: statistics-gtk.c:607 msgid "Air Temp" msgstr "Lufttemp" #: info-gtk.c:590 #, c-format msgid "Air Temp in %s" msgstr "Lufttemp i %s" #: download-dialog.c:403 msgid "Always prefer downloaded dive" msgstr "Föredra alltid nyladdad dykinformation" #: main.c:73 msgid "Apr" msgstr "apr" #: main.c:74 msgid "Aug" msgstr "aug" #: gtk-gui.c:1640 msgid "Autogroup" msgstr "Gruppera automatiskt" #: equipment.c:642 msgid "Available gases" msgstr "Tillgänglig gas" #: statistics-gtk.c:100 msgctxt "Depth" msgid "Average" msgstr "Genomsnitt" #: statistics-gtk.c:97 msgctxt "Duration" msgid "Average" msgstr "Genomsnitt" #: statistics-gtk.c:103 msgctxt "SAC" msgid "Average" msgstr "Genomsnitt" #: statistics-gtk.c:106 msgctxt "Temp" msgid "Average" msgstr "Genomsnitt" #: statistics-gtk.c:562 statistics-gtk.c:599 msgid "Avg Depth" msgstr "Medeldjup" #: info-gtk.c:932 #, c-format msgid "Avg Depth (%s):" msgstr "Medeldjup (%s):" #: statistics-gtk.c:570 msgid "Avg SAC" msgstr "Medel-SAC" #: statistics-gtk.c:545 msgid "Avg Temp" msgstr "Medel-temp" #: statistics-gtk.c:552 msgid "Avg Time" msgstr "Medel-tid" #: profile.c:426 #, c-format msgid "Bailing out to OC" msgstr "Bailout till öppet system" #: gtk-gui.c:780 msgid "Bar" msgstr "bar" #: info-gtk.c:576 info-gtk.c:1005 print.c:503 msgid "Buddy" msgstr "Parkamrat" #: planner-gtk.c:301 msgid "CC SetPoint" msgstr "CC SetPoint" #: planner.c:131 #, c-format msgid "Can't find gas %d/%d" msgstr "Kan inte hitta gasen %d/%d" #: parse-xml.c:1944 #, c-format msgid "Can't open stylesheet (%s)/%s" msgstr "Kunde inte öppna stilmall (%s)%s" #: uemis-downloader.c:932 msgid "Cancelled, exiting cleanly..." msgstr "Avbrutet ..." #: libdivecomputer.c:757 msgid "Cancelled..." msgstr "Avbrutet ..." #: equipment.c:621 msgid "Cannot add gas change" msgstr "Kan inte lägga till gasbyte" #: webservice.c:29 msgid "Cannot parse response!" msgstr "Kan inte tolka respons" #: gtk-gui.c:790 msgid "Celsius" msgstr "Celsius" #: gtk-gui.c:680 msgid "Choose Default XML File" msgstr "Välj standard XML-fil" #: gtk-gui.c:2275 msgid "Choose XML Files To Import Into Current Data File" msgstr "Välj vilka XML-filer du vill importera" #: gtk-gui.c:1611 msgid "Close" msgstr "Stäng" #: divelist-gtk.c:1799 msgid "Collapse all" msgstr "Sammanslå alla" #: webservice.c:121 msgid "Connecting..." msgstr "Kontaktar..." #: webservice.c:25 msgid "Connection Error: " msgstr "Kontaktfel:" #: divelist-gtk.c:1771 msgid "Create new trip above" msgstr "Ny resa innan" #: gtk-gui.c:786 msgid "CuFt" msgstr "ft^3" #: divelist-gtk.c:820 gtk-gui.c:810 msgid "Cyl" msgstr "Cyl" #: equipment.c:982 equipment.c:1093 print.c:201 msgid "Cylinder" msgstr "Flaska" #: planner.c:192 msgid "Cylinder for planning" msgstr "Flaska för planering" #: equipment.c:1603 msgid "Cylinders" msgstr "Flaskor" #: profile.c:2145 #, c-format msgid "D:%.1f %s" msgstr "D:%.1f %s" #: planner-gtk.c:359 msgid "" "DISCLAIMER / WARNING: THIS IS A NEW IMPLEMENTATION OF THE BUHLMANN ALGORITHM" " AND A DIVE PLANNER IMPLEMENTION BASED ON THAT WHICH HAS RECEIVED ONLY A " "LIMITED AMOUNT OF TESTING. WE STRONGLY RECOMMEND NOT TO PLAN DIVES SIMPLY " "BASED ON THE RESULTS GIVEN HERE." msgstr "VARNING: DETTA ÄR EN NY IMPLEMENTATION AV BÜHLMANN'S DEKO ALGORITM OCH EN DYKPLANERARE BASERAD PÅ DEN, OCH KODEN HAR SETT ENDAST LITE TESTNING. VI FÖRESLÅR ATT MAN INTE GÖR DYK BASERADE ENBART PÅ RESULTATEN AV DENNA PLAN!" #: parse-xml.c:1829 #, c-format msgid "Database connection failed '%s'.\n" msgstr "Databasanslutning misslyckades '%s'.\n" #: parse-xml.c:1836 #, c-format msgid "Database query failed '%s'.\n" msgstr "Databasfråga misslyckades '%s'.\n" #: parse-xml.c:1794 #, c-format msgid "Database query get_events failed.\n" msgstr "Databasfråga get_events misslyckades.\n" #: divelist-gtk.c:813 print.c:502 statistics-gtk.c:590 msgid "Date" msgstr "Datum" #: info-gtk.c:824 msgid "Date and Time" msgstr "Datum och tid" #: info-gtk.c:834 msgid "Date:" msgstr "Datum:" #: main.c:74 msgid "Dec" msgstr "dec" #: gtk-gui.c:852 msgid "Default XML Data File" msgstr "Standard XML-fil" #: gtk-gui.c:1558 msgid "Delete a dive computer information entry" msgstr "Radera dykdatorinformation" #: divelist-gtk.c:1289 divelist-gtk.c:1340 divelist-gtk.c:1647 msgid "Delete dive" msgstr "Radera dyk" #: divelist-gtk.c:1291 divelist-gtk.c:1646 msgid "Delete dives" msgstr "Radera dyk" #: print.c:502 statistics-gtk.c:92 msgid "Depth" msgstr "Djup" #: uemis.c:222 msgid "Depth Limit Exceeded" msgstr "Maxdjup har överskridits" #: gtk-gui.c:774 msgid "Depth:" msgstr "Djup:" #: gtk-gui.c:1517 msgid "Device Id" msgstr "Enhetsnamn" #: download-dialog.c:341 msgid "Device or mount point" msgstr "Enhet eller monteringspunkt" #: gtk-gui.c:847 msgid "Display invalid dives" msgstr "Visa ogiltiga dyk" #. ++GETTEXT 80 char buffer: dive nr, weekday, month, day, year, hour, min #. #: info.c:88 #, c-format msgid "Dive #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" msgstr "Dyk #%1$d - %2$s %3$02d/%4$02d/%5$04d at %6$d:%7$02d %8$s" #: info.c:130 print.c:83 #, c-format msgid "Dive #%d - " msgstr "Dyk #%d - " #: libdivecomputer.c:436 #, c-format msgid "Dive %d: %s %d %04d" msgstr "Dyk #%d: %s %d %04d" #: gtk-gui.c:2355 msgid "Dive Computer Nickname" msgstr "Dykdatornamn" #: gtk-gui.c:1861 info-gtk.c:705 statistics-gtk.c:581 msgid "Dive Info" msgstr "Information" #: gtk-gui.c:1853 msgid "Dive Notes" msgstr "Dykanteckningar" #: planner-gtk.c:370 msgid "Dive Plan - THIS IS JUST A SIMULATION; DO NOT USE FOR DIVING" msgstr "Dykplan - DETTA ÄR BARA EN SIMULATION; ANVÄND INTE FÖR DYKNING" #: info-gtk.c:597 statistics-gtk.c:623 msgid "Dive Tags" msgstr "Dyktagg" #: statistics-gtk.c:591 msgid "Dive Time" msgstr "Dyktid" #: uemis.c:228 msgid "Dive Time Alert" msgstr "Dyktidsvarning" #: uemis.c:226 msgid "Dive Time Info" msgstr "Dyktidsnot" #: download-dialog.c:300 msgid "Dive computer vendor and product" msgstr "Dykdatorleverantör och produkt" #: libdivecomputer.c:681 msgid "Dive data import error" msgstr "Lyckades inte importera dykdata" #: gps.c:214 msgid "Dive locations" msgstr "Dykplatser" #: info-gtk.c:575 msgid "Dive master" msgstr "Divemaster" #: planner-gtk.c:392 msgid "Dive starts when?" msgstr "När börjar dyket?" #: print.c:502 msgid "Dive#" msgstr "Dyknr" #: gtk-gui.c:835 msgid "Divelist Font" msgstr "Font för dyklistan" #: info-gtk.c:1004 msgid "Divemaster" msgstr "Divemaster" #: statistics-gtk.c:542 msgid "Dives" msgstr "Dyk" #: gtk-gui.c:1622 msgid "Dives Locations" msgstr "Dykplatser" #: download-dialog.c:376 msgid "Download From Dive Computer" msgstr "Ladda ner från dykdator" #: gtk-gui.c:1616 msgid "Download From Dive Computer..." msgstr "Ladda ner från dykdator..." #: webservice.c:260 msgid "Download From Web Service" msgstr "Ladda ner från webbtjänst" #: gtk-gui.c:1617 msgid "Download From Web Service..." msgstr "Ladda ned från webbtjänst..." #: webservice.c:31 msgid "Download Success!" msgstr "Nedladdning lyckades!" #: print.c:502 statistics-gtk.c:92 msgid "Duration" msgstr "Varaktighet" #: info-gtk.c:911 msgid "Duration (min)" msgstr "Varaktighet (min)" #: info.c:312 msgid "E" msgstr "E" #: planner.c:96 #, c-format msgid "EAN%d" msgstr "EAN%d" #: planner-gtk.c:273 msgid "EAN32" msgstr "EAN32" #: planner-gtk.c:274 msgid "EAN36" msgstr "EAN36" #: info-gtk.c:99 msgid "Edit" msgstr "Redigera" #: gtk-gui.c:1632 msgid "Edit Device Names" msgstr "Ändra Enhetsnamn" #: gtk-gui.c:1490 msgid "Edit Dive Computer Nicknames" msgstr "Ändra dykdatorers namn" #: info-gtk.c:659 msgid "Edit Trip Info" msgstr "Ändra reseinformation" #: divelist-gtk.c:1670 msgid "Edit Trip Summary" msgstr "Ändra resesammandrag" #: gtk-gui.c:1550 msgid "" "Edit a dive computer nickname by double-clicking it in the relevant nickname" " field" msgstr "Ändra dykdatorns namn genom att dubbel-klicka på namnfältet" #: divelist-gtk.c:1644 msgid "Edit dive" msgstr "Redigera dyk" #: divelist-gtk.c:1703 divelist-gtk.c:1745 msgid "Edit dive date/time" msgstr "Redigera dyk datum/tid" #: divelist-gtk.c:1643 msgid "Edit dives" msgstr "Redigera dyk" #: info-gtk.c:535 msgid "Edit multiple dives" msgstr "Redigera flera dyk" #: info-gtk.c:369 msgid "Edit trip summary" msgstr "Redigera resesammandrag" #: gtk-gui.c:1172 msgid "Enable / Disable Events" msgstr "Aktivera / Inaktivera händelser" #: gtk-gui.c:1136 msgid "Enable / Disable Tags" msgstr "Aktivera / Avaktivera taggar" #: equipment.c:1013 equipment.c:1520 msgid "End" msgstr "Slut" #: planner-gtk.c:298 msgid "Ending Depth" msgstr "Slutdjup" #: webservice.c:275 msgid "" "Enter a user identifier and press 'Download'. Once the download is complete " "you can press 'Apply' if you wish to apply the changes." msgstr "Ange ditt användarid och tryck 'Ladda ner'. När laddningen är färdig kan du trycka på 'Använd' för att använda data" #: gtk-gui.c:1857 info-gtk.c:644 msgid "Equipment" msgstr "Utrustning" #: divelist-gtk.c:1370 msgid "Error" msgstr "Error" #: libdivecomputer.c:471 msgid "Error obtaining water salinity" msgstr "Kunde inte ladda vattnets salthalt" #: libdivecomputer.c:419 msgid "Error parsing the datetime" msgstr "Kunde inte tolka tid och datum" #: libdivecomputer.c:441 msgid "Error parsing the divetime" msgstr "Kunde inte tolka dyktid" #: libdivecomputer.c:480 msgid "Error parsing the gas mix" msgstr "Kunde inte tolka gasblandning" #: libdivecomputer.c:461 msgid "Error parsing the gas mix count" msgstr "Kunde inte tolka antal gasblandningar" #: libdivecomputer.c:451 msgid "Error parsing the maxdepth" msgstr "Kunde inte tolka maxdjup" #: libdivecomputer.c:488 msgid "Error parsing the samples" msgstr "Kunde inte tolka sampel" #: libdivecomputer.c:677 msgid "Error registering the cancellation handler." msgstr "Kunde inte registrera avbrytningsrutin" #: libdivecomputer.c:410 msgid "Error registering the data" msgstr "Kunde inte registrera parser-data" #: libdivecomputer.c:672 msgid "Error registering the event handler." msgstr "Kunde inte registrera event-funktion" #: libdivecomputer.c:645 #, c-format msgid "Event: systime=%, devtime=%u\n" msgstr "Event: systime=%, devtime=%u\n" #: libdivecomputer.c:622 msgid "Event: waiting for user action" msgstr "Händelse: väntar på användaren" #: divelist-gtk.c:1795 msgid "Expand all" msgstr "Expandera alla" #: divelist-gtk.c:1524 msgid "Export As UDDF File" msgstr "Exportera som UDDF fil" #: gtk-gui.c:1614 msgid "Export UDDF..." msgstr "Exportera UDDF..." #: divelist-gtk.c:1649 msgid "Export dive(s) to UDDF" msgstr "Exportera dyk till UDDF" #: gtk-gui.c:791 msgid "Fahrenheit" msgstr "Fahrenheit" #: gtk-gui.c:122 #, c-format msgid "Failed to open %i files." msgstr "Kunde inte öppna %i filer." #: parse-xml.c:1594 #, c-format msgid "Failed to parse '%s'" msgstr "Kunde inte läsa '%s'" #: parse-xml.c:1593 #, c-format msgid "Failed to parse '%s'.\n" msgstr "Kunde inte läsa '%s'.\n" #: file.c:276 #, c-format msgid "Failed to read '%s'" msgstr "Kunde inte öppna '%s'" #: file.c:272 #, c-format msgid "Failed to read '%s'.\n" msgstr "Kunde inte öppna '%s'.\n" #: main.c:73 msgid "Feb" msgstr "feb" #: gtk-gui.c:776 msgid "Feet" msgstr "fot" #: gtk-gui.c:1601 msgid "File" msgstr "Fil" #: gtk-gui.c:1604 msgid "Filter" msgstr "Filter" #: download-dialog.c:397 msgid "Force download of all dives" msgstr "Tvinga nedladdning av alla dyk" #: main.c:64 msgid "Fri" msgstr "fre" #: gtk-gui.c:1007 msgid "GFhigh" msgstr "GFhigh" #: planner-gtk.c:426 msgid "GFhigh for plan" msgstr "GFhigh för dykplanering" #: gtk-gui.c:997 msgid "GFlow" msgstr "GFlow" #: planner-gtk.c:425 msgid "GFlow for plan" msgstr "GFlow för dykplanering" #: info-gtk.c:555 msgid "GPS (WGS84 or GPS format)" msgstr "GPS (WGS84 eller GPS format)" #. ++GETTEXT Gas Used is amount used #: print.c:203 msgid "Gas Used" msgstr "Gasanvändning" #: statistics-gtk.c:617 msgctxt "Amount" msgid "Gas Used" msgstr "Gasanvändning" #: planner-gtk.c:300 msgctxt "Type of" msgid "Gas Used" msgstr "Gasanvändning" #: planner.c:578 #, c-format msgid "Gas consumption:\n" msgstr "Gasanvändning:\n" #: equipment.c:1023 print.c:201 msgid "Gasmix" msgstr "Gasblandning" #: gtk-gui.c:767 msgid "General Settings" msgstr "Allmänna Iinställningar" #: gtk-gui.c:1606 msgid "Help" msgstr "Hjälp" #: webservice.c:296 msgid "Idle" msgstr "Idle" #: gtk-gui.c:1613 msgid "Import File(s)..." msgstr "Importera fil(er)..." #: divelist-gtk.c:1370 gtk-gui.c:1630 msgid "Info" msgstr "Info" #: uemis-downloader.c:769 msgid "Init Communication" msgstr "Initierar anslutning" #: gtk-gui.c:1635 msgid "Input Plan" msgstr "Skriv plan" #: planner-gtk.c:145 #, c-format msgid "Invalid depth - could not parse \"%s\"" msgstr "Ogiltigt djup - kunde inte tolka \"%s\"" #: planner-gtk.c:147 msgid "Invalid depth - values deeper than 400m not supported" msgstr "Ogiltigt djup - värden djupare än 400m stöds inte" #: planner-gtk.c:118 #, c-format msgid "Invalid gas for row %d" msgstr "Ogiltig gas för rad %d" #: planner-gtk.c:207 msgid "Invalid starttime" msgstr "Ogiltig starttid" #: webservice.c:27 msgid "Invalid user identifier!" msgstr "Ogiltigt användarid!" #. ++GETTEXT: these are three letter months - we allow up to six code bytes #: main.c:73 msgid "Jan" msgstr "jan" #: main.c:74 msgid "Jul" msgstr "jul" #: main.c:73 msgid "Jun" msgstr "jun" #: planner-gtk.c:398 msgid "Last stop at 20 Feet" msgstr "Sista stoppet vid 20 Fot" #: planner-gtk.c:396 msgid "Last stop at 6 Meters" msgstr "Sista stoppet vid 6 Meter" #: print.c:985 msgid "Layout Options" msgstr "Layout Optioner" #: gtk-gui.c:1279 msgid "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" msgstr "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013" #: gtk-gui.c:1628 msgid "List" msgstr "Lista" #: gtk-gui.c:785 msgid "Liter" msgstr "liter" #: divelist-gtk.c:825 info-gtk.c:374 info-gtk.c:550 info-gtk.c:999 print.c:503 msgid "Location" msgstr "Plats" #: gtk-gui.c:1602 msgid "Log" msgstr "Log" #: statistics-gtk.c:99 msgctxt "Duration" msgid "Longest" msgstr "Längsta" #: statistics-gtk.c:553 msgid "Longest Dive" msgstr "Längsta dyk" #: uemis.c:236 msgid "Low Battery Alert" msgstr "Batterivarning" #: uemis.c:234 msgid "Low Battery Warning" msgstr "Batterivarning" #: gtk-gui.c:862 msgid "Map provider" msgstr "Kartleverantör" #: main.c:73 msgid "Mar" msgstr "mar" #: divelist-gtk.c:1718 divelist-gtk.c:1720 msgid "Mark invalid" msgstr "Märk som ogiltig" #: gps.c:53 msgid "Mark location here" msgstr "Markera platsen här" #: divelist-gtk.c:1716 msgid "Mark valid" msgstr "Märk som giltig" #: uemis.c:230 msgid "Marker" msgstr "markering" #: print.c:502 msgid "Master" msgstr "master" #: uemis.c:224 msgid "Max Deco Time Warning" msgstr "Varning: max dekotid" #: statistics-gtk.c:560 statistics-gtk.c:598 msgid "Max Depth" msgstr "Maxdjup" #: info-gtk.c:921 #, c-format msgid "Max Depth (%s):" msgstr "Maxdjup (%s):" #: statistics-gtk.c:568 msgid "Max SAC" msgstr "Max SAC" #: statistics-gtk.c:543 msgid "Max Temp" msgstr "Max temp" #: print.c:109 #, c-format msgid "" "Max depth: %.*f %s\n" "Duration: %d min\n" "%s" msgstr "Maxdjup: %.*f %s\nTid: %d min\n%s" #: print.c:377 #, c-format msgid "Max. CNS" msgstr "Max. CNS" #: equipment.c:1518 msgid "MaxPress" msgstr "Max tryck" #: statistics-gtk.c:102 msgctxt "Depth" msgid "Maximum" msgstr "Maximum" #: statistics-gtk.c:105 msgctxt "SAC" msgid "Maximum" msgstr "Maximum" #: statistics-gtk.c:108 msgctxt "Temp" msgid "Maximum" msgstr "Maximum" #: main.c:73 msgid "May" msgstr "maj" #: divelist-gtk.c:1635 msgid "Merge dives" msgstr "Sammanslå dyk" #: divelist-gtk.c:1678 msgid "Merge trip with trip above" msgstr "Sammanfoga resa med tidigare resa" #: divelist-gtk.c:1688 msgid "Merge trip with trip below" msgstr "Sammanfoga resa med senare resa" #: gtk-gui.c:775 msgid "Meter" msgstr "meter" #: statistics-gtk.c:561 msgid "Min Depth" msgstr "Min. djup" #: statistics-gtk.c:569 msgid "Min SAC" msgstr "Min. SAC" #: statistics-gtk.c:544 msgid "Min Temp" msgstr "Min. temp" #: statistics-gtk.c:101 msgctxt "Depth" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:104 msgctxt "SAC" msgid "Minimum" msgstr "Minimum" #: statistics-gtk.c:107 msgctxt "Temp" msgid "Minimum" msgstr "Minimum" #: gtk-gui.c:841 msgid "Misc. Options" msgstr "Diverse inställningar" #: gtk-gui.c:1512 msgid "Model" msgstr "Modell" #: main.c:64 msgid "Mon" msgstr "mån" #: gtk-gui.c:1275 msgid "Multi-platform divelog software in C" msgstr "Dyklogg i C för flera plattformar" #: info.c:311 msgid "N" msgstr "N" #: gtk-gui.c:1607 msgid "New" msgstr "Ny" #: gtk-gui.c:1227 msgid "New starting number" msgstr "Nytt startnummer" #: gtk-gui.c:1634 msgid "Next DC" msgstr "Nästa dykdator" #: gtk-gui.c:1522 gtk-gui.c:2377 msgid "Nickname" msgstr "Enhetsnamn" #: uemis.c:232 msgid "No Tank Data" msgstr "Ingen flaskinformation" #: equipment.c:627 msgid "No cylinders listed for this dive." msgstr "Inga flaskor listade för detta dyk." #: info-gtk.c:379 info-gtk.c:635 info-gtk.c:1013 msgid "Notes" msgstr "Anteckningar" #: print.c:1025 #, c-format msgid "Notes height (%d%% - %d%%)" msgstr "Anteckningar höjd (%d%% - %d%%)" #: print.c:1003 msgid "Notes on top" msgstr "Anteckningar ovanpå" #: main.c:74 msgid "Nov" msgstr "nov" #: libdivecomputer.c:153 msgid "OLF" msgstr "OLF" #: divelist-gtk.c:823 gtk-gui.c:878 print.c:361 statistics-gtk.c:615 #, c-format msgid "OTU" msgstr "OTU" #: main.c:74 msgid "Oct" msgstr "okt" #: libdivecomputer.c:770 msgid "Odd pthread error return" msgstr "Konstig felreturn from pthread" #: gtk-gui.c:1569 msgid "Ok to delete the selected entry?" msgstr "Ok att radera?" #: gtk-gui.c:1127 msgid "Only display dives with these tags:" msgstr "Visa endast dyk med dessa taggar:" #: gtk-gui.c:291 msgid "Open File" msgstr "Öppna fil" #: gtk-gui.c:1608 msgid "Open..." msgstr "Öppna..." #: print.c:995 msgid "Ordering" msgstr "Sortering" #: print.c:1024 #, c-format msgid "Other data height (%d%% - %d%%)" msgstr "Höjd på övriga uppgifter (%d%% - %d%%)" #: print.c:173 #, c-format msgid "Oxygen" msgstr "Syre" #: libdivecomputer.c:153 msgid "PO2" msgstr "PO2" #: uemis.c:210 msgid "PO2 Ascend Alarm" msgstr "Alarm: uppstigning / PO2" #: uemis.c:208 msgid "PO2 Ascend Warning" msgstr "Varning: uppstigning / PO2" #: uemis.c:205 msgid "PO2 Green Warning" msgstr "Varning: grön PO2" #: gtk-gui.c:781 msgid "PSI" msgstr "psi" #: webservice.c:341 msgid "Password" msgstr "Lösenord" #: info-gtk.c:565 msgid "Pick on map" msgstr "Välj från karta" #: gtk-gui.c:1605 msgid "Planner" msgstr "Planerare" #: webservice.c:327 msgid "" "Please enter your userid and password for divelogs.de. The selected dives " "will be added to your account" msgstr "Vänligen ange ditt användarnamn och lösenord för divelogs.de. De markerade dyken kommer att läggas till ditt konto." #: gtk-gui.c:752 msgid "Preferences" msgstr "Inställningar" #: gtk-gui.c:1619 msgid "Preferences..." msgstr "Inställningar..." #: equipment.c:1002 equipment.c:1008 msgid "Pressure" msgstr "Tryck" #: gtk-gui.c:779 msgid "Pressure:" msgstr "Tryck:" #: gtk-gui.c:1633 msgid "Prev DC" msgstr "Föregående dykdator" #: print.c:989 msgid "Print in color" msgstr "Skriv ut i färg" #: print.c:978 msgid "Print only selected dives" msgstr "Skriv ut valda dyk" #: print.c:974 msgid "Print selection" msgstr "Skriv ut valda dyk" #: print.c:939 print.c:946 msgid "Print type" msgstr "Utskriftstyp" #: gtk-gui.c:1612 msgid "Print..." msgstr "Skriv ut..." #: gtk-gui.c:1629 msgid "Profile" msgstr "Profil" #: gtk-gui.c:888 msgid "Profile Settings" msgstr "Profilinställningar" #: print.c:1023 #, c-format msgid "Profile height (%d%% - %d%%)" msgstr "Profilhöjd (%d%% - %d%%)" #: print.c:1000 msgid "Profile on top" msgstr "Profil ovanpå" #: gtk-gui.c:1625 msgid "Quit" msgstr "Avsluta" #: uemis.c:218 msgid "RGT Alert" msgstr "Varning: gastid" #: uemis.c:216 msgid "RGT Warning" msgstr "Varning: gastid" #: info-gtk.c:581 info-gtk.c:1010 msgid "Rating" msgstr "Rankning" #: uemis-downloader.c:364 #, c-format msgid "Reading %s %s" msgstr "Läser %s %s" #: gtk-gui.c:2142 msgid "Remove" msgstr "Ta bort" #: divelist-gtk.c:1205 divelist-gtk.c:1693 msgid "Remove Trip" msgstr "Radera resa" #: divelist-gtk.c:1789 msgid "Remove dive from trip" msgstr "Ta bort dyk från resa" #: gtk-gui.c:2176 msgid "Remove event here" msgstr "Ta bort händelse" #: divelist-gtk.c:1787 msgid "Remove selected dives from trip" msgstr "Ta bort valda dyk från resa" #: gtk-gui.c:1218 msgid "Renumber" msgstr "Uppdatera numrering" #: gtk-gui.c:1620 msgid "Renumber..." msgstr "Uppdatera numrering..." #: download-dialog.c:153 msgid "Retry" msgstr "Försök igen" #: info.c:311 msgid "S" msgstr "S" #: divelist-gtk.c:822 gtk-gui.c:820 print.c:395 statistics-gtk.c:92 #: statistics-gtk.c:614 #, c-format msgid "SAC" msgstr "SAC" #: planner-gtk.c:420 msgid "SAC during decostop" msgstr "SAC under dekostopp" #: planner-gtk.c:419 msgid "SAC during dive" msgstr "SAC under dyk" #: uemis.c:198 msgid "Safety Stop Violation" msgstr "Säkerhetsstopp ej uppfyllt" #: main.c:64 msgid "Sat" msgstr "lör" #: gtk-gui.c:1610 msgid "Save As..." msgstr "Spara som..." #: gtk-gui.c:221 msgid "Save Changes?" msgstr "Spara ändringar?" #: divelist-gtk.c:1020 gtk-gui.c:158 msgid "Save File As" msgstr "Spara fil som" #: divelist-gtk.c:1710 msgid "Save as" msgstr "Spara som" #: gtk-gui.c:1609 msgid "Save..." msgstr "Spara..." #: planner-gtk.c:299 msgid "Segment Time" msgstr "Segment-tid" #: gtk-gui.c:1163 msgid "Select Events" msgstr "Välj händelser" #: gtk-gui.c:1623 msgid "Select Events..." msgstr "Välj händelser..." #: gtk-gui.c:1624 msgid "Select Tags..." msgstr "Välj taggar..." #: main.c:74 msgid "Sep" msgstr "sep" #: uemis-downloader.c:30 msgid "" "Short write to req.txt file\n" "Is the Uemis Zurich plugged in correctly?" msgstr "Kunde inte skriva filen req.txt\nÄr Uemis Zurich ordentligt ansluten?" #: statistics-gtk.c:98 msgctxt "Duration" msgid "Shortest" msgstr "Kortaste" #: statistics-gtk.c:554 msgid "Shortest Dive" msgstr "Kortaste dyk" #: gtk-gui.c:799 gtk-gui.c:872 msgid "Show Columns" msgstr "Visa kolumner" #: gtk-gui.c:968 msgid "Show EAD, END, EADD" msgstr "Visa EAD, END, EADD" #: gtk-gui.c:951 msgid "Show MOD" msgstr "Visa MOD" #: gtk-gui.c:984 msgid "Show calculated ceiling" msgstr "Visa beräknad tak-information" #: gtk-gui.c:976 msgid "Show dc reported ceiling in red" msgstr "Visa takinformationen i rött" #: divelist-gtk.c:1761 msgid "Show in map" msgstr "Visa på kartan" #: gtk-gui.c:934 msgid "Show pHe graph" msgstr "Visa pHe graf" #: gtk-gui.c:915 #, c-format msgid "Show pN%s graph" msgstr "Visa pN%s graf" #: gtk-gui.c:896 #, c-format msgid "Show pO%s graph" msgstr "Visa pO%s graph" #: planner.c:217 msgid "Simulated Dive" msgstr "Simulerat dyk" #: equipment.c:999 equipment.c:1517 msgid "Size" msgstr "Storlek" #: print.c:1012 #, c-format msgid "Sizing heights (%% of layout)" msgstr "Dimensionering av höjder (%% av layout)" #: uemis.c:200 msgid "Speed Alarm" msgstr "Alarm: uppstigningshastighet" #: uemis.c:203 msgid "Speed Warning" msgstr "Varning: uppstigningshastighet" #: equipment.c:1010 equipment.c:1519 msgid "Start" msgstr "Start" #: uemis-downloader.c:782 msgid "Start download" msgstr "Starta nedladdningen" #: statistics-gtk.c:532 msgid "Statistics" msgstr "Statistik" #: statistics-gtk.c:468 #, c-format msgid "Statistics %s" msgstr "Statistik %s" #: gtk-gui.c:1865 msgid "Stats" msgstr "Statistik" #: webservice.c:295 msgid "Status" msgstr "Status" #: planner.c:559 #, c-format msgid "Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s\n" msgstr "Stanna vid %.*f %s för %d:%02d min - totaltid %d:%02u on %s\n" #: parse-xml.c:438 #, c-format msgid "Strange percentage reading %s\n" msgstr "Konstig procent läsning %s\n" #: divelist-gtk.c:819 gtk-gui.c:830 info-gtk.c:582 info-gtk.c:1011 msgid "Suit" msgstr "Dräkt" #. ++GETTEXT: these are three letter days - we allow up to six code bytes #: main.c:64 msgid "Sun" msgstr "sön" #: statistics-gtk.c:592 msgid "Surf Intv" msgstr "Ytintervall" #: planner-gtk.c:393 msgid "Surface Pressure (mbar)" msgstr "Lufttryck på ytan (mbar)" #: planner.c:570 #, c-format msgid "Switch gas to %s\n" msgstr "Byt till gas %s\n" #: print.c:960 msgid "Table print" msgstr "Tabellutskrift" #: info-gtk.c:628 msgid "Tags are only shown if they are identical for all edited dives" msgstr "Taggar visas bara om de är identiska för alla dyk" #: uemis.c:220 msgid "Tank Change Suggested" msgstr "Tankbyte rekommenderat" #: uemis.c:214 msgid "Tank Pressure Info" msgstr "Info: flasktryck" #: gtk-gui.c:870 msgid "Tec Settings" msgstr "Tekniska inställningar" #: gtk-gui.c:805 msgid "Temp" msgstr "Temp" #: statistics-gtk.c:92 msgid "Temperature" msgstr "Temperatur" #: gtk-gui.c:789 msgid "Temperature:" msgstr "Temperatur:" #: gtk-gui.c:1631 msgid "Three" msgstr "Alla" #: main.c:64 msgid "Thu" msgstr "tor" #: info-gtk.c:841 msgid "Time" msgstr "Tid" #: gtk-gui.c:1749 msgid "" "To edit dive information\n" "double click on it in the dive list" msgstr "Dubbelklicka på dyklistan för att ändra dykinformation" #: gtk-gui.c:1641 msgid "Toggle Zoom" msgstr "Zoom av/på" #: planner.c:294 msgid "Too many gas mixes" msgstr "För många gasblandningar" #: planner-gtk.c:327 msgid "Too many waypoints" msgstr "För många etapper" #: statistics-gtk.c:96 msgctxt "Duration" msgid "Total" msgstr "Total" #: statistics-gtk.c:551 msgid "Total Time" msgstr "Total tid" #: print.c:340 #, c-format msgid "Total Weight:" msgstr "Total vikt:" #: planner.c:550 #, c-format msgid "Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s\n" msgstr "Dyk till %.*f %s i %d:%02d min - totaltid %d:%02u on %s\n" #. ++GETTEXT 60 char buffer weekday, monthname, day of month, year, nr dives #: divelist.c:579 #, c-format msgid "Trip %1$s, %2$s %3$d, %4$d (%5$d dive)" msgid_plural "Trip %1$s, %2$s %3$d, %4$d (%5$d dives)" msgstr[0] "Resa %1$s, %3$d %2$s, %4$d (%5$d dyk)" msgstr[1] "Resa %1$s, %3$d %2$s, %4$d (%5$d dyk)" #: main.c:64 msgid "Tue" msgstr "tis" #: equipment.c:1516 equipment.c:1544 msgid "Type" msgstr "Typ" #: uemis-downloader.c:28 msgid "" "Uemis Zurich: File System is almost full\n" "Disconnect/reconnect the dive computer\n" "and click 'Retry'" msgstr "Uemis Zurich: Filsystem är nästan fullt\nÅteranslut dykdatorn och försök\nigen" #: uemis-downloader.c:29 msgid "" "Uemis Zurich: File System is full\n" "Disconnect/reconnect the dive computer\n" "and try again" msgstr "Uemis Zurich: Fullt filsystem\nÅteranslut dykdatorn och försök\nigen" #: uemis-downloader.c:771 msgid "Uemis init failed" msgstr "Kunde inte läsa från Uemis" #: libdivecomputer.c:699 msgid "Unable to create libdivecomputer context" msgstr "Kan inte skapa libdivecomputer context" #: libdivecomputer.c:404 #, c-format msgid "Unable to create parser for %s %s" msgstr "Kan inte skapa parser för %s %s" #: libdivecomputer.c:701 #, c-format msgid "Unable to open %s %s (%s)" msgstr "Kunde inte öppna fil %s %s (%s)" #: gtk-gui.c:768 msgid "Units" msgstr "Enheter" #: divelist-gtk.c:1650 msgid "Upload dive(s) to divelogs.de" msgstr "Ladda upp dyk till divelogs.de" #: webservice.c:318 msgid "Upload to divelogs.de" msgstr "Ladda upp till divelogs.de" #: gtk-gui.c:1615 msgid "Upload to divelogs.de..." msgstr "Ladda upp till divelogs.de..." #: gps.c:212 msgid "Use right click to mark dive location at cursor" msgstr "Högerklicka för att markera dykmål vid muspekaren" #: webservice.c:282 webservice.c:333 msgid "User Identifier" msgstr "Användar ID" #: gtk-gui.c:1627 msgid "User Manual" msgstr "Användarmanual" #: gtk-gui.c:1603 msgid "View" msgstr "Visa" #: info-gtk.c:587 statistics-gtk.c:600 msgid "Visibility" msgstr "Synlighet" #: gtk-gui.c:784 msgid "Volume:" msgstr "Volym:" #: info.c:312 msgid "W" msgstr "W" #: planner-gtk.c:162 msgid "Warning - extremely long dives can cause long calculation time" msgstr "Varning - extremt långa dyk kan ta lång tid att beräkna" #: planner-gtk.c:137 msgid "Warning - planning very deep dives can take excessive amounts of time" msgstr "Varning - att planera väldigt djupa dyk kan ta väldigt lång tid" #: statistics-gtk.c:606 msgid "Water Temp" msgstr "Vattentemperatur" #: webservice.c:163 msgid "Webservice" msgstr "Webbtjänst" #: main.c:64 msgid "Wed" msgstr "ons" #: equipment.c:1049 equipment.c:1643 gtk-gui.c:825 msgid "Weight" msgstr "Vikt" #: equipment.c:1148 print.c:308 #, c-format msgid "Weight System" msgstr "Viktsystem" #: gtk-gui.c:794 msgid "Weight:" msgstr "Vikt:" #: gtk-gui.c:146 msgid "XML file" msgstr "XML-fil" #: statistics-gtk.c:92 msgid "Year" msgstr "År" #: gtk-gui.c:1621 statistics-gtk.c:295 msgid "Yearly Statistics" msgstr "Årsstatistik" #: gtk-gui.c:2363 #, c-format msgid "" "You already have a dive computer of this model\n" "named %s\n" "Subsurface can maintain a nickname for this device to distinguish it from the existing one. The default is the model and device ID as shown below.\n" "If you don't want to name this dive computer click 'Cancel' and Subsurface will simply display its model as its name (which may mean that you cannot tell the two dive computers apart in the logs)." msgstr "Du äger redan en dydator av denna modell\nmed namnet %s\nSubsurface kan namnge den nya dykdatorn så att du kan lätt skilja dem åt. Det förvalda namnet är modellen och enhetens ID som visas nedan.\nOm du inte vill ge ett nytt namn åt datorn, tryck 'Avbryt'. Subsurface kommer att endast visa modellnamnet (vilket kan göra det svårt att skilja två dykdatorer av samma modell)." #: gtk-gui.c:231 msgid "" "You have unsaved changes\n" "Would you like to save those before closing the datafile?" msgstr "Du har ändringer som inte är sparade.\nVill du spara dem innan du stänger datafilen?" #: gtk-gui.c:234 gtk-gui.c:237 #, c-format msgid "" "You have unsaved changes to file: %s \n" "Would you like to save those before closing the datafile?" msgstr "Du har ändringer som inte är sparade i %s.\nVill du spara dem innan du stänger datafilen?" #: divelist-gtk.c:463 planner.c:94 planner.c:786 planner.c:787 print.c:178 #: profile.c:415 #, c-format msgid "air" msgstr "luft" #: libdivecomputer.c:153 msgid "airtime" msgstr "gastid" #: statistics.c:21 msgid "altitude" msgstr "höjd" #: equipment.c:892 msgid "ankle" msgstr "ankel" #: libdivecomputer.c:149 msgid "ascent" msgstr "uppstigning" #: equipment.c:893 msgid "backplate weight" msgstr "Ryggplattans vikt" #: dive.c:48 msgid "bar" msgstr "bar" #: equipment.c:891 msgid "belt" msgstr "bälte" #: statistics.c:20 msgid "boat" msgstr "båt" #: gtk-gui.c:2116 libdivecomputer.c:150 msgid "bookmark" msgstr "bokmärke" #: statistics.c:21 msgid "cave" msgstr "grotta" #: statistics.c:20 msgid "cavern" msgstr "cavern" #: libdivecomputer.c:149 msgid "ceiling" msgstr "ceiling" #: libdivecomputer.c:152 msgid "ceiling (safety stop)" msgstr "ceiling (säkerhetsstopp)" #: equipment.c:894 msgid "clip-on" msgstr "clip-on" #: dive.c:93 planner.c:959 msgid "cuft" msgstr "ft³" #: uemis-downloader.c:384 msgid "data" msgstr "data" #: statistics.c:23 msgid "deco" msgstr "deko" #: libdivecomputer.c:149 msgid "deco stop" msgstr "dekostopp" #: statistics.c:20 msgid "deep" msgstr "djup" #: libdivecomputer.c:152 msgid "deepstop" msgstr "djupstopp" #: uemis-downloader.c:405 msgid "divelog entry id" msgstr "dyklog ID" #: uemis-downloader.c:407 msgid "divespot data id" msgstr "dykplats ID" #: libdivecomputer.c:152 msgid "divetime" msgstr "dyktid" #: statistics.c:20 msgid "drift" msgstr "ström" #: uemis-downloader.c:589 msgid "drysuit" msgstr "torrdräkt" #: planner.c:788 msgid "ean" msgstr "ean" #: statistics.c:263 #, c-format msgid "for all dives" msgstr "för alla dyk" #: statistics.c:259 #, c-format msgid "for dive #%d" msgstr "Dyk #%d " #: statistics.c:217 #, c-format msgid "for dives #" msgstr "för dykningar #" #: statistics.c:261 #, c-format msgid "for selected dive" msgstr "för valt dyk" #: statistics.c:224 #, c-format msgid "for selected dives" msgstr "för utvalda dyk" #: statistics.c:22 msgid "freshwater" msgstr "sötvatten" #: dive.c:119 divelist-gtk.c:815 info-gtk.c:921 info-gtk.c:932 planner.c:897 msgid "ft" msgstr "ft" #: uemis-downloader.c:590 msgid "full suit" msgstr "fulldräkt" #: libdivecomputer.c:151 libdivecomputer.c:154 msgid "gaschange" msgstr "gasbyte" #: libdivecomputer.c:153 msgid "heading" msgstr "riktning" #: statistics.c:21 msgid "ice" msgstr "is" #: equipment.c:890 msgid "integrated" msgstr "integrerat" #: statistics.c:20 msgid "invalid" msgstr "ogiltig" #: libdivecomputer.c:171 msgid "invalid event number" msgstr "okänt händelsenummer" #: uemis-downloader.c:590 msgid "jacket" msgstr "jacka" #: dive.c:143 equipment.c:1068 gtk-gui.c:795 msgid "kg" msgstr "kg" #: dive.c:88 msgid "l" msgstr "l" #: statistics.c:21 msgid "lake" msgstr "sjö" #: dive.c:139 divelist-gtk.c:818 equipment.c:1070 gtk-gui.c:796 msgid "lbs" msgstr "pund" #: uemis-downloader.c:590 msgid "long john" msgstr "Longjohn" #: dive.c:114 info-gtk.c:921 info-gtk.c:932 msgid "m" msgstr "m" #: gtk-gui.c:956 msgid "max ppO2" msgstr "max ppO2" #: divelist-gtk.c:824 gtk-gui.c:883 msgid "maxCNS" msgstr "maxCNS" #: libdivecomputer.c:153 msgid "maxdepth" msgstr "Maxdjup" #: uemis-downloader.c:591 msgid "membrane" msgstr "membran" #: divelist-gtk.c:816 planner.c:965 msgid "min" msgstr "Min" #: libdivecomputer.c:630 #, c-format msgid "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" msgstr "model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x)" #: uemis-downloader.c:409 msgid "more data dive id" msgstr "mer data dive id" #: statistics.c:198 #, c-format msgid "more than %d days" msgstr "mer än %d dagar" #: statistics.c:22 msgid "night" msgstr "natt" #: libdivecomputer.c:154 msgid "non stop time" msgstr "non stop tid" #: libdivecomputer.c:149 msgid "none" msgstr "inget" #: gtk-gui.c:939 msgid "pHe threshold" msgstr "pHe tröskel" #: gtk-gui.c:921 #, c-format msgid "pN%s threshold" msgstr "pN%s tröskel" #: gtk-gui.c:902 #, c-format msgid "pO%s threshold" msgstr "pO%s tröskel" #: dive.c:44 msgid "pascal" msgstr "pascal" #: statistics.c:23 msgid "photo" msgstr "foto" #: statistics.c:21 msgid "pool" msgstr "pool" #: dive.c:52 msgid "psi" msgstr "psi" #: libdivecomputer.c:149 msgid "rbt" msgstr "rbt" #: libdivecomputer.c:153 msgid "rgbm" msgstr "rgbm" #: statistics.c:22 msgid "river" msgstr "älv" #: libdivecomputer.c:150 msgid "safety stop" msgstr "säkerhetsstopp" #: libdivecomputer.c:151 msgid "safety stop (mandatory)" msgstr "säkerhetsstopp (obligatoriskt)" #: libdivecomputer.c:151 msgid "safety stop (voluntary)" msgstr "säkerhetsstopp (frivilligt)" #: uemis-downloader.c:589 msgid "semidry" msgstr "semidry" #: statistics.c:20 msgid "shore" msgstr "strand" #: uemis-downloader.c:590 msgid "shorty" msgstr "shorty" #: libdivecomputer.c:150 msgid "surface" msgstr "ytan" #: statistics.c:22 msgid "teaching" msgstr "undervisning" #: libdivecomputer.c:154 msgid "tissue level warning" msgstr "vävnadsnivå" #: statistics.c:22 msgid "training" msgstr "utbildning" #. ++GETTEXT the term translator-credits is magic - list the names of the #. tranlators here #: gtk-gui.c:1281 msgid "translator-credits" msgstr "Linus Torvalds\nFredrik Steen" #: libdivecomputer.c:150 msgid "transmitter" msgstr "sändare" #: equipment.c:1409 equipment.c:1429 msgid "unkn" msgstr "okänd" #: equipment.c:649 libdivecomputer.c:152 print.c:321 statistics-gtk.c:361 #: uemis-downloader.c:133 msgid "unknown" msgstr "okänd" #: equipment.c:540 msgid "unspecified" msgstr "inte specifierad" #: uemis-downloader.c:590 msgid "vest" msgstr "väst" #: statistics.c:23 msgid "video" msgstr "video" #: libdivecomputer.c:150 msgid "violation" msgstr "kränkning" #: equipment.c:1545 msgid "weight" msgstr "Vikt" #: uemis-downloader.c:589 msgid "wetsuit" msgstr "våtdräkt" #: libdivecomputer.c:149 msgid "workload" msgstr "arbetsbelastning" #: statistics.c:21 msgid "wreck" msgstr "vrak" Subsurface-4.0.2/pref.h000066400000000000000000000033701226345450700147370ustar00rootroot00000000000000#ifndef PREF_H #define PREF_H #ifdef __cplusplus extern "C" { #endif /* can't use 'bool' for the boolean values - different size in C and C++ */ typedef struct { short po2; short pn2; short phe; double po2_threshold; double pn2_threshold; double phe_threshold; } partial_pressure_graphs_t; struct preferences { const char *divelist_font; const char *default_filename; const char *default_cylinder; double font_size; partial_pressure_graphs_t pp_graphs; short mod; double mod_ppO2; short ead; short profile_dc_ceiling; short profile_red_ceiling; short profile_calc_ceiling; short calc_ceiling_3m_incr; short calc_all_tissues; short calc_ndl_tts; short gflow; short gfhigh; bool gf_low_at_maxdepth; short display_invalid_dives; short unit_system; struct units units; short show_sac; }; enum unit_system_values { METRIC, IMPERIAL, PERSONALIZE }; extern struct preferences prefs, default_prefs; #define PP_GRAPHS_ENABLED (prefs.pp_graphs.po2 || prefs.pp_graphs.pn2 || prefs.pp_graphs.phe) extern void subsurface_open_conf(void); extern void subsurface_set_conf(const char *name, const char *value); extern void subsurface_set_conf_bool(const char *name, bool value); extern void subsurface_set_conf_int(const char *name, int value); extern void subsurface_unset_conf(const char *name); extern const char *subsurface_get_conf(const char *name); extern int subsurface_get_conf_bool(const char *name); extern int subsurface_get_conf_int(const char *name); extern void subsurface_flush_conf(void); extern void subsurface_close_conf(void); extern const char system_divelist_default_font[]; extern const char *system_default_filename(); extern void load_preferences(void); extern void save_preferences(void); #ifdef __cplusplus } #endif #endif /* PREF_H */ Subsurface-4.0.2/profile.c000066400000000000000000001245641226345450700154470ustar00rootroot00000000000000/* profile.c */ /* creates all the necessary data for drawing the dive profile */ #include "gettext.h" #include #include #include "dive.h" #include "display.h" #include "divelist.h" #include "profile.h" #include "deco.h" #include "libdivecomputer/parser.h" #include "libdivecomputer/version.h" int selected_dive = -1; /* careful: 0 is a valid value */ char zoomed_plot = 0; char dc_number = 0; static struct plot_data *last_pi_entry = NULL; #ifdef DEBUG_PI /* debugging tool - not normally used */ static void dump_pi (struct plot_info *pi) { int i; printf("pi:{nr:%d maxtime:%d meandepth:%d maxdepth:%d \n" " maxpressure:%d mintemp:%d maxtemp:%d\n", pi->nr, pi->maxtime, pi->meandepth, pi->maxdepth, pi->maxpressure, pi->mintemp, pi->maxtemp); for (i = 0; i < pi->nr; i++) { struct plot_data *entry = &pi->entry[i]; printf(" entry[%d]:{cylinderindex:%d sec:%d pressure:{%d,%d}\n" " time:%d:%02d temperature:%d depth:%d stopdepth:%d stoptime:%d ndl:%d smoothed:%d po2:%lf phe:%lf pn2:%lf sum-pp %lf}\n", i, entry->cylinderindex, entry->sec, entry->pressure[0], entry->pressure[1], entry->sec / 60, entry->sec % 60, entry->temperature, entry->depth, entry->stopdepth, entry->stoptime, entry->ndl, entry->smoothed, entry->po2, entry->phe, entry->pn2, entry->po2 + entry->phe + entry->pn2); } printf(" }\n"); } #endif #define ROUND_UP(x,y) ((((x)+(y)-1)/(y))*(y)) #define DIV_UP(x,y) (((x)+(y)-1)/(y)) /* * When showing dive profiles, we scale things to the * current dive. However, we don't scale past less than * 30 minutes or 90 ft, just so that small dives show * up as such unless zoom is enabled. * We also need to add 180 seconds at the end so the min/max * plots correctly */ int get_maxtime(struct plot_info *pi) { int seconds = pi->maxtime; if (zoomed_plot) { /* Rounded up to one minute, with at least 2.5 minutes to * spare. * For dive times shorter than 10 minutes, we use seconds/4 to * calculate the space dynamically. * This is seamless since 600/4 = 150. */ if (seconds < 600) return ROUND_UP(seconds+seconds/4, 60); else return ROUND_UP(seconds+150, 60); } else { /* min 30 minutes, rounded up to 5 minutes, with at least 2.5 minutes to spare */ return MAX(30*60, ROUND_UP(seconds+150, 60*5)); } } /* get the maximum depth to which we want to plot * take into account the additional vertical space needed to plot * partial pressure graphs */ int get_maxdepth(struct plot_info *pi) { unsigned mm = pi->maxdepth; int md; if (zoomed_plot) { /* Rounded up to 10m, with at least 3m to spare */ md = ROUND_UP(mm+3000, 10000); } else { /* Minimum 30m, rounded up to 10m, with at least 3m to spare */ md = MAX((unsigned)30000, ROUND_UP(mm+3000, 10000)); } md += pi->maxpp * 9000; return md; } /* collect all event names and whether we display them */ struct ev_select *ev_namelist; int evn_allocated; int evn_used; #if WE_DONT_USE_THIS /* we need to implement event filters in Qt */ int evn_foreach(void (*callback)(const char *, bool *, void *), void *data) { int i; for (i = 0; i < evn_used; i++) { /* here we display an event name on screen - so translate */ callback(translate("gettextFromC",ev_namelist[i].ev_name), &ev_namelist[i].plot_ev, data); } return i; } #endif /* WE_DONT_USE_THIS */ void clear_events(void) { evn_used = 0; } void remember_event(const char *eventname) { int i = 0, len; if (!eventname || (len = strlen(eventname)) == 0) return; while (i < evn_used) { if (!strncmp(eventname, ev_namelist[i].ev_name, len)) return; i++; } if (evn_used == evn_allocated) { evn_allocated += 10; ev_namelist = realloc(ev_namelist, evn_allocated * sizeof(struct ev_select)); if (! ev_namelist) /* we are screwed, but let's just bail out */ return; } ev_namelist[evn_used].ev_name = strdup(eventname); ev_namelist[evn_used].plot_ev = TRUE; evn_used++; } int setup_temperature_limits(struct graphics_context *gc) { int maxtime, mintemp, maxtemp, delta; struct plot_info *pi = &gc->pi; /* Get plot scaling limits */ maxtime = get_maxtime(pi); mintemp = pi->mintemp; maxtemp = pi->maxtemp; gc->leftx = 0; gc->rightx = maxtime; /* Show temperatures in roughly the lower third, but make sure the scale is at least somewhat reasonable */ delta = maxtemp - mintemp; if (delta < 3000) /* less than 3K in fluctuation */ delta = 3000; gc->topy = maxtemp + delta*2; if (PP_GRAPHS_ENABLED) gc->bottomy = mintemp - delta * 2; else gc->bottomy = mintemp - delta / 3; pi->endtempcoord = SCALEY(gc, pi->mintemp); return maxtemp && maxtemp >= mintemp; } void setup_pp_limits(struct graphics_context *gc) { int maxdepth; gc->leftx = 0; gc->rightx = get_maxtime(&gc->pi); /* the maxdepth already includes extra vertical space - and if * we use 1.5 times the corresponding pressure as maximum partial * pressure the graph seems to look fine*/ maxdepth = get_maxdepth(&gc->pi); gc->topy = 1.5 * (maxdepth + 10000) / 10000.0 * SURFACE_PRESSURE / 1000; gc->bottomy = -gc->topy / 20; } int get_cylinder_pressure_range(struct graphics_context *gc) { gc->leftx = 0; gc->rightx = get_maxtime(&gc->pi); if (PP_GRAPHS_ENABLED) gc->bottomy = -gc->pi.maxpressure * 0.75; else gc->bottomy = 0; gc->topy = gc->pi.maxpressure * 1.5; if (!gc->pi.maxpressure) return FALSE; while (gc->pi.endtempcoord <= SCALEY(gc, gc->pi.minpressure - (gc->topy) * 0.1)) gc->bottomy -= gc->topy * 0.1 * gc->maxy/abs(gc->maxy); return TRUE; } /* Get local sac-rate (in ml/min) between entry1 and entry2 */ static int get_local_sac(struct plot_data *entry1, struct plot_data *entry2, struct dive *dive) { int index = entry1->cylinderindex; cylinder_t *cyl; int duration = entry2->sec - entry1->sec; int depth, airuse; pressure_t a, b; double atm; if (entry2->cylinderindex != index) return 0; if (duration <= 0) return 0; a.mbar = GET_PRESSURE(entry1); b.mbar = GET_PRESSURE(entry2); if (!a.mbar || !b.mbar) return 0; /* Mean pressure in ATM */ depth = (entry1->depth + entry2->depth) / 2; atm = (double) depth_to_mbar(depth, dive) / SURFACE_PRESSURE; cyl = dive->cylinder + index; airuse = gas_volume(cyl, a) - gas_volume(cyl, b); /* milliliters per minute */ return airuse / atm * 60 / duration; } static void analyze_plot_info_minmax_minute(struct plot_data *entry, struct plot_data *first, struct plot_data *last, int index) { struct plot_data *p = entry; int time = entry->sec; int seconds = 90*(index+1); struct plot_data *min, *max; int avg, nr; /* Go back 'seconds' in time */ while (p > first) { if (p[-1].sec < time - seconds) break; p--; } /* Then go forward until we hit an entry past the time */ min = max = p; avg = p->depth; nr = 1; while (++p < last) { int depth = p->depth; if (p->sec > time + seconds) break; avg += depth; nr ++; if (depth < min->depth) min = p; if (depth > max->depth) max = p; } entry->min[index] = min; entry->max[index] = max; entry->avg[index] = (avg + nr/2) / nr; } static void analyze_plot_info_minmax(struct plot_data *entry, struct plot_data *first, struct plot_data *last) { analyze_plot_info_minmax_minute(entry, first, last, 0); analyze_plot_info_minmax_minute(entry, first, last, 1); analyze_plot_info_minmax_minute(entry, first, last, 2); } static velocity_t velocity(int speed) { velocity_t v; if (speed < -304) /* ascent faster than -60ft/min */ v = CRAZY; else if (speed < -152) /* above -30ft/min */ v = FAST; else if (speed < -76) /* -15ft/min */ v = MODERATE; else if (speed < -25) /* -5ft/min */ v = SLOW; else if (speed < 25) /* very hard to find data, but it appears that the recommendations for descent are usually about 2x ascent rate; still, we want stable to mean stable */ v = STABLE; else if (speed < 152) /* between 5 and 30ft/min is considered slow */ v = SLOW; else if (speed < 304) /* up to 60ft/min is moderate */ v = MODERATE; else if (speed < 507) /* up to 100ft/min is fast */ v = FAST; else /* more than that is just crazy - you'll blow your ears out */ v = CRAZY; return v; } static struct plot_info *analyze_plot_info(struct plot_info *pi) { int i; int nr = pi->nr; /* Smoothing function: 5-point triangular smooth */ for (i = 2; i < nr; i++) { struct plot_data *entry = pi->entry+i; int depth; if (i < nr-2) { depth = entry[-2].depth + 2*entry[-1].depth + 3*entry[0].depth + 2*entry[1].depth + entry[2].depth; entry->smoothed = (depth+4) / 9; } /* vertical velocity in mm/sec */ /* Linus wants to smooth this - let's at least look at the samples that aren't FAST or CRAZY */ if (entry[0].sec - entry[-1].sec) { entry->speed = (entry[0].depth - entry[-1].depth) / (entry[0].sec - entry[-1].sec); entry->velocity = velocity(entry->speed); /* if our samples are short and we aren't too FAST*/ if (entry[0].sec - entry[-1].sec < 15 && entry->velocity < FAST) { int past = -2; while (i+past > 0 && entry[0].sec - entry[past].sec < 15) past--; entry->velocity = velocity((entry[0].depth - entry[past].depth) / (entry[0].sec - entry[past].sec)); } } else { entry->velocity = STABLE; entry->speed = 0; } } /* One-, two- and three-minute minmax data */ for (i = 0; i < nr; i++) { struct plot_data *entry = pi->entry +i; analyze_plot_info_minmax(entry, pi->entry, pi->entry+nr); } return pi; } /* * simple structure to track the beginning and end tank pressure as * well as the integral of depth over time spent while we have no * pressure reading from the tank */ typedef struct pr_track_struct pr_track_t; struct pr_track_struct { int start; int end; int t_start; int t_end; int pressure_time; pr_track_t *next; }; static pr_track_t *pr_track_alloc(int start, int t_start) { pr_track_t *pt = malloc(sizeof(pr_track_t)); pt->start = start; pt->end = 0; pt->t_start = pt->t_end = t_start; pt->pressure_time = 0; pt->next = NULL; return pt; } /* poor man's linked list */ static pr_track_t *list_last(pr_track_t *list) { pr_track_t *tail = list; if (!tail) return NULL; while (tail->next) { tail = tail->next; } return tail; } static pr_track_t *list_add(pr_track_t *list, pr_track_t *element) { pr_track_t *tail = list_last(list); if (!tail) return element; tail->next = element; return list; } static void list_free(pr_track_t *list) { if (!list) return; list_free(list->next); free(list); } #ifdef DEBUG_PR_TRACK static void dump_pr_track(pr_track_t **track_pr) { int cyl; pr_track_t *list; for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { list = track_pr[cyl]; while (list) { printf("cyl%d: start %d end %d t_start %d t_end %d pt %d\n", cyl, list->start, list->end, list->t_start, list->t_end, list->pressure_time); list = list->next; } } } #endif /* * This looks at the pressures for one cylinder, and * calculates any missing beginning/end pressures for * each segment by taking the over-all SAC-rate into * account for that cylinder. * * NOTE! Many segments have full pressure information * (both beginning and ending pressure). But if we have * switched away from a cylinder, we will have the * beginning pressure for the first segment with a * missing end pressure. We may then have one or more * segments without beginning or end pressures, until * we finally have a segment with an end pressure. * * We want to spread out the pressure over these missing * segments according to how big of a time_pressure area * they have. */ static void fill_missing_segment_pressures(pr_track_t *list) { while (list) { int start = list->start, end; pr_track_t *tmp = list; int pt_sum = 0, pt = 0; for (;;) { pt_sum += tmp->pressure_time; end = tmp->end; if (end) break; end = start; if (!tmp->next) break; tmp = tmp->next; } if (!start) start = end; /* * Now 'start' and 'end' contain the pressure values * for the set of segments described by 'list'..'tmp'. * pt_sum is the sum of all the pressure-times of the * segments. * * Now dole out the pressures relative to pressure-time. */ list->start = start; tmp->end = end; for (;;) { int pressure; pt += list->pressure_time; pressure = start; if (pt_sum) pressure -= (start-end)*(double)pt/pt_sum; list->end = pressure; if (list == tmp) break; list = list->next; list->start = pressure; } /* Ok, we've done that set of segments */ list = list->next; } } /* * What's the pressure-time between two plot data entries? * We're calculating the integral of pressure over time by * adding these up. * * The units won't matter as long as everybody agrees about * them, since they'll cancel out - we use this to calculate * a constant SAC-rate-equivalent, but we only use it to * scale pressures, so it ends up being a unitless scaling * factor. */ static inline int pressure_time(struct dive *dive, struct divecomputer *dc, struct plot_data *a, struct plot_data *b) { int time = b->sec - a->sec; int depth = (a->depth + b->depth)/2; if (depth <= SURFACE_THRESHOLD) return 0; return depth_to_mbar(depth, dive) * time; } static void fill_missing_tank_pressures(struct dive *dive, struct plot_info *pi, pr_track_t **track_pr) { int cyl, i; struct plot_data *entry; int cur_pr[MAX_CYLINDERS]; #ifdef DEBUG_PR_TRACK /* another great debugging tool */ dump_pr_track(track_pr); #endif for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { if (!track_pr[cyl]) continue; fill_missing_segment_pressures(track_pr[cyl]); cur_pr[cyl] = track_pr[cyl]->start; } /* The first two are "fillers", but in case we don't have a sample * at time 0 we need to process the second of them here */ for (i = 1; i < pi->nr; i++) { double magic, cur_pt; pr_track_t *segment; int pressure; entry = pi->entry + i; cyl = entry->cylinderindex; if (SENSOR_PRESSURE(entry)) { cur_pr[cyl] = SENSOR_PRESSURE(entry); continue; } /* Find the right pressure segment for this entry.. */ segment = track_pr[cyl]; while (segment && segment->t_end < entry->sec) segment = segment->next; /* No (or empty) segment? Just use our current pressure */ if (!segment || !segment->pressure_time) { SENSOR_PRESSURE(entry) = cur_pr[cyl]; continue; } /* Overall pressure change over total pressure-time for this segment*/ magic = (segment->end - segment->start) / (double) segment->pressure_time; /* Use that overall pressure change to update the current pressure */ cur_pt = pressure_time(dive, &dive->dc, entry-1, entry); pressure = cur_pr[cyl] + cur_pt * magic + 0.5; INTERPOLATED_PRESSURE(entry) = pressure; cur_pr[cyl] = pressure; } } int get_cylinder_index(struct dive *dive, struct event *ev) { int i; int best = 0, score = INT_MAX; int target_o2, target_he; /* * Crazy gas change events give us odd encoded o2/he in percent. * Decode into our internal permille format. */ target_o2 = (ev->value & 0xFFFF) * 10; target_he = (ev->value >> 16) * 10; /* * Try to find a cylinder that best matches the target gas * mix. */ for (i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = dive->cylinder+i; int delta_o2, delta_he, distance; if (cylinder_nodata(cyl)) continue; delta_o2 = get_o2(&cyl->gasmix) - target_o2; delta_he = get_he(&cyl->gasmix) - target_he; distance = delta_o2 * delta_o2; /* Check the event type to figure out if we should care about the he part. * 11 is SAMPLE_EVENT_GASCHANGE, aka without he * 25 is SAMPLE_EVENT_GASCHANGE2, aka with he */ if (ev->type == 25) distance += delta_he * delta_he; if (distance >= score) continue; score = distance; best = i; } return best; } struct event *get_next_event(struct event *event, char *name) { if (!name || !*name) return NULL; while (event) { if (!strcmp(event->name, name)) return event; event = event->next; } return event; } static int set_cylinder_index(struct plot_info *pi, int i, int cylinderindex, unsigned int end) { while (i < pi->nr) { struct plot_data *entry = pi->entry+i; if (entry->sec > end) break; if (entry->cylinderindex != cylinderindex) { entry->cylinderindex = cylinderindex; entry->pressure[0] = 0; } i++; } return i; } static void check_gas_change_events(struct dive *dive, struct divecomputer *dc, struct plot_info *pi) { int i = 0, cylinderindex = 0; struct event *ev = get_next_event(dc->events, "gaschange"); if (!ev) return; do { i = set_cylinder_index(pi, i, cylinderindex, ev->time.seconds); cylinderindex = get_cylinder_index(dive, ev); ev = get_next_event(ev->next, "gaschange"); } while (ev); set_cylinder_index(pi, i, cylinderindex, ~0u); } void calculate_max_limits(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc) { struct plot_info *pi; int maxdepth; int maxtime = 0; int maxpressure = 0, minpressure = INT_MAX; int mintemp, maxtemp; int cyl; /* The plot-info is embedded in the graphics context */ pi = &gc->pi; memset(pi, 0, sizeof(*pi)); maxdepth = dive->maxdepth.mm; mintemp = dive->mintemp.mkelvin; maxtemp = dive->maxtemp.mkelvin; /* Get the per-cylinder maximum pressure if they are manual */ for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { unsigned int mbar = dive->cylinder[cyl].start.mbar; if (mbar > maxpressure) maxpressure = mbar; } /* Then do all the samples from all the dive computers */ do { int i = dc->samples; int lastdepth = 0; struct sample *s = dc->sample; while (--i >= 0) { int depth = s->depth.mm; int pressure = s->cylinderpressure.mbar; int temperature = s->temperature.mkelvin; if (!mintemp && temperature < mintemp) mintemp = temperature; if (temperature > maxtemp) maxtemp = temperature; if (pressure && pressure < minpressure) minpressure = pressure; if (pressure > maxpressure) maxpressure = pressure; if (depth > maxdepth) maxdepth = s->depth.mm; if ((depth > SURFACE_THRESHOLD || lastdepth > SURFACE_THRESHOLD) && s->time.seconds > maxtime) maxtime = s->time.seconds; lastdepth = depth; s++; } } while ((dc = dc->next) != NULL); if (minpressure > maxpressure) minpressure = 0; pi->maxdepth = maxdepth; pi->maxtime = maxtime; pi->maxpressure = maxpressure; pi->minpressure = minpressure; pi->mintemp = mintemp; pi->maxtemp = maxtemp; } static struct plot_data *populate_plot_entries(struct dive *dive, struct divecomputer *dc, struct plot_info *pi) { int idx, maxtime, nr, i; int lastdepth, lasttime, lasttemp = 0; struct plot_data *plot_data; maxtime = pi->maxtime; /* * We want to have a plot_info event at least every 10s (so "maxtime/10+1"), * but samples could be more dense than that (so add in dc->samples), and * additionally we want two surface events around the whole thing (thus the * additional 4). */ nr = dc->samples + 5 + maxtime / 10; plot_data = calloc(nr, sizeof(struct plot_data)); pi->entry = plot_data; if (!plot_data) return NULL; pi->nr = nr; idx = 2; /* the two extra events at the start */ lastdepth = 0; lasttime = 0; for (i = 0; i < dc->samples; i++) { struct plot_data *entry = plot_data + idx; struct sample *sample = dc->sample+i; int time = sample->time.seconds; int depth = sample->depth.mm; int offset, delta; /* Add intermediate plot entries if required */ delta = time - lasttime; if (delta < 0) { time = lasttime; delta = 0; } for (offset = 10; offset < delta; offset += 10) { if (lasttime + offset > maxtime) break; /* Use the data from the previous plot entry */ *entry = entry[-1]; /* .. but update depth and time, obviously */ entry->sec = lasttime + offset; entry->depth = interpolate(lastdepth, depth, offset, delta); /* And clear out the sensor pressure, since we'll interpolate */ SENSOR_PRESSURE(entry) = 0; idx++; entry++; } if (time > maxtime) break; entry->sec = time; entry->depth = depth; entry->stopdepth = sample->stopdepth.mm; entry->stoptime = sample->stoptime.seconds; entry->ndl = sample->ndl.seconds; pi->has_ndl |= sample->ndl.seconds; entry->in_deco = sample->in_deco; entry->cns = sample->cns; entry->po2 = sample->po2 / 1000.0; /* FIXME! sensor index -> cylinder index translation! */ entry->cylinderindex = sample->sensor; SENSOR_PRESSURE(entry) = sample->cylinderpressure.mbar; if (sample->temperature.mkelvin) entry->temperature = lasttemp = sample->temperature.mkelvin; else entry->temperature = lasttemp; lasttime = time; lastdepth = depth; idx++; } /* Add two final surface events */ plot_data[idx++].sec = lasttime+1; plot_data[idx++].sec = lasttime+2; pi->nr = idx; return plot_data; } static void populate_cylinder_pressure_data(int idx, int start, int end, struct plot_info *pi) { int i; /* First: check that none of the entries has sensor pressure for this cylinder index */ for (i = 0; i < pi->nr; i++) { struct plot_data *entry = pi->entry+i; if (entry->cylinderindex != idx) continue; if (SENSOR_PRESSURE(entry)) return; } /* Then: populate the first entry with the beginning cylinder pressure */ for (i = 0; i < pi->nr; i++) { struct plot_data *entry = pi->entry+i; if (entry->cylinderindex != idx) continue; SENSOR_PRESSURE(entry) = start; break; } /* .. and the last entry with the ending cylinder pressure */ for (i = pi->nr; --i >= 0; /* nothing */) { struct plot_data *entry = pi->entry+i; if (entry->cylinderindex != idx) continue; SENSOR_PRESSURE(entry) = end; break; } } static void calculate_sac(struct dive *dive, struct plot_info *pi) { int i = 0, last = 0; struct plot_data *last_entry = NULL; for (i = 0; i < pi->nr; i++) { struct plot_data *entry = pi->entry+i; if (!last_entry || last_entry->cylinderindex != entry->cylinderindex) { last = i; last_entry = entry; entry->sac = get_local_sac(entry, pi->entry + i + 1, dive); } else { int j; entry->sac = 0; for (j = last; j < i; j++) entry->sac += get_local_sac(pi->entry + j, pi->entry + j + 1, dive); entry->sac /= (i - last); if (entry->sec - last_entry->sec >= SAC_WINDOW) { last++; last_entry = pi->entry + last; } } } } static void populate_secondary_sensor_data(struct divecomputer *dc, struct plot_info *pi) { /* We should try to see if it has interesting pressure data here */ } static void setup_gas_sensor_pressure(struct dive *dive, struct divecomputer *dc, struct plot_info *pi) { int i; struct divecomputer *secondary; /* First, populate the pressures with the manual cylinder data.. */ for (i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = dive->cylinder+i; int start = cyl->start.mbar ? : cyl->sample_start.mbar; int end = cyl->end.mbar ? : cyl->sample_end.mbar; if (!start || !end) continue; populate_cylinder_pressure_data(i, start, end, pi); } /* * Here, we should try to walk through all the dive computers, * and try to see if they have sensor data different from the * primary dive computer (dc). */ secondary = &dive->dc; do { if (secondary == dc) continue; populate_secondary_sensor_data(dc, pi); } while ((secondary = secondary->next) != NULL); } static void populate_pressure_information(struct dive *dive, struct divecomputer *dc, struct plot_info *pi) { int i, cylinderindex; pr_track_t *track_pr[MAX_CYLINDERS] = {NULL, }; pr_track_t *current; bool missing_pr = FALSE; cylinderindex = -1; current = NULL; for (i = 0; i < pi->nr; i++) { struct plot_data *entry = pi->entry + i; unsigned pressure = SENSOR_PRESSURE(entry); /* discrete integration of pressure over time to get the SAC rate equivalent */ if (current) { current->pressure_time += pressure_time(dive, dc, entry-1, entry); current->t_end = entry->sec; } /* track the segments per cylinder and their pressure/time integral */ if (entry->cylinderindex != cylinderindex) { cylinderindex = entry->cylinderindex; current = pr_track_alloc(pressure, entry->sec); track_pr[cylinderindex] = list_add(track_pr[cylinderindex], current); continue; } if (!pressure) { missing_pr = 1; continue; } current->end = pressure; /* Was it continuous? */ if (SENSOR_PRESSURE(entry-1)) continue; /* transmitter changed its working status */ current = pr_track_alloc(pressure, entry->sec); track_pr[cylinderindex] = list_add(track_pr[cylinderindex], current); } if (missing_pr) { fill_missing_tank_pressures(dive, pi, track_pr); } for (i = 0; i < MAX_CYLINDERS; i++) list_free(track_pr[i]); } /* calculate DECO STOP / TTS / NDL */ static void calculate_ndl_tts(double tissue_tolerance, struct plot_data *entry, struct dive *dive, double surface_pressure) { /* FIXME: This should be configurable */ /* ascent speed up to first deco stop */ const int ascent_s_per_step = 1; const int ascent_mm_per_step = 200; /* 12 m/min */ /* ascent speed between deco stops */ const int ascent_s_per_deco_step = 1; const int ascent_mm_per_deco_step = 16; /* 1 m/min */ /* how long time steps in deco calculations? */ const int time_stepsize = 10; const int deco_stepsize = 3000; /* at what depth is the current deco-step? */ int next_stop = ROUND_UP(deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1), deco_stepsize); int ascent_depth = entry->depth; /* at what time should we give up and say that we got enuff NDL? */ const int max_ndl = 7200; int cylinderindex = entry->cylinderindex; /* If we don't have a ceiling yet, calculate ndl. Don't try to calculate * a ndl for lower values than 3m it would take forever */ if (next_stop == 0) { if(entry->depth < 3000) { entry->ndl = max_ndl; return; } /* stop if the ndl is above max_ndl seconds, and call it plenty of time */ while (entry->ndl_calc < max_ndl && deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1) <= 0) { entry->ndl_calc += time_stepsize; tissue_tolerance = add_segment(depth_to_mbar(entry->depth, dive) / 1000.0, &dive->cylinder[cylinderindex].gasmix, time_stepsize, entry->po2 * 1000, dive); } /* we don't need to calculate anything else */ return; } /* We are in deco */ entry->in_deco_calc = TRUE; /* Add segments for movement to stopdepth */ for (; ascent_depth > next_stop; ascent_depth -= ascent_mm_per_step, entry->tts_calc += ascent_s_per_step) { tissue_tolerance = add_segment(depth_to_mbar(ascent_depth, dive) / 1000.0, &dive->cylinder[cylinderindex].gasmix, ascent_s_per_step, entry->po2 * 1000, dive); next_stop = ROUND_UP(deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1), deco_stepsize); } ascent_depth = next_stop; /* And how long is the current deco-step? */ entry->stoptime_calc = 0; entry->stopdepth_calc = next_stop; next_stop -= deco_stepsize; /* And how long is the total TTS */ while(next_stop >= 0) { /* save the time for the first stop to show in the graph */ if (ascent_depth == entry->stopdepth_calc) entry->stoptime_calc += time_stepsize; entry->tts_calc += time_stepsize; tissue_tolerance = add_segment(depth_to_mbar(ascent_depth, dive) / 1000.0, &dive->cylinder[cylinderindex].gasmix, time_stepsize, entry->po2 * 1000, dive); if (deco_allowed_depth(tissue_tolerance, surface_pressure, dive, 1) <= next_stop) { /* move to the next stop and add the travel between stops */ for (; ascent_depth > next_stop ; ascent_depth -= ascent_mm_per_deco_step, entry->tts_calc += ascent_s_per_deco_step) tissue_tolerance = add_segment(depth_to_mbar(ascent_depth, dive) / 1000.0, &dive->cylinder[cylinderindex].gasmix, ascent_s_per_deco_step, entry->po2 * 1000, dive); ascent_depth = next_stop; next_stop -= deco_stepsize; } } } /* Let's try to do some deco calculations. * Needs to be run before calculate_gas_information so we know that if we have a po2, where in ccr-mode. */ static void calculate_deco_information(struct dive *dive, struct divecomputer *dc, struct plot_info *pi, bool print_mode) { int i; double surface_pressure = (dc->surface_pressure.mbar ? dc->surface_pressure.mbar : get_surface_pressure_in_mbar(dive, TRUE)) / 1000.0; double tissue_tolerance = 0; for (i = 1; i < pi->nr; i++) { struct plot_data *entry = pi->entry + i; int j, t0 = (entry - 1)->sec, t1 = entry->sec; for (j = t0+1; j <= t1; j++) { int depth = interpolate(entry[-1].depth, entry[0].depth, j - t0, t1 - t0); double min_pressure = add_segment(depth_to_mbar(depth, dive) / 1000.0, &dive->cylinder[entry->cylinderindex].gasmix, 1, entry->po2 * 1000, dive); tissue_tolerance = min_pressure; } if (t0 == t1) entry->ceiling = (entry - 1)->ceiling; else entry->ceiling = deco_allowed_depth(tissue_tolerance, surface_pressure, dive, !prefs.calc_ceiling_3m_incr); for (j=0; j<16; j++) entry->ceilings[j] = deco_allowed_depth(tolerated_by_tissue[j], surface_pressure, dive, 1); /* should we do more calculations? * We don't for print-mode because this info doesn't show up there */ if (prefs.calc_ndl_tts && !print_mode) { /* We are going to mess up deco state, so store it for later restore */ char *cache_data = NULL; cache_deco_state(tissue_tolerance, &cache_data); calculate_ndl_tts(tissue_tolerance, entry, dive, surface_pressure); /* Restore "real" deco state for next real time step */ tissue_tolerance = restore_deco_state(cache_data); free(cache_data); } } #if DECO_CALC_DEBUG & 1 dump_tissues(); #endif } static void calculate_gas_information(struct dive *dive, struct plot_info *pi) { int i; double amb_pressure; for (i = 1; i < pi->nr; i++) { int fo2, fhe; struct plot_data *entry = pi->entry + i; int cylinderindex = entry->cylinderindex; amb_pressure = depth_to_mbar(entry->depth, dive) / 1000.0; fo2 = get_o2(&dive->cylinder[cylinderindex].gasmix); fhe = get_he(&dive->cylinder[cylinderindex].gasmix); double ratio = (double)fhe / (1000.0 - fo2); if (entry->po2) { /* we have an O2 partial pressure in the sample - so this * is likely a CC dive... use that instead of the value * from the cylinder info */ double po2 = entry->po2 > amb_pressure ? amb_pressure : entry->po2; entry->po2 = po2; entry->phe = (amb_pressure - po2) * ratio; entry->pn2 = amb_pressure - po2 - entry->phe; } else { entry->po2 = fo2 / 1000.0 * amb_pressure; entry->phe = fhe / 1000.0 * amb_pressure; entry->pn2 = (1000 - fo2 - fhe) / 1000.0 * amb_pressure; } /* Calculate MOD, EAD, END and EADD based on partial pressures calculated before * so there is no difference in calculating between OC and CC * EAD takes O2 + N2 (air) into account * END just uses N2 */ entry->mod = (prefs.mod_ppO2 / fo2 * 1000 - 1) * 10000; entry->ead = (entry->depth + 10000) * (entry->po2 + (amb_pressure - entry->po2) * (1 - ratio)) / amb_pressure - 10000; entry->end = (entry->depth + 10000) * (amb_pressure - entry->po2) * (1 - ratio) / amb_pressure / N2_IN_AIR * 1000 - 10000; entry->eadd = (entry->depth + 10000) * (entry->po2 / amb_pressure * O2_DENSITY + entry->pn2 / amb_pressure * N2_DENSITY + entry->phe / amb_pressure * HE_DENSITY) / (O2_IN_AIR * O2_DENSITY + N2_IN_AIR * N2_DENSITY) * 1000 -10000; if (entry->mod < 0) entry->mod = 0; if (entry->ead < 0) entry->ead = 0; if (entry->end < 0) entry->end = 0; if (entry->eadd < 0) entry->eadd = 0; if (entry->po2 > pi->maxpp && prefs.pp_graphs.po2) pi->maxpp = entry->po2; if (entry->phe > pi->maxpp && prefs.pp_graphs.phe) pi->maxpp = entry->phe; if (entry->pn2 > pi->maxpp && prefs.pp_graphs.pn2) pi->maxpp = entry->pn2; } } /* * Create a plot-info with smoothing and ranged min/max * * This also makes sure that we have extra empty events on both * sides, so that you can do end-points without having to worry * about it. */ struct plot_info *create_plot_info(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc, bool print_mode) { struct plot_info *pi; /* The plot-info is embedded in the graphics context */ pi = &gc->pi; /* reset deco information to start the calculation */ if (prefs.profile_calc_ceiling) init_decompression(dive); /* Create the new plot data */ if (last_pi_entry) free((void *)last_pi_entry); last_pi_entry = populate_plot_entries(dive, dc, pi); /* Populate the gas index from the gas change events */ check_gas_change_events(dive, dc, pi); /* Try to populate our gas pressure knowledge */ setup_gas_sensor_pressure(dive, dc, pi); /* .. calculate missing pressure entries */ populate_pressure_information(dive, dc, pi); /* Calculate sac */ calculate_sac(dive, pi); /* Then, calculate deco information */ if (prefs.profile_calc_ceiling) calculate_deco_information(dive, dc, pi, print_mode); /* And finaly calculate gas partial pressures */ calculate_gas_information(dive, pi); pi->meandepth = dive->dc.meandepth.mm; #ifdef DEBUG_PI /* awesome for debugging - not useful otherwise */ dump_pi(pi); #endif return analyze_plot_info(pi); } /* make sure you pass this the FIRST dc - it just walks the list */ static int nr_dcs(struct divecomputer *main) { int i = 1; struct divecomputer *dc = main; while ((dc = dc->next) != NULL) i++; return i; } struct divecomputer *select_dc(struct divecomputer *main) { int i = dc_number; struct divecomputer *dc = main; while (i < 0) i += nr_dcs(main); do { if (--i < 0) return dc; } while ((dc = dc->next) != NULL); /* If we switched dives to one with fewer DC's, reset the dive computer counter */ dc_number = 0; return main; } static void plot_string(struct plot_data *entry, char *buf, int bufsize, bool has_ndl) { int pressurevalue, mod, ead, end, eadd; const char *depth_unit, *pressure_unit, *temp_unit, *vertical_speed_unit; char *buf2 = malloc(bufsize); double depthvalue, tempvalue, speedvalue; depthvalue = get_depth_units(entry->depth, NULL, &depth_unit); snprintf(buf, bufsize, translate("gettextFromC","@:%d:%02d\nD:%.1f %s"), FRACTION(entry->sec, 60), depthvalue, depth_unit); if (GET_PRESSURE(entry)) { pressurevalue = get_pressure_units(GET_PRESSURE(entry), &pressure_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nP:%d %s"), buf2, pressurevalue, pressure_unit); } if (entry->temperature) { tempvalue = get_temp_units(entry->temperature, &temp_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nT:%.1f %s"), buf2, tempvalue, temp_unit); } speedvalue = get_vertical_speed_units(abs(entry->speed), NULL, &vertical_speed_unit); memcpy(buf2, buf, bufsize); /* Ascending speeds are positive, descending are negative */ if (entry->speed > 0) speedvalue *= -1; snprintf(buf, bufsize, translate("gettextFromC","%s\nV:%.2f %s"), buf2, speedvalue, vertical_speed_unit); if (entry->sac && prefs.show_sac) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nSAC:%2.1fl/min"), buf2, entry->sac / 1000.0); } if (entry->cns) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nCNS:%u%%"), buf2, entry->cns); } if (prefs.pp_graphs.po2) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\npO%s:%.2fbar"), buf2, UTF8_SUBSCRIPT_2, entry->po2); } if (prefs.pp_graphs.pn2) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\npN%s:%.2fbar"), buf2, UTF8_SUBSCRIPT_2, entry->pn2); } if (prefs.pp_graphs.phe) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\npHe:%.2fbar"), buf2, entry->phe); } if (prefs.mod) { mod = (int)get_depth_units(entry->mod, NULL, &depth_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nMOD:%d%s"), buf2, mod, depth_unit); } if (prefs.ead) { ead = (int)get_depth_units(entry->ead, NULL, &depth_unit); end = (int)get_depth_units(entry->end, NULL, &depth_unit); eadd = (int)get_depth_units(entry->eadd, NULL, &depth_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nEAD:%d%s\nEND:%d%s\nEADD:%d%s"), buf2, ead, depth_unit, end, depth_unit, eadd, depth_unit); } if (entry->stopdepth) { depthvalue = get_depth_units(entry->stopdepth, NULL, &depth_unit); memcpy(buf2, buf, bufsize); if (entry->ndl) { /* this is a safety stop as we still have ndl */ if (entry->stoptime) snprintf(buf, bufsize, translate("gettextFromC","%s\nSafetystop:%umin @ %.0f %s"), buf2, DIV_UP(entry->stoptime, 60), depthvalue, depth_unit); else snprintf(buf, bufsize, translate("gettextFromC","%s\nSafetystop:unkn time @ %.0f %s"), buf2, depthvalue, depth_unit); } else { /* actual deco stop */ if (entry->stoptime) snprintf(buf, bufsize, translate("gettextFromC","%s\nDeco:%umin @ %.0f %s"), buf2, DIV_UP(entry->stoptime, 60), depthvalue, depth_unit); else snprintf(buf, bufsize, translate("gettextFromC","%s\nDeco:unkn time @ %.0f %s"), buf2, depthvalue, depth_unit); } } else if (entry->in_deco) { /* this means we had in_deco set but don't have a stop depth */ memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nIn deco"), buf2); } else if (has_ndl) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nNDL:%umin"), buf2, DIV_UP(entry->ndl, 60)); } if (entry->stopdepth_calc && entry->stoptime_calc) { depthvalue = get_depth_units(entry->stopdepth_calc, NULL, &depth_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nDeco:%umin @ %.0f %s (calc)"), buf2, DIV_UP(entry->stoptime_calc, 60), depthvalue, depth_unit); } else if (entry->in_deco_calc) { /* This means that we have no NDL left, * and we have no deco stop, * so if we just accend to the surface slowly * (ascent_mm_per_step / ascent_s_per_step) * everything will be ok. */ memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nIn deco (calc)"), buf2); } else if (prefs.calc_ndl_tts && entry->ndl_calc != 0) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nNDL:%umin (calc)"), buf2, DIV_UP(entry->ndl_calc, 60)); } if (entry->tts_calc) { memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nTTS:%umin (calc)"), buf2, DIV_UP(entry->tts_calc, 60)); } if (entry->ceiling) { depthvalue = get_depth_units(entry->ceiling, NULL, &depth_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nCalculated ceiling %.0f %s"), buf2, depthvalue, depth_unit); if (prefs.calc_all_tissues){ int k; for (k=0; k<16; k++){ if (entry->ceilings[k]){ depthvalue = get_depth_units(entry->ceilings[k], NULL, &depth_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s\nTissue %.0fmin: %.0f %s"), buf2, buehlmann_N2_t_halflife[k], depthvalue, depth_unit); } } } } free(buf2); } void get_plot_details(struct graphics_context *gc, int time, char *buf, int bufsize) { struct plot_info *pi = &gc->pi; struct plot_data *entry = NULL; int i; for (i = 0; i < pi->nr; i++) { entry = pi->entry + i; if (entry->sec >= time) break; } if (entry) plot_string(entry, buf, bufsize, pi->has_ndl); } /* Compare two plot_data entries and writes the results into a string */ void compare_samples(struct plot_data *e1, struct plot_data *e2, char *buf, int bufsize, int sum) { struct plot_data *start, *stop, *data; const char *depth_unit, *pressure_unit, *vertical_speed_unit; char *buf2 = malloc(bufsize); int avg_speed, max_asc_speed, max_desc_speed; int delta_depth, avg_depth, max_depth, min_depth; int bar_used, last_pressure, pressurevalue; int count, last_sec, delta_time; double depthvalue, speedvalue; if (bufsize > 0) buf[0] = '\0'; if (e1 == NULL || e2 == NULL) { free(buf2); return; } if (e1->sec < e2->sec) { start = e1; stop = e2; } else if (e1->sec > e2->sec) { start = e2; stop = e1; } else { free(buf2); return; } count = 0; avg_speed = 0; max_asc_speed = 0; max_desc_speed = 0; delta_depth = abs(start->depth-stop->depth); delta_time = abs(start->sec-stop->sec); avg_depth = 0; max_depth = 0; min_depth = INT_MAX; bar_used = 0; last_sec = start->sec; last_pressure = GET_PRESSURE(start); data = start; while (data != stop) { data = start+count; if (sum) avg_speed += abs(data->speed)*(data->sec-last_sec); else avg_speed += data->speed*(data->sec-last_sec); avg_depth += data->depth*(data->sec-last_sec); if (data->speed > max_desc_speed) max_desc_speed = data->speed; if (data->speed < max_asc_speed) max_asc_speed = data->speed; if (data->depth < min_depth) min_depth = data->depth; if (data->depth > max_depth) max_depth = data->depth; /* Try to detect gas changes */ if (GET_PRESSURE(data) < last_pressure+2000) bar_used += last_pressure-GET_PRESSURE(data); count+=1; last_sec = data->sec; last_pressure = GET_PRESSURE(data); } avg_depth /= stop->sec-start->sec; avg_speed /= stop->sec-start->sec; snprintf(buf, bufsize, translate("gettextFromC","%sT: %d:%02d min"), UTF8_DELTA, delta_time/60, delta_time%60); memcpy(buf2, buf, bufsize); depthvalue = get_depth_units(delta_depth, NULL, &depth_unit); snprintf(buf, bufsize, translate("gettextFromC","%s %sD:%.1f%s"), buf2, UTF8_DELTA, depthvalue, depth_unit); memcpy(buf2, buf, bufsize); depthvalue = get_depth_units(min_depth, NULL, &depth_unit); snprintf(buf, bufsize, translate("gettextFromC","%s %sD:%.1f%s"), buf2, UTF8_DOWNWARDS_ARROW, depthvalue, depth_unit); memcpy(buf2, buf, bufsize); depthvalue = get_depth_units(max_depth, NULL, &depth_unit); snprintf(buf, bufsize, translate("gettextFromC","%s %sD:%.1f%s"), buf2, UTF8_UPWARDS_ARROW, depthvalue, depth_unit); memcpy(buf2, buf, bufsize); depthvalue = get_depth_units(avg_depth, NULL, &depth_unit); snprintf(buf, bufsize, translate("gettextFromC","%s %sD:%.1f%s\n"), buf2, UTF8_AVERAGE, depthvalue, depth_unit); memcpy(buf2, buf, bufsize); speedvalue = get_vertical_speed_units(abs(max_desc_speed), NULL, &vertical_speed_unit); snprintf(buf, bufsize, translate("gettextFromC","%s%sV:%.2f%s"), buf2, UTF8_DOWNWARDS_ARROW, speedvalue, vertical_speed_unit); memcpy(buf2, buf, bufsize); speedvalue = get_vertical_speed_units(abs(max_asc_speed), NULL, &vertical_speed_unit); snprintf(buf, bufsize, translate("gettextFromC","%s %sV:%.2f%s"), buf2, UTF8_UPWARDS_ARROW, speedvalue, vertical_speed_unit); memcpy(buf2, buf, bufsize); speedvalue = get_vertical_speed_units(abs(avg_speed), NULL, &vertical_speed_unit); snprintf(buf, bufsize, translate("gettextFromC","%s %sV:%.2f%s"), buf2, UTF8_AVERAGE, speedvalue, vertical_speed_unit); memcpy(buf2, buf, bufsize); /* Only print if gas has been used */ if (bar_used) { pressurevalue = get_pressure_units(bar_used, &pressure_unit); memcpy(buf2, buf, bufsize); snprintf(buf, bufsize, translate("gettextFromC","%s %sP:%d %s"), buf2, UTF8_DELTA, pressurevalue, pressure_unit); } free(buf2); } Subsurface-4.0.2/profile.h000066400000000000000000000062001226345450700154360ustar00rootroot00000000000000#ifndef PROFILE_H #define PROFILE_H #ifdef __cplusplus extern "C" { #endif typedef enum { STABLE, SLOW, MODERATE, FAST, CRAZY } velocity_t; struct divecomputer; struct graphics_context; struct plot_info; struct plot_data { unsigned int in_deco:1; int cylinderindex; int sec; /* pressure[0] is sensor pressure * pressure[1] is interpolated pressure */ int pressure[2]; int temperature; /* Depth info */ int depth; int ceiling; int ceilings[16]; int ndl; int stoptime; int stopdepth; int cns; int smoothed; int sac; double po2, pn2, phe; double mod, ead, end, eadd; velocity_t velocity; int speed; struct plot_data *min[3]; struct plot_data *max[3]; int avg[3]; /* values calculated by us */ unsigned int in_deco_calc:1; int ndl_calc; int tts_calc; int stoptime_calc; int stopdepth_calc; }; void calculate_max_limits(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc); struct plot_info *create_plot_info(struct dive *dive, struct divecomputer *dc, struct graphics_context *gc, bool print_mode); int setup_temperature_limits(struct graphics_context *gc); int get_cylinder_pressure_range(struct graphics_context *gc); void compare_samples(struct plot_data *e1, struct plot_data *e2, char *buf, int bufsize, int sum); struct ev_select { char *ev_name; bool plot_ev; }; /* * When showing dive profiles, we scale things to the * current dive. However, we don't scale past less than * 30 minutes or 90 ft, just so that small dives show * up as such unless zoom is enabled. * We also need to add 180 seconds at the end so the min/max * plots correctly */ int get_maxtime(struct plot_info *pi); /* get the maximum depth to which we want to plot * take into account the additional verical space needed to plot * partial pressure graphs */ int get_maxdepth(struct plot_info *pi); void setup_pp_limits(struct graphics_context *gc); #define ALIGN_LEFT 1 #define ALIGN_RIGHT 2 #define INVISIBLE 4 #define UNSORTABLE 8 #define EDITABLE 16 #ifndef TEXT_SCALE #define TEXT_SCALE 1.0 #endif #define DEPTH_TEXT_SIZE (12 * TEXT_SCALE) #define PRESSURE_TEXT_SIZE (12 * TEXT_SCALE) #define DC_TEXT_SIZE (12 * TEXT_SCALE) #define PP_TEXT_SIZE (12 * TEXT_SCALE) #define TEMP_TEXT_SIZE (12 * TEXT_SCALE) #define RIGHT (-1.0) #define CENTER (-0.5) #define LEFT (0.0) #define LINE_DOWN (1) #define TOP (0) #define MIDDLE (-0.5) #define BOTTOM (-1) #define SCALEXGC(x) (((x) - gc.leftx) / (gc.rightx - gc.leftx) * gc.maxx) #define SCALEYGC(y) (((y) - gc.topy) / (gc.bottomy - gc.topy) * gc.maxy) #define SCALEGC(x,y) SCALEXGC(x),SCALEYGC(y) #define SCALEX(gc,x) (((x)-gc->leftx)/(gc->rightx-gc->leftx)*gc->maxx) #define SCALEY(gc,y) (((y)-gc->topy)/(gc->bottomy-gc->topy)*gc->maxy) #define SCALE(gc,x,y) SCALEX(gc,x),SCALEY(gc,y) #define SENSOR_PR 0 #define INTERPOLATED_PR 1 #define SENSOR_PRESSURE(_entry) (_entry)->pressure[SENSOR_PR] #define INTERPOLATED_PRESSURE(_entry) (_entry)->pressure[INTERPOLATED_PR] #define GET_PRESSURE(_entry) (SENSOR_PRESSURE(_entry) ? SENSOR_PRESSURE(_entry) : INTERPOLATED_PRESSURE(_entry)) #define SAC_WINDOW 45 /* sliding window in seconds for current SAC calculation */ #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/qt-gui.cpp000066400000000000000000000367551226345450700155610ustar00rootroot00000000000000/* qt-gui.cpp */ /* Qt UI implementation */ #include #include #include #include #include #include #include #include #include #include "dive.h" #include "divelist.h" #include "display.h" #include "uemis.h" #include "device.h" #include "webservice.h" #include "libdivecomputer.h" #include "qt-ui/mainwindow.h" #include "helpers.h" #include "qthelper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // this will create a warning when executing lupdate #define translate(_context, arg) gettextFromC::instance()->tr(arg) const char *default_dive_computer_vendor; const char *default_dive_computer_product; const char *default_dive_computer_device; DiveComputerList dcList; static QApplication *application = NULL; static MainWindow *window = NULL; int error_count; const char *existing_filename; const char *getSetting(QSettings &s, QString name) { QVariant v; v = s.value(name); if (v.isValid()) { return strdup(v.toString().toUtf8().data()); } return NULL; } #ifdef Q_OS_WIN static QByteArray encodeUtf8(const QString &fname) { return fname.toUtf8(); } static QString decodeUtf8(const QByteArray &fname) { return QString::fromUtf8(fname); } #endif void init_ui(int *argcp, char ***argvp) { QVariant v; application = new QApplication(*argcp, *argvp); // tell Qt to use system proxies // note: on Linux, "system" == "environment variables" QNetworkProxyFactory::setUseSystemConfiguration(true); #if QT_VERSION < 0x050000 // ask QString in Qt 4 to interpret all char* as UTF-8, // like Qt 5 does. // 106 is "UTF-8", this is faster than lookup by name // [http://www.iana.org/assignments/character-sets/character-sets.xml] QTextCodec::setCodecForCStrings(QTextCodec::codecForMib(106)); # ifdef Q_OS_WIN QFile::setDecodingFunction(decodeUtf8); QFile::setEncodingFunction(encodeUtf8); # endif #endif QCoreApplication::setOrganizationName("Subsurface"); QCoreApplication::setOrganizationDomain("subsurface.hohndel.org"); QCoreApplication::setApplicationName("Subsurface"); // find plugins installed in the application directory (without this SVGs don't work on Windows) QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath()); QSettings s; s.beginGroup("Language"); QLocale loc; if (!s.value("UseSystemLanguage", true).toBool()){ loc = QLocale(s.value("UiLanguage", QLocale().uiLanguages().first()).toString()); } QString uiLang = loc.uiLanguages().first(); s.endGroup(); // there's a stupid Qt bug on MacOS where uiLanguages doesn't give us the country info if (!uiLang.contains('-') && uiLang != loc.bcp47Name()) { QLocale loc2(loc.bcp47Name()); loc = loc2; uiLang = loc2.uiLanguages().first(); } // we don't have translations for English - if we don't check for this // Qt will proceed to load the second language in preference order - not what we want // on Linux this tends to be en-US, but on the Mac it's just en if (!uiLang.startsWith("en")) { qtTranslator = new QTranslator; if (qtTranslator->load(loc,"qt", "_", QLibraryInfo::location(QLibraryInfo::TranslationsPath))) { application->installTranslator(qtTranslator); } else { qDebug() << "can't find Qt localization for locale" << uiLang << "searching in" << QLibraryInfo::location(QLibraryInfo::TranslationsPath); } ssrfTranslator = new QTranslator; if (ssrfTranslator->load(loc,"subsurface", "_") || ssrfTranslator->load(loc,"subsurface", "_", getSubsurfaceDataPath("translations")) || ssrfTranslator->load(loc,"subsurface", "_", getSubsurfaceDataPath("../translations"))) { application->installTranslator(ssrfTranslator); } else { qDebug() << "can't find Subsurface localization for locale" << uiLang; } } s.beginGroup("DiveComputer"); default_dive_computer_vendor = getSetting(s, "dive_computer_vendor"); default_dive_computer_product = getSetting(s,"dive_computer_product"); default_dive_computer_device = getSetting(s, "dive_computer_device"); s.endGroup(); window = new MainWindow(); window->show(); if (existing_filename && existing_filename[0] != '\0') window->setTitle(MWTF_FILENAME); else window->setTitle(MWTF_DEFAULT); return; } void run_ui(void) { application->exec(); } void exit_ui(void) { delete window; delete application; if (existing_filename) free((void *)existing_filename); if (default_dive_computer_device) free((void *)default_dive_computer_device); } void set_filename(const char *filename, bool force) { if (!force && existing_filename) return; free((void *)existing_filename); if (filename) existing_filename = strdup(filename); else existing_filename = NULL; } const QString get_dc_nickname(const char *model, uint32_t deviceid) { const DiveComputerNode *existNode = dcList.getExact(model, deviceid); if (!existNode) return QString(); else if (!existNode->nickName.isEmpty()) return existNode->nickName; else return model; } void set_dc_nickname(struct dive *dive) { if (!dive) return; struct divecomputer *dc = &dive->dc; while (dc) { if (dc->model && *dc->model && dc->deviceid && !dcList.getExact(dc->model, dc->deviceid)) { // we don't have this one, yet const DiveComputerNode *existNode = dcList.get(dc->model); if (existNode) { // we already have this model but a different deviceid QString simpleNick(dc->model); if (dc->deviceid == 0) simpleNick.append(" (unknown deviceid)"); else simpleNick.append(" (").append(QString::number(dc->deviceid, 16)).append(")"); dcList.addDC(dc->model, dc->deviceid, simpleNick); } else { dcList.addDC(dc->model, dc->deviceid); } } dc = dc->next; } } QString get_depth_string(int mm, bool showunit, bool showdecimal) { if (prefs.units.length == units::METERS) { double meters = mm / 1000.0; return QString("%1%2").arg(meters, 0, 'f', (showdecimal && meters < 20.0) ? 1 : 0 ).arg(showunit ? translate("gettextFromC","m") : ""); } else { double feet = mm_to_feet(mm); return QString("%1%2").arg(feet, 0, 'f', showdecimal ? 1 : 0). arg(showunit ? translate("gettextFromC","ft") : ""); } } QString get_depth_string(depth_t depth, bool showunit, bool showdecimal) { return get_depth_string(depth.mm, showunit, showdecimal); } QString get_depth_unit() { if (prefs.units.length == units::METERS) return QString("%1").arg(translate("gettextFromC","m")); else return QString("%1").arg(translate("gettextFromC","ft")); } QString get_weight_string(weight_t weight, bool showunit) { QString str = weight_string (weight.grams); if (get_units()->weight == units::KG) { str = QString ("%1%2").arg(str).arg(showunit ? translate("gettextFromC","kg") : ""); } else { str = QString ("%1%2").arg(str).arg(showunit ? translate("gettextFromC","lbs") : ""); } return (str); } QString get_weight_unit() { if (prefs.units.weight == units::KG) return QString("%1").arg(translate("gettextFromC","kg")); else return QString("%1").arg(translate("gettextFromC","lbs")); } /* these methods retrieve used gas per cylinder */ static unsigned start_pressure(cylinder_t *cyl) { return cyl->start.mbar ? : cyl->sample_start.mbar; } static unsigned end_pressure(cylinder_t *cyl) { return cyl->end.mbar ? : cyl->sample_end.mbar; } QString get_cylinder_used_gas_string(cylinder_t *cyl, bool showunit) { int decimals; const char *unit; double gas_usage; /* Get the cylinder gas use in mbar */ gas_usage = start_pressure(cyl) - end_pressure(cyl); /* Can we turn it into a volume? */ if (cyl->type.size.mliter) { gas_usage = bar_to_atm(gas_usage / 1000); gas_usage *= cyl->type.size.mliter; gas_usage = get_volume_units(gas_usage, &decimals, &unit); } else { gas_usage = get_pressure_units(gas_usage, &unit); decimals = 0; } // translate("gettextFromC","%.*f %s" return QString("%1 %2").arg(gas_usage, 0, 'f', decimals).arg(showunit ? unit : ""); } QString get_temperature_string(temperature_t temp, bool showunit) { if (temp.mkelvin == 0) { return ""; //temperature not defined } else if (prefs.units.temperature == units::CELSIUS) { double celsius = mkelvin_to_C(temp.mkelvin); return QString("%1%2%3").arg(celsius, 0, 'f', 1).arg(showunit ? (UTF8_DEGREE): "") .arg(showunit ? translate("gettextFromC","C") : ""); } else { double fahrenheit = mkelvin_to_F(temp.mkelvin); return QString("%1%2%3").arg(fahrenheit, 0, 'f', 1).arg(showunit ? (UTF8_DEGREE): "") .arg(showunit ? translate("gettextFromC","F") : ""); } } QString get_temp_unit() { if (prefs.units.temperature == units::CELSIUS) return QString(UTF8_DEGREE "C"); else return QString(UTF8_DEGREE "F"); } QString get_volume_string(volume_t volume, bool showunit, unsigned int mbar) { if (prefs.units.volume == units::LITER) { double liter = volume.mliter / 1000.0; return QString("%1%2").arg(liter, 0, 'f', liter >= 40.0 ? 0 : 1 ).arg(showunit ? translate("gettextFromC","l") : ""); } else { double cuft = ml_to_cuft(volume.mliter); if (mbar) cuft *= bar_to_atm(mbar / 1000.0); return QString("%1%2").arg(cuft, 0, 'f', cuft >= 20.0 ? 0 : (cuft >= 2.0 ? 1 : 2)).arg(showunit ? translate("gettextFromC","cuft") : ""); } } QString get_volume_unit() { if (prefs.units.volume == units::LITER) return "l"; else return "cuft"; } QString get_pressure_string(pressure_t pressure, bool showunit) { if (prefs.units.pressure == units::BAR) { double bar = pressure.mbar / 1000.0; return QString("%1%2").arg(bar, 0, 'f', 1).arg(showunit ? translate("gettextFromC","bar") : ""); } else { double psi = mbar_to_PSI(pressure.mbar); return QString("%1%2").arg(psi, 0, 'f', 0).arg(showunit ? translate("gettextFromC","psi") : ""); } } double get_screen_dpi() { QDesktopWidget *mydesk = application->desktop(); return mydesk->physicalDpiX(); } int is_default_dive_computer(const char *vendor, const char *product) { return default_dive_computer_vendor && !strcmp(vendor, default_dive_computer_vendor) && default_dive_computer_product && !strcmp(product, default_dive_computer_product); } int is_default_dive_computer_device(const char *name) { return default_dive_computer_device && !strcmp(name, default_dive_computer_device); } void set_default_dive_computer(const char *vendor, const char *product) { QSettings s; if (!vendor || !*vendor) return; if (!product || !*product) return; if (is_default_dive_computer(vendor, product)) return; if (default_dive_computer_vendor) free((void *)default_dive_computer_vendor); if (default_dive_computer_product) free((void *)default_dive_computer_product); default_dive_computer_vendor = strdup(vendor); default_dive_computer_product = strdup(product); s.beginGroup("DiveComputer"); s.setValue("dive_computer_vendor", vendor); s.setValue("dive_computer_product", product); s.endGroup(); } void set_default_dive_computer_device(const char *name) { QSettings s; if (!name || !*name) return; if (is_default_dive_computer_device(name)) return; if (default_dive_computer_device) free((void *)default_dive_computer_device); default_dive_computer_device = strdup(name); s.beginGroup("DiveComputer"); s.setValue("dive_computer_device", name); s.endGroup(); } QString getSubsurfaceDataPath(QString folderToFind) { QString execdir; QDir folder; // first check if we are running in the build dir, so the path that we // are looking for is just a subdirectory of the execution path; // this also works on Windows as there we install the dirs // under the application path execdir = QCoreApplication::applicationDirPath(); folder = QDir(execdir.append(QDir::separator()).append(folderToFind)); if (folder.exists()) return folder.absolutePath(); // next check for the Linux typical $(prefix)/share/subsurface execdir = QCoreApplication::applicationDirPath(); if (execdir.contains("bin")) { folder = QDir(execdir.replace("bin", "share/subsurface/").append(folderToFind)); if (folder.exists()) return folder.absolutePath(); } // then look for the usual locations on a Mac execdir = QCoreApplication::applicationDirPath(); folder = QDir(execdir.append("/../Resources/share/").append(folderToFind)); if (folder.exists()) return folder.absolutePath(); execdir = QCoreApplication::applicationDirPath(); folder = QDir(execdir.append("/../Resources/").append(folderToFind)); if (folder.exists()) return folder.absolutePath(); return QString(""); } void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname) { dcList.addDC(model, deviceid, nickname, serial, firmware); } void call_for_each_dc(FILE *f, void (*callback)(FILE *, const char *, uint32_t, const char *, const char *, const char *)) { QList values = dcList.dcMap.values(); for (int i = 0; i < values.size(); i++) { const DiveComputerNode *node = &values.at(i); callback(f, node->model.toUtf8().data(), node->deviceId, node->nickName.toUtf8().data(), node->serialNumber.toUtf8().data(), node->firmware.toUtf8().data()); } } int gettimezoneoffset() { QDateTime dt1 = QDateTime::currentDateTime(); QDateTime dt2 = dt1.toUTC(); dt1.setTimeSpec(Qt::UTC); return dt2.secsTo(dt1); } int parseTemperatureToMkelvin(const QString& text) { int mkelvin; QString numOnly = text; numOnly.replace(",",".").remove(QRegExp("[^-0-9.]")); if (numOnly == "") return 0; double number = numOnly.toDouble(); switch (prefs.units.temperature) { case units::CELSIUS: mkelvin = C_to_mkelvin(number); break; case units::FAHRENHEIT: mkelvin = F_to_mkelvin(number); break; default: mkelvin = 0; } return mkelvin; } QString get_dive_date_string(timestamp_t when) { struct tm tm; utc_mkdate(when, &tm); return translate("gettextFromC", "%1, %2 %3, %4 %5:%6") .arg(weekday(tm.tm_wday)) .arg(monthname(tm.tm_mon)) .arg(tm.tm_mday) .arg(tm.tm_year + 1900) .arg(tm.tm_hour, 2, 10, QChar('0')) .arg(tm.tm_min, 2, 10, QChar('0')); } QString get_short_dive_date_string(timestamp_t when) { struct tm tm; utc_mkdate(when, &tm); return translate("gettextFromC", "%1 %2, %3\n%4:%5") .arg(monthname(tm.tm_mon)) .arg(tm.tm_mday) .arg(tm.tm_year + 1900) .arg(tm.tm_hour, 2, 10, QChar('0')) .arg(tm.tm_min, 2, 10, QChar('0')); } QString get_trip_date_string(timestamp_t when, int nr) { struct tm tm; utc_mkdate(when, &tm); if (nr != 1) return translate("gettextFromC", "%1 %2 (%3 dives)") .arg(monthname(tm.tm_mon)) .arg(tm.tm_year + 1900) .arg(nr); else return translate("gettextFromC", "%1 %2 (1 dive)") .arg(monthname(tm.tm_mon)) .arg(tm.tm_year + 1900); } static xmlDocPtr get_stylesheet_doc(const xmlChar *uri, xmlDictPtr, int, void *, xsltLoadType) { QFile f(QLatin1String(":/xslt/") + (const char *)uri); if (!f.open(QIODevice::ReadOnly)) return NULL; /* Load and parse the data */ QByteArray source = f.readAll(); xmlDocPtr doc = xmlParseMemory(source, source.size()); return doc; } xsltStylesheetPtr get_stylesheet(const char *name) { // this needs to be done only once, but doesn't hurt to run every time xsltSetLoaderFunc(get_stylesheet_doc); // get main document: xmlDocPtr doc = get_stylesheet_doc((const xmlChar *)name, NULL, 0, NULL, XSLT_LOAD_START); if (!doc) return NULL; // xsltSetGenericErrorFunc(stderr, NULL); xsltStylesheetPtr xslt = xsltParseStylesheetDoc(doc); if (!xslt) { xmlFreeDoc(doc); return NULL; } return xslt; } Subsurface-4.0.2/qt-gui.h000066400000000000000000000002741226345450700152110ustar00rootroot00000000000000#ifndef QT_GUI_H #define QT_GUI_H void init_ui(int *argcp, char ***argvp); void init_qt_ui(int *argcp, char ***argvp, char *errormessage); void run_ui(void); void exit_ui(void); #endif Subsurface-4.0.2/qt-ui/000077500000000000000000000000001226345450700146665ustar00rootroot00000000000000Subsurface-4.0.2/qt-ui/about.cpp000066400000000000000000000025221226345450700165050ustar00rootroot00000000000000#include "about.h" #include "ssrf-version.h" #include "mainwindow.h" #include #include #include #include SubsurfaceAbout *SubsurfaceAbout::instance() { static SubsurfaceAbout *self = new SubsurfaceAbout(mainWindow()); self->setAttribute(Qt::WA_QuitOnClose, false); return self; } SubsurfaceAbout::SubsurfaceAbout(QWidget* parent, Qt::WindowFlags f) { ui.setupUi(this); ui.aboutLabel->setText(tr("" \ "Subsurface %1

" \ "Multi-platform divelog software
" \ "Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013").arg(VERSION_STRING)); licenseButton = new QPushButton(tr("&License")); websiteButton = new QPushButton(tr("&Website")); ui.buttonBox->addButton(licenseButton, QDialogButtonBox::ActionRole); ui.buttonBox->addButton(websiteButton, QDialogButtonBox::ActionRole); connect(licenseButton, SIGNAL(clicked(bool)), this, SLOT(licenseClicked())); connect(websiteButton, SIGNAL(clicked(bool)), this, SLOT(websiteClicked())); } void SubsurfaceAbout::licenseClicked(void) { QDesktopServices::openUrl(QUrl("http://www.gnu.org/licenses/gpl-2.0.txt")); } void SubsurfaceAbout::websiteClicked(void) { QDesktopServices::openUrl(QUrl("http://subsurface.hohndel.org")); } Subsurface-4.0.2/qt-ui/about.h000066400000000000000000000006601226345450700161530ustar00rootroot00000000000000#ifndef ABOUT_H #define ABOUT_H #include #include #include "ui_about.h" class SubsurfaceAbout : public QDialog { Q_OBJECT public: static SubsurfaceAbout* instance(); private slots: void licenseClicked(); void websiteClicked(); private: explicit SubsurfaceAbout(QWidget* parent = 0, Qt::WindowFlags f = 0); QPushButton *licenseButton; QPushButton *websiteButton; Ui::SubsurfaceAbout ui; }; #endif Subsurface-4.0.2/qt-ui/about.ui000066400000000000000000000053511226345450700163430ustar00rootroot00000000000000 SubsurfaceAbout Qt::WindowModal 0 0 359 423 0 0 About Subsurface :/subsurface-icon:/subsurface-icon true 20 30 30 30 20 :/subsurface-icon Qt::AlignCenter Qt::RichText Qt::AlignCenter 10 Qt::Horizontal QDialogButtonBox::Close true buttonBox rejected() SubsurfaceAbout close() 227 437 227 224 Subsurface-4.0.2/qt-ui/completionmodels.cpp000066400000000000000000000023671226345450700207570ustar00rootroot00000000000000#include "completionmodels.h" #include "dive.h" #include "mainwindow.h" #define CREATE_SINGLETON(X) \ X* X::instance() \ { \ static QScopedPointer self(new X()); \ return self.data(); \ } CREATE_SINGLETON(BuddyCompletionModel); CREATE_SINGLETON(DiveMasterCompletionModel); CREATE_SINGLETON(LocationCompletionModel); CREATE_SINGLETON(SuitCompletionModel); CREATE_SINGLETON(TagCompletionModel); #undef CREATE_SINGLETON #define CREATE_UPDATE_METHOD(Class, diveStructMember) \ void Class::updateModel() \ { \ QStringList list; \ struct dive* dive; \ int i = 0; \ for_each_dive(i, dive){ \ QString buddy(dive->diveStructMember); \ if (!list.contains(buddy)){ \ list.append(buddy); \ } \ } \ setStringList(list); \ } CREATE_UPDATE_METHOD(BuddyCompletionModel, buddy); CREATE_UPDATE_METHOD(DiveMasterCompletionModel, divemaster); CREATE_UPDATE_METHOD(LocationCompletionModel, location); CREATE_UPDATE_METHOD(SuitCompletionModel, suit); void TagCompletionModel::updateModel() { if(g_tag_list == NULL) return; QStringList list; struct tag_entry *current_tag_entry = g_tag_list->next; while (current_tag_entry != NULL) { list.append(QString(current_tag_entry->tag->name)); current_tag_entry = current_tag_entry->next; } setStringList(list); } Subsurface-4.0.2/qt-ui/completionmodels.h000066400000000000000000000014411226345450700204140ustar00rootroot00000000000000#ifndef COMPLETIONMODELS_H #define COMPLETIONMODELS_H #include class BuddyCompletionModel : public QStringListModel { Q_OBJECT public: static BuddyCompletionModel* instance(); void updateModel(); }; class DiveMasterCompletionModel : public QStringListModel { Q_OBJECT public: static DiveMasterCompletionModel* instance(); void updateModel(); }; class LocationCompletionModel : public QStringListModel { Q_OBJECT public: static LocationCompletionModel* instance(); void updateModel(); }; class SuitCompletionModel : public QStringListModel { Q_OBJECT public: static SuitCompletionModel* instance(); void updateModel(); }; class TagCompletionModel : public QStringListModel { Q_OBJECT public: static TagCompletionModel* instance(); void updateModel(); }; #endif Subsurface-4.0.2/qt-ui/css/000077500000000000000000000000001226345450700154565ustar00rootroot00000000000000Subsurface-4.0.2/qt-ui/css/tableviews.css000066400000000000000000000000001226345450700203230ustar00rootroot00000000000000Subsurface-4.0.2/qt-ui/csvimportdialog.cpp000066400000000000000000000072321226345450700206040ustar00rootroot00000000000000#include #include #include "csvimportdialog.h" #include "mainwindow.h" #include "ui_csvimportdialog.h" const CSVImportDialog::CSVAppConfig CSVImportDialog::CSVApps[CSVAPPS] = { {"", }, {"APD Log Viewer", 1, 2, 16, 7, 18, 19, "Tab"}, {"XP5", 1, 2, 10, -1, -1, -1, "Tab"}, {NULL,} }; CSVImportDialog::CSVImportDialog(QWidget *parent) : QDialog(parent), selector(true), ui(new Ui::CSVImportDialog) { ui->setupUi(this); for (int i = 0; !CSVApps[i].name.isNull(); ++i) ui->knownImports->addItem(CSVApps[i].name); ui->CSVSeparator->addItem("Tab"); ui->CSVSeparator->addItem(","); ui->knownImports->setCurrentIndex(1); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); connect(ui->CSVDepth, SIGNAL(valueChanged(int)), this, SLOT(unknownImports(int))); connect(ui->CSVTime, SIGNAL(valueChanged(int)), this, SLOT(unknownImports(int))); connect(ui->CSVTemperature, SIGNAL(valueChanged(int)), this, SLOT(unknownImports(int))); connect(ui->temperatureCheckBox, SIGNAL(clicked(bool)), this, SLOT(unknownImports(bool))); connect(ui->CSVpo2, SIGNAL(valueChanged(int)), this, SLOT(unknownImports(int))); connect(ui->po2CheckBox, SIGNAL(clicked(bool)), this, SLOT(unknownImports(bool))); connect(ui->CSVcns, SIGNAL(valueChanged(int)), this, SLOT(unknownImports(int))); connect(ui->cnsCheckBox, SIGNAL(clicked(bool)), this, SLOT(unknownImports(bool))); connect(ui->CSVstopdepth, SIGNAL(valueChanged(int)), this, SLOT(unknownImports(int))); connect(ui->stopdepthCheckBox, SIGNAL(clicked(bool)), this, SLOT(unknownImports(bool))); } CSVImportDialog::~CSVImportDialog() { delete ui; } #define VALUE_IF_CHECKED(x) (ui->x->isEnabled() ? ui->x->value() - 1: -1) void CSVImportDialog::on_buttonBox_accepted() { char *error = NULL; parse_csv_file(ui->CSVFile->text().toUtf8().data(), ui->CSVTime->value() - 1, ui->CSVDepth->value() - 1, VALUE_IF_CHECKED(CSVTemperature), VALUE_IF_CHECKED(CSVpo2), VALUE_IF_CHECKED(CSVcns), VALUE_IF_CHECKED(CSVstopdepth), ui->CSVSeparator->currentIndex(), &error); if (error != NULL) { mainWindow()->showError(error); free(error); error = NULL; } process_dives(TRUE, FALSE); mainWindow()->refreshDisplay(); } void CSVImportDialog::on_CSVFileSelector_clicked() { QString filename = QFileDialog::getOpenFileName(this, tr("Open CSV Log File"), ".", tr("CSV Files (*.csv);;All Files(*)")); ui->CSVFile->setText(filename); ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!filename.isEmpty()); } #define SET_VALUE_AND_CHECKBOX(CSV, BOX, VAL) ({\ ui->CSV->blockSignals(true);\ ui->CSV->setValue(VAL);\ ui->CSV->setEnabled(VAL >= 0);\ ui->BOX->setChecked(VAL >= 0);\ ui->CSV->blockSignals(false);\ }) void CSVImportDialog::on_knownImports_currentIndexChanged(int index) { if (index == 0) return; ui->CSVTime->blockSignals(true); ui->CSVDepth->blockSignals(true); ui->CSVTime->setValue(CSVApps[index].time); ui->CSVDepth->setValue(CSVApps[index].depth); ui->CSVTime->blockSignals(false); ui->CSVDepth->blockSignals(false); SET_VALUE_AND_CHECKBOX(CSVTemperature, temperatureCheckBox, CSVApps[index].temperature); SET_VALUE_AND_CHECKBOX(CSVpo2, po2CheckBox, CSVApps[index].po2); SET_VALUE_AND_CHECKBOX(CSVcns, cnsCheckBox, CSVApps[index].cns); SET_VALUE_AND_CHECKBOX(CSVstopdepth, stopdepthCheckBox, CSVApps[index].stopdepth); } void CSVImportDialog::unknownImports(bool arg1) { unknownImports(); } void CSVImportDialog::unknownImports(int arg1) { unknownImports(); } void CSVImportDialog::unknownImports() { ui->knownImports->setCurrentIndex(0); } void CSVImportDialog::on_CSVFile_textEdited() { ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!ui->CSVFile->text().isEmpty()); } Subsurface-4.0.2/qt-ui/csvimportdialog.h000066400000000000000000000015301226345450700202440ustar00rootroot00000000000000#ifndef CSVIMPORTDIALOG_H #define CSVIMPORTDIALOG_H #include #include #include "../dive.h" #include "../divelist.h" namespace Ui { class CSVImportDialog; } class CSVImportDialog : public QDialog { Q_OBJECT public: explicit CSVImportDialog(QWidget *parent = 0); ~CSVImportDialog(); private slots: void on_buttonBox_accepted(); void on_CSVFileSelector_clicked(); void on_knownImports_currentIndexChanged(int index); void on_CSVFile_textEdited(); void unknownImports(int); void unknownImports(bool); private: void unknownImports(); bool selector; Ui::CSVImportDialog *ui; struct CSVAppConfig { QString name; int time; int depth; int temperature; int po2; int cns; int stopdepth; QString separator; }; #define CSVAPPS 4 static const CSVAppConfig CSVApps[CSVAPPS]; }; #endif // CSVIMPORTDIALOG_H Subsurface-4.0.2/qt-ui/csvimportdialog.ui000066400000000000000000000242631226345450700204420ustar00rootroot00000000000000 CSVImportDialog 0 0 432 330 Import CSV file :/subsurface-icon 0 0 Import File (CSV) ... 0 0 0 0 Field Configuration 1 1 Time 1 2 Depth 1 false Temp 1 false 0 PO2 1 false 0 Cns 1 false 0 Stopdepth label label_2 CSVTime CSVDepth temperatureCheckBox CSVTemperature po2CheckBox CSVpo2 cnsCheckBox CSVcns stopdepthCheckBox CSVstopdepth 0 0 0 Field Separator 0 0 Pre-configured imports -1 Qt::Vertical 20 40 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() CSVImportDialog accept() 310 286 215 164 buttonBox rejected() CSVImportDialog reject() 310 286 215 164 temperatureCheckBox clicked(bool) CSVTemperature setEnabled(bool) 77 191 161 191 po2CheckBox clicked(bool) CSVpo2 setEnabled(bool) 77 223 161 223 cnsCheckBox clicked(bool) CSVcns setEnabled(bool) 77 255 161 255 stopdepthCheckBox clicked(bool) CSVstopdepth setEnabled(bool) 77 287 161 287 Subsurface-4.0.2/qt-ui/divecomputermanagementdialog.cpp000066400000000000000000000031121226345450700233120ustar00rootroot00000000000000#include "divecomputermanagementdialog.h" #include "models.h" #include "mainwindow.h" #include #include "../qthelper.h" #include "../helpers.h" DiveComputerManagementDialog::DiveComputerManagementDialog(QWidget* parent, Qt::WindowFlags f): QDialog(parent, f), model(0) { ui.setupUi(this); init(); connect(ui.tableView, SIGNAL(clicked(QModelIndex)), this, SLOT(tryRemove(QModelIndex))); } void DiveComputerManagementDialog::init() { delete model; model = new DiveComputerModel(dcList.dcMap); ui.tableView->setModel(model); } DiveComputerManagementDialog* DiveComputerManagementDialog::instance() { static DiveComputerManagementDialog *self = new DiveComputerManagementDialog(mainWindow()); self->setAttribute(Qt::WA_QuitOnClose, false); return self; } void DiveComputerManagementDialog::update() { model->update(); ui.tableView->resizeColumnsToContents(); ui.tableView->setColumnWidth(DiveComputerModel::REMOVE, 22); layout()->activate(); } void DiveComputerManagementDialog::tryRemove(const QModelIndex& index) { if (index.column() != DiveComputerModel::REMOVE) return; QMessageBox::StandardButton response = QMessageBox::question( this, TITLE_OR_TEXT( tr("Remove the selected Dive Computer?"), tr("Are you sure that you want to \n remove the selected dive computer?")), QMessageBox::Ok | QMessageBox::Cancel ); if (response == QMessageBox::Ok) model->remove(index); } void DiveComputerManagementDialog::accept() { model->keepWorkingList(); hide(); close(); } void DiveComputerManagementDialog::reject() { model->dropWorkingList(); hide(); close(); } Subsurface-4.0.2/qt-ui/divecomputermanagementdialog.h000066400000000000000000000011301226345450700227550ustar00rootroot00000000000000#ifndef DIVECOMPUTERMANAGEMENTDIALOG_H #define DIVECOMPUTERMANAGEMENTDIALOG_H #include #include "ui_divecomputermanagementdialog.h" class QModelIndex; class DiveComputerModel; class DiveComputerManagementDialog : public QDialog{ Q_OBJECT public: static DiveComputerManagementDialog *instance(); void update(); void init(); public slots: void tryRemove(const QModelIndex& index); void accept(); void reject(); private: explicit DiveComputerManagementDialog(QWidget* parent = 0, Qt::WindowFlags f = 0); Ui::DiveComputerManagementDialog ui; DiveComputerModel *model; }; #endif Subsurface-4.0.2/qt-ui/divecomputermanagementdialog.ui000066400000000000000000000035131226345450700231520ustar00rootroot00000000000000 DiveComputerManagementDialog 0 0 560 300 Edit Dive Computer Nicknames :/subsurface-icon true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() DiveComputerManagementDialog accept() 248 254 157 274 buttonBox rejected() DiveComputerManagementDialog reject() 316 260 286 274 Subsurface-4.0.2/qt-ui/divelistview.cpp000066400000000000000000000573751226345450700201310ustar00rootroot00000000000000/* * divelistview.cpp * * classes for the divelist of Subsurface * */ #include "divelistview.h" #include "models.h" #include "modeldelegates.h" #include "mainwindow.h" #include "subsurfacewebservices.h" #include "../display.h" #include #include #include #include #include #include #include #include #include #include #include DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false), sortColumn(0), currentOrder(Qt::DescendingOrder), searchBox(new QLineEdit(this)) { setItemDelegate(new DiveListDelegate ); setUniformRowHeights(true); setItemDelegateForColumn(DiveTripModel::RATING, new StarWidgetsDelegate()); QSortFilterProxyModel *model = new QSortFilterProxyModel(this); model->setSortRole(DiveTripModel::SORT_ROLE); model->setFilterKeyColumn(-1); // filter all columns setModel(model); connect(model, SIGNAL(layoutChanged()), this, SLOT(fixMessyQtModelBehaviour())); setSortingEnabled(false); setContextMenuPolicy(Qt::DefaultContextMenu); header()->setContextMenuPolicy(Qt::ActionsContextMenu); const QFontMetrics metrics(defaultModelFont()); header()->setMinimumHeight(metrics.height() + 10); header()->setStretchLastSection(true); QAction *showSearchBox = new QAction(tr("Show Search Box"), this); showSearchBox->setShortcut( Qt::CTRL + Qt::Key_F); showSearchBox->setShortcutContext(Qt::ApplicationShortcut); addAction(showSearchBox); searchBox->installEventFilter(this); searchBox->hide(); connect(showSearchBox, SIGNAL(triggered(bool)), this, SLOT(showSearchEdit())); connect(searchBox, SIGNAL(textChanged(QString)), model, SLOT(setFilterFixedString(QString))); setupUi(); } DiveListView::~DiveListView() { QSettings settings; settings.beginGroup("ListWidget"); for (int i = DiveTripModel::NR; i < DiveTripModel::COLUMNS; i++){ if (isColumnHidden(i)) continue; settings.setValue(QString("colwidth%1").arg(i), columnWidth(i)); } settings.endGroup(); } void DiveListView::setupUi(){ QSettings settings; static bool firstRun = true; if(firstRun) backupExpandedRows(); settings.beginGroup("ListWidget"); /* if no width are set, use the calculated width for each column; * for that to work we need to temporarily expand all rows */ expandAll(); for (int i = DiveTripModel::NR; i < DiveTripModel::COLUMNS; i++) { if(isColumnHidden(i)) continue; QVariant width = settings.value(QString("colwidth%1").arg(i)); if (width.isValid()) setColumnWidth(i, width.toInt()); else setColumnWidth(i, 100); } settings.endGroup(); if(firstRun) restoreExpandedRows(); else collapseAll(); firstRun = false; setColumnWidth(lastVisibleColumn(), 10); } int DiveListView::lastVisibleColumn() { int lastColumn = -1; for (int i = DiveTripModel::NR; i < DiveTripModel::COLUMNS; i++) { if(isColumnHidden(i)) continue; lastColumn = i; } return lastColumn; } void DiveListView::backupExpandedRows(){ expandedRows.clear(); for(int i = 0; i < model()->rowCount(); i++) if(isExpanded( model()->index(i, 0) )) expandedRows.push_back(i); } void DiveListView::restoreExpandedRows(){ setAnimated(false); Q_FOREACH(const int &i, expandedRows) setExpanded( model()->index(i, 0), true ); setAnimated(true); } void DiveListView::fixMessyQtModelBehaviour() { QAbstractItemModel *m = model(); for(int i = 0; i < model()->rowCount(); i++) if (m->rowCount( m->index(i, 0) ) != 0) setFirstColumnSpanned(i, QModelIndex(), true); } // this only remembers dives that were selected, not trips void DiveListView::rememberSelection() { selectedDives.clear(); QItemSelection selection = selectionModel()->selection(); Q_FOREACH(const QModelIndex& index , selection.indexes()) { if (index.column() != 0) // We only care about the dives, so, let's stick to rows and discard columns. continue; struct dive *d = (struct dive *) index.data(DiveTripModel::DIVE_ROLE).value(); if (d) selectedDives.insert(d->divetrip, get_divenr(d)); } } void DiveListView::restoreSelection() { unselectDives(); Q_FOREACH(dive_trip_t *trip, selectedDives.keys()){ QList divesOnTrip = getDivesInTrip(trip); QList selectedDivesOnTrip = selectedDives.values(trip); // Trip was not selected, let's select single-dives. if (trip == NULL || divesOnTrip.count() != selectedDivesOnTrip.count()){ Q_FOREACH(int i, selectedDivesOnTrip){ selectDive(i); } }else{ selectTrip(trip); Q_FOREACH(int i, selectedDivesOnTrip){ selectDive(i); } } } } void DiveListView::selectTrip ( dive_trip_t* trip ) { if (!trip) return; QSortFilterProxyModel *m = qobject_cast(model()); QModelIndexList match = m->match(m->index(0,0), DiveTripModel::TRIP_ROLE, QVariant::fromValue(trip), 2, Qt::MatchRecursive); QItemSelectionModel::SelectionFlags flags; if (!match.count()) return; QModelIndex idx = match.first(); flags = QItemSelectionModel::Select; flags |= QItemSelectionModel::Rows; selectionModel()->select(idx, flags); expand(idx); } void DiveListView::unselectDives() { selectionModel()->clearSelection(); } QList< dive_trip_t* > DiveListView::selectedTrips() { QModelIndexList indexes = selectionModel()->selectedRows(); QList ret; Q_FOREACH(const QModelIndex& index, indexes){ dive_trip_t *trip = static_cast(index.data(DiveTripModel::TRIP_ROLE).value()); if(!trip) continue; ret.push_back(trip); } return ret; } void DiveListView::selectDive(int i, bool scrollto, bool toggle) { if( i == -1) return; QSortFilterProxyModel *m = qobject_cast(model()); QModelIndexList match = m->match(m->index(0,0), DiveTripModel::DIVE_IDX, i, 2, Qt::MatchRecursive); QItemSelectionModel::SelectionFlags flags; QModelIndex idx = match.first(); flags = toggle ? QItemSelectionModel::Toggle : QItemSelectionModel::Select; flags |= QItemSelectionModel::Rows; selectionModel()->setCurrentIndex(idx, flags); if(idx.parent().isValid()){ setAnimated(false); expand(idx.parent()); setAnimated(true); } if (scrollto) scrollTo(idx, PositionAtCenter); } void DiveListView::selectDives(const QList< int >& newDiveSelection) { if(!newDiveSelection.count()) return; disconnect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection))); disconnect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex))); setAnimated(false); collapseAll(); QSortFilterProxyModel *m = qobject_cast(model()); QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Select | QItemSelectionModel::Rows; QItemSelection newDeselected = selectionModel()->selection(); QModelIndexList diveList; int firstSelectedDive = -1; /* context for temp. variables. */{ int i = 0; struct dive *dive; for_each_dive(i, dive){ dive->selected = newDiveSelection.contains(i) == true; if(firstSelectedDive == -1 && dive->selected ){ firstSelectedDive = i; } } } select_dive(firstSelectedDive); Q_FOREACH(int i, newDiveSelection){ diveList.append(m->match(m->index(0,0), DiveTripModel::DIVE_IDX, i, 2, Qt::MatchRecursive).first()); } Q_FOREACH(const QModelIndex& idx, diveList){ selectionModel()->select(idx, flags); if(idx.parent().isValid() && !isExpanded(idx.parent())){ expand(idx.parent()); } } setAnimated(true); QTreeView::selectionChanged(selectionModel()->selection(), newDeselected); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection))); connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex))); Q_EMIT currentDiveChanged(selected_dive); const QModelIndex& idx = m->match(m->index(0,0), DiveTripModel::DIVE_IDX,selected_dive, 2, Qt::MatchRecursive).first(); scrollTo(idx); } void DiveListView::showSearchEdit() { searchBox->show(); searchBox->setFocus(); } bool DiveListView::eventFilter(QObject* , QEvent* event) { if(event->type() != QEvent::KeyPress) return false; QKeyEvent *keyEv = static_cast(event); if (keyEv->key() != Qt::Key_Escape) return false; searchBox->clear(); searchBox->hide(); QSortFilterProxyModel *m = qobject_cast(model()); m->setFilterFixedString(QString()); return true; } // NOTE! This loses trip selection, because while we remember the // dives, we don't remember the trips (see the "currentSelectedDives" // list). I haven't figured out how to look up the trip from the // index. TRIP_ROLE vs DIVE_ROLE? void DiveListView::headerClicked(int i) { DiveTripModel::Layout newLayout = i == (int) DiveTripModel::NR ? DiveTripModel::TREE : DiveTripModel::LIST; rememberSelection(); unselectDives(); /* No layout change? Just re-sort, and scroll to first selection, making sure all selections are expanded */ if (currentLayout == newLayout) { currentOrder = (currentOrder == Qt::DescendingOrder) ? Qt::AscendingOrder : Qt::DescendingOrder; sortByColumn(i, currentOrder); } else { // clear the model, repopulate with new indexes. if(currentLayout == DiveTripModel::TREE){ backupExpandedRows(); } reload(newLayout, false); currentOrder = Qt::DescendingOrder; sortByColumn(i, currentOrder); if (newLayout == DiveTripModel::TREE){ restoreExpandedRows(); } } restoreSelection(); } void DiveListView::reload(DiveTripModel::Layout layout, bool forceSort) { if (layout == DiveTripModel::CURRENT) layout = currentLayout; else currentLayout = layout; header()->setClickable(true); connect(header(), SIGNAL(sectionPressed(int)), this, SLOT(headerClicked(int)), Qt::UniqueConnection); QSortFilterProxyModel *m = qobject_cast(model()); QAbstractItemModel *oldModel = m->sourceModel(); if (oldModel){ oldModel->deleteLater(); } DiveTripModel *tripModel = new DiveTripModel(this); tripModel->setLayout(layout); m->setSourceModel(tripModel); if(!forceSort) return; sortByColumn(sortColumn, currentOrder); if (amount_selected && current_dive != NULL) { selectDive(selected_dive, true); } else { QModelIndex firstDiveOrTrip = m->index(0,0); if (firstDiveOrTrip.isValid()) { if (m->index(0,0, firstDiveOrTrip).isValid()) setCurrentIndex(m->index(0,0, firstDiveOrTrip)); else setCurrentIndex(firstDiveOrTrip); } } setupUi(); if(selectedIndexes().count()){ QModelIndex curr = selectedIndexes().first(); curr = curr.parent().isValid() ? curr.parent() : curr; if(!isExpanded(curr)){ setAnimated(false); expand(curr); setAnimated(true); } } if(currentLayout == DiveTripModel::TREE){ fixMessyQtModelBehaviour(); } } void DiveListView::reloadHeaderActions() { // Populate the context menu of the headers that will show // the menu to show / hide columns. if (!header()->actions().size()) { QSettings s; s.beginGroup("DiveListColumnState"); for(int i = 0; i < model()->columnCount(); i++) { QString title = QString("%1").arg(model()->headerData(i, Qt::Horizontal).toString()); QString settingName = QString("showColumn%1").arg(i); QAction *a = new QAction(title, header()); bool showHeaderFirstRun = !( i == DiveTripModel::MAXCNS || i == DiveTripModel::NITROX || i == DiveTripModel::OTU || i == DiveTripModel::TEMPERATURE || i == DiveTripModel::TOTALWEIGHT || i == DiveTripModel::SUIT || i == DiveTripModel::CYLINDER || i == DiveTripModel::SAC ); bool shown = s.value(settingName, showHeaderFirstRun).toBool(); a->setCheckable(true); a->setChecked(shown); a->setProperty("index", i); a->setProperty("settingName", settingName); connect(a, SIGNAL(triggered(bool)), this, SLOT(toggleColumnVisibilityByIndex())); header()->addAction(a); setColumnHidden(i, !shown); } s.endGroup(); } else { for(int i = 0; i < model()->columnCount(); i++) { QString title = QString("%1").arg(model()->headerData(i, Qt::Horizontal).toString()); header()->actions()[i]->setText(title); } } } void DiveListView::toggleColumnVisibilityByIndex() { QAction *action = qobject_cast(sender()); if (!action) return; QSettings s; s.beginGroup("DiveListColumnState"); s.setValue(action->property("settingName").toString(), action->isChecked()); s.endGroup(); s.sync(); setColumnHidden(action->property("index").toInt(), !action->isChecked()); setColumnWidth(lastVisibleColumn(), 10); } void DiveListView::currentChanged(const QModelIndex& current, const QModelIndex& previous) { if (!current.isValid()) return; scrollTo(current); } void DiveListView::selectionChanged(const QItemSelection& selected, const QItemSelection& deselected) { QItemSelection newSelected = selected.size() ? selected : selectionModel()->selection(); QItemSelection newDeselected = deselected; disconnect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection))); disconnect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex))); Q_FOREACH(const QModelIndex& index, newDeselected.indexes()) { if (index.column() != 0) continue; const QAbstractItemModel *model = index.model(); struct dive *dive = (struct dive*) model->data(index, DiveTripModel::DIVE_ROLE).value(); if (!dive) { // it's a trip! if (model->rowCount(index)) { struct dive *child = (struct dive*) model->data(index.child(0,0), DiveTripModel::DIVE_ROLE).value(); while (child) { deselect_dive(get_divenr(child)); child = child->next; } } } else { deselect_dive(get_divenr(dive)); } } Q_FOREACH(const QModelIndex& index, newSelected.indexes()) { if (index.column() != 0) continue; const QAbstractItemModel *model = index.model(); struct dive *dive = (struct dive*) model->data(index, DiveTripModel::DIVE_ROLE).value(); if (!dive) { // it's a trip! if (model->rowCount(index)) { QItemSelection selection; struct dive *child = (struct dive*) model->data(index.child(0,0), DiveTripModel::DIVE_ROLE).value(); while (child) { select_dive(get_divenr(child)); child = child->next; } selection.select(index.child(0,0), index.child(model->rowCount(index) -1 , 0)); selectionModel()->select(selection, QItemSelectionModel::Select | QItemSelectionModel::Rows); selectionModel()->setCurrentIndex(index, QItemSelectionModel::Select | QItemSelectionModel::NoUpdate); if (!isExpanded(index)) expand(index); } } else { select_dive(get_divenr(dive)); } } QTreeView::selectionChanged(selectionModel()->selection(), newDeselected); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(selectionChanged(QItemSelection,QItemSelection))); connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(currentChanged(QModelIndex,QModelIndex))); // now that everything is up to date, update the widgets Q_EMIT currentDiveChanged(selected_dive); } static bool can_merge(const struct dive *a, const struct dive *b) { if (!a || !b) return false; if (a->when > b->when) return false; /* Don't merge dives if there's more than half an hour between them */ if (a->when + a->duration.seconds + 30*60 < b->when) return false; return true; } void DiveListView::mergeDives() { int i; struct dive *dive, *maindive = NULL; for_each_dive(i, dive) { if (dive->selected) { if (!can_merge(maindive, dive)) { maindive = dive; } else { maindive = merge_two_dives(maindive, dive); i--; // otherwise we skip a dive in the freshly changed list } } } mainWindow()->refreshDisplay(); } void DiveListView::merge_trip(const QModelIndex &a, int offset) { int i = a.row() + offset; QModelIndex b = a.sibling(i,0); dive_trip_t *trip_a = (dive_trip_t *) a.data(DiveTripModel::TRIP_ROLE).value(); dive_trip_t *trip_b = (dive_trip_t *) b.data(DiveTripModel::TRIP_ROLE).value(); if (trip_a == trip_b || !trip_a || !trip_b) return; if (!trip_a->location && trip_b->location) trip_a->location = strdup(trip_b->location); if (!trip_a->notes && trip_b->notes) trip_a->notes = strdup(trip_b->notes); while (trip_b->dives) add_dive_to_trip(trip_b->dives, trip_a); rememberSelection(); reload(currentLayout, false); fixMessyQtModelBehaviour(); restoreSelection(); mark_divelist_changed(TRUE); } void DiveListView::mergeTripAbove() { merge_trip(contextMenuIndex, -1); } void DiveListView::mergeTripBelow() { merge_trip(contextMenuIndex, +1); } void DiveListView::removeFromTrip() { int i; struct dive *d; for_each_dive(i, d) { if (d->selected) remove_dive_from_trip(d, FALSE); } rememberSelection(); reload(currentLayout, false); fixMessyQtModelBehaviour(); restoreSelection(); mark_divelist_changed(TRUE); } void DiveListView::newTripAbove() { dive_trip_t *trip; int idx; struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); if (!d) // shouldn't happen as we only are setting up this action if this is a dive return; rememberSelection(); trip = create_and_hookup_trip_from_dive(d); for_each_dive(idx, d) { if (d->selected) add_dive_to_trip(d, trip); } trip->expanded = 1; reload(currentLayout, false); fixMessyQtModelBehaviour(); mark_divelist_changed(TRUE); restoreSelection(); } void DiveListView::addToTripAbove() { int idx, delta = (currentOrder == Qt::AscendingOrder) ? -1 : +1; dive_trip_t *trip = NULL; struct dive *pd = NULL; struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); if (!d) // shouldn't happen as we only are setting up this action if this is a dive return; rememberSelection(); if (d->selected) { // we are right-clicking on one of possibly many selected dive(s) // find the top selected dive, depending on the list order if (delta == 1) { for_each_dive(idx, d) { if (d->selected) pd = d; } d = pd; // this way we have the chronologically last } else { for_each_dive(idx, d) { if (d->selected) break; // now that's the chronologically first } } } // now find the trip "above" in the dive list if ((pd = get_dive(get_divenr(d) + delta)) != NULL) { trip = pd->divetrip; } if (!pd || !trip) // previous dive wasn't in a trip, so something is wrong return; add_dive_to_trip(d, trip); if (d->selected) { // there are possibly other selected dives that we should add for_each_dive(idx, d) { if (d->selected) add_dive_to_trip(d, trip); } } trip->expanded = 1; mark_divelist_changed(TRUE); reload(currentLayout, false); restoreSelection(); fixMessyQtModelBehaviour(); } void DiveListView::markDiveInvalid() { int i; struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); if (!d) return; for_each_dive (i, d) { if (!d->selected) continue; // now mark the dive invalid... how do we do THAT? // d->invalid = true; } if (amount_selected == 0) { mainWindow()->cleanUpEmpty(); } mark_divelist_changed(TRUE); mainWindow()->refreshDisplay(); if(prefs.display_invalid_dives == FALSE) { clearSelection(); // select top dive that isn't marked invalid rememberSelection(); } fixMessyQtModelBehaviour(); } void DiveListView::deleteDive() { int i; struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); if (!d) return; // after a dive is deleted the ones following it move forward in the dive_table // so instead of using the for_each_dive macro I'm using an explicit for loop // to make this easier to understand int lastDiveNr = -1; for (i = 0; i < dive_table.nr; i++) { d = get_dive(i); if (!d->selected) continue; delete_single_dive(i); i--; // so the next dive isn't skipped... it's now #i lastDiveNr = i; } if (amount_selected == 0) { mainWindow()->cleanUpEmpty(); } mark_divelist_changed(TRUE); mainWindow()->refreshDisplay(); if(lastDiveNr != -1){ clearSelection(); selectDive(lastDiveNr); rememberSelection(); } fixMessyQtModelBehaviour(); } void DiveListView::testSlot() { struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); if (d) { qDebug("testSlot called on dive #%d", d->number); } else { QModelIndex child = contextMenuIndex.child(0, 0); d = (struct dive *) child.data(DiveTripModel::DIVE_ROLE).value(); if (d) qDebug("testSlot called on trip including dive #%d", d->number); else qDebug("testSlot called on trip with no dive"); } } void DiveListView::contextMenuEvent(QContextMenuEvent *event) { QAction *collapseAction = NULL; // let's remember where we are contextMenuIndex = indexAt(event->pos()); struct dive *d = (struct dive *) contextMenuIndex.data(DiveTripModel::DIVE_ROLE).value(); dive_trip_t *trip = (dive_trip_t *) contextMenuIndex.data(DiveTripModel::TRIP_ROLE).value(); QMenu popup(this); if (currentLayout == DiveTripModel::TREE) { popup.addAction(tr("expand all"), this, SLOT(expandAll())); popup.addAction(tr("collapse all"), this, SLOT(collapseAll())); collapseAction = popup.addAction(tr("collapse others"), this, SLOT(collapseAll())); if (d) { popup.addAction(tr("remove dive(s) from trip"), this, SLOT(removeFromTrip())); popup.addAction(tr("create new trip above"), this, SLOT(newTripAbove())); popup.addAction(tr("add dive(s) to trip immediately above"), this, SLOT(addToTripAbove())); } if (trip) { popup.addAction(tr("merge trip with trip above"), this, SLOT(mergeTripAbove())); popup.addAction(tr("merge trip with trip below"), this, SLOT(mergeTripBelow())); } } if (d) { popup.addAction(tr("delete dive(s)"), this, SLOT(deleteDive())); #if 0 popup.addAction(tr("mark dive(s) invalid", this, SLOT(markDiveInvalid()))); #endif } if (amount_selected > 1 && consecutive_selected()) popup.addAction(tr("merge selected dives"), this, SLOT(mergeDives())); if (amount_selected >= 1) { popup.addAction(tr("save As"), this, SLOT(saveSelectedDivesAs())); popup.addAction(tr("export As UDDF"), this, SLOT(exportSelectedDivesAsUDDF())); popup.addAction(tr("shift times"), this, SLOT(shiftTimes())); } if (d) popup.addAction(tr("upload dive(s) to divelogs.de"), this, SLOT(uploadToDivelogsDE())); // "collapse all" really closes all trips, // "collapse" keeps the trip with the selected dive open QAction * actionTaken = popup.exec(event->globalPos()); if (actionTaken == collapseAction && collapseAction) { this->setAnimated(false); selectDive(selected_dive, true); scrollTo(selectedIndexes().first()); this->setAnimated(true); } event->accept(); } void DiveListView::saveSelectedDivesAs() { QSettings settings; QString lastDir = QDir::homePath(); settings.beginGroup("FileDialog"); if (settings.contains("LastDir")) { if(QDir::setCurrent(settings.value("LastDir").toString())) { lastDir = settings.value("LastDir").toString(); } } settings.endGroup(); QString fileName = QFileDialog::getSaveFileName(mainWindow(), tr("Save Dives As..."), QDir::homePath()); if (fileName.isEmpty()) return; // Keep last open dir QFileInfo fileInfo(fileName); settings.beginGroup("FileDialog"); settings.setValue("LastDir",fileInfo.dir().path()); settings.endGroup(); QByteArray bt = QFile::encodeName(fileName); save_dives_logic(bt.data(), TRUE); } void DiveListView::exportSelectedDivesAsUDDF() { QString filename; QFileInfo fi(system_default_filename()); filename = QFileDialog::getSaveFileName(this, tr("Save File as"), fi.absolutePath(), tr("UDDF files (*.uddf *.UDDF)")); if (!filename.isNull() && !filename.isEmpty()) export_dives_uddf(filename.toUtf8(), true); } void DiveListView::shiftTimes() { ShiftTimesDialog::instance()->show(); } void DiveListView::uploadToDivelogsDE() { DivelogsDeWebServices::instance()->prepareDivesForUpload(); } Subsurface-4.0.2/qt-ui/divelistview.h000066400000000000000000000037271226345450700175660ustar00rootroot00000000000000/* * divelistview.h * * header file for the dive list of Subsurface * */ #ifndef DIVELISTVIEW_H #define DIVELISTVIEW_H /*! A view subclass for use with dives Note: calling this a list view might be misleading? */ #include #include "models.h" class DiveListView : public QTreeView { Q_OBJECT public: DiveListView(QWidget *parent = 0); ~DiveListView(); void selectionChanged(const QItemSelection& selected, const QItemSelection& deselected); void currentChanged(const QModelIndex& current, const QModelIndex& previous); void reload(DiveTripModel::Layout layout, bool forceSort = true); bool eventFilter(QObject* , QEvent* ); void unselectDives(); void selectDive(int dive_table_idx, bool scrollto = false, bool toggle = false); void selectDives(const QList& newDiveSelection); void rememberSelection(); void restoreSelection(); void contextMenuEvent(QContextMenuEvent *event); QList selectedTrips(); public slots: void toggleColumnVisibilityByIndex(); void reloadHeaderActions(); void headerClicked(int); void showSearchEdit(); void removeFromTrip(); void deleteDive(); void markDiveInvalid(); void testSlot(); void fixMessyQtModelBehaviour(); void mergeTripAbove(); void mergeTripBelow(); void newTripAbove(); void addToTripAbove(); void mergeDives(); void saveSelectedDivesAs(); void exportSelectedDivesAsUDDF(); void shiftTimes(); void uploadToDivelogsDE(); signals: void currentDiveChanged(int divenr); private: bool mouseClickSelection; QList expandedRows; int sortColumn; Qt::SortOrder currentOrder; DiveTripModel::Layout currentLayout; QLineEdit *searchBox; QModelIndex contextMenuIndex; /* if dive_trip_t is null, there's no problem. */ QMultiHash selectedDives; void merge_trip(const QModelIndex &a, const int offset); void setupUi(); void backupExpandedRows(); void restoreExpandedRows(); int lastVisibleColumn(); void selectTrip ( dive_trip_t* trip ); }; #endif // DIVELISTVIEW_H Subsurface-4.0.2/qt-ui/diveplanner.cpp000066400000000000000000001264231226345450700177110ustar00rootroot00000000000000#include "diveplanner.h" #include "graphicsview-common.h" #include "models.h" #include "modeldelegates.h" #include "mainwindow.h" #include "maintab.h" #include "tableview.h" #include "graphicsview-common.h" #include "../dive.h" #include "../divelist.h" #include "../planner.h" #include "helpers.h" #include #include #include #include #include #include #include #include #include #include #include #define TIME_INITIAL_MAX 30 #define MAX_DEPTH M_OR_FT(150, 450) #define MIN_DEPTH M_OR_FT(20, 60) QString gasToStr(const int o2Permille, const int hePermille) { uint o2 = (o2Permille + 5) / 10, he = (hePermille + 5) / 10; QString result = is_air(o2Permille, hePermille) ? QObject::tr("AIR") : he == 0 ? QString("EAN%1").arg(o2, 2, 10, QChar('0')) : QString("%1/%2").arg(o2).arg(he); return result; } QString dpGasToStr(const divedatapoint& p) { return gasToStr(p.o2, p.he); } QColor getColor(const color_indice_t i) { return profile_color[i].at(0); } static DivePlannerPointsModel *plannerModel = DivePlannerPointsModel::instance(); DivePlannerGraphics::DivePlannerGraphics(QWidget* parent): QGraphicsView(parent), activeDraggedHandler(0) { fill_profile_color(); setBackgroundBrush(profile_color[BACKGROUND].at(0)); setMouseTracking(true); setScene(new QGraphicsScene()); scene()->setSceneRect(0,0,1920,1080); verticalLine = new QGraphicsLineItem( fromPercent(0, Qt::Horizontal), fromPercent(0, Qt::Vertical), fromPercent(0, Qt::Horizontal), fromPercent(100, Qt::Vertical) ); verticalLine->setPen(QPen(Qt::DotLine)); scene()->addItem(verticalLine); horizontalLine = new QGraphicsLineItem( fromPercent(0, Qt::Horizontal), fromPercent(0, Qt::Vertical), fromPercent(100, Qt::Horizontal), fromPercent(0, Qt::Vertical) ); horizontalLine->setPen(QPen(Qt::DotLine)); scene()->addItem(horizontalLine); timeLine = new Ruler(); timeLine->setMinimum(0); timeLine->setMaximum(TIME_INITIAL_MAX); timeLine->setTickInterval(10); timeLine->setColor(getColor(TIME_GRID)); timeLine->setLine( fromPercent(10, Qt::Horizontal), fromPercent(85, Qt::Vertical), fromPercent(90, Qt::Horizontal), fromPercent(85, Qt::Vertical) ); timeLine->setOrientation(Qt::Horizontal); timeLine->setTickSize(fromPercent(1, Qt::Vertical)); timeLine->setTextColor(getColor(TIME_TEXT)); timeLine->updateTicks(); scene()->addItem(timeLine); depthLine = new Ruler(); depthLine->setMinimum(0); depthLine->setMaximum(M_OR_FT(40,120)); depthLine->setTickInterval(M_OR_FT(10,30)); depthLine->setLine( fromPercent(10, Qt::Horizontal), fromPercent(10, Qt::Vertical), fromPercent(10, Qt::Horizontal), fromPercent(85, Qt::Vertical) ); depthLine->setOrientation(Qt::Vertical); depthLine->setTickSize(fromPercent(1, Qt::Horizontal)); depthLine->setColor(getColor(DEPTH_GRID)); depthLine->setTextColor(getColor(SAMPLE_DEEP)); depthLine->updateTicks(); depthLine->unitSystem = prefs.units.length; scene()->addItem(depthLine); timeString = new QGraphicsSimpleTextItem(); timeString->setFlag(QGraphicsItem::ItemIgnoresTransformations); timeString->setBrush(profile_color[TIME_TEXT].at(0)); scene()->addItem(timeString); depthString = new QGraphicsSimpleTextItem(); depthString->setFlag(QGraphicsItem::ItemIgnoresTransformations); depthString->setBrush(profile_color[SAMPLE_DEEP].at(0)); scene()->addItem(depthString); diveBg = new QGraphicsPolygonItem(); diveBg->setPen(QPen(QBrush(),0)); scene()->addItem(diveBg); QString incrText; if (prefs.units.length == units::METERS) incrText = tr("10m"); else incrText = tr("30ft"); timeHandler = new ExpanderGraphics(); timeHandler->increaseBtn->setPixmap(QString(":plan_plus")); timeHandler->decreaseBtn->setPixmap(QString(":plan_minus")); timeHandler->icon->setPixmap(QString(":icon_time")); connect(timeHandler->increaseBtn, SIGNAL(clicked()), this, SLOT(increaseTime())); connect(timeHandler->decreaseBtn, SIGNAL(clicked()), this, SLOT(decreaseTime())); timeHandler->setPos(fromPercent(83, Qt::Horizontal), fromPercent(100, Qt::Vertical)); timeHandler->setZValue(-2); scene()->addItem(timeHandler); depthHandler = new ExpanderGraphics(); depthHandler->increaseBtn->setPixmap(QString(":arrow_up")); depthHandler->decreaseBtn->setPixmap(QString(":arrow_down")); depthHandler->icon->setPixmap(QString(":icon_depth")); // Inverted here in the slots because the 'up' graphi should increase the depness, // and the down should decrease. connect(depthHandler->increaseBtn, SIGNAL(clicked()), this, SLOT(decreaseDepth())); connect(depthHandler->decreaseBtn, SIGNAL(clicked()), this, SLOT(increaseDepth())); depthHandler->setPos(fromPercent(0, Qt::Horizontal), fromPercent(100, Qt::Vertical)); depthHandler->setZValue(-2); scene()->addItem(depthHandler); minMinutes = TIME_INITIAL_MAX; minDepth = M_OR_FT(40,120); QAction *action = NULL; #define ADD_ACTION( SHORTCUT, Slot ) \ action = new QAction(this); \ action->setShortcut( SHORTCUT ); \ action->setShortcutContext(Qt::WindowShortcut); \ addAction(action); \ connect(action, SIGNAL(triggered(bool)), this, SLOT( Slot )) ADD_ACTION(Qt::Key_Escape, keyEscAction()); ADD_ACTION(Qt::Key_Delete, keyDeleteAction()); ADD_ACTION(Qt::Key_Up, keyUpAction()); ADD_ACTION(Qt::Key_Down, keyDownAction()); ADD_ACTION(Qt::Key_Left, keyLeftAction()); ADD_ACTION(Qt::Key_Right, keyRightAction()); #undef ADD_ACTION connect(plannerModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(drawProfile())); connect(plannerModel, SIGNAL(rowsInserted(const QModelIndex&,int,int)), this, SLOT(pointInserted(const QModelIndex&, int, int))); connect(plannerModel, SIGNAL(rowsRemoved(const QModelIndex&, int, int)), this, SLOT(pointsRemoved(const QModelIndex&, int, int))); setRenderHint(QPainter::Antialiasing); } void DivePlannerGraphics::settingsChanged() { if (depthLine->unitSystem == prefs.units.length) return; depthLine->setTickInterval(M_OR_FT(10,30)); depthLine->updateTicks(); depthLine->unitSystem = prefs.units.length; } void DivePlannerGraphics::pointInserted(const QModelIndex& parent, int start , int end) { DiveHandler *item = new DiveHandler (); scene()->addItem(item); handles << item; QGraphicsSimpleTextItem *gasChooseBtn = new QGraphicsSimpleTextItem(); scene()->addItem(gasChooseBtn); gasChooseBtn->setZValue(10); gasChooseBtn->setFlag(QGraphicsItem::ItemIgnoresTransformations); gases << gasChooseBtn; drawProfile(); } void DivePlannerGraphics::keyDownAction() { Q_FOREACH(QGraphicsItem *i, scene()->selectedItems()) { if (DiveHandler *handler = qgraphicsitem_cast(i)) { int row = handles.indexOf(handler); divedatapoint dp = plannerModel->at(row); if (dp.depth >= depthLine->maximum()) continue; dp.depth += M_OR_FT(1,5); plannerModel->editStop(row, dp); } } } void DivePlannerGraphics::keyUpAction() { Q_FOREACH(QGraphicsItem *i, scene()->selectedItems()) { if (DiveHandler *handler = qgraphicsitem_cast(i)) { int row = handles.indexOf(handler); divedatapoint dp = plannerModel->at(row); if (dp.depth <= 0) continue; dp.depth -= M_OR_FT(1,5); plannerModel->editStop(row, dp); } } drawProfile(); } void DivePlannerGraphics::keyLeftAction() { Q_FOREACH(QGraphicsItem *i, scene()->selectedItems()) { if (DiveHandler *handler = qgraphicsitem_cast(i)) { int row = handles.indexOf(handler); divedatapoint dp = plannerModel->at(row); if (dp.time / 60 <= 0) continue; // don't overlap positions. // maybe this is a good place for a 'goto'? double xpos = timeLine->posAtValue((dp.time - 60) / 60); bool nextStep = false; Q_FOREACH(DiveHandler *h, handles) { if (h->pos().x() == xpos) { nextStep = true; break; } } if(nextStep) continue; dp.time -= 60; plannerModel->editStop(row, dp); } } } void DivePlannerGraphics::keyRightAction() { Q_FOREACH(QGraphicsItem *i, scene()->selectedItems()) { if (DiveHandler *handler = qgraphicsitem_cast(i)) { int row = handles.indexOf(handler); divedatapoint dp = plannerModel->at(row); if (dp.time / 60 >= timeLine->maximum()) continue; // don't overlap positions. // maybe this is a good place for a 'goto'? double xpos = timeLine->posAtValue((dp.time + 60) / 60); bool nextStep = false; Q_FOREACH(DiveHandler *h, handles) { if (h->pos().x() == xpos) { nextStep = true; break; } } if(nextStep) continue; dp.time += 60; plannerModel->editStop(row, dp); } } } void DivePlannerGraphics::keyDeleteAction() { int selCount = scene()->selectedItems().count(); if(selCount) { QVector selectedIndexes; Q_FOREACH(QGraphicsItem *i, scene()->selectedItems()) { if (DiveHandler *handler = qgraphicsitem_cast(i)) { selectedIndexes.push_back(handles.indexOf(handler)); } } plannerModel->removeSelectedPoints(selectedIndexes); } } void DivePlannerGraphics::pointsRemoved(const QModelIndex& , int start, int end) { // start and end are inclusive. int num = (end - start) + 1; for(int i = num; i != 0; i--) { delete handles.back(); handles.pop_back(); delete gases.back(); gases.pop_back(); } scene()->clearSelection(); drawProfile(); } bool intLessThan(int a, int b) { return a <= b; } void DivePlannerPointsModel::removeSelectedPoints(const QVector< int >& rows) { int firstRow = rowCount() - rows.count(); QVector v2 = rows; std::sort(v2.begin(), v2.end(), intLessThan); beginRemoveRows(QModelIndex(), firstRow, rowCount()-1); for(int i = v2.count()-1; i >= 0; i--) { divepoints.remove(v2[i]); } endRemoveRows(); } void DivePlannerGraphics::keyEscAction() { if (scene()->selectedItems().count()) { scene()->clearSelection(); return; } if (DivePlannerPointsModel::instance()->isPlanner()) plannerModel->cancelPlan(); } qreal DivePlannerGraphics::fromPercent(qreal percent, Qt::Orientation orientation) { qreal total = orientation == Qt::Horizontal ? sceneRect().width() : sceneRect().height(); qreal result = (total * percent) / 100; return result; } void DivePlannerGraphics::increaseDepth() { if (depthLine->maximum() + M_OR_FT(10,30) > MAX_DEPTH) return; minDepth += M_OR_FT(10,30); depthLine->setMaximum( minDepth ); depthLine->updateTicks(); drawProfile(); } void DivePlannerGraphics::increaseTime() { minMinutes += 10; timeLine->setMaximum( minMinutes ); timeLine->updateTicks(); drawProfile(); } void DivePlannerGraphics::decreaseDepth() { if (depthLine->maximum() - M_OR_FT(10,30) < MIN_DEPTH) return; Q_FOREACH(DiveHandler *d, handles) { if (depthLine->valueAt(d->pos()) > depthLine->maximum() - M_OR_FT(10,30)) { QMessageBox::warning(mainWindow(), tr("Handler Position Error"), tr("One or more of your stops will be lost with this operations, \n" "Please, remove them first.")); return; } } minDepth -= M_OR_FT(10,30); depthLine->setMaximum( minDepth ); depthLine->updateTicks(); drawProfile(); } void DivePlannerGraphics::decreaseTime() { if (timeLine->maximum() - 10 < TIME_INITIAL_MAX || timeLine->maximum() - 10 < dpMaxTime) return; minMinutes -= 10; timeLine->setMaximum(timeLine->maximum() - 10); timeLine->updateTicks(); drawProfile(); } void DivePlannerGraphics::mouseDoubleClickEvent(QMouseEvent* event) { QPointF mappedPos = mapToScene(event->pos()); if (isPointOutOfBoundaries(mappedPos)) return; int minutes = rint(timeLine->valueAt(mappedPos)); int milimeters = rint(depthLine->valueAt(mappedPos) / M_OR_FT(1,1)) * M_OR_FT(1,1); plannerModel->addStop(milimeters, minutes * 60, -1, 0, 0); } void DivePlannerPointsModel::createSimpleDive() { // plannerModel->addStop(0, 0, O2_IN_AIR, 0, 0); plannerModel->addStop(M_OR_FT(15,45), 1 * 60, O2_IN_AIR, 0, 0); plannerModel->addStop(M_OR_FT(15,45), 40 * 60, O2_IN_AIR, 0, 0); plannerModel->addStop(M_OR_FT(5,15), 42 * 60, O2_IN_AIR, 0, 0); plannerModel->addStop(M_OR_FT(5,15), 45 * 60, O2_IN_AIR, 0, 0); } void DivePlannerPointsModel::loadFromDive(dive* d) { /* We need to make a copy, because * as soon as the model is modified, it will * remove all samples from the current dive. * */ memcpy(&backupDive, current_dive, sizeof(struct dive)); copy_samples(current_dive, &backupDive); copy_events(current_dive, &backupDive); copy_cylinders(current_dive, stagingDive); // this way the correct cylinder data is shown CylindersModel::instance()->setDive(stagingDive); int lasttime = 0; // we start with the first gas and see if it was changed int o2 = backupDive.cylinder[0].gasmix.o2.permille; int he = backupDive.cylinder[0].gasmix.he.permille; for (int i = 0; i < backupDive.dc.samples - 1; i++) { const sample &s = backupDive.dc.sample[i]; if (s.time.seconds == 0) continue; get_gas_from_events(&backupDive.dc, lasttime, &o2, &he); plannerModel->addStop(s.depth.mm, s.time.seconds, o2, he, 0); lasttime = s.time.seconds; } } void DivePlannerPointsModel::restoreBackupDive() { memcpy(current_dive, &backupDive, sizeof(struct dive)); } void DivePlannerPointsModel::copyCylinders(dive *d) { copy_cylinders(stagingDive, d); } QStringList& DivePlannerPointsModel::getGasList() { struct dive *activeDive = isPlanner() ? stagingDive : current_dive; static QStringList list; list.clear(); if (!activeDive) { list.push_back(tr("AIR")); } else { for (int i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = &activeDive->cylinder[i]; if (cylinder_nodata(cyl)) break; list.push_back(gasToStr(cyl->gasmix.o2.permille, cyl->gasmix.he.permille)); } } return list; } void DivePlannerGraphics::drawProfile() { qDeleteAll(lines); lines.clear(); plannerModel->createTemporaryPlan(); struct diveplan diveplan = plannerModel->getDiveplan(); struct divedatapoint *dp = diveplan.dp; unsigned int max_depth = 0; if (!dp) { plannerModel->deleteTemporaryPlan(); return; } while(dp->next) { if (dp->depth > max_depth) max_depth = dp->depth; dp = dp->next; } if (!activeDraggedHandler && (timeLine->maximum() < dp->time / 60.0 + 5 || dp->time / 60.0 + 15 < timeLine->maximum())) { minMinutes = fmax(dp->time / 60.0 + 5, minMinutes); timeLine->setMaximum(minMinutes); timeLine->updateTicks(); } if (!activeDraggedHandler && (depthLine->maximum() < max_depth + M_OR_FT(10,30) || max_depth + M_OR_FT(10,30) < depthLine->maximum())) { minDepth = fmax(max_depth + M_OR_FT(10,30), minDepth); depthLine->setMaximum(minDepth); depthLine->updateTicks(); } // Re-position the user generated dive handlers int last = 0; for (int i = 0; i < plannerModel->rowCount(); i++) { divedatapoint dp = plannerModel->at(i); if (dp.time == 0) // those are the magic entries for tanks continue; DiveHandler *h = handles.at(i); h->setPos(timeLine->posAtValue(dp.time / 60), depthLine->posAtValue(dp.depth)); QPointF p1 = (last == i) ? QPointF(timeLine->posAtValue(0), depthLine->posAtValue(0)) : handles[last]->pos(); QPointF p2 = handles[i]->pos(); QLineF line(p1, p2); QPointF pos = line.pointAt(0.5); gases[i]->setPos(pos); gases[i]->setText(dpGasToStr(plannerModel->at(i))); last = i; } // (re-) create the profile with different colors for segments that were // entered vs. segments that were calculated double lastx = timeLine->posAtValue(0); double lasty = depthLine->posAtValue(0); QPolygonF poly; poly.append(QPointF(lastx, lasty)); for (dp = diveplan.dp; dp != NULL; dp = dp->next) { if (dp->time == 0) // magic entry for available tank continue; double xpos = timeLine->posAtValue(dp->time / 60.0); double ypos = depthLine->posAtValue(dp->depth); if (!dp->entered) { QGraphicsLineItem *item = new QGraphicsLineItem(lastx, lasty, xpos, ypos); item->setPen(QPen(QBrush(Qt::red),0)); scene()->addItem(item); lines << item; } lastx = xpos; lasty = ypos; poly.append(QPointF(lastx, lasty)); } diveBg->setPolygon(poly); QRectF b = poly.boundingRect(); QLinearGradient pat( b.x(), b.y(), b.x(), b.height() + b.y() ); pat.setColorAt(1, profile_color[DEPTH_BOTTOM].first()); pat.setColorAt(0, profile_color[DEPTH_TOP].first()); diveBg->setBrush(pat); plannerModel->deleteTemporaryPlan(); } void DivePlannerGraphics::resizeEvent(QResizeEvent* event) { QGraphicsView::resizeEvent(event); fitInView(sceneRect(), Qt::IgnoreAspectRatio); } void DivePlannerGraphics::showEvent(QShowEvent* event) { QGraphicsView::showEvent(event); fitInView(sceneRect(), Qt::IgnoreAspectRatio); } void DivePlannerGraphics::mouseMoveEvent(QMouseEvent* event) { QPointF mappedPos = mapToScene(event->pos()); double xpos = timeLine->valueAt(mappedPos); double ypos = depthLine->valueAt(mappedPos); xpos = (xpos > timeLine->maximum()) ? timeLine->posAtValue(timeLine->maximum()) : (xpos < timeLine->minimum()) ? timeLine->posAtValue(timeLine->minimum()) : timeLine->posAtValue(xpos); ypos = (ypos > depthLine->maximum()) ? depthLine->posAtValue(depthLine->maximum()) : ( ypos < depthLine->minimum()) ? depthLine->posAtValue(depthLine->minimum()) : depthLine->posAtValue(ypos); verticalLine->setPos(xpos, fromPercent(0, Qt::Vertical)); horizontalLine->setPos(fromPercent(0, Qt::Horizontal), ypos); depthString->setPos(fromPercent(1, Qt::Horizontal), ypos); timeString->setPos(xpos+1, fromPercent(95, Qt::Vertical)); if(isPointOutOfBoundaries(mappedPos)) return; depthString->setText(get_depth_string(depthLine->valueAt(mappedPos), true, false)); timeString->setText(QString::number(rint(timeLine->valueAt(mappedPos))) + "min"); // calculate the correct color for the depthString. // QGradient doesn't returns it's interpolation, meh. double percent = depthLine->percentAt(mappedPos); QColor& startColor = profile_color[SAMPLE_SHALLOW].first(); QColor& endColor = profile_color[SAMPLE_DEEP].first(); short redDelta = (endColor.red() - startColor.red()) * percent + startColor.red(); short greenDelta = (endColor.green() - startColor.green()) * percent + startColor.green(); short blueDelta = (endColor.blue() - startColor.blue()) * percent + startColor.blue(); depthString->setBrush( QColor(redDelta, greenDelta, blueDelta)); if (activeDraggedHandler) moveActiveHandler(mappedPos, handles.indexOf(activeDraggedHandler)); if (!handles.count()) return; if (handles.last()->x() > mappedPos.x()) { verticalLine->setPen(QPen(QBrush(Qt::red), 0, Qt::SolidLine)); horizontalLine->setPen(QPen(QBrush(Qt::red), 0, Qt::SolidLine)); } else { verticalLine->setPen(QPen(Qt::DotLine)); horizontalLine->setPen(QPen(Qt::DotLine)); } } void DivePlannerGraphics::moveActiveHandler(const QPointF& mappedPos, const int pos) { divedatapoint data = plannerModel->at(pos); int mintime = 0, maxtime = (timeLine->maximum() + 10) * 60; if (pos > 0) mintime = plannerModel->at(pos - 1).time; if (pos < plannerModel->size() - 1) maxtime = plannerModel->at(pos + 1).time; int minutes = rint(timeLine->valueAt(mappedPos)); if (minutes * 60 <= mintime || minutes * 60 >= maxtime) return; int milimeters = rint(depthLine->valueAt(mappedPos) / M_OR_FT(1,1)) * M_OR_FT(1,1); double xpos = timeLine->posAtValue(minutes); double ypos = depthLine->posAtValue(milimeters); data.depth = milimeters; data.time = rint(timeLine->valueAt(mappedPos)) * 60; plannerModel->editStop(pos, data); activeDraggedHandler->setPos(QPointF(xpos, ypos)); qDeleteAll(lines); lines.clear(); drawProfile(); } bool DivePlannerGraphics::isPointOutOfBoundaries(const QPointF& point) { double xpos = timeLine->valueAt(point); double ypos = depthLine->valueAt(point); if (xpos > timeLine->maximum() || xpos < timeLine->minimum() || ypos > depthLine->maximum() || ypos < depthLine->minimum()) { return true; } return false; } void DivePlannerGraphics::mousePressEvent(QMouseEvent* event) { if (event->modifiers()) { QGraphicsView::mousePressEvent(event); return; } QPointF mappedPos = mapToScene(event->pos()); if (event->button() == Qt::LeftButton){ Q_FOREACH(QGraphicsItem *item, scene()->items(mappedPos, Qt::IntersectsItemBoundingRect, Qt::AscendingOrder, transform())) { if (DiveHandler *h = qgraphicsitem_cast(item)) { activeDraggedHandler = h; activeDraggedHandler->setBrush(Qt::red); originalHandlerPos = activeDraggedHandler->pos(); } } } QGraphicsView::mousePressEvent(event); } void DivePlannerGraphics::mouseReleaseEvent(QMouseEvent* event) { if (activeDraggedHandler) { /* we already deal with all the positioning in the life update, * so all we need to do here is change the color of the handler */ activeDraggedHandler->setBrush(QBrush(Qt::white)); activeDraggedHandler = 0; drawProfile(); } } DiveHandler::DiveHandler(): QGraphicsEllipseItem() { setRect(-5,-5,10,10); setFlag(QGraphicsItem::ItemIgnoresTransformations); setFlag(QGraphicsItem::ItemIsSelectable); setBrush(Qt::white); setZValue(2); } int DiveHandler::parentIndex() { DivePlannerGraphics *view = qobject_cast(scene()->views().first()); return view->handles.indexOf(this); } void DiveHandler::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { QMenu m; GasSelectionModel *model = GasSelectionModel::instance(); model->repopulate(); int rowCount = model->rowCount(); for(int i = 0; i < rowCount; i++){ QAction *action = new QAction(&m); action->setText( model->data(model->index(i, 0),Qt::DisplayRole).toString()); connect(action, SIGNAL(triggered(bool)), this, SLOT(changeGas())); m.addAction(action); } m.addSeparator(); m.addAction(QObject::tr("Remove this Point"), this, SLOT(selfRemove())); m.exec(event->screenPos()); } void DiveHandler::selfRemove() { setSelected(true); DivePlannerGraphics *view = qobject_cast(scene()->views().first()); view->keyDeleteAction(); } void DiveHandler::changeGas() { QAction *action = qobject_cast(sender()); QModelIndex index = plannerModel->index(parentIndex(), DivePlannerPointsModel::GAS); plannerModel->setData(index, action->text()); } void DiveHandler::mousePressEvent(QGraphicsSceneMouseEvent* event) { if (event->button() != Qt::LeftButton) return; if (event->modifiers().testFlag(Qt::ControlModifier)) { setSelected(true); } // mousePressEvent 'grabs' the mouse and keyboard, annoying. ungrabMouse(); /* hack. Sometimes the keyboard is grabbed, sometime it's not, so, let's force a grab and release, to get rid of a warning. */ grabKeyboard(); ungrabKeyboard(); } void Ruler::setMaximum(double maximum) { max = maximum; } void Ruler::setMinimum(double minimum) { min = minimum; } void Ruler::setTextColor(const QColor& color) { textColor = color; } void Ruler::eraseAll() { qDeleteAll(ticks); ticks.clear(); qDeleteAll(labels); labels.clear(); } Ruler::Ruler() : orientation(Qt::Horizontal) { } Ruler::~Ruler() { eraseAll(); } void Ruler::setOrientation(Qt::Orientation o) { orientation = o; // position the elements on the screen. setMinimum(minimum()); setMaximum(maximum()); } void Ruler::updateTicks() { eraseAll(); QLineF m = line(); QGraphicsLineItem *item = NULL; QGraphicsSimpleTextItem *label = NULL; double steps = (max - min) / interval; qreal pos; double currValue = min; if (orientation == Qt::Horizontal) { double stepSize = (m.x2() - m.x1()) / steps; for (pos = m.x1(); pos <= m.x2(); pos += stepSize, currValue += interval) { item = new QGraphicsLineItem(pos, m.y1(), pos, m.y1() + tickSize, this); item->setPen(pen()); ticks.push_back(item); label = new QGraphicsSimpleTextItem(QString::number(currValue), this); label->setBrush(QBrush(textColor)); label->setFlag(ItemIgnoresTransformations); label->setPos(pos - label->boundingRect().width()/2, m.y1() + tickSize + 5); labels.push_back(label); } } else { double stepSize = (m.y2() - m.y1()) / steps; for (pos = m.y1(); pos <= m.y2(); pos += stepSize, currValue += interval) { item = new QGraphicsLineItem(m.x1(), pos, m.x1() - tickSize, pos, this); item->setPen(pen()); ticks.push_back(item); label = new QGraphicsSimpleTextItem(get_depth_string(currValue, false, false), this); label->setBrush(QBrush(textColor)); label->setFlag(ItemIgnoresTransformations); label->setPos(m.x2() - 80, pos); labels.push_back(label); } } } void Ruler::setTickSize(qreal size) { tickSize = size; } void Ruler::setTickInterval(double i) { interval = i; } qreal Ruler::valueAt(const QPointF& p) { QLineF m = line(); double retValue = orientation == Qt::Horizontal ? max * (p.x() - m.x1()) / (m.x2() - m.x1()) : max * (p.y() - m.y1()) / (m.y2() - m.y1()); return retValue; } qreal Ruler::posAtValue(qreal value) { QLineF m = line(); double size = max - min; double percent = value / size; double realSize = orientation == Qt::Horizontal ? m.x2() - m.x1() : m.y2() - m.y1(); double retValue = realSize * percent; retValue = (orientation == Qt::Horizontal) ? retValue + m.x1() : retValue + m.y1(); return retValue; } qreal Ruler::percentAt(const QPointF& p) { qreal value = valueAt(p); double size = max - min; double percent = value / size; return percent; } double Ruler::maximum() const { return max; } double Ruler::minimum() const { return min; } void Ruler::setColor(const QColor& color) { QPen defaultPen(color); defaultPen.setJoinStyle(Qt::RoundJoin); defaultPen.setCapStyle(Qt::RoundCap); defaultPen.setWidth(2); defaultPen.setCosmetic(true); setPen(defaultPen); } Button::Button(QObject* parent, QGraphicsItem *itemParent): QObject(parent), QGraphicsRectItem(itemParent) { icon = new QGraphicsPixmapItem(this); text = new QGraphicsSimpleTextItem(this); icon->setPos(0,0); text->setPos(0,0); setFlag(ItemIgnoresTransformations); setPen(QPen(QBrush(), 0)); } void Button::setPixmap(const QPixmap& pixmap) { icon->setPixmap(pixmap); if(pixmap.isNull()) icon->hide(); else icon->show(); setRect(childrenBoundingRect()); } void Button::setText(const QString& t) { text->setText(t); if(icon->pixmap().isNull()) { icon->hide(); text->setPos(0,0); } else { icon->show(); text->setPos(22,0); } setRect(childrenBoundingRect()); } void Button::mousePressEvent(QGraphicsSceneMouseEvent* event) { event->ignore(); emit clicked(); } DivePlannerWidget::DivePlannerWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent, f) { ui.setupUi(this); ui.tableWidget->setTitle(tr("Dive Planner Points")); ui.tableWidget->setModel(DivePlannerPointsModel::instance()); ui.tableWidget->view()->setItemDelegateForColumn(DivePlannerPointsModel::GAS, new AirTypesDelegate(this)); ui.cylinderTableWidget->setTitle(tr("Available Gases")); ui.cylinderTableWidget->setModel(CylindersModel::instance()); QTableView *view = ui.cylinderTableWidget->view(); view->setColumnHidden(CylindersModel::START, true); view->setColumnHidden(CylindersModel::END, true); view->setColumnHidden(CylindersModel::DEPTH, false); view->setItemDelegateForColumn(CylindersModel::TYPE, new TankInfoDelegate()); connect(ui.cylinderTableWidget, SIGNAL(addButtonClicked()), DivePlannerPointsModel::instance(), SLOT(addCylinder_clicked())); connect(ui.tableWidget, SIGNAL(addButtonClicked()), DivePlannerPointsModel::instance(), SLOT(addStop())); connect(CylindersModel::instance(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), GasSelectionModel::instance(), SLOT(repopulate())); connect(CylindersModel::instance(), SIGNAL(rowsInserted(QModelIndex,int,int)), GasSelectionModel::instance(), SLOT(repopulate())); connect(CylindersModel::instance(), SIGNAL(rowsRemoved(QModelIndex,int,int)), GasSelectionModel::instance(), SLOT(repopulate())); ui.tableWidget->setBtnToolTip(tr("add dive data point")); connect(ui.startTime, SIGNAL(timeChanged(QTime)), plannerModel, SLOT(setStartTime(QTime))); connect(ui.ATMPressure, SIGNAL(textChanged(QString)), this, SLOT(atmPressureChanged(QString))); connect(ui.bottomSAC, SIGNAL(textChanged(QString)), this, SLOT(bottomSacChanged(QString))); connect(ui.decoStopSAC, SIGNAL(textChanged(QString)), this, SLOT(decoSacChanged(QString))); connect(ui.gfhigh, SIGNAL(valueChanged(int)), plannerModel, SLOT(setGFHigh(int))); connect(ui.gflow, SIGNAL(valueChanged(int)), plannerModel, SLOT(setGFLow(int))); connect(ui.lastStop, SIGNAL(toggled(bool)), plannerModel, SLOT(setLastStop6m(bool))); // Creating the plan connect(ui.buttonBox, SIGNAL(accepted()), plannerModel, SLOT(createPlan())); connect(ui.buttonBox, SIGNAL(rejected()), plannerModel, SLOT(cancelPlan())); connect(plannerModel, SIGNAL(planCreated()), mainWindow(), SLOT(showProfile())); connect(plannerModel, SIGNAL(planCreated()), mainWindow(), SLOT(refreshDisplay())); connect(plannerModel, SIGNAL(planCanceled()), mainWindow(), SLOT(showProfile())); /* set defaults. */ ui.startTime->setTime( QTime(1, 0) ); ui.ATMPressure->setText( "1013" ); ui.bottomSAC->setText("20"); ui.decoStopSAC->setText("17"); ui.gflow->setValue(prefs.gflow); ui.gfhigh->setValue(prefs.gfhigh); setMinimumWidth(0); setMinimumHeight(0); } void DivePlannerWidget::settingsChanged() { ui.gflow->setValue(prefs.gflow); ui.gfhigh->setValue(prefs.gfhigh); } void DivePlannerPointsModel::addCylinder_clicked() { CylindersModel::instance()->add(); } void DivePlannerWidget::atmPressureChanged(const QString& pressure) { plannerModel->setSurfacePressure(pressure.toInt()); } void DivePlannerWidget::bottomSacChanged(const QString& bottomSac) { plannerModel->setBottomSac(bottomSac.toInt()); } void DivePlannerWidget::decoSacChanged(const QString& decosac) { plannerModel->setDecoSac(decosac.toInt()); } void DivePlannerPointsModel::setPlanMode(Mode m) { mode = m; } bool DivePlannerPointsModel::isPlanner() { return mode == PLAN; } int DivePlannerPointsModel::columnCount(const QModelIndex& parent) const { return COLUMNS; } QVariant DivePlannerPointsModel::data(const QModelIndex& index, int role) const { if(role == Qt::DisplayRole) { divedatapoint p = divepoints.at(index.row()); switch(index.column()) { case CCSETPOINT: return (double) p.po2 / 1000; case DEPTH: return rint(get_depth_units(p.depth, NULL, NULL)); case DURATION: return p.time / 60; case GAS: return dpGasToStr(p); } } else if (role == Qt::DecorationRole) { switch(index.column()) { case REMOVE : return QIcon(":trash"); } } else if (role == Qt::FontRole) { return defaultModelFont(); } return QVariant(); } bool DivePlannerPointsModel::setData(const QModelIndex& index, const QVariant& value, int role) { int o2 = 0; int he = 0; if(role == Qt::EditRole) { divedatapoint& p = divepoints[index.row()]; switch(index.column()) { case DEPTH: p.depth = units_to_depth(value.toInt()); break; case DURATION: p.time = value.toInt() * 60; break; case CCSETPOINT: { int po2 = 0; QByteArray gasv = value.toByteArray(); if (validate_po2(gasv.data(), &po2)) p.po2 = po2; } break; case GAS: QByteArray gasv = value.toByteArray(); if (validate_gas(gasv.data(), &o2, &he)) { p.o2 = o2; p.he = he; } break; } editStop(index.row(), p); } return QAbstractItemModel::setData(index, value, role); } QVariant DivePlannerPointsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { switch(section) { case DEPTH: return tr("Final Depth"); case DURATION: return tr("Duration"); case GAS: return tr("Used Gas"); case CCSETPOINT: return tr("CC Set Point"); } } else if (role == Qt::FontRole) { return defaultModelFont(); } return QVariant(); } Qt::ItemFlags DivePlannerPointsModel::flags(const QModelIndex& index) const { return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } int DivePlannerPointsModel::rowCount(const QModelIndex& parent) const { return divepoints.count(); } DivePlannerPointsModel::DivePlannerPointsModel(QObject* parent): QAbstractTableModel(parent), mode(NOTHING), stagingDive(NULL) { diveplan.dp = NULL; } DivePlannerPointsModel* DivePlannerPointsModel::instance() { static QScopedPointer self(new DivePlannerPointsModel()); return self.data(); } void DivePlannerPointsModel::setBottomSac(int sac) { diveplan.bottomsac = sac; emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::setDecoSac(int sac) { diveplan.decosac = sac; emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::setGFHigh(const int gfhigh) { diveplan.gfhigh = gfhigh; emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::setGFLow(const int ghflow) { diveplan.gflow = ghflow; emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::setSurfacePressure(int pressure) { diveplan.surface_pressure = pressure; emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::setLastStop6m(bool value) { set_last_stop(value); emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::setStartTime(const QTime& t) { diveplan.when = (t.msec() + QDateTime::currentMSecsSinceEpoch()) / 1000 - gettimezoneoffset(); emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } bool divePointsLessThan(const divedatapoint& p1, const divedatapoint& p2) { return p1.time <= p2.time; } bool DivePlannerPointsModel::addGas(int o2, int he) { if (is_air(o2, he)) o2 = 0; for (int i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = &stagingDive->cylinder[i]; if (cylinder_nodata(cyl)) { fill_default_cylinder(cyl); cyl->gasmix.o2.permille = o2; cyl->gasmix.he.permille = he; CylindersModel::instance()->setDive(stagingDive); return true; } if (cyl->gasmix.o2.permille == o2 && cyl->gasmix.he.permille == he) return true; } qDebug("too many gases"); return false; } int DivePlannerPointsModel::addStop(int milimeters, int seconds, int o2, int he, int ccpoint) { int row = divepoints.count(); if (seconds == 0 && milimeters == 0 && row != 0){ /* this is only possible if the user clicked on the 'plus' sign on the DivePoints Table */ struct divedatapoint& t = divepoints.last(); milimeters = t.depth; seconds = t.time + 600; // 10 minutes. o2 = t.o2; he = t.he; ccpoint = t.po2; } else if (seconds == 0 && milimeters == 0 && row == 0) { milimeters = M_OR_FT(5, 15); // 5m / 15ft seconds = 600; // 10 min //Default to the first defined gas, if we got one. cylinder_t *cyl = &stagingDive->cylinder[0]; if (cyl) { o2 = cyl->gasmix.o2.permille; he = cyl->gasmix.he.permille; } } if (o2 != -1) if (!addGas(o2, he)) qDebug("addGas failed"); // FIXME add error propagation // check if there's already a new stop before this one: for (int i = 0; i < row; i++) { const divedatapoint& dp = divepoints.at(i); if (dp.time == seconds) { row = i; beginRemoveRows(QModelIndex(), row, row); divepoints.remove(row); endRemoveRows(); break; } if (dp.time > seconds ) { row = i; break; } } if (o2 == -1) { if (row > 0) { o2 = divepoints.at(row - 1).o2; he = divepoints.at(row - 1).he; } else { // when we add a first data point we need to make sure that there is a // tank for it to use; // first check to the right, then to the left, but if there's nothing, // we simply default to AIR if (row < divepoints.count()) { o2 = divepoints.at(row).o2; he = divepoints.at(row).he; } else { o2 = O2_IN_AIR; if (!addGas(o2, 0)) qDebug("addGas failed"); // FIXME add error propagation } } } // add the new stop beginInsertRows(QModelIndex(), row, row); divedatapoint point; point.depth = milimeters; point.time = seconds; point.o2 = o2; point.he = he; point.po2 = ccpoint; divepoints.append( point ); std::sort(divepoints.begin(), divepoints.end(), divePointsLessThan); endInsertRows(); return row; } void DivePlannerPointsModel::editStop(int row, divedatapoint newData) { divepoints[row] = newData; std::sort(divepoints.begin(), divepoints.end(), divePointsLessThan); emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } int DivePlannerPointsModel::size() { return divepoints.size(); } divedatapoint DivePlannerPointsModel::at(int row) { return divepoints.at(row); } void DivePlannerPointsModel::remove(const QModelIndex& index) { if (index.column() != REMOVE) return; beginRemoveRows(QModelIndex(), index.row(), index.row()); divepoints.remove(index.row()); endRemoveRows(); } struct diveplan DivePlannerPointsModel::getDiveplan() { return diveplan; } void DivePlannerPointsModel::cancelPlan() { if (mode == PLAN && rowCount()) { if (QMessageBox::warning(mainWindow(), TITLE_OR_TEXT(tr("Discard the Plan?"), tr("You are about to discard your plan.")), QMessageBox::Discard | QMessageBox::Cancel, QMessageBox::Discard) != QMessageBox::Discard) { return; } } clear(); emit planCanceled(); if (mode != ADD) free(stagingDive); setPlanMode(NOTHING); stagingDive = NULL; CylindersModel::instance()->setDive(current_dive); CylindersModel::instance()->update(); } DivePlannerPointsModel::Mode DivePlannerPointsModel::currentMode() const { return mode; } QVector > DivePlannerPointsModel::collectGases(struct dive *d) { QVector > l; for (int i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = &d->cylinder[i]; if (!cylinder_nodata(cyl)) l.push_back(qMakePair(cyl->gasmix.o2.permille, cyl->gasmix.he.permille)); } return l; } void DivePlannerPointsModel::rememberTanks() { oldGases = collectGases(stagingDive); } bool DivePlannerPointsModel::tankInUse(int o2, int he) { for (int j = 0; j < rowCount(); j++) { divedatapoint& p = divepoints[j]; if (p.time == 0) // special entries that hold the available gases continue; if ((p.o2 == o2 && p.he == he) || (is_air(p.o2, p.he) && is_air(o2, he))) return true; } return false; } void DivePlannerPointsModel::tanksUpdated() { // we don't know exactly what changed - what we care about is // "did a gas change on us". So we look through the diveplan to // see if there is a gas that is now missing and if there is, we // replace it with the matching new gas. QVector > gases = collectGases(stagingDive); if (gases.count() == oldGases.count()) { // either nothing relevant changed, or exactly ONE gasmix changed for (int i = 0; i < gases.count(); i++) { if (gases.at(i) != oldGases.at(i)) { if (oldGases.count(oldGases.at(i)) > 1) { // we had this gas more than once, so don't // change segments that used this gas as it still exists break; } for (int j = 0; j < rowCount(); j++) { divedatapoint& p = divepoints[j]; int o2 = oldGases.at(i).first; int he = oldGases.at(i).second; if ((p.o2 == o2 && p.he == he) || (is_air(p.o2, p.he) && (is_air(o2, he) || (o2 == 0 && he == 0)))) { p.o2 = gases.at(i).first; p.he = gases.at(i).second; } } break; } } } emit dataChanged(createIndex(0, 0), createIndex(rowCount()-1, COLUMNS-1)); } void DivePlannerPointsModel::clear() { if (mode == ADD) { stagingDive = current_dive; } else { if (!stagingDive) stagingDive = alloc_dive(); memset(stagingDive->cylinder, 0, MAX_CYLINDERS * sizeof(cylinder_t)); } CylindersModel::instance()->setDive(stagingDive); if (rowCount() > 0) { beginRemoveRows(QModelIndex(), 0, rowCount() - 1); divepoints.clear(); endRemoveRows(); } CylindersModel::instance()->clear(); } void DivePlannerPointsModel::createTemporaryPlan() { // This needs to be done in the following steps: // Get the user-input and calculate the dive info // Not sure if this is the place to create the diveplan... // We just start with a surface node at time = 0 if (!stagingDive) return; diveplan.dp = NULL; int lastIndex = -1; for (int i = 0; i < rowCount(); i++) { divedatapoint p = at(i); int deltaT = lastIndex != -1 ? p.time - at(lastIndex).time : p.time; lastIndex = i; plan_add_segment(&diveplan, deltaT, p.depth, p.o2, p.he, p.po2); } char *cache = NULL; tempDive = NULL; const char *errorString = NULL; struct divedatapoint *dp = NULL; for (int i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = &stagingDive->cylinder[i]; if (cyl->depth.mm) { dp = create_dp(0, cyl->depth.mm, cyl->gasmix.o2.permille, cyl->gasmix.he.permille, 0); if (diveplan.dp) dp->next = diveplan.dp->next; else dp->next = NULL; diveplan.dp->next = dp; } } #if DEBUG_PLAN dump_plan(&diveplan); #endif plan(&diveplan, &cache, &tempDive, isPlanner(), &errorString); if (mode == ADD) { // copy the samples and events, but don't overwrite the cylinders copy_samples(tempDive, current_dive); copy_events(tempDive, current_dive); } #if DEBUG_PLAN dump_plan(&diveplan); #endif } void DivePlannerPointsModel::deleteTemporaryPlan() { deleteTemporaryPlan(diveplan.dp); delete_single_dive(get_divenr(tempDive)); tempDive = NULL; } void DivePlannerPointsModel::deleteTemporaryPlan(struct divedatapoint *dp) { if (!dp) return; deleteTemporaryPlan(dp->next); free(dp); } void DivePlannerPointsModel::createPlan() { // Ok, so, here the diveplan creates a dive, // puts it on the dive list, and we need to remember // to not delete it later. mumble. ;p char *cache = NULL; tempDive = NULL; const char *errorString = NULL; createTemporaryPlan(); plan(&diveplan, &cache, &tempDive, isPlanner(), &errorString); copy_cylinders(stagingDive, tempDive); int mean[MAX_CYLINDERS], duration[MAX_CYLINDERS]; per_cylinder_mean_depth(tempDive, select_dc(&tempDive->dc), mean, duration); for (int i = 0; i < MAX_CYLINDERS; i++) { cylinder_t *cyl = tempDive->cylinder+i; if (cylinder_none(cyl)) continue; // FIXME: The epic assumption that all the cylinders after the first is deco int sac = i ? diveplan.decosac : diveplan.bottomsac; cyl->start.mbar = cyl->type.workingpressure.mbar; int consumption = ((depth_to_mbar(mean[i], tempDive) * duration[i] / 60) * sac) / ( cyl->type.size.mliter / 1000); cyl->end.mbar = cyl->start.mbar - consumption; } mark_divelist_changed(TRUE); // Remove and clean the diveplan, so we don't delete // the dive by mistake. diveplan.dp = NULL; clear(); planCreated(); setPlanMode(NOTHING); free(stagingDive); stagingDive = NULL; CylindersModel::instance()->setDive(current_dive); CylindersModel::instance()->update(); } ExpanderGraphics::ExpanderGraphics(QGraphicsItem* parent): QGraphicsRectItem(parent) { icon = new QGraphicsPixmapItem(this); bg = new QGraphicsPixmapItem(this); leftWing = new QGraphicsPixmapItem(this); rightWing = new QGraphicsPixmapItem(this); QPixmap p; #define CREATE(item, pixmap) \ p = QPixmap(QString( pixmap ));\ item->setPixmap(p); \ CREATE(icon, ":icon_time"); CREATE(bg, ":round_base"); CREATE(leftWing, ":left_wing"); CREATE(rightWing, ":right_wing"); #undef CREATE decreaseBtn = new Button(0, this); increaseBtn = new Button(0, this); decreaseBtn->setPixmap(QPixmap(":arrow_down")); increaseBtn->setPixmap(QPixmap(":arrow_up")); setFlag(ItemIgnoresTransformations); leftWing->setZValue(-2); rightWing->setZValue(-2); bg->setZValue(-1); leftWing->setPos(0,0); bg->setPos(leftWing->pos().x() + leftWing->boundingRect().width() -60, 5); rightWing->setPos(leftWing->pos().x() + leftWing->boundingRect().width() - 20, 0); decreaseBtn->setPos(leftWing->pos().x(), leftWing->pos().y() ); increaseBtn->setPos(rightWing->pos().x(), rightWing->pos().y() ); icon->setPos(bg->pos().x(), bg->pos().y() - 5); //I need to bottom align the items, I need to make the 0,0 ( orgin ) to be // the bottom of this item, so shift everything up. QRectF r = childrenBoundingRect(); Q_FOREACH(QGraphicsItem *i, childItems()){ i->setPos(i->pos().x(), i->pos().y() - r.height()); } setScale(0.7); } Subsurface-4.0.2/qt-ui/diveplanner.h000066400000000000000000000153221226345450700173510ustar00rootroot00000000000000#ifndef DIVEPLANNER_H #define DIVEPLANNER_H #include #include #include #include #include #include "dive.h" class QListView; class QStringListModel; class QModelIndex; class DivePlannerPointsModel : public QAbstractTableModel{ Q_OBJECT public: static DivePlannerPointsModel* instance(); enum Sections{REMOVE, DEPTH, DURATION, GAS, CCSETPOINT, COLUMNS}; enum Mode { NOTHING, PLAN, ADD }; virtual int columnCount(const QModelIndex& parent = QModelIndex()) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); virtual Qt::ItemFlags flags(const QModelIndex& index) const; void removeSelectedPoints(const QVector& rows); void setPlanMode(Mode mode); bool isPlanner(); void createSimpleDive(); void clear(); Mode currentMode() const; void tanksUpdated(); void rememberTanks(); bool tankInUse(int o2, int he); void copyCylinders(struct dive *d); /** * @return the row number. */ void editStop(int row, divedatapoint newData ); divedatapoint at(int row); int size(); struct diveplan getDiveplan(); QStringList &getGasList(); QVector > collectGases(dive *d); public slots: int addStop(int millimeters = 0, int seconds = 0, int o2 = 0, int he = 0, int ccpoint = 0 ); void addCylinder_clicked(); void setGFHigh(const int gfhigh); void setGFLow(const int ghflow); void setSurfacePressure(int pressure); void setBottomSac(int sac); void setDecoSac(int sac); void setStartTime(const QTime& t); void setLastStop6m(bool value); void createPlan(); void remove(const QModelIndex& index); void cancelPlan(); void createTemporaryPlan(); void deleteTemporaryPlan(); void loadFromDive(dive* d); void restoreBackupDive(); signals: void planCreated(); void planCanceled(); private: explicit DivePlannerPointsModel(QObject* parent = 0); bool addGas(int o2, int he); struct diveplan diveplan; Mode mode; QVector divepoints; struct dive *tempDive; struct dive backupDive; void deleteTemporaryPlan(struct divedatapoint *dp); QVector backupSamples; // For editing added dives. struct dive *stagingDive; QVector > oldGases; }; class Button : public QObject, public QGraphicsRectItem { Q_OBJECT public: Button(QObject* parent = 0, QGraphicsItem *itemParent = 0); void setText(const QString& text); void setPixmap(const QPixmap& pixmap); protected: virtual void mousePressEvent(QGraphicsSceneMouseEvent* event); signals: void clicked(); private: QGraphicsPixmapItem *icon; QGraphicsSimpleTextItem *text; }; class ExpanderGraphics : public QGraphicsRectItem { public: ExpanderGraphics(QGraphicsItem *parent = 0); QGraphicsPixmapItem *icon; Button *increaseBtn; Button *decreaseBtn; private: QGraphicsPixmapItem *bg; QGraphicsPixmapItem *leftWing; QGraphicsPixmapItem *rightWing; }; class DiveHandler : public QObject, public QGraphicsEllipseItem{ Q_OBJECT public: DiveHandler(); protected: void mousePressEvent(QGraphicsSceneMouseEvent* event); void contextMenuEvent(QGraphicsSceneContextMenuEvent* event); private: int parentIndex(); public slots: void selfRemove(); void changeGas(); }; class Ruler : public QGraphicsLineItem{ public: Ruler(); ~Ruler(); void setMinimum(double minimum); void setMaximum(double maximum); void setTickInterval(double interval); void setOrientation(Qt::Orientation orientation); void setTickSize(qreal size); void updateTicks(); double minimum() const; double maximum() const; qreal valueAt(const QPointF& p); qreal percentAt(const QPointF& p); qreal posAtValue(qreal value); void setColor(const QColor& color); void setTextColor(const QColor& color); int unitSystem; private: void eraseAll(); Qt::Orientation orientation; QList ticks; QList labels; double min; double max; double interval; double tickSize; QColor textColor; }; class DivePlannerGraphics : public QGraphicsView { Q_OBJECT public: DivePlannerGraphics(QWidget* parent = 0); protected: virtual void mouseDoubleClickEvent(QMouseEvent* event); virtual void showEvent(QShowEvent* event); virtual void resizeEvent(QResizeEvent* event); virtual void mouseMoveEvent(QMouseEvent* event); virtual void mousePressEvent(QMouseEvent* event); virtual void mouseReleaseEvent(QMouseEvent* event); bool isPointOutOfBoundaries(const QPointF& point); qreal fromPercent(qreal percent, Qt::Orientation orientation); public slots: void settingsChanged(); private slots: void keyEscAction(); void keyDeleteAction(); void keyUpAction(); void keyDownAction(); void keyLeftAction(); void keyRightAction(); void increaseTime(); void increaseDepth(); void decreaseTime(); void decreaseDepth();; void drawProfile(); void pointInserted(const QModelIndex&, int start, int end); void pointsRemoved(const QModelIndex&, int start, int end); private: void moveActiveHandler(const QPointF& MappedPos, const int pos); /* This are the lines of the plotted dive. */ QList lines; /* This is the user-entered handles. */ QList handles; QList gases; /* those are the lines that follows the mouse. */ QGraphicsLineItem *verticalLine; QGraphicsLineItem *horizontalLine; /* This is the handler that's being dragged. */ DiveHandler *activeDraggedHandler; // When we start to move the handler, this pos is saved. // so we can revert it later. QPointF originalHandlerPos; /* this is the background of the dive, the blue-gradient. */ QGraphicsPolygonItem *diveBg; /* This is the bottom ruler - the x axis, and it's associated text */ Ruler *timeLine; QGraphicsSimpleTextItem *timeString; /* this is the left ruler, the y axis, and it's associated text. */ Ruler *depthLine; QGraphicsSimpleTextItem *depthString; /* Buttons */ ExpanderGraphics *depthHandler; ExpanderGraphics *timeHandler; int minMinutes; // this holds the minimum requested window time int minDepth; // this holds the minimum requested window depth int dpMaxTime; // this is the time of the dive calculated by the deco. friend class DiveHandler; }; #include "ui_diveplanner.h" class DivePlannerWidget : public QWidget { Q_OBJECT public: explicit DivePlannerWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); public slots: void settingsChanged(); void atmPressureChanged(const QString& pressure); void bottomSacChanged(const QString& bottomSac); void decoSacChanged(const QString& decosac); private: Ui::DivePlanner ui; }; #endif Subsurface-4.0.2/qt-ui/diveplanner.ui000066400000000000000000000131741226345450700175420ustar00rootroot00000000000000 DivePlanner 0 0 515 591 0 0 0 0 0 QFrame::NoFrame QFrame::Plain true 0 0 515 591 0 0 0 0 2 Bottom SAC GFHigh SAC on DECO Stop GFLow 1 150 1 150 Last Stop at 6m 0 0 0 50 0 0 0 50 QDialogButtonBox::Abort|QDialogButtonBox::Save Start Time ATM Pressure TableView QWidget
tableview.h
1
Subsurface-4.0.2/qt-ui/downloadfromdivecomputer.cpp000066400000000000000000000271341226345450700225230ustar00rootroot00000000000000#include "downloadfromdivecomputer.h" #include "../libdivecomputer.h" #include "../helpers.h" #include "../display.h" #include "../divelist.h" #include "mainwindow.h" #include #include #include #include #include #include #include struct product { const char *product; dc_descriptor_t *descriptor; struct product *next; }; struct vendor { const char *vendor; struct product *productlist; struct vendor *next; }; struct mydescriptor { const char *vendor; const char *product; dc_family_t type; unsigned int model; }; namespace DownloadFromDcGlobal{ const char *err_string; }; DownloadFromDCWidget *DownloadFromDCWidget::instance() { static DownloadFromDCWidget *dialog = new DownloadFromDCWidget(mainWindow()); dialog->setAttribute(Qt::WA_QuitOnClose, false); return dialog; } DownloadFromDCWidget::DownloadFromDCWidget(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f), thread(0), timer(new QTimer(this)), dumpWarningShown(false), currentState(INITIAL) { ui.setupUi(this); ui.progressBar->hide(); ui.progressBar->setMinimum(0); ui.progressBar->setMaximum(100); fill_device_list(); fill_computer_list(); ui.chooseDumpFile->setEnabled(ui.dumpToFile->isChecked()); connect(ui.chooseDumpFile, SIGNAL(clicked()), this, SLOT(pickDumpFile())); connect(ui.dumpToFile, SIGNAL(stateChanged(int)), this, SLOT(checkDumpFile(int))); ui.chooseLogFile->setEnabled(ui.logToFile->isChecked()); connect(ui.chooseLogFile, SIGNAL(clicked()), this, SLOT(pickLogFile())); connect(ui.logToFile, SIGNAL(stateChanged(int)), this, SLOT(checkLogFile(int))); vendorModel = new QStringListModel(vendorList); ui.vendor->setModel(vendorModel); if (default_dive_computer_vendor) { ui.vendor->setCurrentIndex(ui.vendor->findText(default_dive_computer_vendor)); productModel = new QStringListModel(productList[default_dive_computer_vendor]); ui.product->setModel(productModel); if (default_dive_computer_product) ui.product->setCurrentIndex(ui.product->findText(default_dive_computer_product)); } connect(ui.product, SIGNAL(currentIndexChanged(int)), this, SLOT(on_product_currentIndexChanged()), Qt::UniqueConnection); if (default_dive_computer_device) ui.device->setEditText(default_dive_computer_device); timer->setInterval(200); connect(timer, SIGNAL(timeout()), this, SLOT(updateProgressBar())); updateState(INITIAL); } void DownloadFromDCWidget::runDialog() { updateState(INITIAL); exec(); } void DownloadFromDCWidget::updateProgressBar() { ui.progressBar->setValue(progress_bar_fraction *100); } void DownloadFromDCWidget::updateState(states state) { if (state == currentState) return; if (state == INITIAL) { fill_device_list(); ui.progressBar->hide(); markChildrenAsEnabled(); timer->stop(); } // tries to cancel an on going download else if (currentState == DOWNLOADING && state == CANCELLING) { import_thread_cancelled = true; ui.cancel->setEnabled(false); } // user pressed cancel but the application isn't doing anything. // means close the window else if ((currentState == INITIAL || currentState == CANCELLED || currentState == DONE || currentState == ERROR) && state == CANCELLING) { timer->stop(); reject(); ui.ok->setText(tr("OK")); } // the cancelation process is finished else if (currentState == CANCELLING && (state == DONE || state == CANCELLED)) { timer->stop(); state = CANCELLED; ui.progressBar->setValue(0); ui.progressBar->hide(); markChildrenAsEnabled(); } // DOWNLOAD is finally done, close the dialog and go back to the main window else if (currentState == DOWNLOADING && state == DONE) { timer->stop(); ui.progressBar->setValue(100); markChildrenAsEnabled(); ui.ok->setText(tr("OK")); accept(); } // DOWNLOAD is started. else if (state == DOWNLOADING) { timer->start(); ui.progressBar->setValue(0); ui.progressBar->show(); markChildrenAsDisabled(); } // got an error else if (state == ERROR) { QMessageBox::critical(this, TITLE_OR_TEXT(tr("Error"), this->thread->error), QMessageBox::Ok); markChildrenAsEnabled(); ui.progressBar->hide(); ui.ok->setText(tr("Retry")); } // properly updating the widget state currentState = state; } void DownloadFromDCWidget::on_vendor_currentIndexChanged(const QString& vendor) { QAbstractItemModel *currentModel = ui.product->model(); if (!currentModel) return; productModel = new QStringListModel(productList[vendor]); ui.product->setModel(productModel); // Memleak - but deleting gives me a crash. //currentModel->deleteLater(); } void DownloadFromDCWidget::on_product_currentIndexChanged() { // Set up the DC descriptor dc_descriptor_t *descriptor = NULL; descriptor = descriptorLookup[ui.vendor->currentText() + ui.product->currentText()]; // call dc_descriptor_get_transport to see if the dc_transport_t is DC_TRANSPORT_SERIAL if (dc_descriptor_get_transport(descriptor) == DC_TRANSPORT_SERIAL) { // if the dc_transport_t is DC_TRANSPORT_SERIAL, then enable the device node box. ui.device->setEnabled(true); } else { // otherwise disable the device node box ui.device->setEnabled(false); } } void DownloadFromDCWidget::fill_computer_list() { dc_iterator_t *iterator = NULL; dc_descriptor_t *descriptor = NULL; struct mydescriptor *mydescriptor; QStringList computer; dc_descriptor_iterator(&iterator); while (dc_iterator_next (iterator, &descriptor) == DC_STATUS_SUCCESS) { const char *vendor = dc_descriptor_get_vendor(descriptor); const char *product = dc_descriptor_get_product(descriptor); if (!vendorList.contains(vendor)) vendorList.append(vendor); if (!productList[vendor].contains(product)) productList[vendor].push_back(product); descriptorLookup[QString(vendor) + QString(product)] = descriptor; } dc_iterator_free(iterator); /* and add the Uemis Zurich which we are handling internally THIS IS A HACK as we magically have a data structure here that happens to match a data structure that is internal to libdivecomputer; this WILL BREAK if libdivecomputer changes the dc_descriptor struct... eventually the UEMIS code needs to move into libdivecomputer, I guess */ mydescriptor = (struct mydescriptor*) malloc(sizeof(struct mydescriptor)); mydescriptor->vendor = "Uemis"; mydescriptor->product = "Zurich"; mydescriptor->type = DC_FAMILY_NULL; mydescriptor->model = 0; if (!vendorList.contains("Uemis")) vendorList.append("Uemis"); if (!productList["Uemis"].contains("Zurich")) productList["Uemis"].push_back("Zurich"); descriptorLookup[QString("UemisZurich")] = (dc_descriptor_t *)mydescriptor; } void DownloadFromDCWidget::on_cancel_clicked() { updateState(CANCELLING); } void DownloadFromDCWidget::on_ok_clicked() { updateState(DOWNLOADING); // I don't really think that create/destroy the thread // is really necessary. if (thread) { thread->deleteLater(); } data.devname = strdup(ui.device->currentText().toUtf8().data()); data.vendor = strdup(ui.vendor->currentText().toUtf8().data()); data.product = strdup(ui.product->currentText().toUtf8().data()); data.descriptor = descriptorLookup[ui.vendor->currentText() + ui.product->currentText()]; data.force_download = ui.forceDownload->isChecked(); data.deviceid = data.diveid = 0; set_default_dive_computer(data.vendor, data.product); set_default_dive_computer_device(data.devname); thread = new DownloadThread(this, &data); connect(thread, SIGNAL(finished()), this, SLOT(onDownloadThreadFinished()), Qt::QueuedConnection); MainWindow *w = mainWindow(); connect(thread, SIGNAL(finished()), w, SLOT(refreshDisplay())); // before we start, remember where the dive_table ended previousLast = dive_table.nr; thread->start(); } bool DownloadFromDCWidget::preferDownloaded() { return ui.preferDownloaded->isChecked(); } void DownloadFromDCWidget::checkLogFile(int state) { ui.chooseLogFile->setEnabled(state == Qt::Checked); data.libdc_log = (state == Qt::Checked); if (state == Qt::Checked && logFile.isEmpty()) { pickLogFile(); } } void DownloadFromDCWidget::pickLogFile() { QString filename = existing_filename ? : prefs.default_filename; QFileInfo fi(filename); filename = fi.absolutePath().append(QDir::separator()).append("subsurface.log"); logFile = QFileDialog::getSaveFileName(this, tr("Choose file for divecomputer download logfile"), filename, tr("Log files (*.log)")); if (!logFile.isEmpty()) { if (logfile_name) free(logfile_name); logfile_name = strdup(logFile.toUtf8().data()); } } void DownloadFromDCWidget::checkDumpFile(int state) { ui.chooseDumpFile->setEnabled(state == Qt::Checked); data.libdc_dump = (state == Qt::Checked); if (state == Qt::Checked) { if (dumpFile.isEmpty()) pickDumpFile(); if (!dumpWarningShown) { QMessageBox::warning(this, tr("Warning"), tr("Saving the libdivecomputer dump will NOT download dives to the dive list.")); dumpWarningShown = true; } } } void DownloadFromDCWidget::pickDumpFile() { QString filename = existing_filename ? : prefs.default_filename; QFileInfo fi(filename); filename = fi.absolutePath().append(QDir::separator()).append("subsurface.bin"); dumpFile = QFileDialog::getSaveFileName(this, tr("Choose file for divecomputer binary dump file"), filename, tr("Dump files (*.bin)")); if (!dumpFile.isEmpty()) { if (dumpfile_name) free(dumpfile_name); dumpfile_name = strdup(dumpFile.toUtf8().data()); } } void DownloadFromDCWidget::reject() { // we don't want the download window being able to close // while we're still downloading. if (currentState != DOWNLOADING && currentState != CANCELLING) QDialog::reject(); } void DownloadFromDCWidget::onDownloadThreadFinished() { if (currentState == DOWNLOADING) { if (thread->error.isEmpty()) updateState(DONE); else updateState(ERROR); // I'm not sure if we should really call process_dives even // if there's an error if (import_thread_cancelled) { // walk backwards so we don't keep moving the dives // down in the dive_table for (int i = dive_table.nr - 1; i >= previousLast; i--) delete_single_dive(i); } else { process_dives(TRUE, preferDownloaded()); } } else { updateState(CANCELLED); } } void DownloadFromDCWidget::markChildrenAsDisabled() { ui.device->setDisabled(true); ui.vendor->setDisabled(true); ui.product->setDisabled(true); ui.forceDownload->setDisabled(true); ui.preferDownloaded->setDisabled(true); ui.ok->setDisabled(true); ui.search->setDisabled(true); } void DownloadFromDCWidget::markChildrenAsEnabled() { ui.device->setDisabled(false); ui.vendor->setDisabled(false); ui.product->setDisabled(false); ui.forceDownload->setDisabled(false); ui.preferDownloaded->setDisabled(false); ui.ok->setDisabled(false); ui.cancel->setDisabled(false); ui.search->setDisabled(false); } static void fillDeviceList(const char *name, void *data) { QComboBox *comboBox = (QComboBox *)data; comboBox->addItem(name); } void DownloadFromDCWidget::fill_device_list() { int deviceIndex; ui.device->clear(); deviceIndex = enumerate_devices(fillDeviceList, ui.device); if (deviceIndex >= 0) ui.device->setCurrentIndex(deviceIndex); } DownloadThread::DownloadThread(QObject* parent, device_data_t* data): QThread(parent), data(data) { } static QString str_error(const char *fmt, ...) { va_list args; va_start(args, fmt); const QString str = QString().vsprintf( fmt, args ); va_end(args); return str; } void DownloadThread::run() { const char *error; import_thread_cancelled = false; if (!strcmp(data->vendor, "Uemis")) error = do_uemis_import(data->devname, data->force_download); else error = do_libdivecomputer_import(data); if (error) this->error = str_error(error, data->devname, data->vendor, data->product); } Subsurface-4.0.2/qt-ui/downloadfromdivecomputer.h000066400000000000000000000032131226345450700221600ustar00rootroot00000000000000#ifndef DOWNLOADFROMDIVECOMPUTER_H #define DOWNLOADFROMDIVECOMPUTER_H #include #include #include #include #include "../libdivecomputer.h" #include "ui_downloadfromdivecomputer.h" class DownloadThread : public QThread{ Q_OBJECT public: DownloadThread(QObject* parent, device_data_t* data); virtual void run(); QString error; private: device_data_t *data; }; class QStringListModel; class DownloadFromDCWidget : public QDialog{ Q_OBJECT public: explicit DownloadFromDCWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); static DownloadFromDCWidget *instance(); void reject(); enum states { INITIAL, DOWNLOADING, CANCELLING, CANCELLED, ERROR, DONE, }; public slots: void on_ok_clicked(); void on_cancel_clicked(); void on_vendor_currentIndexChanged(const QString& vendor); void on_product_currentIndexChanged(); void onDownloadThreadFinished(); void updateProgressBar(); void runDialog(); void checkLogFile(int state); void checkDumpFile(int state); void pickDumpFile(); void pickLogFile(); private: void markChildrenAsDisabled(); void markChildrenAsEnabled(); Ui::DownloadFromDiveComputer ui; DownloadThread *thread; bool downloading; QStringList vendorList; QHash productList; QMap descriptorLookup; device_data_t data; int previousLast; QStringListModel *vendorModel; QStringListModel *productModel; void fill_computer_list(); void fill_device_list(); QString logFile; QString dumpFile; QTimer *timer; bool dumpWarningShown; public: bool preferDownloaded(); void updateState(states state); states currentState; }; #endif Subsurface-4.0.2/qt-ui/downloadfromdivecomputer.ui000066400000000000000000000075001226345450700223510ustar00rootroot00000000000000 DownloadFromDiveComputer 0 0 331 314 Download From Dive Computer :/subsurface-icon Device or Mount Point true Vendor Dive Computer ... Force download of all dives Always prefer downloaded dives Qt::Horizontal 40 20 OK Cancel 24 Save libdivecomputer logfile Save libdivecomputer dumpfile ... ... Subsurface-4.0.2/qt-ui/globe.cpp000066400000000000000000000212321226345450700164620ustar00rootroot00000000000000#include "globe.h" #include "kmessagewidget.h" #include "mainwindow.h" #include "ui_mainwindow.h" #include "../dive.h" #include "../divelist.h" #include "../helpers.h" #include #include #include #include #include #include #include #include #include #if INCOMPLETE_MARBLE #include "marble/GeoDataTreeModel.h" #else #include #endif #include #include GlobeGPS::GlobeGPS(QWidget* parent) : MarbleWidget(parent), loadedDives(0), editingDiveLocation(false) { // check if Google Sat Maps are installed // if not, check if they are in a known location MapThemeManager mtm; QStringList list = mtm.mapThemeIds(); QString subsurfaceDataPath; QDir marble; if (!list.contains("earth/googlesat/googlesat.dgml")) { subsurfaceDataPath = getSubsurfaceDataPath("marbledata"); if (subsurfaceDataPath != "") { MarbleDirs::setMarbleDataPath(subsurfaceDataPath); } else { subsurfaceDataPath = getSubsurfaceDataPath("data"); if (subsurfaceDataPath != "") MarbleDirs::setMarbleDataPath(subsurfaceDataPath); } } messageWidget = new KMessageWidget(this); messageWidget->setCloseButtonVisible(false); messageWidget->setHidden(true); setMapThemeId("earth/googlesat/googlesat.dgml"); //setMapThemeId("earth/openstreetmap/openstreetmap.dgml"); setProjection(Marble::Spherical); setAnimationsEnabled(true); Q_FOREACH(AbstractFloatItem *i, floatItems()){ i->setVisible(false); } setShowClouds(false); setShowBorders(false); setShowPlaces(true); setShowCrosshairs(false); setShowGrid(false); setShowOverviewMap(false); setShowScaleBar(true); setShowCompass(false); connect(this, SIGNAL(mouseClickGeoPosition(qreal, qreal, GeoDataCoordinates::Unit)), this, SLOT(mouseClicked(qreal, qreal, GeoDataCoordinates::Unit))); setMinimumHeight(0); setMinimumWidth(0); fixZoomTimer = new QTimer(); connect(fixZoomTimer, SIGNAL(timeout()), this, SLOT(fixZoom())); fixZoomTimer->setSingleShot(true); installEventFilter(this); } bool GlobeGPS::eventFilter(QObject *obj, QEvent *ev) { // This disables Zooming when a double click occours on the scene. if (ev->type() == QEvent::MouseButtonDblClick && !editingDiveLocation) return true; // This disables the Marble's Context Menu // we need to move this to our 'contextMenuEvent' // if we plan to do a different one in the future. if (ev->type() == QEvent::ContextMenu){ contextMenuEvent(static_cast(ev)); return true; } if (ev->type() == QEvent::MouseButtonPress){ QMouseEvent *e = static_cast(ev); if(e->button() == Qt::RightButton) return true; } return QObject::eventFilter(obj,ev ); } void GlobeGPS::contextMenuEvent(QContextMenuEvent* ev) { QMenu m; QAction *a = m.addAction(tr("Edit Selected Dive Locations"), this, SLOT(prepareForGetDiveCoordinates())); a->setData(QVariant::fromValue(&m)); m.exec(ev->globalPos()); } void GlobeGPS::mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) { // don't mess with the selection while the user is editing a dive if (mainWindow()->information()->isEditing()) return; GeoDataCoordinates here(lon, lat, unit); long lon_udeg = rint(1000000 * here.longitude(GeoDataCoordinates::Degree)); long lat_udeg = rint(1000000 * here.latitude(GeoDataCoordinates::Degree)); // distance() is in km above the map. // We're going to use that to decide how // approximate the dives have to be. // // Totally arbitrarily I say that 1km // distance means that we can resolve // to about 100m. Which in turn is about // 1000 udeg. // // Trigonometry is hard, but sin x == x // for small x, so let's just do this as // a linear thing. long resolve = rint(distance() * 1000); int idx; struct dive *dive; bool clear = !(QApplication::keyboardModifiers() & Qt::ControlModifier); QList selectedDiveIds; for_each_dive(idx, dive) { long lat_diff, lon_diff; if (!dive_has_gps_location(dive)) continue; lat_diff = labs(dive->latitude.udeg - lat_udeg); lon_diff = labs(dive->longitude.udeg - lon_udeg); if (lat_diff > 180000000) lat_diff = 360000000 - lat_diff; if (lon_diff > 180000000) lon_diff = 180000000 - lon_diff; if (lat_diff > resolve || lon_diff > resolve) continue; selectedDiveIds.push_back(idx); } if(selectedDiveIds.empty()) return; if (clear) { mainWindow()->dive_list()->unselectDives(); clear = false; } mainWindow()->dive_list()->selectDives(selectedDiveIds); } void GlobeGPS::repopulateLabels() { if (loadedDives) { model()->treeModel()->removeDocument(loadedDives); delete loadedDives; } loadedDives = new GeoDataDocument; QMap locationMap; int idx = 0; struct dive *dive; for_each_dive(idx, dive) { if (dive_has_gps_location(dive)) { GeoDataPlacemark *place = new GeoDataPlacemark(dive->location); place->setCoordinate(dive->longitude.udeg / 1000000.0,dive->latitude.udeg / 1000000.0 , 0, GeoDataCoordinates::Degree); // don't add dive locations twice, unless they are at least 50m apart if (locationMap[QString(dive->location)]) { GeoDataCoordinates existingLocation = locationMap[QString(dive->location)]->coordinate(); GeoDataLineString segment = GeoDataLineString(); segment.append(existingLocation); GeoDataCoordinates newLocation = place->coordinate(); segment.append(newLocation); double dist = segment.length(6371); // the dist is scaled to the radius given - so with 6371km as radius // 50m turns into 0.05 as threashold if (dist < 0.05) continue; } locationMap[QString(dive->location)] = place; loadedDives->append(place); } } model()->treeModel()->addDocument(loadedDives); } void GlobeGPS::reload() { editingDiveLocation = false; if (messageWidget->isVisible()) messageWidget->hide(); repopulateLabels(); } void GlobeGPS::centerOn(dive* dive) { // dive has changed, if we had the 'editingDive', hide it. if (messageWidget->isVisible() && (!dive || dive_has_gps_location(dive))) messageWidget->hide(); if (!dive) return; qreal longitude = dive->longitude.udeg / 1000000.0; qreal latitude = dive->latitude.udeg / 1000000.0; if (!longitude || !latitude || mainWindow()->information()->isEditing()) { prepareForGetDiveCoordinates(); return; } // set the zoom as seen from n kilometer above. 3km / 10,000ft seems pleasant // do not change it it was already modified by user if (!zoom()) zoomView(zoomFromDistance(3)); if (!fixZoomTimer->isActive()) currentZoomLevel = zoom(); // From the marble source code, the maximum time of // 'spin and fit' is 2 seconds, so wait a bit them zoom again. fixZoomTimer->start(2100); centerOn(longitude,latitude, true); } void GlobeGPS::fixZoom() { zoomView(currentZoomLevel, Marble::Linear); } void GlobeGPS::prepareForGetDiveCoordinates() { if (!messageWidget->isVisible()) { messageWidget->setMessageType(KMessageWidget::Warning); messageWidget->setText(QObject::tr("Move the map and double-click to set the dive location")); messageWidget->setWordWrap(true); messageWidget->animatedShow(); editingDiveLocation = true; } } void GlobeGPS::changeDiveGeoPosition(qreal lon, qreal lat, GeoDataCoordinates::Unit unit) { messageWidget->hide(); if (mainWindow()->dive_list()->selectionModel()->selection().isEmpty()) return; // convert to degrees if in radian. if (unit == GeoDataCoordinates::Radian) { lon = lon * 180 / M_PI; lat = lat * 180 / M_PI; } /* change everything on the selection. */ int i; struct dive* dive; for_each_dive(i, dive){ if(!dive->selected) continue; dive->latitude.udeg = lrint(lat * 1000000.0); dive->longitude.udeg = lrint(lon * 1000000.0); } centerOn(lon, lat, true); editingDiveLocation = false; mark_divelist_changed(TRUE); mainWindow()->refreshDisplay(); } void GlobeGPS::mousePressEvent(QMouseEvent* event) { qreal lat, lon; bool clickOnGlobe = geoCoordinates(event->pos().x(), event->pos().y(), lon, lat, GeoDataCoordinates::Degree); // there could be two scenarios that got us here; let's check if we are editing a dive if (mainWindow()->information()->isEditing() && clickOnGlobe) { mainWindow()->information()->updateCoordinatesText(lat, lon); repopulateLabels(); } else if (clickOnGlobe) { changeDiveGeoPosition(lon, lat, GeoDataCoordinates::Degree); } } void GlobeGPS::resizeEvent(QResizeEvent* event) { int size = event->size().width(); MarbleWidget::resizeEvent(event); if (size > 600) messageWidget->setGeometry((size - 600) / 2, 5, 600, 0); else messageWidget->setGeometry(5, 5, size - 10, 0); messageWidget->setMaximumHeight(500); } Subsurface-4.0.2/qt-ui/globe.h000066400000000000000000000017421226345450700161330ustar00rootroot00000000000000#ifndef GLOBE_H #define GLOBE_H #include #include #include #include class KMessageWidget; using namespace Marble; struct dive; class GlobeGPS : public MarbleWidget{ Q_OBJECT public: using MarbleWidget::centerOn; GlobeGPS(QWidget *parent); void reload(); void repopulateLabels(); void centerOn(struct dive* dive); bool eventFilter(QObject*, QEvent*); protected: /* reimp */ void resizeEvent(QResizeEvent *event); /* reimp */ void mousePressEvent(QMouseEvent* event); /* reimp */ void contextMenuEvent(QContextMenuEvent*); private: GeoDataDocument *loadedDives; KMessageWidget* messageWidget; QTimer *fixZoomTimer; int currentZoomLevel; bool editingDiveLocation; public slots: void changeDiveGeoPosition(qreal lon,qreal lat,GeoDataCoordinates::Unit); void mouseClicked(qreal lon, qreal lat, GeoDataCoordinates::Unit); void fixZoom(); void prepareForGetDiveCoordinates(); }; #endif Subsurface-4.0.2/qt-ui/graphicsview-common.cpp000066400000000000000000000102541226345450700213550ustar00rootroot00000000000000#include "graphicsview-common.h" QMap > profile_color; void fill_profile_color() { #define COLOR(x, y, z) QVector() << x << y << z; profile_color[SAC_1] = COLOR(FUNGREEN1, BLACK1_LOW_TRANS, FUNGREEN1); profile_color[SAC_2] = COLOR(APPLE1, BLACK1_LOW_TRANS, APPLE1); profile_color[SAC_3] = COLOR(ATLANTIS1, BLACK1_LOW_TRANS, ATLANTIS1); profile_color[SAC_4] = COLOR(ATLANTIS2, BLACK1_LOW_TRANS, ATLANTIS2); profile_color[SAC_5] = COLOR(EARLSGREEN1, BLACK1_LOW_TRANS, EARLSGREEN1); profile_color[SAC_6] = COLOR(HOKEYPOKEY1, BLACK1_LOW_TRANS, HOKEYPOKEY1); profile_color[SAC_7] = COLOR(TUSCANY1, BLACK1_LOW_TRANS, TUSCANY1); profile_color[SAC_8] = COLOR(CINNABAR1, BLACK1_LOW_TRANS, CINNABAR1); profile_color[SAC_9] = COLOR(REDORANGE1, BLACK1_LOW_TRANS, REDORANGE1); profile_color[VELO_STABLE] = COLOR(CAMARONE1, BLACK1_LOW_TRANS, CAMARONE1); profile_color[VELO_SLOW] = COLOR(LIMENADE1, BLACK1_LOW_TRANS, LIMENADE1); profile_color[VELO_MODERATE] = COLOR(RIOGRANDE1, BLACK1_LOW_TRANS, RIOGRANDE1); profile_color[VELO_FAST] = COLOR(PIRATEGOLD1, BLACK1_LOW_TRANS, PIRATEGOLD1); profile_color[VELO_CRAZY] = COLOR(RED1, BLACK1_LOW_TRANS, RED1); profile_color[PO2] = COLOR(APPLE1, BLACK1_LOW_TRANS, APPLE1); profile_color[PO2_ALERT] = COLOR(RED1, BLACK1_LOW_TRANS, RED1); profile_color[PN2] = COLOR(BLACK1_LOW_TRANS, BLACK1_LOW_TRANS, BLACK1_LOW_TRANS); profile_color[PN2_ALERT] = COLOR(RED1, BLACK1_LOW_TRANS, RED1); profile_color[PHE] = COLOR(PEANUT, BLACK1_LOW_TRANS, PEANUT); profile_color[PHE_ALERT] = COLOR(RED1, BLACK1_LOW_TRANS, RED1); profile_color[PP_LINES] = COLOR(BLACK1_HIGH_TRANS, BLACK1_LOW_TRANS, BLACK1_HIGH_TRANS); profile_color[TEXT_BACKGROUND] = COLOR(CONCRETE1_LOWER_TRANS, WHITE1, CONCRETE1_LOWER_TRANS); profile_color[ALERT_BG] = COLOR(BROOM1_LOWER_TRANS, BLACK1_LOW_TRANS, BROOM1_LOWER_TRANS); profile_color[ALERT_FG] = COLOR(BLACK1_LOW_TRANS, WHITE1, BLACK1_LOW_TRANS); profile_color[EVENTS] = COLOR(REDORANGE1, BLACK1_LOW_TRANS, REDORANGE1); profile_color[SAMPLE_DEEP] = COLOR(QColor(Qt::red).darker(), BLACK1, PERSIANRED1); profile_color[SAMPLE_SHALLOW] = COLOR(QColor(Qt::red).lighter(), BLACK1_LOW_TRANS, PERSIANRED1); profile_color[SMOOTHED] = COLOR(REDORANGE1_HIGH_TRANS, BLACK1_LOW_TRANS, REDORANGE1_HIGH_TRANS); profile_color[MINUTE] = COLOR(MEDIUMREDVIOLET1_HIGHER_TRANS, BLACK1_LOW_TRANS, MEDIUMREDVIOLET1_HIGHER_TRANS); profile_color[TIME_GRID] = COLOR(WHITE1, BLACK1_HIGH_TRANS, TUNDORA1_MED_TRANS); profile_color[TIME_TEXT] = COLOR(FORESTGREEN1, BLACK1, FORESTGREEN1); profile_color[DEPTH_GRID] = COLOR(WHITE1, BLACK1_HIGH_TRANS, TUNDORA1_MED_TRANS); profile_color[MEAN_DEPTH] = COLOR(REDORANGE1_MED_TRANS, BLACK1_LOW_TRANS, REDORANGE1_MED_TRANS); profile_color[DEPTH_BOTTOM] = COLOR(GOVERNORBAY1_MED_TRANS, BLACK1_HIGH_TRANS, GOVERNORBAY1_MED_TRANS); profile_color[DEPTH_TOP] = COLOR(MERCURY1_MED_TRANS, WHITE1_MED_TRANS, MERCURY1_MED_TRANS); profile_color[TEMP_TEXT] = COLOR(GOVERNORBAY2, BLACK1_LOW_TRANS, GOVERNORBAY2); profile_color[TEMP_PLOT] = COLOR(ROYALBLUE2_LOW_TRANS, BLACK1_LOW_TRANS, ROYALBLUE2_LOW_TRANS); profile_color[SAC_DEFAULT] = COLOR(WHITE1, BLACK1_LOW_TRANS, FORESTGREEN1); profile_color[BOUNDING_BOX] = COLOR(WHITE1, BLACK1_LOW_TRANS, TUNDORA1_MED_TRANS); profile_color[PRESSURE_TEXT] = COLOR(KILLARNEY1, BLACK1_LOW_TRANS, KILLARNEY1); profile_color[BACKGROUND] = COLOR(SPRINGWOOD1, WHITE1, SPRINGWOOD1); profile_color[CEILING_SHALLOW] = COLOR(REDORANGE1_HIGH_TRANS, BLACK1_HIGH_TRANS, REDORANGE1_HIGH_TRANS); profile_color[CEILING_DEEP] = COLOR(RED1_MED_TRANS, BLACK1_HIGH_TRANS, RED1_MED_TRANS); profile_color[CALC_CEILING_SHALLOW] = COLOR(FUNGREEN1_HIGH_TRANS, BLACK1_HIGH_TRANS, FUNGREEN1_HIGH_TRANS); profile_color[CALC_CEILING_DEEP] = COLOR(APPLE1_HIGH_TRANS, BLACK1_HIGH_TRANS, APPLE1_HIGH_TRANS); #undef COLOR } QColor getColor(const color_indice_t i, bool isGrayscale = false) { return profile_color[i].at((isGrayscale) ? 1 : 0); } Subsurface-4.0.2/qt-ui/graphicsview-common.h000066400000000000000000000023251226345450700210220ustar00rootroot00000000000000#ifndef GRAPHICSVIEW_COMMON_H #define GRAPHICSVIEW_COMMON_H #include "../color.h" #include #include #include #define SAC_COLORS_START_IDX SAC_1 #define SAC_COLORS 9 #define VELOCITY_COLORS_START_IDX VELO_STABLE #define VELOCITY_COLORS 5 typedef enum { /* SAC colors. Order is important, the SAC_COLORS_START_IDX define above. */ SAC_1, SAC_2, SAC_3, SAC_4, SAC_5, SAC_6, SAC_7, SAC_8, SAC_9, /* Velocity colors. Order is still important, ref VELOCITY_COLORS_START_IDX. */ VELO_STABLE, VELO_SLOW, VELO_MODERATE, VELO_FAST, VELO_CRAZY, /* gas colors */ PO2, PO2_ALERT, PN2, PN2_ALERT, PHE, PHE_ALERT, PP_LINES, /* Other colors */ TEXT_BACKGROUND, ALERT_BG, ALERT_FG, EVENTS, SAMPLE_DEEP, SAMPLE_SHALLOW, SMOOTHED, MINUTE, TIME_GRID, TIME_TEXT, DEPTH_GRID, MEAN_DEPTH, DEPTH_TOP, DEPTH_BOTTOM, TEMP_TEXT, TEMP_PLOT, SAC_DEFAULT, BOUNDING_BOX, PRESSURE_TEXT, BACKGROUND, CEILING_SHALLOW, CEILING_DEEP, CALC_CEILING_SHALLOW, CALC_CEILING_DEEP } color_indice_t; /* profile_color[color indice] = COLOR(screen color, b/w printer color, color printer}} printer & screen colours could be different */ extern QMap > profile_color; void fill_profile_color(); #endif Subsurface-4.0.2/qt-ui/groupedlineedit.cpp000066400000000000000000000121711226345450700205570ustar00rootroot00000000000000/* * Copyright (c) 2013 Maximilian Güntner * * This file is subject to the terms and conditions of version 2 of * the GNU General Public License. See the file gpl-2.0.txt in the main * directory of this archive for more details. * * Original License: * * This file is part of the Nepomuk widgets collection * Copyright (c) 2013 Denis Steckelmacher * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2.1 as published by the Free Software Foundation, * or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "groupedlineedit.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include struct GroupedLineEdit::Private { struct Block { int start; int end; QString text; }; QVector blocks; QVector colors; }; GroupedLineEdit::GroupedLineEdit(QWidget* parent) : QPlainTextEdit(parent), d(new Private) { setWordWrapMode(QTextOption::NoWrap); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); document()->setMaximumBlockCount(1); } GroupedLineEdit::~GroupedLineEdit() { delete d; } QString GroupedLineEdit::text() const { // Remove the block crosses from the text return toPlainText(); } int GroupedLineEdit::cursorPosition() const { return textCursor().positionInBlock(); } void GroupedLineEdit::addBlock(int start, int end) { Private::Block block; block.start = start; block.end = end; block.text = text().mid(start, end-start+1).trimmed(); d->blocks.append(block); viewport()->update(); } void GroupedLineEdit::addColor(QColor color) { d->colors.append(color); } void GroupedLineEdit::removeAllColors() { d->colors.clear(); } QStringList GroupedLineEdit::getBlockStringList() { QStringList retList; Private::Block block; foreach(block, d->blocks) retList.append(block.text); return retList; } void GroupedLineEdit::setCursorPosition(int position) { QTextCursor c = textCursor(); c.setPosition(position, QTextCursor::MoveAnchor); setTextCursor(c); } void GroupedLineEdit::setText(const QString &text) { setPlainText(text); } void GroupedLineEdit::clear() { QPlainTextEdit::clear(); removeAllBlocks(); } void GroupedLineEdit::selectAll() { QTextCursor c = textCursor(); c.select(QTextCursor::LineUnderCursor); setTextCursor(c); } void GroupedLineEdit::removeAllBlocks() { d->blocks.clear(); viewport()->update(); } QSize GroupedLineEdit::sizeHint() const { QSize rs( 40, document()->findBlock(0).layout()->lineAt(0).height() + document()->documentMargin() * 2 + frameWidth() * 2 ); return rs; } QSize GroupedLineEdit::minimumSizeHint() const { return sizeHint(); } void GroupedLineEdit::keyPressEvent(QKeyEvent *e) { switch (e->key()) { case Qt::Key_Return: case Qt::Key_Enter: emit editingFinished(); return; } QPlainTextEdit::keyPressEvent(e); } void GroupedLineEdit::paintEvent(QPaintEvent *e) { #if !defined __APPLE__ // for reasons we don't understand, yet, touching the painter // here (even drawing the fill rect) causes the QPlainTextEdit // paintEvent to not draw the text on MacOS. // So as a workaround until this is better understood we need // to disable the eye candy QTextLine line = document()->findBlock(0).layout()->lineAt(0); QPainter painter(viewport()); painter.setRenderHint(QPainter::Antialiasing, true); painter.fillRect(0, 0, viewport()->width(), viewport()->height(), palette().base()); QVectorIterator i(d->colors); i.toFront(); foreach (const Private::Block &block, d->blocks) { qreal start_x = line.cursorToX(block.start, QTextLine::Trailing); qreal end_x = line.cursorToX(block.end + 1, QTextLine::Leading); QPainterPath path; QRectF rectangle( start_x - 1.0 - double(horizontalScrollBar()->value()), 1.0, end_x - start_x + 2.0, double(viewport()->height() - 2) ); if (! i.hasNext()) i.toFront(); path.addRoundedRect(rectangle, 5.0, 5.0); painter.setPen(i.peekNext()); if (palette().color(QPalette::Text).lightnessF() <= 0.3 ) painter.setBrush(i.next().lighter()); else if (palette().color(QPalette::Text).lightnessF() <= 0.6 ) painter.setBrush(i.next()); else painter.setBrush(i.next().darker()); painter.drawPath(path); } #endif QPlainTextEdit::paintEvent(e); } Subsurface-4.0.2/qt-ui/groupedlineedit.h000066400000000000000000000037101226345450700202230ustar00rootroot00000000000000/* * Copyright (c) 2013 Maximilian Güntner * * This file is subject to the terms and conditions of version 2 of * the GNU General Public License. See the file gpl-2.0.txt in the main * directory of this archive for more details. * * Original License: * * This file is part of the Nepomuk widgets collection * Copyright (c) 2013 Denis Steckelmacher * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License version 2.1 as published by the Free Software Foundation, * or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef __GROUPEDLINEEDIT_H__ #define __GROUPEDLINEEDIT_H__ #include #include class GroupedLineEdit : public QPlainTextEdit { Q_OBJECT public: explicit GroupedLineEdit(QWidget *parent = 0); virtual ~GroupedLineEdit(); QString text() const; int cursorPosition() const; void setCursorPosition(int position); void setText(const QString &text); void clear(); void selectAll(); void removeAllBlocks(); void addBlock(int start, int end); QStringList getBlockStringList(); void addColor(QColor color); void removeAllColors(); virtual QSize sizeHint() const; virtual QSize minimumSizeHint() const; signals: void editingFinished(); protected: virtual void paintEvent(QPaintEvent *e); virtual void keyPressEvent(QKeyEvent *e); private: struct Private; Private *d; }; #endif Subsurface-4.0.2/qt-ui/kmessagewidget.cpp000066400000000000000000000240711226345450700204010ustar00rootroot00000000000000/* This file is part of the KDE libraries * * Copyright (c) 2011 Aurélien Gâteau * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "kmessagewidget.h" #include #include #include #include #include #include #include #include #include #include void KMessageWidgetPrivate::init(KMessageWidget* q_ptr) { q = q_ptr; q->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); timeLine = new QTimeLine(500, q); QObject::connect(timeLine, SIGNAL(valueChanged(qreal)), q, SLOT(slotTimeLineChanged(qreal))); QObject::connect(timeLine, SIGNAL(finished()), q, SLOT(slotTimeLineFinished())); content = new QFrame(q); content->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); wordWrap = false; iconLabel = new QLabel(content); iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); iconLabel->hide(); textLabel = new QLabel(content); textLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); textLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QObject::connect(textLabel, SIGNAL(linkActivated(const QString&)), q, SIGNAL(linkActivated(const QString&))); QObject::connect(textLabel, SIGNAL(linkHovered(const QString&)), q, SIGNAL(linkHovered(const QString&))); QAction* closeAction = new QAction(QObject::tr("Close"), q); q->connect(closeAction, SIGNAL(triggered(bool)), q, SLOT(animatedHide())); closeButton = new QToolButton(content); closeButton->setAutoRaise(true); closeButton->setDefaultAction(closeAction); q->setMessageType(KMessageWidget::Information); } void KMessageWidgetPrivate::createLayout() { delete content->layout(); content->resize(q->size()); qDeleteAll(buttons); buttons.clear(); Q_FOREACH(QAction* action, q->actions()) { QToolButton* button = new QToolButton(content); button->setDefaultAction(action); button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); buttons.append(button); } // AutoRaise reduces visual clutter, but we don't want to turn it on if // there are other buttons, otherwise the close button will look different // from the others. closeButton->setAutoRaise(buttons.isEmpty()); if (wordWrap) { QGridLayout* layout = new QGridLayout(content); // Set alignment to make sure icon does not move down if text wraps layout->addWidget(iconLabel, 0, 0, 1, 1, Qt::AlignHCenter | Qt::AlignTop); layout->addWidget(textLabel, 0, 1); QHBoxLayout* buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); Q_FOREACH(QToolButton* button, buttons) { // For some reason, calling show() is necessary if wordwrap is true, // otherwise the buttons do not show up. It is not needed if // wordwrap is false. button->show(); buttonLayout->addWidget(button); } buttonLayout->addWidget(closeButton); layout->addItem(buttonLayout, 1, 0, 1, 2); } else { QHBoxLayout* layout = new QHBoxLayout(content); layout->addWidget(iconLabel); layout->addWidget(textLabel); Q_FOREACH(QToolButton* button, buttons) { layout->addWidget(button); } layout->addWidget(closeButton); }; if (q->isVisible()) { q->setFixedHeight(content->sizeHint().height()); } q->updateGeometry(); } void KMessageWidgetPrivate::updateLayout() { if (content->layout()) { createLayout(); } } void KMessageWidgetPrivate::updateSnapShot() { // Attention: updateSnapShot calls QWidget::render(), which causes the whole // window layouts to be activated. Calling this method from resizeEvent() // can lead to infinite recursion, see: // https://bugs.kde.org/show_bug.cgi?id=311336 contentSnapShot = QPixmap(content->size()); contentSnapShot.fill(Qt::transparent); content->render(&contentSnapShot, QPoint(), QRegion(), QWidget::DrawChildren); } void KMessageWidgetPrivate::slotTimeLineChanged(qreal value) { q->setFixedHeight(qMin(value * 2, qreal(1.0)) * content->height()); q->update(); } void KMessageWidgetPrivate::slotTimeLineFinished() { if (timeLine->direction() == QTimeLine::Forward) { // Show // We set the whole geometry here, because it may be wrong if a // KMessageWidget is shown right when the toplevel window is created. content->setGeometry(0, 0, q->width(), bestContentHeight()); } else { // Hide q->hide(); } } int KMessageWidgetPrivate::bestContentHeight() const { int height = content->heightForWidth(q->width()); if (height == -1) { height = content->sizeHint().height(); } return height; } //--------------------------------------------------------------------- // KMessageWidget //--------------------------------------------------------------------- KMessageWidget::KMessageWidget(QWidget* parent) : QFrame(parent) , d(new KMessageWidgetPrivate) { d->init(this); } KMessageWidget::KMessageWidget(const QString& text, QWidget* parent) : QFrame(parent) , d(new KMessageWidgetPrivate) { d->init(this); setText(text); } KMessageWidget::~KMessageWidget() { delete d; } QString KMessageWidget::text() const { return d->textLabel->text(); } void KMessageWidget::setText(const QString& text) { d->textLabel->setText(text); updateGeometry(); } KMessageWidget::MessageType KMessageWidget::messageType() const { return d->messageType; } void KMessageWidget::setMessageType(KMessageWidget::MessageType type) { d->messageType = type; QColor bg0, bg1, bg2, border, fg; switch (type) { case Positive: bg1 = QColor("#72D594"); // nice green fg = QColor(Qt::white); break; case Information: bg1 = QColor("#41A8E3"); // nice blue fg = QColor(Qt::black); break; case Warning: bg1 = QColor("#72D594"); // nice yellow fg = QColor(Qt::black); break; case Error: bg1 = QColor("#E4B7B7"); // nice red. fg = QColor(Qt::black); break; } // Colors bg0 = bg1.lighter(110); bg2 = bg1.darker(110); border = bg2.darker(110); d->content->setStyleSheet( QString(".QFrame {" "background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," " stop: 0 %1," " stop: 0.1 %2," " stop: 1.0 %3);" "border-radius: 5px;" "border: 1px solid %4;" "margin: %5px;" "}" ".QLabel { color: %6; }" ).arg(bg0.name()) .arg(bg1.name()) .arg(bg2.name()) .arg(border.name()) /* DefaultFrameWidth returns the size of the external margin + border width. We know our border is 1px, so we subtract this from the frame normal QStyle FrameWidth to get our margin */ .arg(style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this) -1) .arg(fg.name()) ); } QSize KMessageWidget::sizeHint() const { ensurePolished(); return d->content->sizeHint(); } QSize KMessageWidget::minimumSizeHint() const { ensurePolished(); return d->content->minimumSizeHint(); } bool KMessageWidget::event(QEvent* event) { if (event->type() == QEvent::Polish && !d->content->layout()) { d->createLayout(); } return QFrame::event(event); } void KMessageWidget::resizeEvent(QResizeEvent* event) { QFrame::resizeEvent(event); if (d->timeLine->state() == QTimeLine::NotRunning) { d->content->resize(width(), d->bestContentHeight()); } } int KMessageWidget::heightForWidth(int width) const { ensurePolished(); return d->content->heightForWidth(width); } void KMessageWidget::paintEvent(QPaintEvent* event) { QFrame::paintEvent(event); if (d->timeLine->state() == QTimeLine::Running) { QPainter painter(this); painter.setOpacity(d->timeLine->currentValue() * d->timeLine->currentValue()); painter.drawPixmap(0, 0, d->contentSnapShot); } } void KMessageWidget::showEvent(QShowEvent* event) { // Keep this method here to avoid breaking binary compatibility: // QFrame::showEvent() used to be reimplemented. QFrame::showEvent(event); } bool KMessageWidget::wordWrap() const { return d->wordWrap; } void KMessageWidget::setWordWrap(bool wordWrap) { d->wordWrap = wordWrap; d->textLabel->setWordWrap(wordWrap); QSizePolicy policy = sizePolicy(); policy.setHeightForWidth(wordWrap); setSizePolicy(policy); d->updateLayout(); // Without this, when user does wordWrap -> !wordWrap -> wordWrap, a minimum // height is set, causing the widget to be too high. // Mostly visible in test programs. if (wordWrap) { setMinimumHeight(0); } } bool KMessageWidget::isCloseButtonVisible() const { return d->closeButton->isVisible(); } void KMessageWidget::setCloseButtonVisible(bool show) { d->closeButton->setVisible(show); updateGeometry(); } void KMessageWidget::addAction(QAction* action) { QFrame::addAction(action); d->updateLayout(); } void KMessageWidget::removeAction(QAction* action) { QFrame::removeAction(action); d->updateLayout(); } void KMessageWidget::animatedShow() { if (isVisible()) { return; } QFrame::show(); setFixedHeight(0); int wantedHeight = d->bestContentHeight(); d->content->setGeometry(0, -wantedHeight, width(), wantedHeight); d->updateSnapShot(); d->timeLine->setDirection(QTimeLine::Forward); if (d->timeLine->state() == QTimeLine::NotRunning) { d->timeLine->start(); } } void KMessageWidget::animatedHide() { if (!isVisible()) { hide(); return; } d->content->move(0, -d->content->height()); d->updateSnapShot(); d->timeLine->setDirection(QTimeLine::Backward); if (d->timeLine->state() == QTimeLine::NotRunning) { d->timeLine->start(); } } QIcon KMessageWidget::icon() const { return d->icon; } void KMessageWidget::setIcon(const QIcon& icon) { d->icon = icon; if (d->icon.isNull()) { d->iconLabel->hide(); } else { d->iconLabel->setPixmap(d->icon.pixmap(QSize(16,16))); d->iconLabel->show(); } } Subsurface-4.0.2/qt-ui/kmessagewidget.h000066400000000000000000000155361226345450700200540ustar00rootroot00000000000000/* This file is part of the KDE libraries * * Copyright (c) 2011 Aurélien Gâteau * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef KMESSAGEWIDGET_H #define KMESSAGEWIDGET_H #include class KMessageWidgetPrivate; /** * @short A widget to provide feedback or propose opportunistic interactions. * * KMessageWidget can be used to provide inline positive or negative * feedback, or to implement opportunistic interactions. * * As a feedback widget, KMessageWidget provides a less intrusive alternative * to "OK Only" message boxes. If you do not need the modalness of KMessageBox, * consider using KMessageWidget instead. * * Negative feedback * * The KMessageWidget can be used as a secondary indicator of failure: the * first indicator is usually the fact the action the user expected to happen * did not happen. * * Example: User fills a form, clicks "Submit". * * @li Expected feedback: form closes * @li First indicator of failure: form stays there * @li Second indicator of failure: a KMessageWidget appears on top of the * form, explaining the error condition * * When used to provide negative feedback, KMessageWidget should be placed * close to its context. In the case of a form, it should appear on top of the * form entries. * * KMessageWidget should get inserted in the existing layout. Space should not * be reserved for it, otherwise it becomes "dead space", ignored by the user. * KMessageWidget should also not appear as an overlay to prevent blocking * access to elements the user needs to interact with to fix the failure. * * Positive feedback * * KMessageWidget can be used for positive feedback but it shouldn't be * overused. It is often enough to provide feedback by simply showing the * results of an action. * * Examples of acceptable uses: * * @li Confirm success of "critical" transactions * @li Indicate completion of background tasks * * Example of inadapted uses: * * @li Indicate successful saving of a file * @li Indicate a file has been successfully removed * * Opportunistic interaction * * Opportunistic interaction is the situation where the application suggests to * the user an action he could be interested in perform, either based on an * action the user just triggered or an event which the application noticed. * * Example of acceptable uses: * * @li A browser can propose remembering a recently entered password * @li A music collection can propose ripping a CD which just got inserted * @li A chat application may notify the user a "special friend" just connected * * @author Aurélien Gâteau * @since 4.7 */ class KMessageWidget : public QFrame { Q_OBJECT Q_ENUMS(MessageType) Q_PROPERTY(QString text READ text WRITE setText) Q_PROPERTY(bool wordWrap READ wordWrap WRITE setWordWrap) Q_PROPERTY(bool closeButtonVisible READ isCloseButtonVisible WRITE setCloseButtonVisible) Q_PROPERTY(MessageType messageType READ messageType WRITE setMessageType) Q_PROPERTY(QIcon icon READ icon WRITE setIcon) public: enum MessageType { Positive, Information, Warning, Error }; /** * Constructs a KMessageWidget with the specified parent. */ explicit KMessageWidget(QWidget *parent = 0); explicit KMessageWidget(const QString &text, QWidget *parent = 0); ~KMessageWidget(); QString text() const; bool wordWrap() const; bool isCloseButtonVisible() const; MessageType messageType() const; void addAction(QAction *action); void removeAction(QAction *action); QSize sizeHint() const; QSize minimumSizeHint() const; int heightForWidth(int width) const; /** * The icon shown on the left of the text. By default, no icon is shown. * @since 4.11 */ QIcon icon() const; public Q_SLOTS: void setText(const QString &text); void setWordWrap(bool wordWrap); void setCloseButtonVisible(bool visible); void setMessageType(KMessageWidget::MessageType type); /** * Show the widget using an animation, unless * KGlobalSettings::graphicsEffectLevel() does not allow simple effects. */ void animatedShow(); /** * Hide the widget using an animation, unless * KGlobalSettings::graphicsEffectLevel() does not allow simple effects. */ void animatedHide(); /** * Define an icon to be shown on the left of the text * @since 4.11 */ void setIcon(const QIcon &icon); Q_SIGNALS: /** * This signal is emitted when the user clicks a link in the text label. * The URL referred to by the href anchor is passed in contents. * @param contents text of the href anchor * @see QLabel::linkActivated() * @since 4.10 */ void linkActivated(const QString& contents); /** * This signal is emitted when the user hovers over a link in the text label. * The URL referred to by the href anchor is passed in contents. * @param contents text of the href anchor * @see QLabel::linkHovered() * @since 4.11 */ void linkHovered(const QString& contents); protected: void paintEvent(QPaintEvent *event); bool event(QEvent *event); void resizeEvent(QResizeEvent *event); void showEvent(QShowEvent *event); private: KMessageWidgetPrivate *const d; friend class KMessageWidgetPrivate; Q_PRIVATE_SLOT(d, void slotTimeLineChanged(qreal)) Q_PRIVATE_SLOT(d, void slotTimeLineFinished()) }; //--------------------------------------------------------------------- // KMessageWidgetPrivate //--------------------------------------------------------------------- class QLabel; class QToolButton; class QTimeLine; #include class KMessageWidgetPrivate { public: void init(KMessageWidget*); KMessageWidget* q; QFrame* content; QLabel* iconLabel; QLabel* textLabel; QToolButton* closeButton; QTimeLine* timeLine; QIcon icon; KMessageWidget::MessageType messageType; bool wordWrap; QList buttons; QPixmap contentSnapShot; void createLayout(); void updateSnapShot(); void updateLayout(); void slotTimeLineChanged(qreal); void slotTimeLineFinished(); int bestContentHeight() const; }; #endif /* KMESSAGEWIDGET_H */ Subsurface-4.0.2/qt-ui/maintab.cpp000066400000000000000000001032201226345450700170030ustar00rootroot00000000000000/* * maintab.cpp * * classes for the "notebook" area of the main window of Subsurface * */ #include "maintab.h" #include "mainwindow.h" #include "../helpers.h" #include "../statistics.h" #include "divelistview.h" #include "modeldelegates.h" #include "globe.h" #include "completionmodels.h" #include "diveplanner.h" #include "divelist.h" #include "qthelper.h" #include #include #include #include #include #include #include #include MainTab::MainTab(QWidget *parent) : QTabWidget(parent), weightModel(new WeightModel()), cylindersModel(CylindersModel::instance()), editMode(NONE) { ui.setupUi(this); ui.tagWidget->setFocusPolicy(Qt::StrongFocus); // Don't get focus by 'Wheel' ui.cylinders->setModel(cylindersModel); ui.weights->setModel(weightModel); closeMessage(); QAction *action = new QAction(tr("Save"), this); connect(action, SIGNAL(triggered(bool)), this, SLOT(acceptChanges())); addMessageAction(action); action = new QAction(tr("Cancel"), this); connect(action, SIGNAL(triggered(bool)), this, SLOT(rejectChanges())); addMessageAction(action); if (qApp->style()->objectName() == "oxygen") setDocumentMode(true); else setDocumentMode(false); // we start out with the fields read-only; once things are // filled from a dive, they are made writeable setEnabled(false); ui.location->installEventFilter(this); ui.coordinates->installEventFilter(this); ui.divemaster->installEventFilter(this); ui.buddy->installEventFilter(this); ui.suit->installEventFilter(this); ui.notes->viewport()->installEventFilter(this); ui.rating->installEventFilter(this); ui.visibility->installEventFilter(this); ui.airtemp->installEventFilter(this); ui.watertemp->installEventFilter(this); ui.dateTimeEdit->installEventFilter(this); ui.tagWidget->installEventFilter(this); QList statisticsTabWidgets = ui.statisticsTab->children(); Q_FOREACH(QObject* obj, statisticsTabWidgets) { QLabel* label = qobject_cast(obj); if (label) label->setAlignment(Qt::AlignHCenter); } ui.cylinders->setTitle(tr("Cylinders")); ui.cylinders->setBtnToolTip(tr("Add Cylinder")); connect(ui.cylinders, SIGNAL(addButtonClicked()), this, SLOT(addCylinder_clicked())); ui.weights->setTitle(tr("Weights")); ui.weights->setBtnToolTip(tr("Add Weight System")); connect(ui.weights, SIGNAL(addButtonClicked()), this, SLOT(addWeight_clicked())); connect(ui.cylinders->view(), SIGNAL(clicked(QModelIndex)), this, SLOT(editCylinderWidget(QModelIndex))); connect(ui.weights->view(), SIGNAL(clicked(QModelIndex)), this, SLOT(editWeightWidget(QModelIndex))); ui.cylinders->view()->setItemDelegateForColumn(CylindersModel::TYPE, new TankInfoDelegate()); ui.weights->view()->setItemDelegateForColumn(WeightModel::TYPE, new WSInfoDelegate()); ui.cylinders->view()->setColumnHidden(CylindersModel::DEPTH, true); completers.buddy = new QCompleter(BuddyCompletionModel::instance(), ui.buddy); completers.divemaster = new QCompleter(DiveMasterCompletionModel::instance(), ui.divemaster); completers.location = new QCompleter(LocationCompletionModel::instance(), ui.location); completers.suit = new QCompleter(SuitCompletionModel::instance(), ui.suit); completers.tags = new QCompleter(TagCompletionModel::instance(), ui.tagWidget); completers.buddy->setCaseSensitivity(Qt::CaseInsensitive); completers.divemaster->setCaseSensitivity(Qt::CaseInsensitive); completers.location->setCaseSensitivity(Qt::CaseInsensitive); completers.suit->setCaseSensitivity(Qt::CaseInsensitive); completers.buddy->setCaseSensitivity(Qt::CaseInsensitive); completers.tags->setCaseSensitivity(Qt::CaseInsensitive); ui.buddy->setCompleter(completers.buddy); ui.divemaster->setCompleter(completers.divemaster); ui.location->setCompleter(completers.location); ui.suit->setCompleter(completers.suit); ui.tagWidget->setCompleter(completers.tags); setMinimumHeight(0); setMinimumWidth(0); // Current display of things on Gnome3 looks like shit, so // let`s fix that. if (isGnome3Session()) { QPalette p; p.setColor(QPalette::Window, QColor(Qt::white)); ui.scrollArea->viewport()->setPalette(p); ui.scrollArea_2->viewport()->setPalette(p); ui.scrollArea_3->viewport()->setPalette(p); ui.scrollArea_4->viewport()->setPalette(p); // GroupBoxes in Gnome3 looks like I'v drawn them... static const QString gnomeCss( "QGroupBox {" " background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," " stop: 0 #E0E0E0, stop: 1 #FFFFFF);" " border: 2px solid gray;" " border-radius: 5px;" " margin-top: 1ex;" "}" "QGroupBox::title {" " subcontrol-origin: margin;" " subcontrol-position: top center;" " padding: 0 3px;" " background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1," " stop: 0 #E0E0E0, stop: 1 #FFFFFF);" "}"); Q_FOREACH(QGroupBox *box, findChildren()){ box->setStyleSheet(gnomeCss); } } ui.cylinders->view()->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu); QSettings s; s.beginGroup("cylinders_dialog"); for(int i = 0; i < CylindersModel::COLUMNS; i++){ if ((i == CylindersModel::REMOVE) || (i == CylindersModel::TYPE)) continue; bool checked = s.value(QString("column%1_hidden").arg(i)).toBool(); QAction *action = new QAction(cylindersModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(), ui.cylinders->view()); action->setCheckable(true); action->setData(i); action->setChecked(!checked); connect(action, SIGNAL(triggered(bool)), this, SLOT(toggleTriggeredColumn())); ui.cylinders->view()->setColumnHidden(i, checked); ui.cylinders->view()->horizontalHeader()->addAction(action); } } MainTab::~MainTab() { QSettings s; s.beginGroup("cylinders_dialog"); for(int i = 0; i < CylindersModel::COLUMNS; i++){ if ((i == CylindersModel::REMOVE) || (i == CylindersModel::TYPE)) continue; s.setValue(QString("column%1_hidden").arg(i), ui.cylinders->view()->isColumnHidden(i)); } } void MainTab::toggleTriggeredColumn() { QAction *action = qobject_cast(sender()); int col = action->data().toInt(); QTableView *view = ui.cylinders->view(); if(action->isChecked()){ view->showColumn(col); if(view->columnWidth(col) <= 15) view->setColumnWidth(col, 80); } else view->hideColumn(col); } void MainTab::addDiveStarted() { enableEdition(ADD); } void MainTab::addMessageAction(QAction* action) { ui.diveEquipmentMessage->addAction(action); ui.diveNotesMessage->addAction(action); ui.diveInfoMessage->addAction(action); ui.diveStatisticsMessage->addAction(action); } void MainTab::hideMessage() { ui.diveNotesMessage->animatedHide(); ui.diveEquipmentMessage->animatedHide(); ui.diveInfoMessage->animatedHide(); ui.diveStatisticsMessage->animatedHide(); } void MainTab::closeMessage() { hideMessage(); ui.diveNotesMessage->setCloseButtonVisible(false); ui.diveEquipmentMessage->setCloseButtonVisible(false); ui.diveInfoMessage->setCloseButtonVisible(false); ui.diveStatisticsMessage->setCloseButtonVisible(false); } void MainTab::displayMessage(QString str) { ui.diveNotesMessage->setText(str); ui.diveNotesMessage->animatedShow(); ui.diveEquipmentMessage->setText(str); ui.diveEquipmentMessage->animatedShow(); ui.diveInfoMessage->setText(str); ui.diveInfoMessage->animatedShow(); ui.diveStatisticsMessage->setText(str); ui.diveStatisticsMessage->animatedShow(); } void MainTab::enableEdition(EditMode newEditMode) { if (current_dive == NULL || editMode != NONE) return; if ((newEditMode == DIVE || newEditMode == NONE) && current_dive->dc.model && strcmp(current_dive->dc.model, "manually added dive") == 0) { // editCurrentDive will call enableEdition with newEditMode == MANUALLY_ADDED_DIVE // so exit this function here after editCurrentDive() returns mainWindow()->editCurrentDive(); return; } mainWindow()->dive_list()->setEnabled(false); mainWindow()->globe()->prepareForGetDiveCoordinates(); // We may be editing one or more dives here. backup everything. notesBackup.clear(); if (mainWindow() && mainWindow()->dive_list()->selectedTrips().count() == 1) { // we are editing trip location and notes displayMessage(tr("This trip is being edited.")); notesBackup[NULL].notes = ui.notes->toPlainText(); notesBackup[NULL].location = ui.location->text(); editMode = TRIP; } else { if (amount_selected > 1) { displayMessage(tr("Multiple dives are being edited.")); } else { displayMessage(tr("This dive is being edited.")); } // We may be editing one or more dives here. backup everything. struct dive *mydive; for (int i = 0; i < dive_table.nr; i++) { mydive = get_dive(i); if (!mydive) continue; if (!mydive->selected) continue; notesBackup[mydive].buddy = QString(mydive->buddy); notesBackup[mydive].suit = QString(mydive->suit); notesBackup[mydive].notes = QString(mydive->notes); notesBackup[mydive].divemaster = QString(mydive->divemaster); notesBackup[mydive].location = QString(mydive->location); notesBackup[mydive].rating = mydive->rating; notesBackup[mydive].visibility = mydive->visibility; notesBackup[mydive].latitude = mydive->latitude; notesBackup[mydive].longitude = mydive->longitude; notesBackup[mydive].coordinates = ui.coordinates->text(); notesBackup[mydive].airtemp = get_temperature_string(mydive->airtemp, true); notesBackup[mydive].watertemp = get_temperature_string(mydive->watertemp, true); notesBackup[mydive].datetime = QDateTime::fromTime_t(mydive->when).toUTC().toString(); char buf[1024]; taglist_get_tagstring(mydive->tag_list, buf, 1024); notesBackup[mydive].tags = QString(buf); // maybe this is a place for memset? for (int i = 0; i < MAX_CYLINDERS; i++) { notesBackup[mydive].cylinders[i] = mydive->cylinder[i]; } for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) { notesBackup[mydive].weightsystem[i] = mydive->weightsystem[i]; } } editMode = newEditMode != NONE ? newEditMode : DIVE; } } bool MainTab::eventFilter(QObject* object, QEvent* event) { if (!isEnabled()) return false; if (editMode != NONE) return false; // for the dateTimeEdit widget we need to ignore Wheel events as well (as long as we aren't editing) if (object->objectName() == "dateTimeEdit" && (event->type() == QEvent::FocusIn || event->type() == QEvent::Wheel)) return true; // MouseButtonPress in any widget (not all will ever get this), KeyPress in the dateTimeEdit, // FocusIn for the starWidgets or RequestSoftwareInputPanel for tagWidget start the editing if ((event->type() == QEvent::MouseButtonPress) || (event->type() == QEvent::KeyPress && object == ui.dateTimeEdit) || (event->type() == QEvent::FocusIn && (object == ui.rating || object == ui.visibility)) || (event->type() == QEvent::RequestSoftwareInputPanel && object == ui.tagWidget)) { tabBar()->setTabIcon(currentIndex(), QIcon(":warning")); enableEdition(); } return false; // don't "eat" the event. } void MainTab::clearEquipment() { cylindersModel->clear(); weightModel->clear(); } void MainTab::clearInfo() { ui.sacText->clear(); ui.otuText->clear(); ui.oxygenHeliumText->clear(); ui.gasUsedText->clear(); ui.dateText->clear(); ui.diveTimeText->clear(); ui.surfaceIntervalText->clear(); ui.maximumDepthText->clear(); ui.averageDepthText->clear(); ui.waterTemperatureText->clear(); ui.airTemperatureText->clear(); ui.airPressureText->clear(); ui.salinityText->clear(); ui.tagWidget->clear(); } void MainTab::clearStats() { ui.depthLimits->clear(); ui.sacLimits->clear(); ui.divesAllText->clear(); ui.tempLimits->clear(); ui.totalTimeAllText->clear(); ui.timeLimits->clear(); } #define UPDATE_TEXT(d, field) \ if (!d || !d->field) \ ui.field->setText(""); \ else \ ui.field->setText(d->field) #define UPDATE_TEMP(d, field) \ if (!d || d->field.mkelvin == 0) \ ui.field->setText(""); \ else \ ui.field->setText(get_temperature_string(d->field, TRUE)) bool MainTab::isEditing() { return editMode != NONE; } void MainTab::updateDiveInfo(int dive) { // don't execute this while adding a dive if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE) return; if (!isEnabled() && dive != -1) setEnabled(true); if (isEnabled() && dive == -1) setEnabled(false); editMode = NONE; // This method updates ALL tabs whenever a new dive or trip is // selected. // If exactly one trip has been selected, we show the location / notes // for the trip in the Info tab, otherwise we show the info of the // selected_dive temperature_t temp; struct dive *prevd; struct dive *d = get_dive(dive); char buf[1024]; process_selected_dives(); process_all_dives(d, &prevd); UPDATE_TEXT(d, notes); UPDATE_TEXT(d, location); UPDATE_TEXT(d, suit); UPDATE_TEXT(d, divemaster); UPDATE_TEXT(d, buddy); UPDATE_TEMP(d, airtemp); UPDATE_TEMP(d, watertemp); if (d) { updateGpsCoordinates(d); ui.dateTimeEdit->setDateTime(QDateTime::fromTime_t(d->when).toUTC()); if (mainWindow() && mainWindow()->dive_list()->selectedTrips().count() == 1) { setTabText(0, tr("Trip Notes")); // only use trip relevant fields ui.coordinates->setVisible(false); ui.CoordinatedLabel->setVisible(false); ui.divemaster->setVisible(false); ui.DivemasterLabel->setVisible(false); ui.buddy->setVisible(false); ui.BuddyLabel->setVisible(false); ui.suit->setVisible(false); ui.SuitLabel->setVisible(false); ui.rating->setVisible(false); ui.RatingLabel->setVisible(false); ui.visibility->setVisible(false); ui.visibilityLabel->setVisible(false); ui.tagWidget->setVisible(false); ui.TagLabel->setVisible(false); ui.airTempLabel->setVisible(false); ui.airtemp->setVisible(false); ui.waterTempLabel->setVisible(false); ui.watertemp->setVisible(false); // rename the remaining fields and fill data from selected trip dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips().begin(); ui.LocationLabel->setText(tr("Trip Location")); ui.location->setText(currentTrip->location); ui.NotesLabel->setText(tr("Trip Notes")); ui.notes->setText(currentTrip->notes); clearEquipment(); ui.equipmentTab->setEnabled(false); } else { setTabText(0, tr("Dive Notes")); // make all the fields visible writeable ui.coordinates->setVisible(true); ui.CoordinatedLabel->setVisible(true); ui.divemaster->setVisible(true); ui.buddy->setVisible(true); ui.suit->setVisible(true); ui.SuitLabel->setVisible(true); ui.rating->setVisible(true); ui.RatingLabel->setVisible(true); ui.visibility->setVisible(true); ui.visibilityLabel->setVisible(true); ui.BuddyLabel->setVisible(true); ui.DivemasterLabel->setVisible(true); ui.TagLabel->setVisible(true); ui.tagWidget->setVisible(true); ui.airTempLabel->setVisible(true); ui.airtemp->setVisible(true); ui.waterTempLabel->setVisible(true); ui.watertemp->setVisible(true); /* and fill them from the dive */ ui.rating->setCurrentStars(d->rating); ui.visibility->setCurrentStars(d->visibility); // reset labels in case we last displayed trip notes ui.LocationLabel->setText(tr("Location")); ui.NotesLabel->setText(tr("Notes")); ui.equipmentTab->setEnabled(true); multiEditEquipmentPlaceholder = *d; cylindersModel->setDive(&multiEditEquipmentPlaceholder); weightModel->setDive(&multiEditEquipmentPlaceholder); taglist_get_tagstring(d->tag_list, buf, 1024); ui.tagWidget->setText(QString(buf)); } ui.maximumDepthText->setText(get_depth_string(d->maxdepth, TRUE)); ui.averageDepthText->setText(get_depth_string(d->meandepth, TRUE)); ui.otuText->setText(QString("%1").arg(d->otu)); ui.waterTemperatureText->setText(get_temperature_string(d->watertemp, TRUE)); ui.airTemperatureText->setText(get_temperature_string(d->airtemp, TRUE)); volume_t gases[MAX_CYLINDERS] = {}; get_gas_used(d, gases); QString volumes = get_volume_string(gases[0], TRUE); int mean[MAX_CYLINDERS], duration[MAX_CYLINDERS]; per_cylinder_mean_depth(d, select_dc(&d->dc), mean, duration); volume_t sac; QString SACs; if (mean[0] && duration[0]) { sac.mliter = gases[0].mliter * 1000.0 / (depth_to_mbar(mean[0], d) * duration[0] / 60.0); SACs = get_volume_string(sac, TRUE).append(tr("/min")); } else { SACs = QString(tr("unknown")); } for(int i=1; i < MAX_CYLINDERS && gases[i].mliter != 0; i++) { volumes.append("\n" + get_volume_string(gases[i], TRUE)); if (duration[i]) { sac.mliter = gases[i].mliter * 1000.0 / (depth_to_mbar(mean[i], d) * duration[i] / 60); SACs.append("\n" + get_volume_string(sac, TRUE).append(tr("/min"))); } else { SACs.append("\n"); } } ui.gasUsedText->setText(volumes); ui.oxygenHeliumText->setText(get_gaslist(d)); ui.dateText->setText(get_short_dive_date_string(d->when)); ui.diveTimeText->setText(QString::number((int)((d->duration.seconds + 30) / 60))); if (prevd) ui.surfaceIntervalText->setText(get_time_string(d->when - (prevd->when + prevd->duration.seconds), 4)); else ui.surfaceIntervalText->clear(); if (mean[0]) ui.sacText->setText(SACs); else ui.sacText->clear(); if (d->surface_pressure.mbar) /* this is ALWAYS displayed in mbar */ ui.airPressureText->setText(QString("%1mbar").arg(d->surface_pressure.mbar)); else ui.airPressureText->clear(); if (d->salinity) ui.salinityText->setText(QString("%1g/l").arg(d->salinity/10.0)); else ui.salinityText->clear(); ui.depthLimits->setMaximum(get_depth_string(stats_selection.max_depth, TRUE)); ui.depthLimits->setMinimum(get_depth_string(stats_selection.min_depth, TRUE)); ui.depthLimits->setAverage(get_depth_string(stats_selection.avg_depth, TRUE)); ui.sacLimits->setMaximum(get_volume_string(stats_selection.max_sac, TRUE).append(tr("/min"))); ui.sacLimits->setMinimum(get_volume_string(stats_selection.min_sac, TRUE).append(tr("/min"))); ui.sacLimits->setAverage(get_volume_string(stats_selection.avg_sac, TRUE).append(tr("/min"))); ui.divesAllText->setText(QString::number(stats_selection.selection_size)); temp.mkelvin = stats_selection.max_temp; ui.tempLimits->setMaximum(get_temperature_string(temp, TRUE)); temp.mkelvin = stats_selection.min_temp; ui.tempLimits->setMinimum(get_temperature_string(temp, TRUE)); if (stats_selection.combined_temp && stats_selection.combined_count) { const char *unit; get_temp_units(0, &unit); ui.tempLimits->setAverage(QString("%1%2").arg(stats_selection.combined_temp / stats_selection.combined_count, 0, 'f', 1).arg(unit)); } ui.totalTimeAllText->setText(get_time_string(stats_selection.total_time.seconds, 0)); int seconds = stats_selection.total_time.seconds; if (stats_selection.selection_size) seconds /= stats_selection.selection_size; ui.timeLimits->setAverage(get_time_string(seconds, 0)); ui.timeLimits->setMaximum(get_time_string(stats_selection.longest_time.seconds, 0)); ui.timeLimits->setMinimum(get_time_string(stats_selection.shortest_time.seconds, 0)); } else { /* clear the fields */ clearInfo(); clearStats(); clearEquipment(); ui.rating->setCurrentStars(0); ui.coordinates->clear(); ui.visibility->setCurrentStars(0); /* turns out this is non-trivial for a dateTimeEdit... this is a partial hack */ QLineEdit *le = ui.dateTimeEdit->findChild(); le->setText(""); } } void MainTab::addCylinder_clicked() { if(editMode == NONE) enableEdition(); cylindersModel->add(); } void MainTab::addWeight_clicked() { if(editMode == NONE) enableEdition(); weightModel->add(); } void MainTab::reload() { SuitCompletionModel::instance()->updateModel(); BuddyCompletionModel::instance()->updateModel(); LocationCompletionModel::instance()->updateModel(); DiveMasterCompletionModel::instance()->updateModel(); TagCompletionModel::instance()->updateModel(); } void MainTab::acceptChanges() { mainWindow()->dive_list()->setEnabled(true); tabBar()->setTabIcon(0, QIcon()); // Notes tabBar()->setTabIcon(1, QIcon()); // Equipment hideMessage(); ui.equipmentTab->setEnabled(true); /* now figure out if things have changed */ if (mainWindow() && mainWindow()->dive_list()->selectedTrips().count() == 1) { if (notesBackup[NULL].notes != ui.notes->toPlainText() || notesBackup[NULL].location != ui.location->text()) mark_divelist_changed(TRUE); } else { struct dive *curr = current_dive; //Reset coordinates field, in case it contains garbage. updateGpsCoordinates(curr); if (notesBackup[curr].buddy != ui.buddy->text() || notesBackup[curr].suit != ui.suit->text() || notesBackup[curr].notes != ui.notes->toPlainText() || notesBackup[curr].divemaster != ui.divemaster->text() || notesBackup[curr].location != ui.location->text() || notesBackup[curr].coordinates != ui.coordinates->text() || notesBackup[curr].rating != ui.visibility->currentStars() || notesBackup[curr].airtemp != ui.airtemp->text() || notesBackup[curr].watertemp != ui.watertemp->text() || notesBackup[curr].datetime != ui.dateTimeEdit->dateTime().toString() || notesBackup[curr].visibility != ui.rating->currentStars() || notesBackup[curr].tags != ui.tagWidget->text()) { mark_divelist_changed(TRUE); } if (notesBackup[curr].location != ui.location->text() || notesBackup[curr].coordinates != ui.coordinates->text()) { mainWindow()->globe()->reload(); } if (notesBackup[curr].tags != ui.tagWidget->text()) saveTags(); if (editMode == MANUALLY_ADDED_DIVE) { DivePlannerPointsModel::instance()->copyCylinders(curr); } else if (editMode != ADD && cylindersModel->changed) { mark_divelist_changed(TRUE); Q_FOREACH (dive *d, notesBackup.keys()) { for (int i = 0; i < MAX_CYLINDERS; i++) { if (notesBackup.keys().count() > 1) // only copy the cylinder type, none of the other values d->cylinder[i].type = multiEditEquipmentPlaceholder.cylinder[i].type; else d->cylinder[i] = multiEditEquipmentPlaceholder.cylinder[i]; } } } if (weightModel->changed) { mark_divelist_changed(TRUE); Q_FOREACH (dive *d, notesBackup.keys()) { for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) { d->weightsystem[i] = multiEditEquipmentPlaceholder.weightsystem[i]; } } } } if (current_dive->divetrip) { current_dive->divetrip->when = current_dive->when; find_new_trip_start_time(current_dive->divetrip); } if (editMode == ADD || editMode == MANUALLY_ADDED_DIVE) { // clean up the dive data (get duration, depth information from samples) fixup_dive(current_dive); if (dive_table.nr == 1) current_dive->number = 1; else if (selected_dive == dive_table.nr - 1 && get_dive(dive_table.nr - 2)->number) current_dive->number = get_dive(dive_table.nr - 2)->number + 1; DivePlannerPointsModel::instance()->cancelPlan(); mainWindow()->showProfile(); mark_divelist_changed(TRUE); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::NOTHING); } // each dive that was selected might have had the temperatures in its active divecomputer changed // so re-populate the temperatures - easiest way to do this is by calling fixup_dive Q_FOREACH(dive *d, notesBackup.keys()) { if (d) fixup_dive(d); } int scrolledBy = mainWindow()->dive_list()->verticalScrollBar()->sliderPosition(); resetPallete(); if(editMode == ADD || editMode == MANUALLY_ADDED_DIVE){ mainWindow()->dive_list()->unselectDives(); struct dive *d = get_dive(dive_table.nr -1 ); // mark the dive as remembered (abusing the selected flag) // and then clear that flag out on the other side of the sort_table() d->selected = true; sort_table(&dive_table); int i = 0; for_each_dive(i,d){ if (d->selected) { d->selected = false; break; } } editMode = NONE; mainWindow()->refreshDisplay(); mainWindow()->dive_list()->selectDive( i, true ); } else { editMode = NONE; mainWindow()->dive_list()->rememberSelection(); sort_table(&dive_table); mainWindow()->refreshDisplay(); mainWindow()->dive_list()->restoreSelection(); } mainWindow()->dive_list()->verticalScrollBar()->setSliderPosition(scrolledBy); mainWindow()->dive_list()->setFocus(); } void MainTab::resetPallete() { QPalette p; ui.buddy->setPalette(p); ui.notes->setPalette(p); ui.location->setPalette(p); ui.coordinates->setPalette(p); ui.divemaster->setPalette(p); ui.suit->setPalette(p); ui.airtemp->setPalette(p); ui.watertemp->setPalette(p); ui.dateTimeEdit->setPalette(p); ui.tagWidget->setPalette(p); } #define EDIT_TEXT2(what, text) \ textByteArray = text.toUtf8(); \ free(what);\ what = strdup(textByteArray.data()); #define EDIT_TEXT(what, text) \ QByteArray textByteArray = text.toUtf8(); \ free(what);\ what = strdup(textByteArray.data()); void MainTab::rejectChanges() { EditMode lastMode = editMode; tabBar()->setTabIcon(0, QIcon()); // Notes tabBar()->setTabIcon(1, QIcon()); // Equipment mainWindow()->dive_list()->setEnabled(true); if (mainWindow() && mainWindow()->dive_list()->selectedTrips().count() == 1){ ui.notes->setText(notesBackup[NULL].notes ); ui.location->setText(notesBackup[NULL].location); } else { if (lastMode == ADD) { // clean up DivePlannerPointsModel::instance()->cancelPlan(); } else if (lastMode == MANUALLY_ADDED_DIVE ) { // when we tried to edit a manually added dive, we destroyed // the dive we edited, so let's just restore it from backup DivePlannerPointsModel::instance()->restoreBackupDive(); } struct dive *curr = current_dive; ui.notes->setText(notesBackup[curr].notes ); ui.location->setText(notesBackup[curr].location); ui.buddy->setText(notesBackup[curr].buddy); ui.suit->setText(notesBackup[curr].suit); ui.divemaster->setText(notesBackup[curr].divemaster); ui.rating->setCurrentStars(notesBackup[curr].rating); ui.visibility->setCurrentStars(notesBackup[curr].visibility); ui.airtemp->setText(notesBackup[curr].airtemp); ui.watertemp->setText(notesBackup[curr].watertemp); ui.tagWidget->setText(notesBackup[curr].tags); // it's a little harder to do the right thing for the date time widget if (curr) { ui.dateTimeEdit->setDateTime(QDateTime::fromString(notesBackup[curr].datetime)); } else { QLineEdit *le = ui.dateTimeEdit->findChild(); le->setText(""); } struct dive *mydive; for (int i = 0; i < dive_table.nr; i++) { mydive = get_dive(i); if (!mydive) continue; if (!mydive->selected) continue; QByteArray textByteArray; EDIT_TEXT2(mydive->buddy, notesBackup[mydive].buddy); EDIT_TEXT2(mydive->suit, notesBackup[mydive].suit); EDIT_TEXT2(mydive->notes, notesBackup[mydive].notes); EDIT_TEXT2(mydive->divemaster, notesBackup[mydive].divemaster); EDIT_TEXT2(mydive->location, notesBackup[mydive].location); mydive->latitude = notesBackup[mydive].latitude; mydive->longitude = notesBackup[mydive].longitude; mydive->rating = notesBackup[mydive].rating; mydive->visibility = notesBackup[mydive].visibility; // maybe this is a place for memset? for (int i = 0; i < MAX_CYLINDERS; i++) { mydive->cylinder[i] = notesBackup[mydive].cylinders[i]; } for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) { mydive->weightsystem[i] = notesBackup[mydive].weightsystem[i]; } } updateGpsCoordinates(curr); if (lastMode == ADD) { delete_single_dive(selected_dive); mainWindow()->dive_list()->reload(DiveTripModel::CURRENT); mainWindow()->dive_list()->restoreSelection(); } if (selected_dive >= 0) { multiEditEquipmentPlaceholder = *get_dive(selected_dive); cylindersModel->setDive(&multiEditEquipmentPlaceholder); weightModel->setDive(&multiEditEquipmentPlaceholder); } else { cylindersModel->clear(); weightModel->clear(); setEnabled(false); } } hideMessage(); mainWindow()->dive_list()->setEnabled(true); notesBackup.clear(); resetPallete(); editMode = NONE; mainWindow()->globe()->reload(); if (lastMode == ADD || lastMode == MANUALLY_ADDED_DIVE) { // more clean up updateDiveInfo(selected_dive); mainWindow()->showProfile(); // we already reloaded the divelist above, so don't recreate it or we'll lose the selection mainWindow()->refreshDisplay(false); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::NOTHING); } mainWindow()->dive_list()->setFocus(); } #undef EDIT_TEXT2 #define EDIT_SELECTED_DIVES( WHAT ) do { \ if (editMode == NONE) \ return; \ \ for (int i = 0; i < dive_table.nr; i++) { \ struct dive *mydive = get_dive(i); \ if (!mydive) \ continue; \ if (!mydive->selected) \ continue; \ \ WHAT; \ } \ } while(0) void markChangedWidget(QWidget *w){ QPalette p; qreal h, s, l, a; qApp->palette().color(QPalette::Text).getHslF(&h, &s, &l, &a); p.setBrush(QPalette::Base, ( l <= 0.3 ) ? QColor(Qt::yellow).lighter() :( l <= 0.6 ) ? QColor(Qt::yellow).light() :/* else */ QColor(Qt::yellow).darker(300) ); w->setPalette(p); } void MainTab::on_buddy_textChanged(const QString& text) { EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->buddy, text) ); markChangedWidget(ui.buddy); } void MainTab::on_divemaster_textChanged(const QString& text) { EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->divemaster, text) ); markChangedWidget(ui.divemaster); } void MainTab::on_airtemp_textChanged(const QString& text) { EDIT_SELECTED_DIVES( select_dc(&mydive->dc)->airtemp.mkelvin = parseTemperatureToMkelvin(text) ); markChangedWidget(ui.airtemp); } void MainTab::on_watertemp_textChanged(const QString& text) { EDIT_SELECTED_DIVES( select_dc(&mydive->dc)->watertemp.mkelvin = parseTemperatureToMkelvin(text) ); markChangedWidget(ui.watertemp); } void MainTab::on_dateTimeEdit_dateTimeChanged(const QDateTime& datetime) { QDateTime dateTimeUtc(datetime); dateTimeUtc.setTimeSpec(Qt::UTC); EDIT_SELECTED_DIVES( mydive->when = dateTimeUtc.toTime_t() ); markChangedWidget(ui.dateTimeEdit); } void MainTab::saveTags() { EDIT_SELECTED_DIVES( QString tag; taglist_clear(mydive->tag_list); foreach (tag, ui.tagWidget->getBlockStringList()) taglist_add_tag(mydive->tag_list, tag.toAscii().data()); ); } void MainTab::on_tagWidget_textChanged() { markChangedWidget(ui.tagWidget); } void MainTab::on_location_textChanged(const QString& text) { if (editMode == NONE) return; if (editMode == TRIP && mainWindow() && mainWindow()->dive_list()->selectedTrips().count() == 1) { // we are editing a trip dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips().begin(); EDIT_TEXT(currentTrip->location, text); } else if (editMode == DIVE || editMode == ADD){ if (!ui.coordinates->isModified() || ui.coordinates->text().trimmed().isEmpty()) { struct dive* dive; int i = 0; for_each_dive(i, dive){ QString location(dive->location); if (location == text && (dive->latitude.udeg || dive->longitude.udeg)) { EDIT_SELECTED_DIVES( mydive->latitude = dive->latitude ); EDIT_SELECTED_DIVES( mydive->longitude = dive->longitude ); //Don't use updateGpsCoordinates() since we don't want to set modified state yet ui.coordinates->setText(printGPSCoords(dive->latitude.udeg, dive->longitude.udeg)); markChangedWidget(ui.coordinates); break; } } } EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->location, text) ); mainWindow()->globe()->repopulateLabels(); } markChangedWidget(ui.location); } void MainTab::on_suit_textChanged(const QString& text) { EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->suit, text) ); markChangedWidget(ui.suit); } void MainTab::on_notes_textChanged() { if (editMode == NONE) return; if (editMode == TRIP && mainWindow() && mainWindow()->dive_list()->selectedTrips().count() == 1) { // we are editing a trip dive_trip_t *currentTrip = *mainWindow()->dive_list()->selectedTrips().begin(); EDIT_TEXT(currentTrip->notes, ui.notes->toPlainText()); } else if (editMode == DIVE || editMode == ADD || editMode == MANUALLY_ADDED_DIVE) { EDIT_SELECTED_DIVES( EDIT_TEXT(mydive->notes, ui.notes->toPlainText()) ); } markChangedWidget(ui.notes); } #undef EDIT_TEXT void MainTab::on_coordinates_textChanged(const QString& text) { bool gpsChanged = false; bool parsed = false; EDIT_SELECTED_DIVES(gpsChanged |= gpsHasChanged(mydive, current_dive, text, &parsed)); if (gpsChanged) { markChangedWidget(ui.coordinates); } else if (!parsed) { QPalette p; p.setBrush(QPalette::Base, QColor(Qt::red).lighter()); ui.coordinates->setPalette(p); } } void MainTab::on_rating_valueChanged(int value) { EDIT_SELECTED_DIVES(mydive->rating = value ); } void MainTab::on_visibility_valueChanged(int value) { EDIT_SELECTED_DIVES( mydive->visibility = value ); } void MainTab::editCylinderWidget(const QModelIndex& index) { if (editMode == NONE) enableEdition(); if (index.isValid() && index.column() != CylindersModel::REMOVE) ui.cylinders->edit(index); } void MainTab::editWeightWidget(const QModelIndex& index) { if (editMode == NONE) enableEdition(); if (index.isValid() && index.column() != WeightModel::REMOVE) ui.weights->edit(index); } QString MainTab::printGPSCoords(int lat, int lon) { unsigned int latdeg, londeg; unsigned int ilatmin, ilonmin; QString lath, lonh, result; if (!lat && !lon) return QString(""); lath = lat >= 0 ? tr("N") : tr("S"); lonh = lon >= 0 ? tr("E") : tr("W"); lat = abs(lat); lon = abs(lon); latdeg = lat / 1000000; londeg = lon / 1000000; ilatmin = (lat % 1000000) * 60; ilonmin = (lon % 1000000) * 60; result.sprintf("%s%u%s %2d.%05d\' , %s%u%s %2d.%05d\'", lath.toUtf8().data(), latdeg, UTF8_DEGREE, ilatmin / 1000000, (ilatmin % 1000000) / 10, lonh.toUtf8().data(), londeg, UTF8_DEGREE, ilonmin / 1000000, (ilonmin % 1000000) / 10); return result; } void MainTab::updateCoordinatesText(qreal lat, qreal lon) { int ulat = rint(lat * 1000000); int ulon = rint(lon * 1000000); ui.coordinates->setText(printGPSCoords(ulat, ulon)); } void MainTab::updateGpsCoordinates(const struct dive *dive) { if (dive) { ui.coordinates->setText(printGPSCoords(dive->latitude.udeg, dive->longitude.udeg)); ui.coordinates->setModified(dive->latitude.udeg || dive->longitude.udeg); } else { ui.coordinates->clear(); } } Subsurface-4.0.2/qt-ui/maintab.h000066400000000000000000000054061226345450700164570ustar00rootroot00000000000000/* * maintab.h * * header file for the main tab of Subsurface * */ #ifndef MAINTAB_H #define MAINTAB_H #include #include #include #include "models.h" #include "ui_maintab.h" class QCompleter; struct dive; struct NotesBackup{ QString airtemp; QString watertemp; QString datetime; QString location; QString coordinates; degrees_t latitude; degrees_t longitude; QString notes; QString buddy; QString suit; int rating; int visibility; QString divemaster; QString tags; cylinder_t cylinders[MAX_CYLINDERS]; weightsystem_t weightsystem[MAX_WEIGHTSYSTEMS ]; }; struct Completers{ QCompleter *location; QCompleter *divemaster; QCompleter *buddy; QCompleter *suit; QCompleter *tags; }; class MainTab : public QTabWidget { Q_OBJECT public: enum EditMode { NONE, DIVE, TRIP, ADD, MANUALLY_ADDED_DIVE }; MainTab(QWidget *parent); ~MainTab(); void clearStats(); void clearInfo(); void clearEquipment(); void reload(); bool eventFilter(QObject* , QEvent*); void initialUiSetup(); bool isEditing(); void updateCoordinatesText(qreal lat, qreal lon); public slots: void addCylinder_clicked(); void addWeight_clicked(); void updateDiveInfo(int dive = selected_dive); void acceptChanges(); void rejectChanges(); void on_location_textChanged(const QString& text); void on_coordinates_textChanged(const QString& text); void on_divemaster_textChanged(const QString& text); void on_buddy_textChanged(const QString& text); void on_suit_textChanged(const QString& text); void on_notes_textChanged(); void on_airtemp_textChanged(const QString& text); void on_watertemp_textChanged(const QString& text); void on_dateTimeEdit_dateTimeChanged(const QDateTime& datetime); void on_rating_valueChanged(int value); void on_visibility_valueChanged(int value); void on_tagWidget_textChanged(); void editCylinderWidget(const QModelIndex& index); void editWeightWidget(const QModelIndex& index); void addDiveStarted(); void addMessageAction(QAction* action); void hideMessage(); void closeMessage(); void displayMessage(QString str); void enableEdition(EditMode newEditMode = NONE); void toggleTriggeredColumn(); private: Ui::MainTab ui; WeightModel *weightModel; CylindersModel *cylindersModel; QMap notesBackup; EditMode editMode; /* since the multi-edition of the equipment is fairly more * complex than a single item, because it involves a Qt * Model to edit things, we are copying the first selected * dive to this structure, making all editions there, * then applying the changes on the other dives.*/ struct dive multiEditEquipmentPlaceholder; Completers completers; void resetPallete(); void saveTags(); QString printGPSCoords(int lat, int lon); void updateGpsCoordinates(const struct dive *dive); }; #endif Subsurface-4.0.2/qt-ui/maintab.ui000066400000000000000000000641611226345450700166500ustar00rootroot00000000000000 MainTab 0 0 690 720 0 Dive Notes QFrame::NoFrame QFrame::Plain true 0 0 662 644 0 0 0 0 2 Start time Air temp Water temp true false false false Location Tags false false Coordinates Buddy false Divemaster false false Rating Visibility Notes Suit Qt::StrongFocus Qt::StrongFocus 0 0 0 0 Qt::ScrollBarAlwaysOff Qt::ScrollBarAlwaysOff QPlainTextEdit::NoWrap Equipment QFrame::NoFrame QFrame::Plain true 0 0 662 644 0 0 0 0 2 0 0 0 0 0 Qt::Vertical Dive Info QFrame::NoFrame QFrame::Plain true 0 0 662 644 0 0 0 0 2 Date Qt::AlignCenter Interval Qt::AlignCenter Gases Used Qt::AlignCenter Gas Consumed Qt::AlignCenter SAC Qt::AlignCenter Max. Depth Qt::AlignCenter Ave. Depth Qt::AlignCenter OTU Qt::AlignCenter Air Pressure Qt::AlignCenter Air Temperature Qt::AlignCenter Water Temperature Qt::AlignCenter Dive Time Qt::AlignCenter Salinity Qt::AlignCenter Qt::Vertical QSizePolicy::Expanding 20 20 Stats QFrame::NoFrame QFrame::Plain true 0 0 662 644 0 0 0 0 2 Depth Temperature SAC Duration Total Time Qt::AlignCenter Dives Qt::AlignCenter Qt::Vertical QSizePolicy::Expanding 20 20 groupBox_8b groupBox_4b groupBox_11b groupBox_14 groupBoxb groupBox_7b KMessageWidget QWidget
kmessagewidget.h
1
StarWidget QWidget
starwidget.h
1
MinMaxAvgWidget QWidget
simplewidgets.h
1
TableView QWidget
tableview.h
1
TagWidget QPlainTextEdit
qt-ui/tagwidget.h
scrollArea dateTimeEdit airtemp watertemp location coordinates divemaster buddy rating visibility suit tagWidget notes scrollArea_2 scrollArea_3 scrollArea_4
Subsurface-4.0.2/qt-ui/mainwindow.cpp000066400000000000000000000617211226345450700175550ustar00rootroot00000000000000/* * mainwindow.cpp * * classes for the main UI window in Subsurface */ #include "mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "divelistview.h" #include "starwidget.h" #include "../dive.h" #include "../divelist.h" #include "../pref.h" #include "../helpers.h" #include "modeldelegates.h" #include "models.h" #include "downloadfromdivecomputer.h" #include "preferences.h" #include "subsurfacewebservices.h" #include "divecomputermanagementdialog.h" #include "simplewidgets.h" #include "diveplanner.h" #include "about.h" #include "printdialog.h" #include "csvimportdialog.h" static MainWindow* instance = 0; MainWindow* mainWindow() { return instance; } MainWindow::MainWindow() : helpView(0) { instance = this; ui.setupUi(this); setWindowIcon(QIcon(":subsurface-icon")); connect(ui.ListWidget, SIGNAL(currentDiveChanged(int)), this, SLOT(current_dive_changed(int))); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), this, SLOT(readSettings())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.ListWidget, SLOT(update())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.ListWidget, SLOT(reloadHeaderActions())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.ProfileWidget, SLOT(refresh())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.InfoWidget, SLOT(updateDiveInfo())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.divePlanner, SLOT(settingsChanged())); connect(PreferencesDialog::instance(), SIGNAL(settingsChanged()), ui.divePlannerWidget, SLOT(settingsChanged())); ui.mainErrorMessage->hide(); initialUiSetup(); readSettings(); ui.ListWidget->reload(DiveTripModel::TREE); ui.ListWidget->reloadHeaderActions(); ui.ListWidget->setFocus(); ui.globe->reload(); ui.ListWidget->expand(ui.ListWidget->model()->index(0,0)); ui.ListWidget->scrollTo(ui.ListWidget->model()->index(0,0), QAbstractItemView::PositionAtCenter); ui.divePlanner->settingsChanged(); ui.divePlannerWidget->settingsChanged(); } // this gets called after we download dives from a divecomputer void MainWindow::refreshDisplay(bool recreateDiveList) { ui.InfoWidget->reload(); TankInfoModel::instance()->update(); ui.ProfileWidget->refresh(); ui.globe->reload(); if (recreateDiveList) ui.ListWidget->reload(DiveTripModel::CURRENT); ui.ListWidget->setFocus(); WSInfoModel::instance()->updateInfo(); } void MainWindow::current_dive_changed(int divenr) { if (divenr >= 0) { select_dive(divenr); ui.globe->centerOn(get_dive(selected_dive)); } redrawProfile(); ui.InfoWidget->updateDiveInfo(divenr); } void MainWindow::redrawProfile() { ui.ProfileWidget->refresh(); } void MainWindow::on_actionNew_triggered() { on_actionClose_triggered(); } void MainWindow::on_actionOpen_triggered() { if(DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before opening a new file.")); return; } QString filename = QFileDialog::getOpenFileName(this, tr("Open File"), lastUsedDir(), filter()); if (filename.isEmpty()) return; updateLastUsedDir(QFileInfo(filename).dir().path()); on_actionClose_triggered(); loadFiles( QStringList() << filename ); } void MainWindow::on_actionSave_triggered() { file_save(); } void MainWindow::on_actionSaveAs_triggered() { file_save_as(); } void MainWindow::cleanUpEmpty() { ui.InfoWidget->clearStats(); ui.InfoWidget->clearInfo(); ui.InfoWidget->clearEquipment(); ui.InfoWidget->updateDiveInfo(-1); ui.ProfileWidget->clear(); ui.ListWidget->reload(DiveTripModel::TREE); ui.globe->reload(); if (!existing_filename) setTitle(MWTF_DEFAULT); } void MainWindow::on_actionClose_triggered() { if(DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before closing the file.")); return; } if (unsaved_changes() && (askSaveChanges() == FALSE)) return; /* free the dives and trips */ while (dive_table.nr) delete_single_dive(0); dive_list()->clearSelection(); /* clear the selection and the statistics */ selected_dive = -1; existing_filename = NULL; cleanUpEmpty(); mark_divelist_changed(FALSE); clear_events(); } void MainWindow::on_actionImport_triggered() { QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("Import Files"), lastUsedDir(), filter()); if (!fileNames.size()) return; // no selection updateLastUsedDir(QFileInfo(fileNames.at(0)).dir().path()); importFiles(fileNames); } QString MainWindow::lastUsedDir() { QSettings settings; QString lastDir = QDir::homePath(); settings.beginGroup("FileDialog"); if (settings.contains("LastDir")) if (QDir::setCurrent(settings.value("LastDir").toString())) lastDir = settings.value("LastDir").toString(); return lastDir; } void MainWindow::updateLastUsedDir(const QString& dir) { QSettings s; s.beginGroup("FileDialog"); s.setValue("LastDir", dir); } void MainWindow::on_actionExportUDDF_triggered() { QFileInfo fi(system_default_filename()); QString filename = QFileDialog::getSaveFileName(this, tr("Save File as"), fi.absolutePath(), tr("UDDF files (*.uddf *.UDDF)")); if (!filename.isNull() && !filename.isEmpty()) export_dives_uddf(filename.toUtf8(), false); } void MainWindow::on_actionPrint_triggered() { PrintDialog::instance()->runDialog(); } void MainWindow::disableDcShortcuts() { ui.actionPreviousDC->setShortcut(QKeySequence()); ui.actionNextDC->setShortcut(QKeySequence()); } void MainWindow::enableDcShortcuts() { ui.actionPreviousDC->setShortcut(Qt::Key_Left); ui.actionNextDC->setShortcut(Qt::Key_Right); } void MainWindow::on_actionDivePlanner_triggered() { if(DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before trying to plan a dive.")); return; } disableDcShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN); DivePlannerPointsModel::instance()->clear(); CylindersModel::instance()->clear(); ui.stackedWidget->setCurrentIndex(PLANNERPROFILE); ui.infoPane->setCurrentIndex(PLANNERWIDGET); } void MainWindow::showProfile() { enableDcShortcuts(); ui.stackedWidget->setCurrentIndex(PROFILE); ui.infoPane->setCurrentIndex(MAINTAB); } void MainWindow::on_actionPreferences_triggered() { PreferencesDialog::instance()->show(); } void MainWindow::on_actionQuit_triggered() { if(DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before closing the file.")); return; } if (unsaved_changes() && (askSaveChanges() == FALSE)) return; writeSettings(); QApplication::quit(); } void MainWindow::on_actionDownloadDC_triggered() { DownloadFromDCWidget* downloadWidget = DownloadFromDCWidget::instance(); downloadWidget->runDialog(); } void MainWindow::on_actionDownloadWeb_triggered() { SubsurfaceWebServices::instance()->exec(); } void MainWindow::on_actionDivelogs_de_triggered() { DivelogsDeWebServices::instance()->downloadDives(); } void MainWindow::on_actionEditDeviceNames_triggered() { DiveComputerManagementDialog::instance()->init(); DiveComputerManagementDialog::instance()->update(); DiveComputerManagementDialog::instance()->show(); } void MainWindow::on_actionAddDive_triggered() { if(DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before trying to add a dive.")); return; } dive_list()->rememberSelection(); dive_list()->unselectDives(); disableDcShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); // now cheat - create one dive that we use to store the info tab data in struct dive *dive = alloc_dive(); dive->when = QDateTime::currentMSecsSinceEpoch() / 1000L + gettimezoneoffset(); dive->dc.model = "manually added dive"; // don't translate! this is stored in the XML file dive->latitude.udeg = 0; dive->longitude.udeg = 0; record_dive(dive); // this isn't in the UI yet, so let's call the C helper function - we'll fix this up when // accepting the dive select_dive(get_divenr(dive)); ui.InfoWidget->setCurrentIndex(0); ui.InfoWidget->updateDiveInfo(selected_dive); ui.InfoWidget->addDiveStarted(); ui.stackedWidget->setCurrentIndex(PLANNERPROFILE); // Planner. ui.infoPane->setCurrentIndex(MAINTAB); DivePlannerPointsModel::instance()->clear(); DivePlannerPointsModel::instance()->createSimpleDive(); ui.ListWidget->reload(DiveTripModel::CURRENT); } void MainWindow::on_actionRenumber_triggered() { RenumberDialog::instance()->show(); } void MainWindow::on_actionAutoGroup_triggered() { autogroup = ui.actionAutoGroup->isChecked(); if (autogroup) autogroup_dives(); else remove_autogen_trips(); refreshDisplay(); mark_divelist_changed(true); } void MainWindow::on_actionToggleZoom_triggered() { zoomed_plot = !zoomed_plot; ui.ProfileWidget->refresh(); } void MainWindow::on_actionYearlyStatistics_triggered() { QTreeView *view = new QTreeView(); QAbstractItemModel *model = new YearlyStatisticsModel(); view->setModel(model); view->setWindowModality(Qt::NonModal); view->setMinimumWidth(600); view->setAttribute(Qt::WA_QuitOnClose, false); view->show(); } void MainWindow::on_mainSplitter_splitterMoved(int pos, int idx) { redrawProfile(); } void MainWindow::on_infoProfileSplitter_splitterMoved(int pos, int idx) { redrawProfile(); } /** * So, here's the deal. * We have a few QSplitters that takes care of helping us with the * size of a few widgets, they are ok, and we should continue using them * to manage the visibility of them too. But the way that we did before was to * widget->hide(); something, and if you hided something using the splitter, * by holding it's handle and collapsing the widget, then you used the 'ctrl+number' * shortcut to show it, it whould only show a gray panel. * * This patch makes everything behave using the splitters. */ #define BEHAVIOR QList() void MainWindow::on_actionViewList_triggered() { beginChangeState(LIST_MAXIMIZED); ui.listGlobeSplitter->setSizes( BEHAVIOR << EXPANDED << COLLAPSED); ui.mainSplitter->setSizes( BEHAVIOR << COLLAPSED << EXPANDED); } void MainWindow::on_actionViewProfile_triggered() { beginChangeState(PROFILE_MAXIMIZED); ui.infoProfileSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); ui.mainSplitter->setSizes( BEHAVIOR << EXPANDED << COLLAPSED); redrawProfile(); } void MainWindow::on_actionViewInfo_triggered() { beginChangeState(INFO_MAXIMIZED); ui.infoProfileSplitter->setSizes(BEHAVIOR << EXPANDED << COLLAPSED); ui.mainSplitter->setSizes( BEHAVIOR << EXPANDED << COLLAPSED); } void MainWindow::on_actionViewGlobe_triggered() { beginChangeState(GLOBE_MAXIMIZED); ui.mainSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); ui.listGlobeSplitter->setSizes(BEHAVIOR << COLLAPSED << EXPANDED); } #undef BEHAVIOR void MainWindow::on_actionViewAll_triggered() { beginChangeState(VIEWALL); static QList mainSizes; const int appH = qApp->desktop()->size().height(); const int appW = qApp->desktop()->size().width(); if (mainSizes.empty()){ mainSizes.append( appH * 0.7 ); mainSizes.append( appH * 0.3 ); } static QList infoProfileSizes; if (infoProfileSizes.empty()){ infoProfileSizes.append( appW * 0.3 ); infoProfileSizes.append( appW * 0.7 ); } static QList listGlobeSizes; if(listGlobeSizes.empty()){ listGlobeSizes.append( appW * 0.7 ); listGlobeSizes.append( appW * 0.3 ); } QSettings settings; settings.beginGroup("MainWindow"); if (settings.value("mainSplitter").isValid()){ ui.mainSplitter->restoreState(settings.value("mainSplitter").toByteArray()); ui.infoProfileSplitter->restoreState(settings.value("infoProfileSplitter").toByteArray()); ui.listGlobeSplitter->restoreState(settings.value("listGlobeSplitter").toByteArray()); if(ui.mainSplitter->sizes().first() == 0 || ui.mainSplitter->sizes().last() == 0) ui.mainSplitter->setSizes(mainSizes); if(ui.infoProfileSplitter->sizes().first() == 0 || ui.infoProfileSplitter->sizes().last() == 0) ui.infoProfileSplitter->setSizes(infoProfileSizes); if(ui.listGlobeSplitter->sizes().first() == 0 || ui.listGlobeSplitter->sizes().last() == 0) ui.listGlobeSplitter->setSizes(listGlobeSizes); } else { ui.mainSplitter->setSizes( mainSizes ); ui.infoProfileSplitter->setSizes(infoProfileSizes); ui.listGlobeSplitter->setSizes(listGlobeSizes); } redrawProfile(); } void MainWindow::beginChangeState(CurrentState s){ if (state == VIEWALL && state != s){ saveSplitterSizes(); } state = s; } void MainWindow::saveSplitterSizes(){ QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("mainSplitter", ui.mainSplitter->saveState()); settings.setValue("infoProfileSplitter", ui.infoProfileSplitter->saveState()); settings.setValue("listGlobeSplitter", ui.listGlobeSplitter->saveState()); } void MainWindow::on_actionPreviousDC_triggered() { dc_number--; ui.InfoWidget->updateDiveInfo(selected_dive); redrawProfile(); } void MainWindow::on_actionNextDC_triggered() { dc_number++; ui.InfoWidget->updateDiveInfo(selected_dive); redrawProfile(); } void MainWindow::on_actionSelectEvents_triggered() { qDebug("actionSelectEvents"); } void MainWindow::on_actionInputPlan_triggered() { qDebug("actionInputPlan"); } void MainWindow::on_actionAboutSubsurface_triggered() { SubsurfaceAbout::instance()->show(); } void MainWindow::on_actionUserManual_triggered() { if(!helpView){ helpView = new QWebView(); helpView->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks); connect(helpView, SIGNAL(linkClicked(QUrl)), this, SLOT(linkClickedSlot(QUrl))); } QString searchPath = getSubsurfaceDataPath("Documentation"); if (searchPath != "") { QUrl url(searchPath.append("/user-manual.html")); helpView->setWindowTitle(tr("User Manual")); helpView->setWindowIcon(QIcon(":/subsurface-icon")); helpView->setUrl(url); } else { helpView->setHtml(tr("Cannot find the Subsurface manual")); } helpView->show(); } void MainWindow::linkClickedSlot(QUrl url) { QDesktopServices::openUrl(url); } QString MainWindow::filter() { QString f; f += "ALL ( *.ssrf *.xml *.XML *.uddf *.udcf *.UDFC *.jlb *.JLB "; f += "*.sde *.SDE *.dld *.DLD "; f += "*.db"; f += ");;"; f += "Subsurface (*.ssrf);;"; f += "XML (*.xml *.XML);;"; f += "UDDF (*.uddf);;"; f += "UDCF (*.udcf *.UDCF);;"; f += "JLB (*.jlb *.JLB);;"; f += "SDE (*.sde *.SDE);;"; f += "DLD (*.dld *.DLD);;"; f += "DB (*.db)"; return f; } bool MainWindow::askSaveChanges() { QString message; QMessageBox response; if (existing_filename) message = tr("Do you want to save the changes you made in the file %1?").arg(existing_filename); else message = tr("Do you want to save the changes you made in the datafile?"); response.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); response.setDefaultButton(QMessageBox::Save); response.setText(message); response.setWindowTitle(tr("Save Changes?")); // Not displayed on MacOSX as described in Qt API response.setInformativeText(tr("Changes will be lost if you don't save them.")); response.setIcon(QMessageBox::Warning); int ret = response.exec(); switch (ret) { case QMessageBox::Save: file_save(); return true; case QMessageBox::Discard: return true; } return false; } #define GET_UNIT(name, field, f, t) \ v = s.value(QString(name)); \ if (v.isValid()) \ prefs.units.field = (v.toInt() == (t)) ? (t) : (f); \ else \ prefs.units.field = default_prefs.units.field #define GET_BOOL(name, field) \ v = s.value(QString(name)); \ if (v.isValid()) \ prefs.field = v.toInt() ? TRUE : FALSE; \ else \ prefs.field = default_prefs.field #define GET_DOUBLE(name, field) \ v = s.value(QString(name)); \ if (v.isValid()) \ prefs.field = v.toDouble(); \ else \ prefs.field = default_prefs.field #define GET_INT(name, field) \ v = s.value(QString(name)); \ if (v.isValid()) \ prefs.field = v.toInt(); \ else \ prefs.field = default_prefs.field #define GET_TXT(name, field) \ v = s.value(QString(name)); \ if (v.isValid()) \ prefs.field = strdup(v.toString().toUtf8().constData()); \ else \ prefs.field = default_prefs.field #define GET_TXT(name, field) \ v = s.value(QString(name)); \ if (v.isValid()) \ prefs.field = strdup(v.toString().toUtf8().constData()); \ else \ prefs.field = default_prefs.field void MainWindow::initialUiSetup() { QSettings settings; settings.beginGroup("MainWindow"); QSize sz = settings.value("size", qApp->desktop()->size()).value(); if (settings.value("maximized", isMaximized()).value()) showMaximized(); else resize(sz); state = (CurrentState) settings.value("lastState", 0).toInt(); switch(state){ case VIEWALL: on_actionViewAll_triggered(); break; case GLOBE_MAXIMIZED : on_actionViewGlobe_triggered(); break; case INFO_MAXIMIZED : on_actionViewInfo_triggered(); break; case LIST_MAXIMIZED : on_actionViewList_triggered(); break; case PROFILE_MAXIMIZED : on_actionViewProfile_triggered(); break; } settings.endGroup(); } void MainWindow::readSettings() { QVariant v; QSettings s; s.beginGroup("Units"); if (s.value("unit_system").toString() == "metric") { prefs.unit_system = METRIC; prefs.units = SI_units; } else if (s.value("unit_system").toString() == "imperial") { prefs.unit_system = IMPERIAL; prefs.units = IMPERIAL_units; } else { prefs.unit_system = PERSONALIZE; GET_UNIT("length", length, units::FEET, units::METERS); GET_UNIT("pressure", pressure, units::PSI, units::BAR); GET_UNIT("volume", volume, units::CUFT, units::LITER); GET_UNIT("temperature", temperature, units::FAHRENHEIT, units::CELSIUS); GET_UNIT("weight", weight, units::LBS, units::KG); } GET_UNIT("vertical_speed_time", vertical_speed_time, units::MINUTES, units::SECONDS); s.endGroup(); s.beginGroup("TecDetails"); GET_BOOL("po2graph", pp_graphs.po2); GET_BOOL("pn2graph", pp_graphs.pn2); GET_BOOL("phegraph", pp_graphs.phe); GET_DOUBLE("po2threshold", pp_graphs.po2_threshold); GET_DOUBLE("pn2threshold", pp_graphs.pn2_threshold); GET_DOUBLE("phethreshold", pp_graphs.phe_threshold); GET_BOOL("mod", mod); GET_DOUBLE("modppO2", mod_ppO2); GET_BOOL("ead", ead); GET_BOOL("redceiling", profile_red_ceiling); GET_BOOL("dcceiling", profile_dc_ceiling); GET_BOOL("calcceiling", profile_calc_ceiling); GET_BOOL("calcceiling3m", calc_ceiling_3m_incr); GET_BOOL("calcndltts", calc_ndl_tts); GET_BOOL("calcalltissues", calc_all_tissues); GET_INT("gflow", gflow); GET_INT("gfhigh", gfhigh); GET_BOOL("gf_low_at_maxdepth", gf_low_at_maxdepth); set_gf(prefs.gflow, prefs.gfhigh, prefs.gf_low_at_maxdepth); GET_BOOL("show_sac", show_sac); s.endGroup(); s.beginGroup("GeneralSettings"); GET_TXT("default_filename", default_filename); GET_TXT("default_cylinder", default_cylinder); s.endGroup(); s.beginGroup("Display"); QFont defaultFont = s.value("divelist_font", qApp->font()).value(); defaultFont.setPointSizeF(s.value("font_size", qApp->font().pointSizeF()).toFloat()); qApp->setFont(defaultFont); GET_TXT("divelist_font", divelist_font); GET_INT("font_size", font_size); GET_INT("displayinvalid", display_invalid_dives); s.endGroup(); } void MainWindow::writeSettings() { QSettings settings; settings.beginGroup("MainWindow"); settings.setValue("lastState", (int) state); settings.setValue("maximized", isMaximized()); if (!isMaximized()) settings.setValue("size", size()); if (state == VIEWALL){ saveSplitterSizes(); } settings.endGroup(); } void MainWindow::closeEvent(QCloseEvent *event) { if(DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING || ui.InfoWidget->isEditing()) { QMessageBox::warning(this, tr("Warning"), tr("Please save or cancel the current dive edit before closing the file.")); event->ignore(); return; } if (helpView && helpView->isVisible()){ helpView->close(); helpView->deleteLater(); } if (unsaved_changes() && (askSaveChanges() == FALSE)) { event->ignore(); return; } event->accept(); writeSettings(); } DiveListView* MainWindow::dive_list() { return ui.ListWidget; } GlobeGPS* MainWindow::globe() { return ui.globe; } ProfileGraphicsView* MainWindow::graphics() { return ui.ProfileWidget; } MainTab* MainWindow::information() { return ui.InfoWidget; } void MainWindow::file_save_as(void) { QString filename; const char *default_filename; if (existing_filename) default_filename = existing_filename; else default_filename = prefs.default_filename; filename = QFileDialog::getSaveFileName(this, tr("Save File as"), default_filename, tr("Subsurface XML files (*.ssrf *.xml *.XML)")); if (!filename.isNull() && !filename.isEmpty()) { if(ui.InfoWidget->isEditing()) ui.InfoWidget->acceptChanges(); save_dives(filename.toUtf8().data()); set_filename(filename.toUtf8().data(), TRUE); setTitle(MWTF_FILENAME); mark_divelist_changed(FALSE); } } void MainWindow::file_save(void) { const char *current_default; if (!existing_filename) return file_save_as(); if(ui.InfoWidget->isEditing()) ui.InfoWidget->acceptChanges(); current_default = prefs.default_filename; if (strcmp(existing_filename, current_default) == 0) { /* if we are using the default filename the directory * that we are creating the file in may not exist */ QDir current_def_dir = QFileInfo(current_default).absoluteDir(); if (!current_def_dir.exists()) current_def_dir.mkpath(current_def_dir.absolutePath()); } save_dives(existing_filename); mark_divelist_changed(FALSE); } void MainWindow::showError(QString message) { if (message.isEmpty()) return; ui.mainErrorMessage->setText(message); ui.mainErrorMessage->setCloseButtonVisible(true); ui.mainErrorMessage->setMessageType(KMessageWidget::Error); ui.mainErrorMessage->animatedShow(); } void MainWindow::setTitle(enum MainWindowTitleFormat format) { switch (format) { case MWTF_DEFAULT: setWindowTitle("Subsurface"); break; case MWTF_FILENAME: if (!existing_filename) { setTitle(MWTF_DEFAULT); return; } QFile f(existing_filename); QFileInfo fileInfo(f); QString fileName(fileInfo.fileName()); setWindowTitle("Subsurface: " + fileName); break; } } void MainWindow::importFiles(const QStringList fileNames) { if (fileNames.isEmpty()) return; QByteArray fileNamePtr; char *error = NULL; for (int i = 0; i < fileNames.size(); ++i) { fileNamePtr = QFile::encodeName(fileNames.at(i)); parse_file(fileNamePtr.data(), &error); if (error != NULL) { showError(error); free(error); error = NULL; } } process_dives(TRUE, FALSE); refreshDisplay(); } void MainWindow::loadFiles(const QStringList fileNames) { if (fileNames.isEmpty()) return; char *error = NULL; QByteArray fileNamePtr; for (int i = 0; i < fileNames.size(); ++i) { fileNamePtr = QFile::encodeName(fileNames.at(i)); parse_file(fileNamePtr.data(), &error); set_filename(fileNamePtr.data(), TRUE); setTitle(MWTF_FILENAME); if (error != NULL) { showError(error); free(error); } } process_dives(FALSE, FALSE); refreshDisplay(); ui.actionAutoGroup->setChecked(autogroup); } void MainWindow::on_actionImportCSV_triggered() { CSVImportDialog *csvImport = new CSVImportDialog(); csvImport->show(); process_dives(TRUE, FALSE); refreshDisplay(); } void MainWindow::editCurrentDive() { if(information()->isEditing() || DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING){ QMessageBox::warning(this, tr("Warning"), tr("First finish the current edition before trying to do another.")); return; } struct dive *d = current_dive; QString defaultDC(d->dc.model); DivePlannerPointsModel::instance()->clear(); if (defaultDC == "manually added dive"){ disableDcShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::ADD); ui.stackedWidget->setCurrentIndex(PLANNERPROFILE); // Planner. ui.infoPane->setCurrentIndex(MAINTAB); DivePlannerPointsModel::instance()->loadFromDive(d); ui.InfoWidget->enableEdition(MainTab::MANUALLY_ADDED_DIVE); } else if (defaultDC == "planned dive"){ disableDcShortcuts(); DivePlannerPointsModel::instance()->setPlanMode(DivePlannerPointsModel::PLAN); ui.stackedWidget->setCurrentIndex(PLANNERPROFILE); // Planner. ui.infoPane->setCurrentIndex(PLANNERWIDGET); DivePlannerPointsModel::instance()->loadFromDive(d); ui.InfoWidget->enableEdition(MainTab::MANUALLY_ADDED_DIVE); } } Subsurface-4.0.2/qt-ui/mainwindow.h000066400000000000000000000066161226345450700172240ustar00rootroot00000000000000/* * mainwindow.h * * header file for the main window of Subsurface * */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include #include "ui_mainwindow.h" struct DiveList; class QSortFilterProxyModel; class DiveTripModel; class DiveInfo; class DiveNotes; class Stats; class Equipment; class QItemSelection; class DiveListView; class GlobeGPS; class MainTab; class ProfileGraphicsView; class QWebView; enum MainWindowTitleFormat { MWTF_DEFAULT, MWTF_FILENAME }; class MainWindow : public QMainWindow { Q_OBJECT public: enum {COLLAPSED, EXPANDED}; enum StackWidgetIndexes{ PROFILE, PLANNERPROFILE}; enum InfoWidgetIndexes{ MAINTAB, PLANNERWIDGET}; enum CurrentState{ VIEWALL, GLOBE_MAXIMIZED, INFO_MAXIMIZED, PROFILE_MAXIMIZED, LIST_MAXIMIZED}; MainWindow(); ProfileGraphicsView *graphics(); MainTab *information(); DiveListView *dive_list(); GlobeGPS *globe(); void showError(QString message); void setTitle(enum MainWindowTitleFormat format); // The 'Change DC Shortcuts' should only be enabled // when the profile's visible. void disableDcShortcuts(); void enableDcShortcuts(); void loadFiles(const QStringList files); void importFiles(const QStringList importFiles); void cleanUpEmpty(); private slots: /* file menu action */ void on_actionNew_triggered(); void on_actionOpen_triggered(); void on_actionSave_triggered(); void on_actionSaveAs_triggered(); void on_actionClose_triggered(); void on_actionImport_triggered(); void on_actionExportUDDF_triggered(); void on_actionPrint_triggered(); void on_actionPreferences_triggered(); void on_actionQuit_triggered(); /* log menu actions */ void on_actionDownloadDC_triggered(); void on_actionDownloadWeb_triggered(); void on_actionDivelogs_de_triggered(); void on_actionEditDeviceNames_triggered(); void on_actionAddDive_triggered(); void on_actionRenumber_triggered(); void on_actionAutoGroup_triggered(); void on_actionToggleZoom_triggered(); void on_actionYearlyStatistics_triggered(); /* view menu actions */ void on_actionViewList_triggered(); void on_actionViewProfile_triggered(); void on_actionViewInfo_triggered(); void on_actionViewGlobe_triggered(); void on_actionViewAll_triggered(); void on_actionPreviousDC_triggered(); void on_actionNextDC_triggered(); /* other menu actions */ void on_actionSelectEvents_triggered(); void on_actionInputPlan_triggered(); void on_actionAboutSubsurface_triggered(); void on_actionUserManual_triggered(); void on_actionDivePlanner_triggered(); /* monitor resize of the info-profile splitter */ void on_mainSplitter_splitterMoved(int pos, int idx); void on_infoProfileSplitter_splitterMoved(int pos, int idx); void current_dive_changed(int divenr); void initialUiSetup(); void on_actionImportCSV_triggered(); void linkClickedSlot(QUrl url); protected: void closeEvent(QCloseEvent *); public slots: void readSettings(); void refreshDisplay(bool recreateDiveList = true); void showProfile(); void editCurrentDive(); private: Ui::MainWindow ui; QAction *actionNextDive; QAction *actionPreviousDive; QWebView *helpView; CurrentState state; QString filter(); bool askSaveChanges(); void writeSettings(); void redrawProfile(); void file_save(); void file_save_as(); void beginChangeState(CurrentState s); void saveSplitterSizes(); QString lastUsedDir(); void updateLastUsedDir(const QString& s); }; MainWindow *mainWindow(); #endif Subsurface-4.0.2/qt-ui/mainwindow.ui000066400000000000000000000335551226345450700174140ustar00rootroot00000000000000 MainWindow 0 0 763 548 0 0 Qt::Vertical Qt::Horizontal 0 0 0 0 0 0 0 0 0 0 Qt::Horizontal true QAbstractItemView::ExtendedSelection true false true true 0 0 763 32 &File &Log &View Filter &Help &Import &New logbook New Ctrl+N &Open logbook Open Ctrl+O &Save Save Ctrl+S Save as Save as Ctrl+Shift+S Close Close Ctrl+W Import Files Import Files Ctrl+I Export &UDDF Ctrl+U &Print Ctrl+P Preferences Ctrl+, QAction::PreferencesRole &Quit Ctrl+Q QAction::QuitRole Import from &dive computer Ctrl+D Import &GPS data from Subsurface Service Ctrl+G &Edit Device Names Add Dive Ctrl++ &Renumber Ctrl+R true Auto Group Toggle &Zoom &Yearly Statistics Ctrl+Y Dive List Ctrl+2 Profile Ctrl+3 Info Ctrl+4 All Ctrl+1 Prev DC Left Next DC Right Select Events Input Plan About Subsurface QAction::AboutRole User &Manual F1 Globe Ctrl+5 P&lan Dive Ctrl+L Import CSV Import CS&V Import from Divelogs.de KMessageWidget QWidget
kmessagewidget.h
1
MainTab QWidget
qt-ui/maintab.h
1
DiveListView QTreeView
divelistview.h
ProfileGraphicsView QGraphicsView
profilegraphics.h
GlobeGPS QWidget
globe.h
1
DivePlannerGraphics QGraphicsView
diveplanner.h
DivePlannerWidget QWidget
diveplanner.h
1
Subsurface-4.0.2/qt-ui/marble/000077500000000000000000000000001226345450700161305ustar00rootroot00000000000000Subsurface-4.0.2/qt-ui/marble/GeoDataTreeModel.h000066400000000000000000000060131226345450700214060ustar00rootroot00000000000000// // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2010 Thibaut Gridel // #ifndef MARBLE_GEODATATREEMODEL_H #define MARBLE_GEODATATREEMODEL_H // -> does not appear to be needed #include "marble_export.h" #include namespace Marble { class GeoDataObject; class GeoDataDocument; class GeoDataFeature; class GeoDataContainer; /** * @short The representation of GeoData in a model * This class represents all available data given by kml-data files. */ class MARBLE_EXPORT GeoDataTreeModel : public QAbstractItemModel { Q_OBJECT public: /** * Creates a new GeoDataTreeModel. * * @param parent The parent object. */ explicit GeoDataTreeModel( QObject *parent = 0 ); /** * Destroys the GeoDataModel. */ ~GeoDataTreeModel(); virtual bool hasChildren( const QModelIndex &parent ) const; /** * Return the number of Items in the Model. */ int rowCount( const QModelIndex &parent = QModelIndex() ) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QVariant data( const QModelIndex &index, int role ) const; QModelIndex index( int row, int column, const QModelIndex &parent = QModelIndex() ) const; QModelIndex index( GeoDataObject* object ); QModelIndex parent( const QModelIndex &index ) const; int columnCount( const QModelIndex &parent = QModelIndex() ) const; Qt::ItemFlags flags ( const QModelIndex & index ) const; bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); void reset() { QAbstractItemModel::reset(); } public Q_SLOTS: /** * Sets the root document to use. This replaces previously loaded data, if any. * @param document The new root document. Ownership retains with the caller, * i.e. GeoDataTreeModel will not delete the passed document at its destruction. */ void setRootDocument( GeoDataDocument *document ); GeoDataDocument* rootDocument(); int addFeature( GeoDataContainer *parent, GeoDataFeature *feature ); bool removeFeature( GeoDataContainer *parent, int index ); bool removeFeature( GeoDataFeature *feature ); void updateFeature( GeoDataFeature *feature ); int addDocument( GeoDataDocument *document ); void removeDocument( int index ); void removeDocument( GeoDataDocument* document ); void update(); Q_SIGNALS: /// insert and remove row don't trigger any signal that proxies forward /// this signal will refresh geometry layer and placemark layout void removed( GeoDataObject *object ); void added( GeoDataObject *object ); private: Q_DISABLE_COPY( GeoDataTreeModel ) class Private; Private* const d; }; } #endif // MARBLE_GEODATATREEMODEL_H Subsurface-4.0.2/qt-ui/modeldelegates.cpp000066400000000000000000000314221226345450700203520ustar00rootroot00000000000000#include "modeldelegates.h" #include "../dive.h" #include "../divelist.h" #include "starwidget.h" #include "models.h" #include "diveplanner.h" #include "simplewidgets.h" #include #include #include #include #include #include #include #include #include #include #include #include QSize DiveListDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { return QSize(50,22); } // Gets the index of the model in the currentRow and column. // currCombo is defined below. #define IDX( XX ) mymodel->index(currCombo.currRow, XX) static bool keyboardFinished = false; StarWidgetsDelegate::StarWidgetsDelegate(QWidget* parent): QStyledItemDelegate(parent), parentWidget(parent) { } void StarWidgetsDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { QStyledItemDelegate::paint(painter, option, index); if (!index.isValid()) return; QVariant value = index.model()->data(index, DiveTripModel::STAR_ROLE); if (!value.isValid()) return; int rating = value.toInt(); int deltaY = option.rect.height()/2 - StarWidget::starActive().height() /2 ; painter->save(); painter->setRenderHint(QPainter::Antialiasing, true); for(int i = 0; i < rating; i++) painter->drawPixmap(option.rect.x() + i * IMG_SIZE + SPACING, option.rect.y() + deltaY, StarWidget::starActive()); for(int i = rating; i < TOTALSTARS; i++) painter->drawPixmap(option.rect.x() + i * IMG_SIZE + SPACING, option.rect.y() + deltaY, StarWidget::starInactive()); painter->restore(); } QSize StarWidgetsDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { return QSize(IMG_SIZE * TOTALSTARS + SPACING * (TOTALSTARS-1), IMG_SIZE); } ComboBoxDelegate::ComboBoxDelegate(QAbstractItemModel *model, QObject* parent): QStyledItemDelegate(parent), model(model) { connect(this, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), this, SLOT(revertModelData(QWidget*, QAbstractItemDelegate::EndEditHint))); } void ComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { QComboBox *c = qobject_cast(editor); QString data = index.model()->data(index, Qt::DisplayRole).toString(); int i = c->findText(data); if (i != -1) c->setCurrentIndex(i); else c->setEditText(data); } struct CurrSelected{ QComboBox *comboEditor; int currRow; QString activeText; QAbstractItemModel *model; bool ignoreSelection; } currCombo; QWidget* ComboBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { QComboBox *comboDelegate = new QComboBox(parent); comboDelegate->setModel(model); comboDelegate->setEditable(true); comboDelegate->setAutoCompletion(true); comboDelegate->setAutoCompletionCaseSensitivity(Qt::CaseInsensitive); comboDelegate->completer()->setCompletionMode(QCompleter::PopupCompletion); comboDelegate->view()->setEditTriggers(QAbstractItemView::AllEditTriggers); comboDelegate->lineEdit()->installEventFilter( const_cast(qobject_cast(this))); comboDelegate->view()->installEventFilter( const_cast(qobject_cast(this))); connect(comboDelegate, SIGNAL(highlighted(QString)), this, SLOT(testActivation(QString))); connect(comboDelegate, SIGNAL(activated(QString)), this, SLOT(fakeActivation())); connect(this, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), this, SLOT(fixTabBehavior())); currCombo.comboEditor = comboDelegate; currCombo.currRow = index.row(); currCombo.model = const_cast(index.model()); keyboardFinished = false; // Current display of things on Gnome3 looks like shit, so // let`s fix that. if (isGnome3Session()) { QPalette p; p.setColor(QPalette::Window, QColor(Qt::white)); p.setColor(QPalette::Base, QColor(Qt::white)); comboDelegate->lineEdit()->setPalette(p); comboDelegate->setPalette(p); } return comboDelegate; } /* This Method is being called when the user *writes* something and press enter or tab, * and it`s also called when the mouse walks over the list of choices from the ComboBox, * One thing is important, if the user writes a *new* cylinder or weight type, it will * be ADDED to the list, and the user will need to fill the other data. */ void ComboBoxDelegate::testActivation(const QString& currText) { currCombo.activeText = currText.isEmpty() ? currCombo.comboEditor->currentText() : currText; setModelData(currCombo.comboEditor, currCombo.model, QModelIndex()); } // HACK, send a fake event so Qt thinks we hit 'enter' on the line edit. void ComboBoxDelegate::fakeActivation(){ /* this test is needed because as soon as I show the selector, * the first item gots selected, this sending an activated signal, * calling this fakeActivation code and setting as the current, * thig that we don't want. so, let's just set the ignoreSelection * to false and be happy, because the next activation ( by click * or keypress) is real. */ if(currCombo.ignoreSelection){ currCombo.ignoreSelection = false; return; } QKeyEvent ev(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier); QStyledItemDelegate::eventFilter(currCombo.comboEditor, &ev); } // This 'reverts' the model data to what we actually choosed, // becaus e a TAB is being understood by Qt as 'cancel' while // we are on a QComboBox ( but not on a QLineEdit. void ComboBoxDelegate::fixTabBehavior() { if(keyboardFinished){ setModelData(0,0,QModelIndex()); } } bool ComboBoxDelegate::eventFilter(QObject* object, QEvent* event) { // Reacts on Key_UP and Key_DOWN to show the QComboBox - list of choices. if (event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride){ if (object == currCombo.comboEditor){ // the 'LineEdit' part QKeyEvent *ev = static_cast(event); if(ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down){ currCombo.ignoreSelection = true; currCombo.comboEditor->showPopup(); } if(ev->key() == Qt::Key_Tab || ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return){ currCombo.activeText = currCombo.comboEditor->currentText(); keyboardFinished = true; } } else{ // the 'Drop Down Menu' part. QKeyEvent *ev = static_cast(event); if( ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return || ev->key() == Qt::Key_Tab || ev->key() == Qt::Key_Backtab || ev->key() == Qt::Key_Escape){ // treat Qt as a silly little boy - pretending that the key_return nwas pressed on the combo, // instead of the list of choices. this can be extended later for // other imputs, like tab navigation and esc. QStyledItemDelegate::eventFilter(currCombo.comboEditor, event); } } } return QStyledItemDelegate::eventFilter(object, event); } void ComboBoxDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const { QRect defaultRect = option.rect; defaultRect.setX( defaultRect.x() -1); defaultRect.setY( defaultRect.y() -1); defaultRect.setWidth( defaultRect.width() + 2); defaultRect.setHeight( defaultRect.height() + 2); editor->setGeometry(defaultRect); } struct RevertCylinderData{ QString type; int pressure; int size; } currCylinderData; void TankInfoDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& thisindex) const { CylindersModel *mymodel = qobject_cast(currCombo.model); TankInfoModel *tanks = TankInfoModel::instance(); QModelIndexList matches = tanks->match(tanks->index(0,0), Qt::DisplayRole, currCombo.activeText); int row; if (matches.isEmpty()) { // we need to add this tanks->insertRows(tanks->rowCount(), 1); tanks->setData(tanks->index(tanks->rowCount() -1, 0), currCombo.activeText); row = tanks->rowCount() - 1; } else { row = matches.first().row(); } int tankSize = tanks->data(tanks->index(row, TankInfoModel::ML)).toInt(); int tankPressure = tanks->data(tanks->index(row, TankInfoModel::BAR)).toInt(); mymodel->setData(IDX(CylindersModel::TYPE), currCombo.activeText, Qt::EditRole); mymodel->passInData(IDX(CylindersModel::WORKINGPRESS), tankPressure); mymodel->passInData(IDX(CylindersModel::SIZE), tankSize); } TankInfoDelegate::TankInfoDelegate(QObject* parent): ComboBoxDelegate(TankInfoModel::instance(), parent) { } void TankInfoDelegate::revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint) { if ( #if !defined __APPLE__ hint == QAbstractItemDelegate::NoHint || #endif hint == QAbstractItemDelegate::RevertModelCache) { CylindersModel *mymodel = qobject_cast(currCombo.model); mymodel->setData(IDX(CylindersModel::TYPE), currCylinderData.type, Qt::EditRole); mymodel->passInData(IDX(CylindersModel::WORKINGPRESS), currCylinderData.pressure); mymodel->passInData(IDX(CylindersModel::SIZE), currCylinderData.size); } } QWidget* TankInfoDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { // ncreate editor needs to be called before because it will populate a few // things in the currCombo global var. QWidget *delegate = ComboBoxDelegate::createEditor(parent, option, index); CylindersModel *mymodel = qobject_cast(currCombo.model); cylinder_t *cyl = mymodel->cylinderAt(index); currCylinderData.type = cyl->type.description; currCylinderData.pressure = cyl->type.workingpressure.mbar; currCylinderData.size = cyl->type.size.mliter; return delegate; } struct RevertWeightData { QString type; int weight; } currWeight; void WSInfoDelegate::revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint) { if ( #if !defined __APPLE__ hint == QAbstractItemDelegate::NoHint || #endif hint == QAbstractItemDelegate::RevertModelCache) { WeightModel *mymodel = qobject_cast(currCombo.model); mymodel->setData(IDX(WeightModel::TYPE), currWeight.type, Qt::EditRole); mymodel->passInData(IDX(WeightModel::WEIGHT), currWeight.weight); } } void WSInfoDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& thisindex) const { WeightModel *mymodel = qobject_cast(currCombo.model); WSInfoModel *wsim = WSInfoModel::instance(); QModelIndexList matches = wsim->match(wsim->index(0,0), Qt::DisplayRole, currCombo.activeText); int row; if (matches.isEmpty()) { // we need to add this puppy wsim->insertRows(wsim->rowCount(), 1); wsim->setData(wsim->index(wsim->rowCount() - 1, 0), currCombo.activeText); row = wsim->rowCount() - 1; } else { row = matches.first().row(); } int grams = wsim->data(wsim->index(row, WSInfoModel::GR)).toInt(); QVariant v = QString(currCombo.activeText); mymodel->setData(IDX(WeightModel::TYPE), v, Qt::EditRole); mymodel->passInData(IDX(WeightModel::WEIGHT), grams); } WSInfoDelegate::WSInfoDelegate(QObject* parent): ComboBoxDelegate(WSInfoModel::instance(), parent) { } QWidget* WSInfoDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { /* First, call the combobox-create editor, it will setup our globals. */ QWidget *editor = ComboBoxDelegate::createEditor(parent, option, index); WeightModel *mymodel = qobject_cast(currCombo.model); weightsystem_t *ws = mymodel->weightSystemAt(index); currWeight.type = ws->description; currWeight.weight = ws->weight.grams; return editor; } void AirTypesDelegate::revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint) { } void AirTypesDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { if (!index.isValid()) return; QComboBox *combo = qobject_cast(editor); model->setData(index, QVariant(combo->currentText())); } AirTypesDelegate::AirTypesDelegate(QObject* parent) : ComboBoxDelegate(GasSelectionModel::instance(), parent) { } ProfilePrintDelegate::ProfilePrintDelegate(QObject *parent) : QStyledItemDelegate(parent) { } /* this method overrides the default table drawing method and places grid lines only at certain rows and columns */ void ProfilePrintDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { const QRect rect(option.rect); const int row = index.row(); const int col = index.column(); // grid color painter->setPen(QPen(QColor(0xff999999))); // horizontal lines if (row == 2 || row == 4 || row == 6) painter->drawLine(rect.topLeft(), rect.topRight()); if (row == 7) painter->drawLine(rect.bottomLeft(), rect.bottomRight()); // vertical lines if (row > 1) { painter->drawLine(rect.topLeft(), rect.bottomLeft()); if (col == 4 || (col == 0 && row > 5)) painter->drawLine(rect.topRight(), rect.bottomRight()); } QStyledItemDelegate::paint(painter, option, index); } Subsurface-4.0.2/qt-ui/modeldelegates.h000066400000000000000000000057241226345450700200250ustar00rootroot00000000000000#ifndef MODELDELEGATES_H #define MODELDELEGATES_H #include class QComboBox; class QPainter; class DiveListDelegate : public QStyledItemDelegate{ public: DiveListDelegate(){} QSize sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const; }; class StarWidgetsDelegate : public QStyledItemDelegate { Q_OBJECT public: explicit StarWidgetsDelegate(QWidget* parent = 0); virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; private: QWidget *parentWidget; }; class ComboBoxDelegate : public QStyledItemDelegate{ Q_OBJECT public: explicit ComboBoxDelegate(QAbstractItemModel *model, QObject* parent = 0); virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; virtual void setEditorData(QWidget* editor, const QModelIndex& index) const; virtual void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const; virtual bool eventFilter(QObject* object, QEvent* event); public slots: void testActivation(const QString& currString = QString()); //HACK: try to get rid of this in the future. void fakeActivation(); void fixTabBehavior(); virtual void revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint) = 0; protected: QAbstractItemModel *model; }; class TankInfoDelegate : public ComboBoxDelegate{ Q_OBJECT public: explicit TankInfoDelegate(QObject* parent = 0); virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const; virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; public slots: void revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint); }; class WSInfoDelegate : public ComboBoxDelegate{ Q_OBJECT public: explicit WSInfoDelegate(QObject* parent = 0); virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const; virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; public slots: void revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint); }; class AirTypesDelegate : public ComboBoxDelegate{ Q_OBJECT public: explicit AirTypesDelegate(QObject* parent = 0); virtual void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const; public slots: void revertModelData(QWidget* widget, QAbstractItemDelegate::EndEditHint hint); }; /* ProfilePrintDelagate: * this delegate is used to modify the look of the table that is printed * bellow profiles. */ class ProfilePrintDelegate : public QStyledItemDelegate { public: explicit ProfilePrintDelegate(QObject *parent = 0); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif Subsurface-4.0.2/qt-ui/models.cpp000066400000000000000000001323471226345450700166670ustar00rootroot00000000000000/* * models.cpp * * classes for the equipment models of Subsurface * */ #include "models.h" #include "diveplanner.h" #include "mainwindow.h" #include "../helpers.h" #include "../dive.h" #include "../device.h" #include "../statistics.h" #include "../qthelper.h" #include "../gettextfromc.h" #include #include #include #include #include #include #include #include #include QFont defaultModelFont() { QFont font; font.setPointSizeF( font.pointSizeF() * 0.8); return font; } CleanerTableModel::CleanerTableModel(): QAbstractTableModel() { } int CleanerTableModel::columnCount(const QModelIndex& parent) const { return headers.count(); } QVariant CleanerTableModel::headerData(int section, Qt::Orientation orientation, int role) const { QVariant ret; if (orientation == Qt::Vertical) return ret; switch (role) { case Qt::FontRole: ret = defaultModelFont(); break; case Qt::DisplayRole: ret = headers.at(section); } return ret; } void CleanerTableModel::setHeaderDataStrings(const QStringList& newHeaders) { headers = newHeaders; } CylindersModel::CylindersModel(QObject* parent): current(0), rows(0) { // enum{REMOVE, TYPE, SIZE, WORKINGPRESS, START, END, O2, HE, DEPTH}; setHeaderDataStrings( QStringList() << "" << tr("Type") << tr("Size") << tr("WorkPress") << tr("StartPress") << tr("EndPress") << trUtf8("O" UTF8_SUBSCRIPT_2 "%") << tr("He%") << tr("Switch at")); } CylindersModel *CylindersModel::instance() { static QScopedPointer self(new CylindersModel()); return self.data(); } static QVariant percent_string(fraction_t fraction) { int permille = fraction.permille; if (!permille) return QVariant(); return QString("%1%").arg(permille / 10.0, 0, 'f', 1); } QVariant CylindersModel::data(const QModelIndex& index, int role) const { QVariant ret; if (!index.isValid() || index.row() >= MAX_CYLINDERS) return ret; cylinder_t *cyl = ¤t->cylinder[index.row()]; switch (role) { case Qt::FontRole: { QFont font = defaultModelFont(); switch (index.column()) { case START: font.setItalic(!cyl->start.mbar); break; case END: font.setItalic(!cyl->end.mbar); break; } ret = font; break; } case Qt::TextAlignmentRole: ret = Qt::AlignCenter; break; case Qt::DisplayRole: case Qt::EditRole: switch(index.column()) { case TYPE: ret = QString(cyl->type.description); break; case SIZE: if (cyl->type.size.mliter) ret = get_volume_string(cyl->type.size, TRUE, cyl->type.workingpressure.mbar); break; case WORKINGPRESS: if (cyl->type.workingpressure.mbar) ret = get_pressure_string(cyl->type.workingpressure, TRUE); break; case START: if (cyl->start.mbar) ret = get_pressure_string(cyl->start, TRUE); else if (cyl->sample_start.mbar) ret = get_pressure_string(cyl->sample_start, TRUE); break; case END: if (cyl->end.mbar) ret = get_pressure_string(cyl->end, TRUE); else if (cyl->sample_end.mbar) ret = get_pressure_string(cyl->sample_end, TRUE); break; case O2: ret = percent_string(cyl->gasmix.o2); break; case HE: ret = percent_string(cyl->gasmix.he); break; case DEPTH: ret = get_depth_string(cyl->depth, TRUE); break; } break; case Qt::DecorationRole: if (index.column() == REMOVE) ret = QIcon(":trash"); break; case Qt::ToolTipRole: if (index.column() == REMOVE) ret = tr("Clicking here will remove this cylinder."); break; } return ret; } cylinder_t* CylindersModel::cylinderAt(const QModelIndex& index) { return ¤t->cylinder[index.row()]; } // this is our magic 'pass data in' function that allows the delegate to get // the data here without silly unit conversions; // so we only implement the two columns we care about void CylindersModel::passInData(const QModelIndex& index, const QVariant& value) { cylinder_t *cyl = cylinderAt(index); switch(index.column()) { case SIZE: if (cyl->type.size.mliter != value.toInt()) { cyl->type.size.mliter = value.toInt(); dataChanged(index, index); } break; case WORKINGPRESS: if (cyl->type.workingpressure.mbar != value.toInt()) { cyl->type.workingpressure.mbar = value.toInt(); dataChanged(index, index); } break; } } /* Has the string value changed */ #define CHANGED() \ (vString = value.toString()) != data(index, role).toString() bool CylindersModel::setData(const QModelIndex& index, const QVariant& value, int role) { QString vString; bool addDiveMode = DivePlannerPointsModel::instance()->currentMode() != DivePlannerPointsModel::NOTHING; if (addDiveMode) DivePlannerPointsModel::instance()->rememberTanks(); cylinder_t *cyl = cylinderAt(index); switch(index.column()) { case TYPE: if (!value.isNull()) { QByteArray ba = value.toByteArray(); const char *text = ba.constData(); if (!cyl->type.description || strcmp(cyl->type.description, text)) { cyl->type.description = strdup(text); changed = true; } } break; case SIZE: if (CHANGED()) { TankInfoModel *tanks = TankInfoModel::instance(); QModelIndexList matches = tanks->match(tanks->index(0,0), Qt::DisplayRole, cyl->type.description); cyl->type.size = string_to_volume(vString.toUtf8().data(), cyl->type.workingpressure); mark_divelist_changed(TRUE); if (!matches.isEmpty()) tanks->setData(tanks->index(matches.first().row(), TankInfoModel::ML), cyl->type.size.mliter); changed = true; } break; case WORKINGPRESS: if (CHANGED()) { TankInfoModel *tanks = TankInfoModel::instance(); QModelIndexList matches = tanks->match(tanks->index(0,0), Qt::DisplayRole, cyl->type.description); cyl->type.workingpressure = string_to_pressure(vString.toUtf8().data()); if (!matches.isEmpty()) tanks->setData(tanks->index(matches.first().row(), TankInfoModel::BAR), cyl->type.workingpressure.mbar / 1000.0); changed = true; } break; case START: if (CHANGED()) { cyl->start = string_to_pressure(vString.toUtf8().data()); changed = true; } break; case END: if (CHANGED()) { cyl->end = string_to_pressure(vString.toUtf8().data()); changed = true; } break; case O2: if (CHANGED()) { cyl->gasmix.o2 = string_to_fraction(vString.toUtf8().data()); changed = true; } break; case HE: if (CHANGED()) { cyl->gasmix.he = string_to_fraction(vString.toUtf8().data()); changed = true; } break; case DEPTH: if (CHANGED()) cyl->depth = string_to_depth(vString.toUtf8().data()); } dataChanged(index, index); if (addDiveMode) DivePlannerPointsModel::instance()->tanksUpdated(); return true; } int CylindersModel::rowCount(const QModelIndex& parent) const { return rows; } void CylindersModel::add() { if (rows >= MAX_CYLINDERS) { return; } int row = rows; fill_default_cylinder(¤t->cylinder[row]); beginInsertRows(QModelIndex(), row, row); rows++; changed = true; endInsertRows(); } void CylindersModel::update() { setDive(current); } void CylindersModel::clear() { if (rows > 0) { beginRemoveRows(QModelIndex(), 0, rows-1); endRemoveRows(); } } void CylindersModel::setDive(dive* d) { if (current) clear(); if (!d) return; rows = 0; for(int i = 0; i < MAX_CYLINDERS; i++) { if (!cylinder_none(&d->cylinder[i])) { rows = i+1; } } current = d; changed = false; if (rows > 0) { beginInsertRows(QModelIndex(), 0, rows-1); endInsertRows(); } } Qt::ItemFlags CylindersModel::flags(const QModelIndex& index) const { if (index.column() == REMOVE) return Qt::ItemIsEnabled; return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } void CylindersModel::remove(const QModelIndex& index) { if (index.column() != REMOVE) { return; } cylinder_t *cyl = ¤t->cylinder[index.row()]; if (DivePlannerPointsModel::instance()->tankInUse(cyl->gasmix.o2.permille, cyl->gasmix.he.permille)) { QMessageBox::warning(mainWindow(), TITLE_OR_TEXT( tr("Cylinder cannot be removed"), tr("This gas in use. Only cylinders that are not used in the dive can be removed.")), QMessageBox::Ok); return; } beginRemoveRows(QModelIndex(), index.row(), index.row()); // yah, know, ugly. rows--; remove_cylinder(current, index.row()); changed = true; endRemoveRows(); } WeightModel::WeightModel(QObject* parent): current(0), rows(0) { //enum Column {REMOVE, TYPE, WEIGHT}; setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight")); } weightsystem_t* WeightModel::weightSystemAt(const QModelIndex& index) { return ¤t->weightsystem[index.row()]; } void WeightModel::remove(const QModelIndex& index) { if (index.column() != REMOVE) { return; } beginRemoveRows(QModelIndex(), index.row(), index.row()); // yah, know, ugly. rows--; remove_weightsystem(current, index.row()); changed = true; endRemoveRows(); } void WeightModel::clear() { if (rows > 0) { beginRemoveRows(QModelIndex(), 0, rows-1); endRemoveRows(); } } QVariant WeightModel::data(const QModelIndex& index, int role) const { QVariant ret; if (!index.isValid() || index.row() >= MAX_WEIGHTSYSTEMS) return ret; weightsystem_t *ws = ¤t->weightsystem[index.row()]; switch (role) { case Qt::FontRole: ret = defaultModelFont(); break; case Qt::TextAlignmentRole: ret = Qt::AlignCenter; break; case Qt::DisplayRole: case Qt::EditRole: switch(index.column()) { case TYPE: ret = gettextFromC::instance()->tr(ws->description); break; case WEIGHT: ret = get_weight_string(ws->weight, TRUE); break; } break; case Qt::DecorationRole: if (index.column() == REMOVE) ret = QIcon(":trash"); break; case Qt::ToolTipRole: if (index.column() == REMOVE) ret = tr("Clicking here will remove this weigthsystem."); break; } return ret; } // this is our magic 'pass data in' function that allows the delegate to get // the data here without silly unit conversions; // so we only implement the two columns we care about void WeightModel::passInData(const QModelIndex& index, const QVariant& value) { weightsystem_t *ws = ¤t->weightsystem[index.row()]; if (index.column() == WEIGHT) { if (ws->weight.grams != value.toInt()) { ws->weight.grams = value.toInt(); dataChanged(index, index); } } } weight_t string_to_weight(const char *str) { const char *end; double value = strtod_flags(str, &end, 0); QString rest = QString(end).trimmed(); QString local_kg = WeightModel::tr("kg"); QString local_lbs = WeightModel::tr("lbs"); weight_t weight; if (rest.startsWith("kg") || rest.startsWith(local_kg)) goto kg; // using just "lb" instead of "lbs" is intentional - some people might enter the singular if (rest.startsWith("lb") || rest.startsWith(local_lbs)) goto lbs; if (prefs.units.weight == prefs.units.LBS) goto lbs; kg: weight.grams = rint(value * 1000); return weight; lbs: weight.grams = lbs_to_grams(value); return weight; } depth_t string_to_depth(const char *str) { const char *end; double value = strtod_flags(str, &end, 0); QString rest = QString(end).trimmed(); QString local_ft = WeightModel::tr("ft"); QString local_m = WeightModel::tr("m"); depth_t depth; if (rest.startsWith("m") || rest.startsWith(local_m)) goto m; if (rest.startsWith("ft") || rest.startsWith(local_ft)) goto ft; if (prefs.units.length == prefs.units.FEET) goto ft; m: depth.mm = rint(value * 1000); return depth; ft: depth.mm = feet_to_mm(value); return depth; } pressure_t string_to_pressure(const char *str) { const char *end; double value = strtod_flags(str, &end, 0); QString rest = QString(end).trimmed(); QString local_psi = CylindersModel::tr("psi"); QString local_bar = CylindersModel::tr("bar"); pressure_t pressure; if (rest.startsWith("bar") || rest.startsWith(local_bar)) goto bar; if (rest.startsWith("psi") || rest.startsWith(local_psi)) goto psi; if (prefs.units.pressure == prefs.units.PSI) goto psi; bar: pressure.mbar = rint(value * 1000); return pressure; psi: pressure.mbar = psi_to_mbar(value); return pressure; } /* Imperial cylinder volumes need working pressure to be meaningful */ volume_t string_to_volume(const char *str, pressure_t workp) { const char *end; double value = strtod_flags(str, &end, 0); QString rest = QString(end).trimmed(); QString local_l = CylindersModel::tr("l"); QString local_cuft = CylindersModel::tr("cuft"); volume_t volume; if (rest.startsWith("l") || rest.startsWith(local_l)) goto l; if (rest.startsWith("cuft") || rest.startsWith(local_cuft)) goto cuft; /* * If we don't have explicit units, and there is no working * pressure, we're going to assume "liter" even in imperial * measurements. */ if (!workp.mbar) goto l; if (prefs.units.volume == prefs.units.LITER) goto l; cuft: if (workp.mbar) value /= bar_to_atm(workp.mbar / 1000.0); value = cuft_to_l(value); l: volume.mliter = rint(value * 1000); return volume; } fraction_t string_to_fraction(const char *str) { const char *end; double value = strtod_flags(str, &end, 0); fraction_t fraction; fraction.permille = rint(value * 10); return fraction; } bool WeightModel::setData(const QModelIndex& index, const QVariant& value, int role) { QString vString = value.toString(); weightsystem_t *ws = ¤t->weightsystem[index.row()]; switch(index.column()) { case TYPE: if (!value.isNull()) { if (!ws->description || gettextFromC::instance()->tr(ws->description) != vString) { // loop over translations to see if one matches int i = -1; while(ws_info[++i].name) { if (gettextFromC::instance()->tr(ws_info[i].name) == vString) { ws->description = ws_info[i].name; break; } } if (ws_info[i].name == NULL) // didn't find a match ws->description = strdup(vString.toUtf8().constData()); changed = true; } } break; case WEIGHT: if (CHANGED()) { ws->weight = string_to_weight(vString.toUtf8().data()); // now update the ws_info changed = true; WSInfoModel *wsim = WSInfoModel::instance(); QModelIndexList matches = wsim->match(wsim->index(0,0), Qt::DisplayRole, gettextFromC::instance()->tr(ws->description)); if (!matches.isEmpty()) wsim->setData(wsim->index(matches.first().row(), WSInfoModel::GR), ws->weight.grams); } break; } dataChanged(index, index); return true; } Qt::ItemFlags WeightModel::flags(const QModelIndex& index) const { if (index.column() == REMOVE) return Qt::ItemIsEnabled; return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } int WeightModel::rowCount(const QModelIndex& parent) const { return rows; } void WeightModel::add() { if (rows >= MAX_WEIGHTSYSTEMS) return; int row = rows; beginInsertRows(QModelIndex(), row, row); rows++; changed = true; endInsertRows(); } void WeightModel::update() { setDive(current); } void WeightModel::setDive(dive* d) { if (current) clear(); rows = 0; for(int i = 0; i < MAX_WEIGHTSYSTEMS; i++) { if (!weightsystem_none(&d->weightsystem[i])) { rows = i+1; } } current = d; changed = false; if (rows > 0) { beginInsertRows(QModelIndex(), 0, rows-1); endInsertRows(); } } WSInfoModel* WSInfoModel::instance() { static QScopedPointer self(new WSInfoModel()); return self.data(); } bool WSInfoModel::insertRows(int row, int count, const QModelIndex& parent) { beginInsertRows(parent, rowCount(), rowCount()); rows += count; endInsertRows(); return true; } bool WSInfoModel::setData(const QModelIndex& index, const QVariant& value, int role) { struct ws_info_t *info = &ws_info[index.row()]; switch(index.column()) { case DESCRIPTION: info->name = strdup(value.toByteArray().data()); break; case GR: info->grams = value.toInt(); break; } emit dataChanged(index, index); return TRUE; } void WSInfoModel::clear() { } QVariant WSInfoModel::data(const QModelIndex& index, int role) const { QVariant ret; if (!index.isValid()) { return ret; } struct ws_info_t *info = &ws_info[index.row()]; int gr = info->grams; switch(role){ case Qt::FontRole : ret = defaultModelFont(); break; case Qt::DisplayRole : case Qt::EditRole : switch(index.column()) { case GR: ret = gr; break; case DESCRIPTION: ret = gettextFromC::instance()->tr(info->name); break; } break; } return ret; } int WSInfoModel::rowCount(const QModelIndex& parent) const { return rows+1; } const QString& WSInfoModel::biggerString() const { return biggerEntry; } WSInfoModel::WSInfoModel() : rows(-1) { setHeaderDataStrings( QStringList() << tr("Description") << tr("kg")); struct ws_info_t *info = ws_info; for (info = ws_info; info->name; info++, rows++){ QString wsInfoName = gettextFromC::instance()->tr(info->name); if( wsInfoName.count() > biggerEntry.count()) biggerEntry = wsInfoName; } if (rows > -1) { beginInsertRows(QModelIndex(), 0, rows); endInsertRows(); } } void WSInfoModel::updateInfo() { struct ws_info_t *info = ws_info; beginRemoveRows(QModelIndex(), 0, this->rows); endRemoveRows(); rows = -1; for (info = ws_info; info->name; info++, rows++){ QString wsInfoName = gettextFromC::instance()->tr(info->name); if( wsInfoName.count() > biggerEntry.count()) biggerEntry = wsInfoName; } if (rows > -1) { beginInsertRows(QModelIndex(), 0, rows); endInsertRows(); } } void WSInfoModel::update() { if (rows > -1) { beginRemoveRows(QModelIndex(), 0, rows); endRemoveRows(); rows = -1; } struct ws_info_t *info = ws_info; for (info = ws_info; info->name; info++, rows++); if (rows > -1) { beginInsertRows(QModelIndex(), 0, rows); endInsertRows(); } } TankInfoModel* TankInfoModel::instance() { static QScopedPointer self(new TankInfoModel()); return self.data(); } const QString& TankInfoModel::biggerString() const { return biggerEntry; } bool TankInfoModel::insertRows(int row, int count, const QModelIndex& parent) { beginInsertRows(parent, rowCount(), rowCount()); rows += count; endInsertRows(); return true; } bool TankInfoModel::setData(const QModelIndex& index, const QVariant& value, int role) { struct tank_info_t *info = &tank_info[index.row()]; switch(index.column()) { case DESCRIPTION: info->name = strdup(value.toByteArray().data()); break; case ML: info->ml = value.toInt(); break; case BAR: info->bar = value.toInt(); break; } emit dataChanged(index, index); return TRUE; } void TankInfoModel::clear() { } QVariant TankInfoModel::data(const QModelIndex& index, int role) const { QVariant ret; if (!index.isValid()) { return ret; } if (role == Qt::FontRole){ return defaultModelFont(); } if (role == Qt::DisplayRole || role == Qt::EditRole) { struct tank_info_t *info = &tank_info[index.row()]; int ml = info->ml; double bar = (info->psi) ? psi_to_bar(info->psi) : info->bar; if (info->cuft && info->psi) ml = cuft_to_l(info->cuft) * 1000 / bar_to_atm(bar); switch(index.column()) { case BAR: ret = bar * 1000; break; case ML: ret = ml; break; case DESCRIPTION: ret = QString(info->name); break; } } return ret; } int TankInfoModel::rowCount(const QModelIndex& parent) const { return rows+1; } TankInfoModel::TankInfoModel() : rows(-1) { setHeaderDataStrings( QStringList() << tr("Description") << tr("ml") << tr("bar")); struct tank_info_t *info = tank_info; for (info = tank_info; info->name; info++, rows++){ QString infoName = gettextFromC::instance()->tr(info->name); if (infoName.count() > biggerEntry.count()) biggerEntry = infoName; } if (rows > -1) { beginInsertRows(QModelIndex(), 0, rows); endInsertRows(); } } void TankInfoModel::update() { if (rows > -1) { beginRemoveRows(QModelIndex(), 0, rows); endRemoveRows(); rows = -1; } struct tank_info_t *info = tank_info; for (info = tank_info; info->name; info++, rows++); if (rows > -1) { beginInsertRows(QModelIndex(), 0, rows); endInsertRows(); } } //################################################################################################# //# //# Tree Model - a Basic Tree Model so I don't need to kill myself repeating this for every model. //# //################################################################################################# /*! A DiveItem for use with a DiveTripModel * * A simple class which wraps basic stats for a dive (e.g. duration, depth) and * tidies up after it's children. This is done manually as we don't inherit from * QObject. * */ TreeItem::TreeItem() { parent = NULL; } TreeItem::~TreeItem() { qDeleteAll(children); } Qt::ItemFlags TreeItem::flags(const QModelIndex& index) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } int TreeItem::row() const { if (parent) return parent->children.indexOf(const_cast(this)); return 0; } QVariant TreeItem::data(int column, int role) const { return QVariant(); } TreeModel::TreeModel(QObject* parent): QAbstractItemModel(parent) { rootItem = new TreeItem(); } TreeModel::~TreeModel() { delete rootItem; } QVariant TreeModel::data(const QModelIndex& index, int role) const { if (!index.isValid()) return QVariant(); TreeItem* item = static_cast(index.internalPointer()); QVariant val = item->data(index.column(), role); if (role == Qt::FontRole && !val.isValid()) return defaultModelFont(); else return val; } bool TreeItem::setData(const QModelIndex& index, const QVariant& value, int role) { return false; } QModelIndex TreeModel::index(int row, int column, const QModelIndex& parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); TreeItem* parentItem = (!parent.isValid()) ? rootItem : static_cast(parent.internalPointer()); TreeItem* childItem = parentItem->children[row]; return (childItem) ? createIndex(row, column, childItem) : QModelIndex(); } QModelIndex TreeModel::parent(const QModelIndex& index) const { if (!index.isValid()) return QModelIndex(); TreeItem* childItem = static_cast(index.internalPointer()); TreeItem* parentItem = childItem->parent; if (parentItem == rootItem || !parentItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int TreeModel::rowCount(const QModelIndex& parent) const { TreeItem* parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast(parent.internalPointer()); int amount = parentItem->children.count(); return amount; } int TreeModel::columnCount(const QModelIndex& parent) const { return columns; } /*################################################################ * * Implementation of the Dive List. * * ############################################################### */ struct TripItem : public TreeItem { virtual QVariant data(int column, int role) const; dive_trip_t* trip; }; QVariant TripItem::data(int column, int role) const { QVariant ret; if (role == DiveTripModel::TRIP_ROLE) return QVariant::fromValue(trip); if (role == DiveTripModel::SORT_ROLE) return (qulonglong)trip->when; if (role == Qt::DisplayRole) { switch (column) { case DiveTripModel::NR: if (trip->location && *trip->location) ret = QString(trip->location) + ", " + get_trip_date_string(trip->when, trip->nrdives); else ret = get_trip_date_string(trip->when, trip->nrdives); break; } } return ret; } static int nitrox_sort_value(struct dive *dive) { int o2, he, o2low; get_dive_gas(dive, &o2, &he, &o2low); return he*1000 + o2; } QVariant DiveItem::data(int column, int role) const { QVariant retVal; switch (role) { case Qt::TextAlignmentRole: switch (column) { case DATE: /* fall through */ case SUIT: /* fall through */ case LOCATION: retVal = int(Qt::AlignLeft | Qt::AlignVCenter); break; default: retVal = int(Qt::AlignRight | Qt::AlignVCenter); break; } break; case DiveTripModel::SORT_ROLE: switch (column) { case NR: retVal = (qulonglong) dive->when; break; case DATE: retVal = (qulonglong) dive->when; break; case RATING: retVal = dive->rating; break; case DEPTH: retVal = dive->maxdepth.mm; break; case DURATION: retVal = dive->duration.seconds; break; case TEMPERATURE: retVal = dive->watertemp.mkelvin; break; case TOTALWEIGHT: retVal = total_weight(dive); break; case SUIT: retVal = QString(dive->suit); break; case CYLINDER: retVal = QString(dive->cylinder[0].type.description); break; case NITROX: retVal = nitrox_sort_value(dive); break; case SAC: retVal = dive->sac; break; case OTU: retVal = dive->otu; break; case MAXCNS: retVal = dive->maxcns; break; case LOCATION: retVal = QString(dive->location); break; } break; case Qt::DisplayRole: switch (column) { case NR: retVal = dive->number; break; case DATE: retVal = displayDate(); break; case DEPTH: retVal = displayDepth(); break; case DURATION: retVal = displayDuration(); break; case TEMPERATURE: retVal = displayTemperature(); break; case TOTALWEIGHT: retVal = displayWeight(); break; case SUIT: retVal = QString(dive->suit); break; case CYLINDER: retVal = QString(dive->cylinder[0].type.description); break; case NITROX: retVal = QString(get_nitrox_string(dive)); break; case SAC: retVal = displaySac(); break; case OTU: retVal = dive->otu; break; case MAXCNS: retVal = dive->maxcns; break; case LOCATION: retVal = QString(dive->location); break; } break; } if (role == DiveTripModel::STAR_ROLE) retVal = dive->rating; if (role == DiveTripModel::DIVE_ROLE) retVal = QVariant::fromValue(dive); if(role == DiveTripModel::DIVE_IDX){ retVal = get_divenr(dive); } return retVal; } Qt::ItemFlags DiveItem::flags(const QModelIndex& index) const { if(index.column() == NR){ return TreeItem::flags(index) | Qt::ItemIsEditable; } return TreeItem::flags(index); } bool DiveItem::setData(const QModelIndex& index, const QVariant& value, int role) { if (role != Qt::EditRole) return false; if (index.column() != NR) return false; int v = value.toInt(); if (v == 0) return false; int i; struct dive *d; for_each_dive(i, d){ if (d->number == v) return false; } dive->number = value.toInt(); mark_divelist_changed(TRUE); return true; } QString DiveItem::displayDate() const { return get_dive_date_string(dive->when); } QString DiveItem::displayDepth() const { const int scale = 1000; QString fract, str; if (get_units()->length == units::METERS) { fract = QString::number((unsigned)(dive->maxdepth.mm % scale) / 100); str = QString("%1.%2").arg((unsigned)(dive->maxdepth.mm / scale)).arg(fract, 1, QChar('0')); } if (get_units()->length == units::FEET) { str = QString::number(mm_to_feet(dive->maxdepth.mm),'f',0); } return str; } QString DiveItem::displayDuration() const { int hrs, mins, secs; secs = dive->duration.seconds % 60; mins = dive->duration.seconds / 60; hrs = mins / 60; mins -= hrs * 60; QString displayTime; if (hrs) displayTime = QString("%1:%2:").arg(hrs).arg(mins, 2, 10, QChar('0')); else displayTime = QString("%1:").arg(mins); displayTime += QString("%1").arg(secs, 2, 10, QChar('0')); return displayTime; } QString DiveItem::displayTemperature() const { QString str; if (!dive->watertemp.mkelvin) return str; if (get_units()->temperature == units::CELSIUS) str = QString::number(mkelvin_to_C(dive->watertemp.mkelvin), 'f', 1); else str = QString::number(mkelvin_to_F(dive->watertemp.mkelvin), 'f', 1); return str; } QString DiveItem::displaySac() const { QString str; if (get_units()->volume == units::LITER) str = QString::number(dive->sac / 1000.0, 'f', 1).append(tr(" l/min")); else str = QString::number(ml_to_cuft(dive->sac), 'f', 2).append(tr(" cuft/min")); return str; } QString DiveItem::displayWeight() const { QString str = weight_string(weight()); return str; } int DiveItem::weight() const { weight_t tw = { total_weight(dive) }; return tw.grams; } DiveTripModel::DiveTripModel(QObject* parent): TreeModel(parent) { columns = COLUMNS; } Qt::ItemFlags DiveTripModel::flags(const QModelIndex& index) const { if (!index.isValid()) return 0; TripItem *item = static_cast(index.internalPointer()); return item->flags(index); } QVariant DiveTripModel::headerData(int section, Qt::Orientation orientation, int role) const { QVariant ret; if (orientation == Qt::Vertical) return ret; switch(role){ case Qt::FontRole : ret = defaultModelFont(); break; case Qt::DisplayRole : switch (section) { case NR: ret = tr("#"); break; case DATE: ret = tr("date"); break; case RATING: ret = UTF8_BLACKSTAR; break; case DEPTH: ret = (get_units()->length == units::METERS) ? tr("m") : tr("ft"); break; case DURATION: ret = tr("min"); break; case TEMPERATURE:ret = QString("%1%2").arg(UTF8_DEGREE).arg((get_units()->temperature == units::CELSIUS) ? "C" : "F"); break; case TOTALWEIGHT:ret = (get_units()->weight == units::KG) ? tr("kg") : tr("lbs"); break; case SUIT: ret = tr("suit"); break; case CYLINDER: ret = tr("cyl"); break; case NITROX: ret = QString("O%1%").arg(UTF8_SUBSCRIPT_2); break; case SAC: ret = tr("SAC"); break; case OTU: ret = tr("OTU"); break; case MAXCNS: ret = tr("maxCNS"); break; case LOCATION: ret = tr("location"); break; }break; } return ret; } void DiveTripModel::setupModelData() { int i = dive_table.nr; if (rowCount()){ beginRemoveRows(QModelIndex(), 0, rowCount()-1); endRemoveRows(); } if (autogroup) autogroup_dives(); dive_table.preexisting = dive_table.nr; while (--i >= 0) { struct dive* dive = get_dive(i); update_cylinder_related_info(dive); dive_trip_t* trip = dive->divetrip; DiveItem* diveItem = new DiveItem(); diveItem->dive = dive; if (!trip || currentLayout == LIST) { diveItem->parent = rootItem; rootItem->children.push_back(diveItem); continue; } if (currentLayout == LIST) continue; if (!trips.keys().contains(trip)) { TripItem* tripItem = new TripItem(); tripItem->trip = trip; tripItem->parent = rootItem; tripItem->children.push_back(diveItem); trips[trip] = tripItem; rootItem->children.push_back(tripItem); continue; } TripItem* tripItem = trips[trip]; tripItem->children.push_back(diveItem); } if (rowCount()){ beginInsertRows(QModelIndex(), 0, rowCount() - 1); endInsertRows(); } } DiveTripModel::Layout DiveTripModel::layout() const { return currentLayout; } void DiveTripModel::setLayout(DiveTripModel::Layout layout) { currentLayout = layout; setupModelData(); } bool DiveTripModel::setData(const QModelIndex& index, const QVariant& value, int role) { TreeItem* item = static_cast(index.internalPointer()); DiveItem *diveItem = dynamic_cast(item); if(!diveItem) return false; return diveItem->setData(index, value, role);} /*#################################################################### * * Dive Computer Model * *#################################################################### */ DiveComputerModel::DiveComputerModel(QMultiMap &dcMap, QObject* parent): CleanerTableModel() { setHeaderDataStrings(QStringList() << "" << tr("Model") << tr("Device ID") << tr("Nickname")); dcWorkingMap = dcMap; numRows = 0; } QVariant DiveComputerModel::data(const QModelIndex& index, int role) const { QList values = dcWorkingMap.values(); DiveComputerNode node = values.at(index.row()); QVariant ret; if (role == Qt::DisplayRole || role == Qt::EditRole){ switch(index.column()){ case ID: ret = QString("0x").append(QString::number(node.deviceId, 16)); break; case MODEL: ret = node.model; break; case NICKNAME: ret = node.nickName; break; } } if (index.column() == REMOVE){ switch(role){ case Qt::DecorationRole : ret = QIcon(":trash"); break; case Qt::ToolTipRole : ret = tr("Clicking here will remove this divecomputer."); break; } } return ret; } int DiveComputerModel::rowCount(const QModelIndex& parent) const { return numRows; } void DiveComputerModel::update() { QList values = dcWorkingMap.values(); int count = values.count(); if(numRows){ beginRemoveRows(QModelIndex(), 0, numRows-1); numRows = 0; endRemoveRows(); } if (count){ beginInsertRows(QModelIndex(), 0, count-1); numRows = count; endInsertRows(); } } Qt::ItemFlags DiveComputerModel::flags(const QModelIndex& index) const { Qt::ItemFlags flags = QAbstractItemModel::flags(index); if (index.column() == NICKNAME) flags |= Qt::ItemIsEditable; return flags; } bool DiveComputerModel::setData(const QModelIndex& index, const QVariant& value, int role) { QList values = dcWorkingMap.values(); DiveComputerNode node = values.at(index.row()); dcWorkingMap.remove(node.model, node); node.nickName = value.toString(); dcWorkingMap.insert(node.model, node); emit dataChanged(index, index); return true; } void DiveComputerModel::remove(const QModelIndex& index) { QList values = dcWorkingMap.values(); DiveComputerNode node = values.at(index.row()); dcWorkingMap.remove(node.model, node); update(); } void DiveComputerModel::dropWorkingList() { // how do I prevent the memory leak ? } void DiveComputerModel::keepWorkingList() { if (dcList.dcMap != dcWorkingMap) mark_divelist_changed(TRUE); dcList.dcMap = dcWorkingMap; } /*################################################################# * # * # Yearly Statistics Model * # * ################################################################ */ class YearStatisticsItem : public TreeItem{ public: enum {YEAR, DIVES, TOTAL_TIME, AVERAGE_TIME, SHORTEST_TIME, LONGEST_TIME, AVG_DEPTH, MIN_DEPTH, MAX_DEPTH, AVG_SAC, MIN_SAC, MAX_SAC, AVG_TEMP, MIN_TEMP, MAX_TEMP, COLUMNS}; QVariant data(int column, int role) const; YearStatisticsItem(stats_t interval); private: stats_t stats_interval; }; YearStatisticsItem::YearStatisticsItem(stats_t interval) : stats_interval(interval) { } QVariant YearStatisticsItem::data(int column, int role) const { double value; QVariant ret; if (role == Qt::FontRole) { QFont font = defaultModelFont(); font.setBold(stats_interval.is_year); return font; } else if (role != Qt::DisplayRole) { return ret; } switch(column) { case YEAR: if (stats_interval.is_trip) { ret = stats_interval.location; } else { ret = stats_interval.period; } break; case DIVES: ret = stats_interval.selection_size; break; case TOTAL_TIME: ret = get_time_string(stats_interval.total_time.seconds, 0); break; case AVERAGE_TIME: ret = get_minutes(stats_interval.total_time.seconds / stats_interval.selection_size); break; case SHORTEST_TIME: ret = get_minutes(stats_interval.shortest_time.seconds); break; case LONGEST_TIME: ret = get_minutes(stats_interval.longest_time.seconds); break; case AVG_DEPTH: ret = get_depth_string(stats_interval.avg_depth); break; case MIN_DEPTH: ret = get_depth_string(stats_interval.min_depth); break; case MAX_DEPTH: ret = get_depth_string(stats_interval.max_depth); break; case AVG_SAC: ret = get_volume_string(stats_interval.avg_sac); break; case MIN_SAC: ret = get_volume_string(stats_interval.min_sac); break; case MAX_SAC: ret = get_volume_string(stats_interval.max_sac); break; case AVG_TEMP: if (stats_interval.combined_temp && stats_interval.combined_count) { ret = QString::number(stats_interval.combined_temp / stats_interval.combined_count, 'f', 1); } break; case MIN_TEMP: value = get_temp_units(stats_interval.min_temp, NULL); if (value > -100.0) ret = QString::number(value, 'f', 1); break; case MAX_TEMP: value = get_temp_units(stats_interval.max_temp, NULL); if (value > -100.0) ret = QString::number(value, 'f', 1); break; } return ret; } YearlyStatisticsModel::YearlyStatisticsModel(QObject* parent) { columns = COLUMNS; update_yearly_stats(); } QVariant YearlyStatisticsModel::headerData(int section, Qt::Orientation orientation, int role) const { QVariant val; if (role == Qt::FontRole) val = defaultModelFont(); if (role == Qt::DisplayRole && orientation == Qt::Horizontal) { switch(section) { case YEAR: val = tr("Year \n > Month / Trip"); break; case DIVES: val = tr("#"); break; case TOTAL_TIME: val = tr("Duration \n Total"); break; case AVERAGE_TIME: val = tr("\nAverage"); break; case SHORTEST_TIME: val = tr("\nShortest"); break; case LONGEST_TIME: val = tr("\nLongest"); break; case AVG_DEPTH: val = QString(tr("Depth (%1)\n Average")).arg(get_depth_unit()); break; case MIN_DEPTH: val = tr("\nMinimum"); break; case MAX_DEPTH: val = tr("\nMaximum"); break; case AVG_SAC: val = QString(tr("SAC (%1)\n Average")).arg(get_volume_unit()); break; case MIN_SAC: val = tr("\nMinimum"); break; case MAX_SAC: val = tr("\nMaximum"); break; case AVG_TEMP: val = QString(tr("Temp. (%1)\n Average").arg(get_temp_unit())); break; case MIN_TEMP: val = tr("\nMinimum"); break; case MAX_TEMP: val = tr("\nMaximum"); break; } } return val; } void YearlyStatisticsModel::update_yearly_stats() { int i, month = 0; unsigned int j, combined_months; for (i = 0; stats_yearly != NULL && stats_yearly[i].period; ++i) { YearStatisticsItem *item = new YearStatisticsItem(stats_yearly[i]); combined_months = 0; for (j = 0; combined_months < stats_yearly[i].selection_size; ++j) { combined_months += stats_monthly[month].selection_size; YearStatisticsItem *iChild = new YearStatisticsItem(stats_monthly[month]); item->children.append(iChild); iChild->parent = item; month++; } rootItem->children.append(item); item->parent = rootItem; } if (stats_by_trip != NULL && stats_by_trip[0].is_trip == TRUE) { YearStatisticsItem *item = new YearStatisticsItem(stats_by_trip[0]); for (i = 1; stats_by_trip != NULL && stats_by_trip[i].is_trip; ++i) { YearStatisticsItem *iChild = new YearStatisticsItem(stats_by_trip[i]); item->children.append(iChild); iChild->parent = item; } rootItem->children.append(item); item->parent = rootItem; } } /*################################################################# * # * # Table Print Model * # * ################################################################ */ TablePrintModel::TablePrintModel() { columns = 7; rows = 0; } TablePrintModel::~TablePrintModel() { for (int i = 0; i < list.size(); i++) delete list.at(i); } void TablePrintModel::insertRow(int index) { struct TablePrintItem *item = new struct TablePrintItem(); item->colorBackground = 0xffffffff; if (index == -1) { beginInsertRows(QModelIndex(), rows, rows); list.append(item); } else { beginInsertRows(QModelIndex(), index, index); list.insert(index, item); } endInsertRows(); rows++; } void TablePrintModel::callReset() { reset(); } QVariant TablePrintModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role == Qt::BackgroundRole) return QColor(list.at(index.row())->colorBackground); if (role == Qt::DisplayRole) switch (index.column()) { case 0: return list.at(index.row())->number; case 1: return list.at(index.row())->date; case 2: return list.at(index.row())->depth; case 3: return list.at(index.row())->duration; case 4: return list.at(index.row())->divemaster; case 5: return list.at(index.row())->buddy; case 6: return list.at(index.row())->location; } return QVariant(); } bool TablePrintModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.isValid()) { if (role == Qt::DisplayRole) { switch (index.column()) { case 0: list.at(index.row())->number = value.toString(); case 1: list.at(index.row())->date = value.toString(); case 2: list.at(index.row())->depth = value.toString(); case 3: list.at(index.row())->duration = value.toString(); case 4: list.at(index.row())->divemaster = value.toString(); case 5: list.at(index.row())->buddy = value.toString(); case 6: { /* truncate if there are more than N lines of text, * we don't want a row to be larger that a single page! */ QString s = value.toString(); const int maxLines = 15; int count = 0; for (int i = 0; i < s.length(); i++) { if (s.at(i) != QChar('\n')) continue; count++; if (count > maxLines) { s = s.left(i - 1); break; } } list.at(index.row())->location = s; } } return true; } if (role == Qt::BackgroundRole) { list.at(index.row())->colorBackground = value.value(); return true; } } return false; } int TablePrintModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); return rows; } int TablePrintModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return columns; } /*################################################################# * # * # Profile Print Model * # * ################################################################ */ ProfilePrintModel::ProfilePrintModel(QObject *parent) { } void ProfilePrintModel::setDive(struct dive *divePtr) { dive = divePtr; // reset(); } int ProfilePrintModel::rowCount(const QModelIndex &parent) const { return 12; } int ProfilePrintModel::columnCount(const QModelIndex &parent) const { return 5; } QVariant ProfilePrintModel::data(const QModelIndex &index, int role) const { const int row = index.row(); const int col = index.column(); switch (role) { case Qt::DisplayRole: { struct DiveItem di; di.dive = dive; const QString unknown = tr("unknown"); // dive# + date, depth, location, duration if (row == 0) { if (col == 0) return tr("Dive #%1 - %2").arg(dive->number).arg(di.displayDate()); if (col == 4) { QString unit = (get_units()->length == units::METERS) ? "m" : "ft"; return tr("Max depth: %1 %2").arg(di.displayDepth()).arg(unit); } } if (row == 1) { if (col == 0) return QString(dive->location); if (col == 4) return QString(tr("Duration: %1 min")).arg(di.displayDuration()); } // headings if (row == 2) { if (col == 0) return tr("Gas Used:"); if (col == 2) return tr("SAC:"); if (col == 3) return tr("Max. CNS:"); if (col == 4) return tr("Weights:"); } // notes if (col == 0) { if (row == 6) return tr("Notes:"); if (row == 7) return QString(dive->notes); } // more headings if (row == 4) { if (col == 0) return tr("Divemaster:"); if (col == 1) return tr("Buddy:"); if (col == 2) return tr("Suit:"); if (col == 3) return tr("Viz:"); if (col == 4) return tr("Rating:"); } // values for gas, sac, etc... if (row == 3) { if (col == 0) { int added = 0; const char *desc; QString gases; for (int i = 0; i < MAX_CYLINDERS; i++) { desc = dive->cylinder[i].type.description; // if has a description and if such gas is not already present if (desc && gases.indexOf(QString(desc)) == -1) { if (added > 0) gases += QString(" / "); gases += QString(desc); added++; } } return gases; } if (col == 2) return di.displaySac(); if (col == 3) return QString::number(dive->maxcns); if (col == 4) { weight_t tw = { total_weight(dive) }; return get_weight_string(tw, true); } } // values for DM, buddy, suit, etc... if (row == 5) { if (col == 0) return QString(dive->divemaster); if (col == 1) return QString(dive->buddy); if (col == 2) return QString(dive->suit); if (col == 3) return (dive->visibility) ? QString::number(dive->visibility).append(" / 5") : QString(); if (col == 4) return (dive->rating) ? QString::number(dive->rating).append(" / 5") : QString(); } return QString(); } case Qt::FontRole: { QFont font; const int baseSize = 9; // dive # if (row == 0 && col == 0) { font.setBold(true); font.setPixelSize(baseSize + 1); return QVariant::fromValue(font); } font.setPixelSize(baseSize); return QVariant::fromValue(font); } case Qt::TextAlignmentRole: { // everything is aligned to the left unsigned int align = Qt::AlignLeft; // align depth and duration right if (row < 2 && col == 4) align = Qt::AlignRight | Qt::AlignVCenter; return QVariant::fromValue(align); } } // switch (role) return QVariant(); } Qt::ItemFlags GasSelectionModel::flags(const QModelIndex& index) const { return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } GasSelectionModel* GasSelectionModel::instance() { static QScopedPointer self(new GasSelectionModel()); return self.data(); } void GasSelectionModel::repopulate() { setStringList(DivePlannerPointsModel::instance()->getGasList()); } QVariant GasSelectionModel::data(const QModelIndex& index, int role) const { if(role == Qt::FontRole){ return defaultModelFont(); } return QStringListModel::data(index, role); } // Language Model, The Model to populate the list of possible Languages. LanguageModel* LanguageModel::instance() { static LanguageModel *self = new LanguageModel(); QLocale l; return self; } LanguageModel::LanguageModel(QObject* parent): QAbstractListModel(parent) { QSettings s; QDir d(getSubsurfaceDataPath("translations")); QStringList result = d.entryList(); Q_FOREACH(const QString& s, result){ if ( s.startsWith("subsurface_") && s.endsWith(".qm") ){ languages.push_back( (s == "subsurface_source.qm") ? "English" : s); } } } QVariant LanguageModel::data(const QModelIndex& index, int role) const { QLocale loc; QString currentString = languages.at(index.row()); if(!index.isValid()) return QVariant(); switch(role){ case Qt::DisplayRole:{ QLocale l( currentString.remove("subsurface_")); return currentString == "English" ? currentString : QString("%1 (%2)").arg(l.languageToString(l.language())).arg(l.countryToString(l.country())); }break; case Qt::UserRole:{ QString currentString = languages.at(index.row()); return currentString == "English" ? "en_US" : currentString.remove("subsurface_"); }break; } return QVariant(); } int LanguageModel::rowCount(const QModelIndex& parent) const { return languages.count(); } Subsurface-4.0.2/qt-ui/models.h000066400000000000000000000231171226345450700163260ustar00rootroot00000000000000/* * models.h * * header file for the equipment models of Subsurface * */ #ifndef MODELS_H #define MODELS_H #include #include #include #include #include "../dive.h" #include "../divelist.h" #include "../qthelper.h" QFont defaultModelFont(); // Encapsulates Boilerplate. class CleanerTableModel : public QAbstractTableModel{ Q_OBJECT public: CleanerTableModel(); virtual int columnCount(const QModelIndex& parent = QModelIndex()) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; protected: void setHeaderDataStrings(const QStringList& headers); private: QStringList headers; }; /* Encapsulates the tank_info global variable * to show on Qt's Model View System.*/ class TankInfoModel : public CleanerTableModel { Q_OBJECT public: static TankInfoModel* instance(); enum Column {DESCRIPTION, ML, BAR}; TankInfoModel(); /*reimp*/ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; /*reimp*/ int rowCount(const QModelIndex& parent = QModelIndex()) const; /*reimp*/ bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()); /*reimp*/ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); const QString& biggerString() const; void clear(); void update(); private: int rows; QString biggerEntry; }; /* Encapsulate ws_info */ class WSInfoModel : public CleanerTableModel { Q_OBJECT public: static WSInfoModel* instance(); enum Column {DESCRIPTION, GR}; WSInfoModel(); /*reimp*/ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; /*reimp*/ int rowCount(const QModelIndex& parent = QModelIndex()) const; /*reimp*/ bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()); /*reimp*/ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); const QString& biggerString() const; void clear(); void update(); void updateInfo(); private: int rows; QString biggerEntry; }; /* Encapsulation of the Cylinder Model, that presents the * Current cylinders that are used on a dive. */ class CylindersModel : public CleanerTableModel { Q_OBJECT public: enum Column {REMOVE, TYPE, SIZE, WORKINGPRESS, START, END, O2, HE, DEPTH, COLUMNS}; explicit CylindersModel(QObject* parent = 0); static CylindersModel *instance(); /*reimp*/ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; /*reimp*/ int rowCount(const QModelIndex& parent = QModelIndex()) const; /*reimp*/ Qt::ItemFlags flags(const QModelIndex& index) const; /*reimp*/ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); void passInData(const QModelIndex& index, const QVariant& value); void add(); void clear(); void update(); void setDive(struct dive *d); cylinder_t *cylinderAt(const QModelIndex& index); bool changed; public slots: void remove(const QModelIndex& index); private: struct dive *current; int rows; }; /* Encapsulation of the Weight Model, that represents * the current weights on a dive. */ class WeightModel : public CleanerTableModel { Q_OBJECT public: enum Column {REMOVE, TYPE, WEIGHT}; explicit WeightModel(QObject *parent = 0); /*reimp*/ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; /*reimp*/ int rowCount(const QModelIndex& parent = QModelIndex()) const; /*reimp*/ Qt::ItemFlags flags(const QModelIndex& index) const; /*reimp*/ bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); void passInData(const QModelIndex& index, const QVariant& value); void add(); void clear(); void update(); void setDive(struct dive *d); weightsystem_t *weightSystemAt(const QModelIndex& index); bool changed; public slots: void remove(const QModelIndex& index); private: struct dive *current; int rows; }; /*! An AbstractItemModel for recording dive trip information such as a list of dives. * */ struct TreeItem { Q_DECLARE_TR_FUNCTIONS (TreeItemDT); public: virtual ~TreeItem(); TreeItem(); virtual QVariant data (int column, int role) const; virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); virtual Qt::ItemFlags flags(const QModelIndex &index) const; int row() const; QList children; TreeItem *parent; }; struct DiveItem : public TreeItem { enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT, SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS }; virtual QVariant data(int column, int role) const; struct dive* dive; virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); virtual Qt::ItemFlags flags(const QModelIndex& index) const; QString displayDate() const; QString displayDuration() const; QString displayDepth() const; QString displayTemperature() const; QString displayWeight() const; QString displaySac() const; int weight() const; }; struct TripItem; class TreeModel : public QAbstractItemModel { Q_OBJECT public: TreeModel(QObject *parent = 0); virtual ~TreeModel(); virtual QVariant data(const QModelIndex &index, int role) const; /*reimp*/ int rowCount(const QModelIndex &parent = QModelIndex()) const; /*reimp*/ int columnCount(const QModelIndex &parent = QModelIndex()) const; /*reimp*/ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; /*reimp*/ QModelIndex parent(const QModelIndex &child) const; protected: int columns; TreeItem *rootItem; }; class DiveTripModel : public TreeModel { Q_OBJECT public: enum Column {NR, DATE, RATING, DEPTH, DURATION, TEMPERATURE, TOTALWEIGHT, SUIT, CYLINDER, NITROX, SAC, OTU, MAXCNS, LOCATION, COLUMNS }; enum ExtraRoles{STAR_ROLE = Qt::UserRole + 1, DIVE_ROLE, TRIP_ROLE, SORT_ROLE, DIVE_IDX}; enum Layout{TREE, LIST, CURRENT}; Qt::ItemFlags flags(const QModelIndex &index) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); DiveTripModel(QObject* parent = 0); Layout layout() const; void setLayout(Layout layout); private: void setupModelData(); QMap trips; Layout currentLayout; }; class DiveComputerModel : public CleanerTableModel { Q_OBJECT public: enum {REMOVE, MODEL, ID, NICKNAME}; DiveComputerModel(QMultiMap &dcMap, QObject *parent = 0); virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; virtual Qt::ItemFlags flags(const QModelIndex& index) const; virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); void update(); void keepWorkingList(); void dropWorkingList(); public slots: void remove(const QModelIndex& index); private: int numRows; QMultiMap dcWorkingMap; }; class YearlyStatisticsModel : public TreeModel { Q_OBJECT public: enum { YEAR,DIVES,TOTAL_TIME,AVERAGE_TIME,SHORTEST_TIME,LONGEST_TIME,AVG_DEPTH,MIN_DEPTH, MAX_DEPTH,AVG_SAC,MIN_SAC,MAX_SAC,AVG_TEMP,MIN_TEMP,MAX_TEMP,COLUMNS}; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; YearlyStatisticsModel(QObject* parent = 0); void update_yearly_stats(); }; /* TablePrintModel: * for now we use a blank table model with row items TablePrintItem. * these are pretty much the same as DiveItem, but have color * properties, as well. perhaps later one a more unified model has to be * considered, but the current TablePrintModel idea has to be extended * to support variadic column lists and column list orders that can * be controlled by the user. */ struct TablePrintItem { QString number; QString date; QString depth; QString duration; QString divemaster; QString buddy; QString location; unsigned int colorBackground; }; class TablePrintModel : public QAbstractTableModel { Q_OBJECT private: QList list; public: ~TablePrintModel(); TablePrintModel(); int rows, columns; void insertRow(int index = -1); void callReset(); QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; }; /* ProfilePrintModel: * this model is used when printing a data table under a profile. it requires * some exact usage of setSpan(..) on the target QTableView widget. */ class ProfilePrintModel : public QAbstractTableModel { Q_OBJECT private: struct dive *dive; QString truncateString(char *str, const int maxlen) const; public: ProfilePrintModel(QObject *parent = 0); int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; void setDive(struct dive *divePtr); }; class GasSelectionModel : public QStringListModel{ Q_OBJECT public: static GasSelectionModel* instance(); Qt::ItemFlags flags(const QModelIndex& index) const; virtual QVariant data(const QModelIndex& index, int role) const; public slots: void repopulate(); }; class LanguageModel : public QAbstractListModel { Q_OBJECT public: static LanguageModel* instance(); virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; private: LanguageModel(QObject* parent = 0); QStringList languages; }; #endif Subsurface-4.0.2/qt-ui/preferences.cpp000066400000000000000000000201001226345450700176640ustar00rootroot00000000000000#include "preferences.h" #include "mainwindow.h" #include #include #include #include #include PreferencesDialog* PreferencesDialog::instance() { static PreferencesDialog *dialog = new PreferencesDialog(mainWindow()); dialog->setAttribute(Qt::WA_QuitOnClose, false); LanguageModel::instance(); return dialog; } PreferencesDialog::PreferencesDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f) { ui.setupUi(this); connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); connect(ui.gflow, SIGNAL(valueChanged(int)), this, SLOT(gflowChanged(int))); connect(ui.gfhigh, SIGNAL(valueChanged(int)), this, SLOT(gfhighChanged(int))); setUiFromPrefs(); rememberPrefs(); } #define DANGER_GF ( gf > 100 ) ? "* { color: red; }" : "" void PreferencesDialog::gflowChanged(int gf) { ui.gflow->setStyleSheet(DANGER_GF); } void PreferencesDialog::gfhighChanged(int gf) { ui.gfhigh->setStyleSheet(DANGER_GF); } #undef DANGER_GF void PreferencesDialog::showEvent(QShowEvent *event) { setUiFromPrefs(); rememberPrefs(); QDialog::showEvent(event); } void PreferencesDialog::setUiFromPrefs() { // graphs ui.phe->setChecked(prefs.pp_graphs.phe); ui.pheThreshold->setEnabled(ui.phe->isChecked()); ui.po2->setChecked(prefs.pp_graphs.po2); ui.po2Threshold->setEnabled(ui.po2->isChecked()); ui.pn2->setChecked(prefs.pp_graphs.pn2); ui.pn2Threshold->setEnabled(ui.pn2->isChecked()); ui.pheThreshold->setValue(prefs.pp_graphs.phe_threshold); ui.po2Threshold->setValue(prefs.pp_graphs.po2_threshold); ui.pn2Threshold->setValue(prefs.pp_graphs.pn2_threshold); ui.ead_end_eadd->setChecked(prefs.ead); ui.mod->setChecked(prefs.mod); ui.maxppo2->setEnabled(ui.mod->isChecked()); ui.maxppo2->setValue(prefs.mod_ppO2); ui.dc_reported_ceiling->setChecked(prefs.profile_dc_ceiling); ui.red_ceiling->setEnabled(ui.dc_reported_ceiling->isChecked()); ui.red_ceiling->setChecked(prefs.profile_red_ceiling); ui.calculated_ceiling->setChecked(prefs.profile_calc_ceiling); ui.increment_3m->setEnabled(ui.calculated_ceiling->isChecked()); ui.increment_3m->setChecked(prefs.calc_ceiling_3m_incr); ui.all_tissues->setEnabled(ui.calculated_ceiling->isChecked()); ui.all_tissues->setChecked(prefs.calc_all_tissues); ui.calc_ndl_tts->setEnabled(ui.calculated_ceiling->isChecked()); ui.calc_ndl_tts->setChecked(prefs.calc_ndl_tts); ui.units_group->setEnabled(ui.personalize->isChecked()); ui.gflow->setValue(prefs.gflow); ui.gfhigh->setValue(prefs.gfhigh); ui.gf_low_at_maxdepth->setChecked(prefs.gf_low_at_maxdepth); // units if (prefs.unit_system == METRIC) ui.metric->setChecked(true); else if (prefs.unit_system == IMPERIAL) ui.imperial->setChecked(true); else ui.personalize->setChecked(true); ui.celsius->setChecked(prefs.units.temperature == units::CELSIUS); ui.fahrenheit->setChecked(prefs.units.temperature == units::FAHRENHEIT); ui.meter->setChecked(prefs.units.length == units::METERS); ui.feet->setChecked(prefs.units.length == units::FEET); ui.bar->setChecked(prefs.units.pressure == units::BAR); ui.psi->setChecked(prefs.units.pressure == units::PSI); ui.liter->setChecked(prefs.units.volume == units::LITER); ui.cuft->setChecked(prefs.units.volume == units::CUFT); ui.kg->setChecked(prefs.units.weight == units::KG); ui.lbs->setChecked(prefs.units.weight == units::LBS); ui.font->setCurrentFont(QString(prefs.divelist_font)); ui.fontsize->setValue(prefs.font_size); ui.defaultfilename->setText(prefs.default_filename); ui.default_cylinder->clear(); for(int i=0; tank_info[i].name != NULL; i++) { ui.default_cylinder->addItem(tank_info[i].name); if (prefs.default_cylinder && strcmp(tank_info[i].name, prefs.default_cylinder) == 0) ui.default_cylinder->setCurrentIndex(i); } ui.displayinvalid->setChecked(prefs.display_invalid_dives); ui.show_sac->setChecked(prefs.show_sac); ui.vertical_speed_minutes->setChecked(prefs.units.vertical_speed_time == units::MINUTES); ui.vertical_speed_seconds->setChecked(prefs.units.vertical_speed_time == units::SECONDS); QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(); filterModel->setSourceModel(LanguageModel::instance()); filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive); ui.languageView->setModel(filterModel); filterModel->sort(0); connect(ui.languageFilter, SIGNAL(textChanged(QString)), filterModel, SLOT(setFilterFixedString(QString))); QSettings s; s.beginGroup("Language"); ui.languageSystemDefault->setChecked(s.value("UseSystemLanguage", true).toBool()); QAbstractItemModel *m = ui.languageView->model(); QModelIndexList languages = m->match( m->index(0,0), Qt::UserRole, s.value("UiLanguage").toString()); if (languages.count()) ui.languageView->setCurrentIndex(languages.first()); } void PreferencesDialog::restorePrefs() { prefs = oldPrefs; setUiFromPrefs(); } void PreferencesDialog::rememberPrefs() { oldPrefs = prefs; } #define SB(V, B) s.setValue(V, (int)(B->isChecked() ? 1 : 0)) void PreferencesDialog::syncSettings() { QSettings s; // Graph s.beginGroup("TecDetails"); SB("phegraph", ui.phe); SB("po2graph", ui.po2); SB("pn2graph", ui.pn2); s.setValue("phethreshold", ui.pheThreshold->value()); s.setValue("po2threshold", ui.po2Threshold->value()); s.setValue("pn2threshold", ui.pn2Threshold->value()); SB("ead", ui.ead_end_eadd); SB("mod", ui.mod); s.setValue("modppO2", ui.maxppo2->value()); SB("dcceiling", ui.dc_reported_ceiling); SB("redceiling", ui.red_ceiling); SB("calcceiling", ui.calculated_ceiling); SB("calcceiling3m", ui.increment_3m); SB("calcndltts", ui.calc_ndl_tts); SB("calcalltissues", ui.all_tissues); s.setValue("gflow", ui.gflow->value()); s.setValue("gfhigh", ui.gfhigh->value()); SB("gf_low_at_maxdepth", ui.gf_low_at_maxdepth); SB("show_sac", ui.show_sac); s.endGroup(); // Units s.beginGroup("Units"); QString unitSystem = ui.metric->isChecked() ? "metric" : (ui.imperial->isChecked() ? "imperial" : "personal"); s.setValue("unit_system", unitSystem); s.setValue("temperature", ui.fahrenheit->isChecked() ? units::FAHRENHEIT : units::CELSIUS); s.setValue("length", ui.feet->isChecked() ? units::FEET : units::METERS); s.setValue("pressure", ui.psi->isChecked() ? units::PSI : units::BAR); s.setValue("volume", ui.cuft->isChecked() ? units::CUFT : units::LITER); s.setValue("weight", ui.lbs->isChecked() ? units::LBS : units::KG); s.setValue("vertical_speed_time", ui.vertical_speed_minutes->isChecked() ? units::MINUTES : units::SECONDS); s.endGroup(); // Defaults s.beginGroup("GeneralSettings"); s.setValue("default_filename", ui.defaultfilename->text()); s.setValue("default_cylinder", ui.default_cylinder->currentText()); s.endGroup(); s.beginGroup("Display"); s.setValue("divelist_font", ui.font->currentFont()); s.setValue("font_size", ui.fontsize->value()); s.setValue("displayinvalid", ui.displayinvalid->isChecked()); s.endGroup(); s.sync(); QLocale loc; s.beginGroup("Language"); bool useSystemLang = s.value("UseSystemLanguage", true).toBool(); if (useSystemLang != ui.languageSystemDefault->isChecked() || (!useSystemLang && s.value("UiLanguage").toString() != ui.languageView->currentIndex().data(Qt::UserRole))) { QMessageBox::warning(mainWindow(), tr("Restart required"), tr("To correctly load a new language you must restart Subsurface.")); } s.setValue("UseSystemLanguage", ui.languageSystemDefault->isChecked()); s.setValue("UiLanguage", ui.languageView->currentIndex().data(Qt::UserRole)); emit settingsChanged(); } void PreferencesDialog::buttonClicked(QAbstractButton* button) { switch(ui.buttonBox->standardButton(button)){ case QDialogButtonBox::Discard: restorePrefs(); close(); break; case QDialogButtonBox::Apply: syncSettings(); break; case QDialogButtonBox::FirstButton: syncSettings(); close(); break; default: break; // ignore warnings. } } #undef SB void PreferencesDialog::on_chooseFile_clicked() { QFileInfo fi(system_default_filename()); ui.defaultfilename->setText(QFileDialog::getOpenFileName(this, tr("Open Default Log File"), fi.absolutePath(), tr("Subsurface XML files (*.ssrf *.xml *.XML)"))); } Subsurface-4.0.2/qt-ui/preferences.h000066400000000000000000000013261226345450700173420ustar00rootroot00000000000000#ifndef PREFERENCES_DIALOG_H #define PREFERENCES_DIALOG_H #include #include "../dive.h" #include "../pref.h" #include "ui_preferences.h" class QAbstractButton; class PreferencesDialog :public QDialog{ Q_OBJECT public: static PreferencesDialog* instance(); void showEvent(QShowEvent* ); signals: void settingsChanged(); public slots: void buttonClicked(QAbstractButton* button); void on_chooseFile_clicked(); void syncSettings(); void restorePrefs(); void rememberPrefs(); void gflowChanged(int gf); void gfhighChanged(int gf); private: explicit PreferencesDialog(QWidget* parent = 0, Qt::WindowFlags f = 0); void setUiFromPrefs(); Ui::PreferencesDialog ui; struct preferences oldPrefs; }; #endif Subsurface-4.0.2/qt-ui/preferences.ui000066400000000000000000001104421226345450700175300ustar00rootroot00000000000000 PreferencesDialog 0 0 780 521 Preferences :/subsurface-icon 0 0 80 0 80 16777215 40 40 Qt::ElideNone QListView::Static true QListView::Batched 0 70 60 QListView::IconMode false true -1 Defaults :/subsurface-icon Units :/units Graph :/graph Language :/advanced 0 0 1 Lists and Tables Font Font size Dives Default Dive file ... Display Invalid Default Cylinder Use Default Cylinder Qt::Vertical 20 40 System Metric buttonGroup_6 Imperial buttonGroup_6 Personalize buttonGroup_6 false false Depth meter buttonGroup feet buttonGroup Pressure bar buttonGroup_2 psi buttonGroup_2 Volume liter buttonGroup_3 cu ft buttonGroup_3 Temperature celsius buttonGroup_4 fahrenheit buttonGroup_4 Weight kg buttonGroup_5 lbs buttonGroup_5 Time units Ascent/Descent speed denominator Minutes verticalSpeed Seconds verticalSpeed Qt::Vertical 20 40 Show pO₂ Qt::Horizontal 40 20 false threshold false pN₂ Qt::Horizontal 40 20 false threshold false pHe Qt::Horizontal 40 20 false threshold false MOD Qt::Horizontal 40 20 false max ppO₂ false EAD END EADD Dive computer reported ceiling Qt::Horizontal 40 20 false draw ceiling red Calculated ceiling Qt::Horizontal 40 20 false show all tissues false 3m increments false Calculate NDL/TTS SAC Misc GFLow 1 150 GFHigh 1 150 GFLow at max depth System Default Qt::Horizontal 40 20 Filter Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Discard|QDialogButtonBox::Ok buttonBox accepted() PreferencesDialog accept() 235 511 157 274 buttonBox rejected() PreferencesDialog reject() 303 511 286 274 listWidget currentRowChanged(int) stackedWidget setCurrentIndex(int) 37 97 282 18 po2 clicked(bool) label_12 setEnabled(bool) 195 39 195 39 po2 clicked(bool) po2Threshold setEnabled(bool) 195 39 195 39 pn2 clicked(bool) label_13 setEnabled(bool) 195 39 195 39 pn2 clicked(bool) pn2Threshold setEnabled(bool) 195 39 195 39 phe clicked(bool) label_17 setEnabled(bool) 195 39 195 39 phe clicked(bool) pheThreshold setEnabled(bool) 195 39 195 39 mod clicked(bool) label_18 setEnabled(bool) 195 39 195 39 mod clicked(bool) maxppo2 setEnabled(bool) 195 39 195 39 calculated_ceiling clicked(bool) all_tissues setEnabled(bool) 195 39 195 39 calculated_ceiling clicked(bool) increment_3m setEnabled(bool) 195 39 195 39 calculated_ceiling clicked(bool) calc_ndl_tts setEnabled(bool) 195 39 195 39 dc_reported_ceiling clicked(bool) red_ceiling setEnabled(bool) 195 39 195 39 personalize toggled(bool) units_group setEnabled(bool) 195 39 195 39 languageSystemDefault toggled(bool) languageView setDisabled(bool) 176 30 171 79 languageSystemDefault toggled(bool) languageFilter setDisabled(bool) 209 34 599 33 imperial toggled(bool) feet setChecked(bool) metric toggled(bool) meter setChecked(bool) imperial toggled(bool) psi setChecked(bool) metric toggled(bool) bar setChecked(bool) imperial toggled(bool) cuft setChecked(bool) metric toggled(bool) liter setChecked(bool) imperial toggled(bool) fahrenheit setChecked(bool) metric toggled(bool) celsius setChecked(bool) imperial toggled(bool) lbs setChecked(bool) metric toggled(bool) kg setChecked(bool) Subsurface-4.0.2/qt-ui/printdialog.cpp000066400000000000000000000047521226345450700177160ustar00rootroot00000000000000#include "printdialog.h" #include "printoptions.h" #include "printlayout.h" #include "mainwindow.h" #include #include #include #include #include #include #include PrintDialog *PrintDialog::instance() { static PrintDialog *self = new PrintDialog(mainWindow()); self->setAttribute(Qt::WA_QuitOnClose, false); return self; } PrintDialog::PrintDialog(QWidget *parent, Qt::WindowFlags f) { // options template (are we storing these in the settings?) struct options tempOptions = {options::PRETTY, 0, 2, false, 65, 15, 12}; printOptions = tempOptions; // create a print layout and pass the printer and options printLayout = new PrintLayout(this, &printer, &printOptions); // create a print options object and pass our options struct optionsWidget = new PrintOptions(this, &printOptions); QVBoxLayout *layout = new QVBoxLayout(this); setLayout(layout); QHBoxLayout *hLayout = new QHBoxLayout(); layout->addLayout(hLayout); QPushButton *previewButton = new QPushButton(tr("&Preview")); connect(previewButton, SIGNAL(clicked(bool)), this, SLOT(previewClicked())); hLayout->addWidget(previewButton); QPushButton *printButton = new QPushButton(tr("P&rint")); connect(printButton, SIGNAL(clicked(bool)), this, SLOT(printClicked())); hLayout->addWidget(printButton); QPushButton *closeButton = new QPushButton(tr("&Close")); connect(closeButton, SIGNAL(clicked(bool)), this, SLOT(closeClicked())); hLayout->addWidget(closeButton); progressBar = new QProgressBar(); connect(printLayout, SIGNAL(signalProgress(int)), progressBar, SLOT(setValue(int))); progressBar->setMinimum(0); progressBar->setMaximum(100); progressBar->setTextVisible(false); layout->addWidget(progressBar); layout->addWidget(optionsWidget); setFixedSize(520, 350); setWindowTitle(tr("Print")); setWindowIcon(QIcon(":subsurface-icon")); } void PrintDialog::runDialog() { progressBar->setValue(0); exec(); } void PrintDialog::previewClicked(void) { QPrintPreviewDialog previewDialog(&printer, this); QObject::connect(&previewDialog, SIGNAL(paintRequested(QPrinter *)), this, SLOT(onPaintRequested(QPrinter *))); previewDialog.exec(); } void PrintDialog::printClicked(void) { QPrintDialog printDialog(&printer, this); if (printDialog.exec() == QDialog::Accepted) printLayout->print(); } void PrintDialog::closeClicked(void) { close(); } void PrintDialog::onPaintRequested(QPrinter *printerPtr) { printLayout->print(); } Subsurface-4.0.2/qt-ui/printdialog.h000066400000000000000000000012341226345450700173530ustar00rootroot00000000000000#ifndef PRINTDIALOG_H #define PRINTDIALOG_H #include #include #include "../display.h" class QProgressBar; class PrintOptions; class PrintLayout; // should be based on a custom QPrintDialog class class PrintDialog : public QDialog { Q_OBJECT public: static PrintDialog *instance(); void runDialog(); struct options printOptions; private: explicit PrintDialog(QWidget *parent = 0, Qt::WindowFlags f = 0); PrintOptions *optionsWidget; PrintLayout *printLayout; QProgressBar *progressBar; QPrinter printer; private slots: void previewClicked(); void printClicked(); void closeClicked(); void onPaintRequested(QPrinter *); }; #endif Subsurface-4.0.2/qt-ui/printlayout.cpp000066400000000000000000000315211226345450700177660ustar00rootroot00000000000000#include #include #include #include #include #include #include #include "mainwindow.h" #include "profilegraphics.h" #include "../dive.h" #include "../display.h" #include "printdialog.h" #include "printlayout.h" #include "models.h" #include "modeldelegates.h" PrintLayout::PrintLayout(PrintDialog *dialogPtr, QPrinter *printerPtr, struct options *optionsPtr) { dialog = dialogPtr; printer = printerPtr; printOptions = optionsPtr; // table print settings tablePrintHeadingBackground = 0xffeeeeee; tablePrintColumnNames.append(tr("Dive#")); tablePrintColumnNames.append(tr("Date")); tablePrintColumnNames.append(tr("Depth")); tablePrintColumnNames.append(tr("Duration")); tablePrintColumnNames.append(tr("Master")); tablePrintColumnNames.append(tr("Buddy")); tablePrintColumnNames.append(tr("Location")); tablePrintColumnWidths.append(7); tablePrintColumnWidths.append(10); tablePrintColumnWidths.append(10); tablePrintColumnWidths.append(10); tablePrintColumnWidths.append(15); tablePrintColumnWidths.append(15); tablePrintColumnWidths.append(33); // profile print settings const int dw = 20; // base percentage profilePrintColumnWidths.append(dw); profilePrintColumnWidths.append(dw); profilePrintColumnWidths.append(dw - 3); profilePrintColumnWidths.append(dw - 3); profilePrintColumnWidths.append(dw + 6); // fit to 100% const int sr = 12; // smallest row height in pixels profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr + 4); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); profilePrintRowHeights.append(sr); } void PrintLayout::print() { // we call setup each time to check if the printer properties have changed setup(); switch (printOptions->type) { case options::PRETTY: printProfileDives(3, 2); break; case options::TWOPERPAGE: printProfileDives(2, 1); break; case options::TABLE: printTable(); break; } } void PrintLayout::setup() { QDesktopWidget *desktop = QApplication::desktop(); screenDpiX = desktop->physicalDpiX(); screenDpiY = desktop->physicalDpiY(); printerDpi = printer->resolution(); pageRect = printer->pageRect(); scaleX = (qreal)printerDpi/(qreal)screenDpiX; scaleY = (qreal)printerDpi/(qreal)screenDpiY; // a printer page scalled to screen DPI scaledPageW = pageRect.width() / scaleX; scaledPageH = pageRect.height() / scaleY; } // go trought the dive table and find how many dives we are a going to print int PrintLayout::estimateTotalDives() const { int total = 0, i = 0; struct dive *dive; for_each_dive(i, dive) { if (!dive->selected && printOptions->print_selected) continue; total++; } return total; } /* the used formula here is: * s = (S - (n - 1) * p) / n * where: * s is the length of a single element (unknown) * S is the total available length * n is the number of elements to fit * p is the padding between elements */ #define ESTIMATE_DIVE_DIM(S, n, p) \ ((S) - ((n) - 1) * (p)) / (n); void PrintLayout::printProfileDives(int divesPerRow, int divesPerColumn) { int i, row = 0, col = 0, printed = 0, total = estimateTotalDives(); struct dive *dive; if (!total) return; // setup a painter QPainter painter; painter.begin(printer); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.scale(scaleX, scaleY); // setup the profile widget ProfileGraphicsView *profile = mainWindow()->graphics(); const int profileFrameStyle = profile->frameStyle(); profile->setFrameStyle(QFrame::NoFrame); profile->clear(); profile->setPrintMode(true, !printOptions->color_selected); QSize originalSize = profile->size(); // swap rows/col for landscape if (printer->orientation() == QPrinter::Landscape) { int swap = divesPerColumn; divesPerColumn = divesPerRow; divesPerRow = swap; } // padding in pixels between two dives. no padding if only one dive per page. const int padDef = 20; const int padW = (divesPerColumn < 2) ? 0 : padDef; const int padH = (divesPerRow < 2) ? 0 : padDef; // estimate dimensions for a single dive const int scaledW = ESTIMATE_DIVE_DIM(scaledPageW, divesPerColumn, padW); const int scaledH = ESTIMATE_DIVE_DIM(scaledPageH, divesPerRow, padH); // padding in pixels between profile and table const int padPT = 5; // create a model and table ProfilePrintModel model; QTableView *table = createProfileTable(&model, scaledW); // profilePrintTableMaxH updates after the table is created const int tableH = profilePrintTableMaxH; // resize the profile widget profile->resize(scaledW, scaledH - tableH - padPT); // offset table or profile on top int yOffsetProfile = 0, yOffsetTable = 0; if (printOptions->notes_up) yOffsetProfile = tableH + padPT; else yOffsetTable = scaledH - tableH; // plot the dives at specific rows and columns on the page for_each_dive(i, dive) { if (!dive->selected && printOptions->print_selected) continue; if (col == divesPerColumn) { col = 0; row++; if (row == divesPerRow) { row = 0; printer->newPage(); } } QTransform origTransform = painter.transform(); // draw a profile painter.translate((scaledW + padW) * col, (scaledH + padH) * row + yOffsetProfile); profile->plot(dive, true); profile->render(&painter, QRect(0, 0, scaledW, scaledH - tableH - padPT)); painter.setTransform(origTransform); // draw a table painter.translate((scaledW + padW) * col, (scaledH + padH) * row + yOffsetTable); model.setDive(dive); table->render(&painter); painter.setTransform(origTransform); col++; printed++; emit signalProgress((printed * 100) / total); } // cleanup painter.end(); delete table; profile->setFrameStyle(profileFrameStyle); profile->setPrintMode(false); profile->resize(originalSize); profile->clear(); profile->plot(current_dive, true); } /* we create a table that has a fixed height, but can stretch to fit certain width */ QTableView *PrintLayout::createProfileTable(ProfilePrintModel *model, const int tableW) { // setup a new table QTableView *table = new QTableView(); QHeaderView *vHeader = table->verticalHeader(); QHeaderView *hHeader = table->horizontalHeader(); table->setAttribute(Qt::WA_DontShowOnScreen); table->setSelectionMode(QAbstractItemView::NoSelection); table->setFocusPolicy(Qt::NoFocus); table->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); table->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); hHeader->setVisible(false); hHeader->setResizeMode(QHeaderView::Fixed); vHeader->setVisible(false); vHeader->setResizeMode(QHeaderView::Fixed); // set the model table->setModel(model); /* setup cell span for the table using QTableView::setSpan(). * changes made here reflect on ProfilePrintModel::data(). */ const int cols = model->columnCount(); const int rows = model->rowCount(); // info on top table->setSpan(0, 0, 1, 4); table->setSpan(1, 0, 1, 4); // gas used table->setSpan(2, 0, 1, 2); table->setSpan(3, 0, 1, 2); // notes table->setSpan(6, 0, 1, 5); table->setSpan(7, 0, 5, 5); /* resize row heights to the 'profilePrintRowHeights' indexes. * profilePrintTableMaxH will then hold the table height. */ int i; profilePrintTableMaxH = 0; for (i = 0; i < rows; i++) { int h = profilePrintRowHeights.at(i); profilePrintTableMaxH += h; vHeader->resizeSection(i, h); } // resize columns. columns widths are percentages from the table width. int accW = 0; for (i = 0; i < cols; i++) { int pw = qCeil((qreal)(profilePrintColumnWidths.at(i) * tableW) / 100.0); accW += pw; if (i == cols - 1 && accW > tableW) /* adjust last column */ pw -= accW - tableW; hHeader->resizeSection(i, pw); } // resize table->resize(tableW, profilePrintTableMaxH); // hide the grid and set a stylesheet table->setItemDelegate(new ProfilePrintDelegate()); table->setShowGrid(false); table->setStyleSheet( "QTableView { border: none }" "QTableView::item { border: 0px; padding-left: 2px; padding-right: 2px; }" ); // return return table; } void PrintLayout::printTable() { struct dive *dive; int done = 0; // percents done int i, row = 0, progress, total = estimateTotalDives(); if (!total) return; // create and setup a table QTableView table; table.setAttribute(Qt::WA_DontShowOnScreen); table.setSelectionMode(QAbstractItemView::NoSelection); table.setFocusPolicy(Qt::NoFocus); table.horizontalHeader()->setVisible(false); table.horizontalHeader()->setResizeMode(QHeaderView::Fixed); table.verticalHeader()->setVisible(false); table.verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); table.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); table.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // fit table to one page initially table.resize(scaledPageW, scaledPageH); // don't show border table.setStyleSheet( "QTableView { border: none }" ); // create and fill a table model TablePrintModel model; addTablePrintHeadingRow(&model, row); // add one heading row row++; progress = 0; for_each_dive(i, dive) { if (!dive->selected && printOptions->print_selected) continue; addTablePrintDataRow(&model, row, dive); row++; progress++; emit signalProgress((progress * 10) / total); } done = 10; table.setModel(&model); // set model to table // resize columns to percentages from page width int accW = 0; int cols = model.columns; int tableW = table.width(); for (int i = 0; i < model.columns; i++) { int pw = qCeil((qreal)(tablePrintColumnWidths.at(i) * table.width()) / 100.0); accW += pw; if (i == cols - 1 && accW > tableW) /* adjust last column */ pw -= accW - tableW; table.horizontalHeader()->resizeSection(i, pw); } // reset the model at this point model.callReset(); // a list of vertical offsets where pages begin and some helpers QList pageIndexes; pageIndexes.append(0); /* the algorithm bellow processes the table rows in multiple passes, * compensating for loss of space due to moving rows on a new page instead * of truncating them. * there is a 'passes' array defining how much percents of the total * progress each will take. given, the first and last stage of this function * use 10% each, then the sum of passes[] here should be 80%. * two should be enough! */ const int passes[] = { 70, 10 }; int tableHeight = 0, lastAccIndex = 0, rowH, accH, headings; bool isHeading = false; for (unsigned int pass = 0; pass < sizeof(passes) / sizeof(passes[0]); pass++) { progress = headings = accH = 0; total = model.rows - lastAccIndex; for (int i = lastAccIndex; i < model.rows; i++) { rowH = table.rowHeight(i); accH += rowH; if (isHeading) { headings += rowH; isHeading = false; } if (accH > scaledPageH) { lastAccIndex = i; pageIndexes.append(pageIndexes.last() + (accH - rowH)); addTablePrintHeadingRow(&model, i); isHeading = true; accH = 0; i--; } tableHeight += table.rowHeight(i); progress++; emit signalProgress(done + (progress * passes[pass]) / total); } done += passes[pass]; } done = 90; pageIndexes.append(pageIndexes.last() + accH + headings); table.resize(scaledPageW, tableHeight); // attach a painter and render pages by using pageIndexes QPainter painter(printer); painter.setRenderHint(QPainter::Antialiasing); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.scale(scaleX, scaleY); total = pageIndexes.size() - 1; progress = 0; for (int i = 0; i < total; i++) { if (i > 0) printer->newPage(); QRegion region(0, pageIndexes.at(i) - 1, table.width(), pageIndexes.at(i + 1) - pageIndexes.at(i) + 1); table.render(&painter, QPoint(0, 0), region); progress++; emit signalProgress(done + (progress * 10) / total); } } void PrintLayout::addTablePrintDataRow(TablePrintModel *model, int row, struct dive *dive) const { struct DiveItem di; di.dive = dive; model->insertRow(); model->setData(model->index(row, 0), QString::number(dive->number), Qt::DisplayRole); model->setData(model->index(row, 1), di.displayDate(), Qt::DisplayRole); model->setData(model->index(row, 2), di.displayDepth(), Qt::DisplayRole); model->setData(model->index(row, 3), di.displayDuration(), Qt::DisplayRole); model->setData(model->index(row, 4), dive->divemaster, Qt::DisplayRole); model->setData(model->index(row, 5), dive->buddy, Qt::DisplayRole); model->setData(model->index(row, 6), dive->location, Qt::DisplayRole); } void PrintLayout::addTablePrintHeadingRow(TablePrintModel *model, int row) const { model->insertRow(row); for (int i = 0; i < model->columns; i++) { model->setData(model->index(row, i), tablePrintColumnNames.at(i), Qt::DisplayRole); model->setData(model->index(row, i), tablePrintHeadingBackground, Qt::BackgroundRole); } } Subsurface-4.0.2/qt-ui/printlayout.h000066400000000000000000000022521226345450700174320ustar00rootroot00000000000000#ifndef PRINTLAYOUT_H #define PRINTLAYOUT_H #include #include #include #include class QTableView; class PrintDialog; class TablePrintModel; class ProfilePrintModel; struct dive; class PrintLayout : public QObject { Q_OBJECT public: PrintLayout(PrintDialog *, QPrinter *, struct options *); void print(); private: PrintDialog *dialog; QPrinter *printer; struct options *printOptions; int screenDpiX, screenDpiY, printerDpi, scaledPageW, scaledPageH; qreal scaleX, scaleY; QRect pageRect; QVector tablePrintColumnNames; unsigned int tablePrintHeadingBackground; QList tablePrintColumnWidths; unsigned int profilePrintTableMaxH; QList profilePrintColumnWidths, profilePrintRowHeights; void setup(); int estimateTotalDives() const; void printProfileDives(int divesPerRow, int divesPerColumn); QTableView *createProfileTable(ProfilePrintModel *model, const int tableW); void printTable(); void addTablePrintDataRow(TablePrintModel *model, int row, struct dive *dive) const; void addTablePrintHeadingRow(TablePrintModel *model, int row) const; signals: void signalProgress(int); }; #endif Subsurface-4.0.2/qt-ui/printoptions.cpp000066400000000000000000000076471226345450700201600ustar00rootroot00000000000000#include "printoptions.h" #include "../display.h" PrintOptions::PrintOptions(QWidget *parent, struct options *printOpt) { hasSetupSlots = false; ui.setupUi(this); if (parent) setParent(parent); if (!printOpt) return; setup(printOpt); } void PrintOptions::setup(struct options *printOpt) { /* these options are not supported ATM and we hide them. * basically the entire PrintDialog class needs re-implementation, so that * the paper size, DPI and all other options are displayed in one dialog. * this way we can print directly or do an optional preview first. */ ui.sizingHeights->setVisible(false); printOptions = printOpt; // layout height sliders initSliderWithLabel(ui.sliderPHeight, ui.valuePHeight, printOptions->profile_height); initSliderWithLabel(ui.sliderOHeight, ui.valueOHeight, printOptions->notes_height); initSliderWithLabel(ui.sliderNHeight, ui.valueNHeight, printOptions->tanks_height); // print type radio buttons switch (printOptions->type) { case options::PRETTY: ui.radioSixDives->setChecked(true); break; case options::TWOPERPAGE: ui.radioTwoDives->setChecked(true); break; case options::TABLE: ui.radioTablePrint->setChecked(true); break; } // general print option checkboxes if (printOptions->color_selected) ui.printInColor->setChecked(true); if (printOptions->print_selected) ui.printSelected->setChecked(true); // ordering if (printOptions->notes_up) ui.notesOnTop->setChecked(true); else ui.profileOnTop->setChecked(true); // connect slots only once if (hasSetupSlots) return; connect(ui.sliderPHeight, SIGNAL(sliderMoved(int)), this, SLOT(sliderPHeightMoved(int))); connect(ui.sliderOHeight, SIGNAL(sliderMoved(int)), this, SLOT(sliderOHeightMoved(int))); connect(ui.sliderNHeight, SIGNAL(sliderMoved(int)), this, SLOT(sliderNHeightMoved(int))); connect(ui.radioSixDives, SIGNAL(clicked(bool)), this, SLOT(radioSixDivesClicked(bool))); connect(ui.radioTwoDives, SIGNAL(clicked(bool)), this, SLOT(radioTwoDivesClicked(bool))); connect(ui.radioTablePrint, SIGNAL(clicked(bool)), this, SLOT(radioTablePrintClicked(bool))); connect(ui.printInColor, SIGNAL(clicked(bool)), this, SLOT(printInColorClicked(bool))); connect(ui.printSelected, SIGNAL(clicked(bool)), this, SLOT(printSelectedClicked(bool))); connect(ui.notesOnTop, SIGNAL(clicked(bool)), this, SLOT(notesOnTopClicked(bool))); connect(ui.profileOnTop, SIGNAL(clicked(bool)), this, SLOT(profileOnTopClicked(bool))); hasSetupSlots = true; } // layout height sliders void PrintOptions::initSliderWithLabel(QSlider *slider, QLabel *label, int value) { slider->setValue(value); label->setText(formatSliderValueText(value)); } QString PrintOptions::formatSliderValueText(int value) { QString str = QString("%1%").arg(QString::number(value)); return str; } void PrintOptions::sliderPHeightMoved(int value) { ui.valuePHeight->setText(formatSliderValueText(value)); printOptions->profile_height = value; } void PrintOptions::sliderOHeightMoved(int value) { ui.valueOHeight->setText(formatSliderValueText(value)); printOptions->notes_height = value; } void PrintOptions::sliderNHeightMoved(int value) { ui.valueNHeight->setText(formatSliderValueText(value)); printOptions->tanks_height = value; } // print type radio buttons void PrintOptions::radioSixDivesClicked(bool check) { printOptions->type = options::PRETTY; } void PrintOptions::radioTwoDivesClicked(bool check) { printOptions->type = options::TWOPERPAGE; } void PrintOptions::radioTablePrintClicked(bool check) { printOptions->type = options::TABLE; } // general print option checkboxes void PrintOptions::printInColorClicked(bool check) { printOptions->color_selected = (int)check; } void PrintOptions::printSelectedClicked(bool check) { printOptions->print_selected = (int)check; } // ordering void PrintOptions::notesOnTopClicked(bool check) { printOptions->notes_up = true; } void PrintOptions::profileOnTopClicked(bool check) { printOptions->notes_up = false; } Subsurface-4.0.2/qt-ui/printoptions.h000066400000000000000000000020001226345450700175770ustar00rootroot00000000000000#ifndef PRINTOPTIONS_H #define PRINTOPTIONS_H #include #include #include #include "ui_printoptions.h" // should be based on a custom QPrintDialog class class PrintOptions : public QWidget { Q_OBJECT public: explicit PrintOptions(QWidget *parent = 0, struct options *printOpt = 0); void setup(struct options *printOpt); private: Ui::PrintOptions ui; void setLabelFromSlider(QSlider *slider, QLabel *label); void initSliderWithLabel(QSlider *slider, QLabel *label, int value); QString formatSliderValueText(int value); struct options *printOptions; bool hasSetupSlots; private slots: void sliderPHeightMoved(int value); void sliderOHeightMoved(int value); void sliderNHeightMoved(int value); void radioSixDivesClicked(bool check); void radioTwoDivesClicked(bool check); void radioTablePrintClicked(bool check); void printInColorClicked(bool check); void printSelectedClicked(bool check); void notesOnTopClicked(bool check); void profileOnTopClicked(bool check); }; #endif Subsurface-4.0.2/qt-ui/printoptions.ui000066400000000000000000000251711226345450700200030ustar00rootroot00000000000000 PrintOptions 0 0 511 453 10 80 489 81 Print options 10 30 461 18 0 0 Print only selected dives 10 50 461 18 0 0 Print in color 10 10 489 61 0 0 0 0 Print type 0 20 491 31 QLayout::SetDefaultConstraint 15 15 0 0 6 dives per page true 0 0 2 dives per page 0 0 Table print 10 170 489 91 Ordering 10 30 461 18 0 0 Profile on top true 10 50 461 18 0 0 Notes on top false 10 270 489 151 Sizing heights (% of layout) 260 30 211 20 43 85 Qt::Horizontal 10 30 201 20 0 0 Profile height (43% - 85%) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 10 70 201 20 0 0 Other data height (8% - 17%) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 260 70 211 20 8 17 Qt::Horizontal 260 110 211 20 52 Qt::Horizontal 10 110 201 20 0 0 Qt::LeftToRight Notes height (0% - 52%) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 220 30 31 20 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 220 70 31 20 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 220 110 31 20 0 Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter radioSixDives radioTwoDives radioTablePrint printSelected printInColor profileOnTop notesOnTop sliderPHeight sliderOHeight sliderNHeight Subsurface-4.0.2/qt-ui/profilegraphics.cpp000066400000000000000000001432171226345450700205630ustar00rootroot00000000000000#include "profilegraphics.h" #include "mainwindow.h" #include "divelistview.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../color.h" #include "../display.h" #include "../dive.h" #include "../profile.h" #include "../device.h" #include "../helpers.h" #include "../planner.h" #include "../gettextfromc.h" #include #include static struct graphics_context last_gc; #if PRINT_IMPLEMENTED static double plot_scale = SCALE_SCREEN; #endif struct text_render_options{ double size; color_indice_t color; double hpos, vpos; }; extern struct ev_select *ev_namelist; extern int evn_allocated; extern int evn_used; #define TOOLBAR_POS \ QPoint(viewport()->geometry().width() - toolBarProxy->boundingRect().width(), \ viewport()->geometry().height() - toolBarProxy->boundingRect().height() ) ProfileGraphicsView::ProfileGraphicsView(QWidget* parent) : QGraphicsView(parent), toolTip(0) , dive(0), diveDC(0), rulerItem(0), toolBarProxy(0) { printMode = false; isGrayscale = false; rulerEnabled = false; gc.printer = false; fill_profile_color(); setScene(new QGraphicsScene()); scene()->installEventFilter(this); setRenderHint(QPainter::Antialiasing); setRenderHint(QPainter::HighQualityAntialiasing); setRenderHint(QPainter::SmoothPixmapTransform); defaultPen.setJoinStyle(Qt::RoundJoin); defaultPen.setCapStyle(Qt::RoundCap); defaultPen.setWidth(2); defaultPen.setCosmetic(true); setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy (Qt::ScrollBarAlwaysOff); } /* since we cannot use translate() directly on the scene we hack on * the scroll bars (hidden) functionality */ void ProfileGraphicsView::scrollViewTo(const QPoint pos) { if (!zoomLevel) return; QScrollBar *vs = verticalScrollBar(); QScrollBar *hs = horizontalScrollBar(); const qreal yRat = pos.y() / sceneRect().height(); const qreal xRat = pos.x() / sceneRect().width(); const int vMax = vs->maximum(); const int hMax = hs->maximum(); const int vMin = vs->minimum(); const int hMin = hs->minimum(); /* QScrollBar receives crazy negative values for minimum */ vs->setValue(yRat * (vMax - vMin) + vMin * 0.9); hs->setValue(xRat * (hMax - hMin) + hMin * 0.9); } void ProfileGraphicsView::wheelEvent(QWheelEvent* event) { if (!toolTip) return; // doesn't seem to work for Qt 4.8.1 // setTransformationAnchor(QGraphicsView::AnchorUnderMouse); // Scale the view / do the zoom QPoint toolTipPos = mapFromScene(toolTip->pos()); double scaleFactor = 1.15; if (event->delta() > 0 && zoomLevel < 20) { scale(scaleFactor, scaleFactor); zoomLevel++; } else if (event->delta() < 0 && zoomLevel > 0) { // Zooming out scale(1.0 / scaleFactor, 1.0 / scaleFactor); zoomLevel--; } scrollViewTo(event->pos()); toolTip->setPos(mapToScene(toolTipPos)); toolBarProxy->setPos(mapToScene(TOOLBAR_POS)); if(zoomLevel != 0){ toolBarProxy->hide(); }else{ toolBarProxy->show(); } } void ProfileGraphicsView::contextMenuEvent(QContextMenuEvent* event) { if(selected_dive == -1) return; QMenu m; QMenu *gasChange = m.addMenu(tr("Add Gas Change")); GasSelectionModel *model = GasSelectionModel::instance(); model->repopulate(); int rowCount = model->rowCount(); for(int i = 0; i < rowCount; i++){ QAction *action = new QAction(&m); action->setText( model->data(model->index(i, 0),Qt::DisplayRole).toString()); connect(action, SIGNAL(triggered(bool)), this, SLOT(changeGas())); action->setData(event->globalPos()); gasChange->addAction(action); } QAction *action = m.addAction(tr("Add Bookmark"), this, SLOT(addBookmark())); action->setData(event->globalPos()); QList itemsAtPos = scene()->items(mapToScene(mapFromGlobal(event->globalPos()))); Q_FOREACH(QGraphicsItem *i, itemsAtPos){ EventItem *item = dynamic_cast(i); if(!item) continue; QAction *action = new QAction(&m); action->setText(tr("Remove Event")); action->setData(QVariant::fromValue(item)); // so we know what to remove. connect(action, SIGNAL(triggered(bool)), this, SLOT(removeEvent())); m.addAction(action); action = new QAction(&m); action->setText(tr("Hide similar events")); action->setData(QVariant::fromValue(item)); connect(action, SIGNAL(triggered(bool)), this, SLOT(hideEvents())); m.addAction(action); break; } bool some_hidden = false; for (int i = 0; i < evn_used; i++) { if (ev_namelist[i].plot_ev == false) { some_hidden = true; break; } } if (some_hidden) { action = m.addAction(tr("Unhide all events"), this, SLOT(unhideEvents())); action->setData(event->globalPos()); } m.exec(event->globalPos()); } void ProfileGraphicsView::addBookmark() { QAction *action = qobject_cast(sender()); QPoint globalPos = action->data().toPoint(); QPoint viewPos = mapFromGlobal(globalPos); QPointF scenePos = mapToScene(viewPos); int seconds = scenePos.x() / gc.maxx * (gc.rightx - gc.leftx) + gc.leftx; add_event(current_dc, seconds, SAMPLE_EVENT_BOOKMARK, 0, 0, "bookmark"); mark_divelist_changed(TRUE); plot(current_dive, TRUE); } void ProfileGraphicsView::changeGas() { QAction *action = qobject_cast(sender()); QPoint globalPos = action->data().toPoint(); QPoint viewPos = mapFromGlobal(globalPos); QPointF scenePos = mapToScene(viewPos); QString gas = action->text(); int o2, he; validate_gas(gas.toUtf8().constData(), &o2, &he); int seconds = scenePos.x() / gc.maxx * (gc.rightx - gc.leftx) + gc.leftx; add_gas_switch_event(current_dive, current_dc, seconds, get_gasidx(current_dive, o2, he)); mark_divelist_changed(TRUE); plot(current_dive, TRUE); } void ProfileGraphicsView::hideEvents() { QAction *action = qobject_cast(sender()); EventItem *item = static_cast(action->data().value()); struct event *event = item->ev; if (QMessageBox::question(mainWindow(), TITLE_OR_TEXT( tr("Hide events"), tr("Hide all %1 events?").arg(event->name)), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok){ if (event->name) { for (int i = 0; i < evn_used; i++) { if (! strcmp(event->name, ev_namelist[i].ev_name)) { ev_namelist[i].plot_ev = false; break; } } } plot(current_dive, TRUE); } } void ProfileGraphicsView::unhideEvents() { for (int i = 0; i < evn_used; i++) { ev_namelist[i].plot_ev = true; } plot(current_dive, TRUE); } void ProfileGraphicsView::removeEvent() { QAction *action = qobject_cast(sender()); EventItem *item = static_cast(action->data().value()); struct event *event = item->ev; if (QMessageBox::question(mainWindow(), TITLE_OR_TEXT( tr("Remove the selected event?"), tr("%1 @ %2:%3").arg(event->name) .arg(event->time.seconds / 60) .arg(event->time.seconds % 60, 2, 10, QChar('0'))), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok){ struct event **ep = ¤t_dc->events; while (ep && *ep != event) ep = &(*ep)->next; if (ep) { *ep = event->next; free(event); } mark_divelist_changed(TRUE); plot(current_dive, TRUE); } } void ProfileGraphicsView::mouseMoveEvent(QMouseEvent* event) { if (!toolTip) return; toolTip->refresh(&gc, mapToScene(event->pos())); QPoint toolTipPos = mapFromScene(toolTip->pos()); scrollViewTo(event->pos()); if (zoomLevel == 0) QGraphicsView::mouseMoveEvent(event); else{ toolTip->setPos(mapToScene(toolTipPos)); toolBarProxy->setPos(mapToScene(TOOLBAR_POS)); } } bool ProfileGraphicsView::eventFilter(QObject* obj, QEvent* event) { if (event->type() == QEvent::Leave) { if (toolTip && toolTip->isExpanded()) toolTip->collapse(); return true; } // This will "Eat" the default tooltip behavior if it is not on the toolBar. if (event->type() == QEvent::GraphicsSceneHelp) { if(toolBarProxy && !toolBarProxy->geometry().contains(mapToScene(mapFromGlobal(QCursor::pos())))){ event->ignore(); return true; } } return QGraphicsView::eventFilter(obj, event); } #if PRINT_IMPLEMENTED static void plot_set_scale(scale_mode_t scale) { switch (scale) { default: case SC_SCREEN: plot_scale = SCALE_SCREEN; break; case SC_PRINT: plot_scale = SCALE_PRINT; break; } } #endif void ProfileGraphicsView::showEvent(QShowEvent* event) { // Program just opened, // but the dive was not ploted. // force a replot by modifying the dive // hold by the view, and issuing a plot. if (dive && !scene()->items().count()) { dive = 0; plot(get_dive(selected_dive)); } if (toolBarProxy) toolBarProxy->setPos(mapToScene(TOOLBAR_POS)); } void ProfileGraphicsView::clear() { resetTransform(); zoomLevel = 0; if(toolTip) { scene()->removeItem(toolTip); toolTip->deleteLater(); toolTip = 0; } if(toolBarProxy) { scene()->removeItem(toolBarProxy); toolBarProxy->deleteLater(); toolBarProxy = 0; } if(rulerItem) { remove_ruler(); rulerItem->destNode()->deleteLater(); rulerItem->sourceNode()->deleteLater(); rulerItem->deleteLater(); rulerItem=0; } scene()->clear(); } void ProfileGraphicsView::refresh() { clear(); plot(current_dive, TRUE); } void ProfileGraphicsView::setPrintMode(bool mode, bool grayscale) { printMode = mode; isGrayscale = grayscale; } QColor ProfileGraphicsView::getColor(const color_indice_t i) { return profile_color[i].at((isGrayscale) ? 1 : 0); } void ProfileGraphicsView::plot(struct dive *d, bool forceRedraw) { struct divecomputer *dc = NULL; if (d) dc = select_dc(&d->dc); if (!forceRedraw && dive == d && (d && dc == diveDC)) return; clear(); dive = d; diveDC = d ? dc : NULL; if (!isVisible() || !dive || !mainWindow()) { return; } setBackgroundBrush(getColor(BACKGROUND)); // best place to put the focus stealer code. setFocusProxy(mainWindow()->dive_list()); scene()->setSceneRect(0,0, viewport()->width()-50, viewport()->height()-50); toolTip = new ToolTipItem(); installEventFilter(toolTip); scene()->addItem(toolTip); if (printMode) toolTip->setVisible(false); // Fix this for printing / screen later. // plot_set_scale(scale_mode_t); if (!dc || !dc->samples) { dc = fake_dc(dc); } QString nick = get_dc_nickname(dc->model, dc->deviceid); if (nick.isEmpty()) nick = QString(dc->model); if (nick.isEmpty()) nick = tr("unknown divecomputer"); if ( tr("unknown divecomputer") == nick){ mode = PLAN; }else{ mode = DIVE; } /* * Set up limits that are independent of * the dive computer */ calculate_max_limits(dive, dc, &gc); QRectF profile_grid_area = scene()->sceneRect(); gc.maxx = (profile_grid_area.width() - 2 * profile_grid_area.x()); gc.maxy = (profile_grid_area.height() - 2 * profile_grid_area.y()); /* This is per-dive-computer */ gc.pi = *create_plot_info(dive, dc, &gc, printMode); /* Bounding box */ QPen pen = defaultPen; pen.setColor(getColor(TIME_GRID)); QGraphicsRectItem *rect = new QGraphicsRectItem(profile_grid_area); rect->setPen(pen); scene()->addItem(rect); /* Depth profile */ plot_depth_profile(); plot_events(dc); if (rulerEnabled && !printMode) create_ruler(); /* Temperature profile */ plot_temperature_profile(); /* Cylinder pressure plot */ plot_cylinder_pressure(); /* Text on top of all graphs.. */ plot_temperature_text(); plot_depth_text(); plot_cylinder_pressure_text(); plot_deco_text(); /* Put the dive computer name in the lower left corner */ gc.leftx = 0; gc.rightx = 1.0; gc.topy = 0; gc.bottomy = 1.0; text_render_options_t computer = {DC_TEXT_SIZE, TIME_TEXT, LEFT, TOP}; diveComputer = plot_text(&computer, QPointF(gc.leftx, gc.bottomy), nick); // The Time ruler should be right after the DiveComputer: timeMarkers->setPos(0, diveComputer->y()); if (PP_GRAPHS_ENABLED) { plot_pp_gas_profile(); plot_pp_text(); } plot_depth_scale(); #if 0 if (gc->printer) { free(pi->entry); last_pi_entry = pi->entry = NULL; pi->nr = 0; } #endif QRectF r = scene()->itemsBoundingRect(); scene()->setSceneRect(r.x() - 15, r.y() -15, r.width() + 30, r.height() + 30); if (zoomLevel == 0) { fitInView(sceneRect()); } toolTip->readPos(); if(mode == PLAN){ timeEditor = new GraphicsTextEditor(); timeEditor->setPlainText( dive->duration.seconds ? QString::number(dive->duration.seconds/60) : tr("Set Duration: 10 minutes")); timeEditor->setPos(profile_grid_area.width() - timeEditor->boundingRect().width(), timeMarkers->y()); timeEditor->document(); connect(timeEditor, SIGNAL(editingFinished(QString)), this, SLOT(edit_dive_time(QString))); scene()->addItem(timeEditor); } if (!printMode) addControlItems(d); if (rulerEnabled && !printMode) add_ruler(); gc.rightx = get_maxtime(&gc.pi); } void ProfileGraphicsView::plot_depth_scale() { int i, maxdepth, marker; static text_render_options_t tro = {DEPTH_TEXT_SIZE, SAMPLE_DEEP, RIGHT, MIDDLE}; /* Depth markers: every 30 ft or 10 m*/ maxdepth = get_maxdepth(&gc.pi); gc.topy = 0; gc.bottomy = maxdepth; marker = M_OR_FT(10,30); /* don't write depth labels all the way to the bottom as * there may be other graphs below the depth plot (like * partial pressure graphs) where this would look out * of place - so we only make sure that we print the next * marker below the actual maxdepth of the dive */ depthMarkers = new QGraphicsRectItem(); for (i = marker; i <= gc.pi.maxdepth + marker; i += marker) { double d = get_depth_units(i, NULL, NULL); plot_text(&tro, QPointF(-0.002, i), QString::number(d), depthMarkers); } scene()->addItem(depthMarkers); depthMarkers->setPos(depthMarkers->pos().x() - 10, 0); } void ProfileGraphicsView::addControlItems(struct dive *d) { QAction *scaleAction = new QAction(QIcon(":scale"), tr("Scale"), this); QAction *rulerAction = new QAction(QIcon(":ruler"), tr("Ruler"), this); QToolBar *toolBar = new QToolBar("", 0); rulerAction->setToolTip(tr("Measure properties of dive segments")); scaleAction->setToolTip(tr("Scale your dive to screen size")); toolBar->addAction(rulerAction); toolBar->addAction(scaleAction); toolBar->setOrientation(Qt::Vertical); //make toolbar transparent //toolBar->setStyleSheet(QString::fromUtf8 ("background-color: rgba(255,255,255,0);")); connect(scaleAction, SIGNAL(triggered()), this, SLOT(on_scaleAction())); connect(rulerAction, SIGNAL(triggered()), this, SLOT(on_rulerAction())); //Put it into the lower right corner of the profile QString defaultDC(d->dc.model); if (defaultDC == "manually added dive" || defaultDC == "planned dive") { QAction *editAction = new QAction(QIcon(":edit"), tr("Edit"), this); toolBar->addAction(editAction); connect(editAction, SIGNAL(triggered()), mainWindow(), SLOT(editCurrentDive())); } toolBarProxy = scene()->addWidget(toolBar); toolBarProxy->setPos(mapToScene(TOOLBAR_POS)); toolBarProxy->setFlag(QGraphicsItem::ItemIgnoresTransformations); } void ProfileGraphicsView::plot_pp_text() { double pp, dpp, m; int hpos; static text_render_options_t tro = {PP_TEXT_SIZE, PP_LINES, LEFT, -0.75}; QGraphicsRectItem *pressureMarkers = new QGraphicsRectItem(); setup_pp_limits(&gc); pp = floor(gc.pi.maxpp * 10.0) / 10.0 + 0.2; dpp = pp > 4 ? 0.5 : 0.25; hpos = gc.pi.entry[gc.pi.nr - 1].sec; QColor c = getColor(PP_LINES); bool alt = true; for (m = 0.0; m <= pp; m += dpp) { QGraphicsLineItem *item = new QGraphicsLineItem(SCALEGC(0, m), SCALEGC(hpos, m)); QPen pen(defaultPen); pen.setColor(c); if ( QString::number(m).toDouble() != QString::number(m).toInt()){ pen.setStyle(Qt::DashLine); pen.setWidthF(1.2); } item->setPen(pen); scene()->addItem(item); qreal textPos = hpos; if (alt) plot_text(&tro, QPointF(textPos, m), QString::number(m), pressureMarkers); alt = !alt; } scene()->addItem(pressureMarkers); pressureMarkers->setPos(pressureMarkers->pos().x() + 10, 0); } void ProfileGraphicsView::plot_add_line(int sec, double val, QColor c, QPointF &from) { QPointF to = QPointF(SCALEGC(sec, val)); QGraphicsLineItem *item = new QGraphicsLineItem(from.x(), from.y(), to.x(), to.y()); QPen pen(defaultPen); pen.setColor(c); item->setPen(pen); scene()->addItem(item); from = to; } void ProfileGraphicsView::plot_pp_gas_profile() { int i; struct plot_data *entry; struct plot_info *pi = &gc.pi; setup_pp_limits(&gc); QColor c; QPointF from, to; QPointF legendPos = QPointF(scene()->sceneRect().width() * 0.4, scene()->sceneRect().height() - scene()->sceneRect().height()*0.02); if (prefs.pp_graphs.pn2) { c = getColor(PN2); entry = pi->entry; from = QPointF(SCALEGC(entry->sec, entry->pn2)); for (i = 1; i < pi->nr; i++) { entry++; if (entry->pn2 < prefs.pp_graphs.pn2_threshold) plot_add_line(entry->sec, entry->pn2, c, from); else from = QPointF(SCALEGC(entry->sec, entry->pn2)); } c = getColor(PN2_ALERT); entry = pi->entry; from = QPointF(SCALEGC(entry->sec, entry->pn2)); for (i = 1; i < pi->nr; i++) { entry++; if (entry->pn2 >= prefs.pp_graphs.pn2_threshold) plot_add_line(entry->sec, entry->pn2, c, from); else from = QPointF(SCALEGC(entry->sec, entry->pn2)); } createPPLegend(trUtf8("pN" UTF8_SUBSCRIPT_2),getColor(PN2), legendPos); } if (prefs.pp_graphs.phe) { c = getColor(PHE); entry = pi->entry; from = QPointF(SCALEGC(entry->sec, entry->phe)); for (i = 1; i < pi->nr; i++) { entry++; if (entry->phe < prefs.pp_graphs.phe_threshold) plot_add_line(entry->sec, entry->phe, c, from); else from = QPointF(SCALEGC(entry->sec, entry->phe)); } c = getColor(PHE_ALERT); entry = pi->entry; from = QPointF(SCALEGC(entry->sec, entry->phe)); for (i = 1; i < pi->nr; i++) { entry++; if (entry->phe >= prefs.pp_graphs.phe_threshold) plot_add_line(entry->sec, entry->phe, c, from); else from = QPointF(SCALEGC(entry->sec, entry->phe)); } createPPLegend(trUtf8("pHe"),getColor(PHE), legendPos); } if (prefs.pp_graphs.po2) { c = getColor(PO2); entry = pi->entry; from = QPointF(SCALEGC(entry->sec, entry->po2)); for (i = 1; i < pi->nr; i++) { entry++; if (entry->po2 < prefs.pp_graphs.po2_threshold) plot_add_line(entry->sec, entry->po2, c, from); else from = QPointF(SCALEGC(entry->sec, entry->po2)); } c = getColor(PO2_ALERT); entry = pi->entry; from = QPointF(SCALEGC(entry->sec, entry->po2)); for (i = 1; i < pi->nr; i++) { entry++; if (entry->po2 >= prefs.pp_graphs.po2_threshold) plot_add_line(entry->sec, entry->po2, c, from); else from = QPointF(SCALEGC(entry->sec, entry->po2)); } createPPLegend(trUtf8("pO" UTF8_SUBSCRIPT_2),getColor(PO2), legendPos); } } void ProfileGraphicsView::createPPLegend(QString title, const QColor& c, QPointF& legendPos) { QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, scene()->sceneRect().width() * 0.01, scene()->sceneRect().width() * 0.01); rect->setBrush(QBrush(c)); rect->setPos(legendPos); rect->setPen(QPen(QColor(Qt::transparent))); QGraphicsSimpleTextItem *text = new QGraphicsSimpleTextItem(title); text->setPos(legendPos.x() + rect->boundingRect().width() + 5, legendPos.y() ); scene()->addItem(rect); scene()->addItem(text); legendPos.setX(text->pos().x() + text->boundingRect().width() + 20); if(printMode){ QFont f = text->font(); f.setPointSizeF( f.pointSizeF() * 0.7); text->setFont(f); } } void ProfileGraphicsView::plot_deco_text() { if (prefs.profile_calc_ceiling) { float x = gc.leftx + (gc.rightx - gc.leftx) / 2; float y = gc.topy = 1.0; static text_render_options_t tro = {PRESSURE_TEXT_SIZE, PRESSURE_TEXT, CENTER, BOTTOM}; gc.bottomy = 0.0; plot_text(&tro, QPointF(x, y), QString("GF %1/%2").arg(prefs.gflow).arg(prefs.gfhigh)); } } void ProfileGraphicsView::plot_cylinder_pressure_text() { int i; int mbar, cyl; int seen_cyl[MAX_CYLINDERS] = { FALSE, }; int last_pressure[MAX_CYLINDERS] = { 0, }; int last_time[MAX_CYLINDERS] = { 0, }; struct plot_data *entry; struct plot_info *pi = &gc.pi; if (!get_cylinder_pressure_range(&gc)) return; cyl = -1; for (i = 0; i < pi->nr; i++) { entry = pi->entry + i; mbar = GET_PRESSURE(entry); if (!mbar) continue; if (cyl != entry->cylinderindex) { cyl = entry->cylinderindex; if (!seen_cyl[cyl]) { plot_pressure_value(mbar, entry->sec, LEFT, BOTTOM); plot_gas_value(mbar, entry->sec, LEFT, TOP, get_o2(&dive->cylinder[cyl].gasmix), get_he(&dive->cylinder[cyl].gasmix)); seen_cyl[cyl] = TRUE; } } last_pressure[cyl] = mbar; last_time[cyl] = entry->sec; } for (cyl = 0; cyl < MAX_CYLINDERS; cyl++) { if (last_time[cyl]) { plot_pressure_value(last_pressure[cyl], last_time[cyl], CENTER, TOP); } } } void ProfileGraphicsView::plot_pressure_value(int mbar, int sec, double xalign, double yalign) { int pressure; const char *unit; pressure = get_pressure_units(mbar, &unit); static text_render_options_t tro = {PRESSURE_TEXT_SIZE, PRESSURE_TEXT, xalign, yalign}; plot_text(&tro, QPointF(sec, mbar), QString("%1 %2").arg(pressure).arg(unit)); } void ProfileGraphicsView::plot_gas_value(int mbar, int sec, double xalign, double yalign, int o2, int he) { QString gas; if (is_air(o2, he)) gas = tr("air"); else if (he == 0) gas = QString(tr("EAN%1")).arg((o2 + 5) / 10); else gas = QString("%1/%2").arg((o2 + 5) / 10).arg((he + 5) / 10); static text_render_options_t tro = {PRESSURE_TEXT_SIZE, PRESSURE_TEXT, xalign, yalign}; plot_text(&tro, QPointF(sec, mbar), gas); } void ProfileGraphicsView::plot_depth_text() { int maxtime, maxdepth; /* Get plot scaling limits */ maxtime = get_maxtime(&gc.pi); maxdepth = get_maxdepth(&gc.pi); gc.leftx = 0; gc.rightx = maxtime; gc.topy = 0; gc.bottomy = maxdepth; plot_text_samples(); } void ProfileGraphicsView::plot_text_samples() { static text_render_options_t deep = {14, SAMPLE_DEEP, CENTER, TOP}; static text_render_options_t shallow = {14, SAMPLE_SHALLOW, CENTER, BOTTOM}; int i; int last = -1; struct plot_info* pi = &gc.pi; for (i = 0; i < pi->nr; i++) { struct plot_data *entry = pi->entry + i; if (entry->depth < 2000) continue; if ((entry == entry->max[2]) && entry->depth / 100 != last) { plot_depth_sample(entry, &deep); last = entry->depth / 100; } if ((entry == entry->min[2]) && entry->depth / 100 != last) { plot_depth_sample(entry, &shallow); last = entry->depth / 100; } if (entry->depth != last) last = -1; } } void ProfileGraphicsView::plot_depth_sample(struct plot_data *entry,text_render_options_t *tro) { int sec = entry->sec, decimals; double d; d = get_depth_units(entry->depth, &decimals, NULL); plot_text(tro, QPointF(sec, entry->depth), QString("%1").arg(d, 0, 'f', 1)); } void ProfileGraphicsView::plot_temperature_text() { int i; int last = -300, sec = 0; int last_temperature = 0, last_printed_temp = 0; plot_info *pi = &gc.pi; if (!setup_temperature_limits(&gc)) return; for (i = 0; i < pi->nr; i++) { struct plot_data *entry = pi->entry+i; int mkelvin = entry->temperature; sec = entry->sec; if (!mkelvin) continue; last_temperature = mkelvin; /* don't print a temperature * if it's been less than 5min and less than a 2K change OR * if it's been less than 2min OR if the change from the * last print is less than .4K (and therefore less than 1F) */ if (((sec < last + 300) && (abs(mkelvin - last_printed_temp) < 2000)) || (sec < last + 120) || (abs(mkelvin - last_printed_temp) < 400)) continue; last = sec; if (mkelvin > 200000) plot_single_temp_text(sec,mkelvin); last_printed_temp = mkelvin; } /* it would be nice to print the end temperature, if it's * different or if the last temperature print has been more * than a quarter of the dive back */ if (last_temperature > 200000 && ((abs(last_temperature - last_printed_temp) > 500) || ((double)last / (double)sec < 0.75))) plot_single_temp_text(sec, last_temperature); } void ProfileGraphicsView::plot_single_temp_text(int sec, int mkelvin) { double deg; const char *unit; static text_render_options_t tro = {TEMP_TEXT_SIZE, TEMP_TEXT, LEFT, TOP}; deg = get_temp_units(mkelvin, &unit); plot_text(&tro, QPointF(sec, mkelvin), QString("%1%2").arg(deg, 0, 'f', 1).arg(unit)); //"%.2g%s" } void ProfileGraphicsView::plot_cylinder_pressure() { int i; int last_index = -1; int lift_pen = FALSE; int first_plot = TRUE; if (!get_cylinder_pressure_range(&gc)) return; QPointF from, to; for (i = 0; i < gc.pi.nr; i++) { int mbar; struct plot_data *entry = gc.pi.entry + i; mbar = GET_PRESSURE(entry); if (entry->cylinderindex != last_index) { lift_pen = TRUE; } if (!mbar) { lift_pen = TRUE; continue; } QColor c = get_sac_color(entry->sac, dive->sac); if (lift_pen) { if (!first_plot && entry->cylinderindex == last_index) { /* if we have a previous event from the same tank, * draw at least a short line */ int prev_pr; prev_pr = GET_PRESSURE(entry - 1); QGraphicsLineItem *item = new QGraphicsLineItem(SCALEGC((entry-1)->sec, prev_pr), SCALEGC(entry->sec, mbar)); QPen pen(defaultPen); pen.setColor(c); item->setPen(pen); scene()->addItem(item); } else { first_plot = FALSE; from = QPointF(SCALEGC(entry->sec, mbar)); } lift_pen = FALSE; } else { to = QPointF(SCALEGC(entry->sec, mbar)); QGraphicsLineItem *item = new QGraphicsLineItem(from.x(), from.y(), to.x(), to.y()); QPen pen(defaultPen); pen.setColor(c); item->setPen(pen); scene()->addItem(item); } from = QPointF(SCALEGC(entry->sec, mbar)); last_index = entry->cylinderindex; } } /* set the color for the pressure plot according to temporary sac rate * as compared to avg_sac; the calculation simply maps the delta between * sac and avg_sac to indexes 0 .. (SAC_COLORS - 1) with everything * more than 6000 ml/min below avg_sac mapped to 0 */ QColor ProfileGraphicsView::get_sac_color(int sac, int avg_sac) { int sac_index = 0; int delta = sac - avg_sac + 7000; if (!gc.printer) { sac_index = delta / 2000; if (sac_index < 0) sac_index = 0; if (sac_index > SAC_COLORS - 1) sac_index = SAC_COLORS - 1; return getColor((color_indice_t)(SAC_COLORS_START_IDX + sac_index)); } return getColor(SAC_DEFAULT); } void ProfileGraphicsView::plot_events(struct divecomputer *dc) { struct event *event = dc->events; // if (gc->printer) { // return; // } while (event) { plot_one_event(event); event = event->next; } } void ProfileGraphicsView::plot_one_event(struct event *ev) { int i; struct plot_info *pi = &gc.pi; struct plot_data *entry = NULL; /* is plotting of this event disabled? */ if (ev->name) { for (i = 0; i < evn_used; i++) { if (! strcmp(ev->name, ev_namelist[i].ev_name)) { if (ev_namelist[i].plot_ev) break; else return; } } } if (ev->time.seconds < 30 && !strcmp(ev->name, "gaschange")) /* a gas change in the first 30 seconds is the way of some dive computers * to tell us the gas that is used; let's not plot a marker for that */ return; for (i = 0; i < pi->nr; i++) { entry = pi->entry + i; if (ev->time.seconds < entry->sec) break; } /* If we didn't find the right event, don't dereference null */ if (entry == NULL) return; /* draw a little triangular marker and attach tooltip */ int x = SCALEXGC(ev->time.seconds); int y = SCALEYGC(entry->depth); EventItem *item = new EventItem(ev, 0, isGrayscale); item->setPos(x, y); scene()->addItem(item); /* we display the event on screen - so translate (with the correct context for events) */ QString name = gettextFromC::instance()->tr(ev->name); if (ev->value) { if (ev->name && strcmp(ev->name, "gaschange") == 0) { int he = get_he(&dive->cylinder[entry->cylinderindex].gasmix); int o2 = get_o2(&dive->cylinder[entry->cylinderindex].gasmix); name += ": "; if (he) name += QString("%1/%2").arg((o2 + 5) / 10).arg((he + 5) / 10); else if(is_air(o2, he)) name += tr("air"); else name += QString(tr("EAN%1")).arg((o2 + 5) / 10); } else if (ev->name && !strcmp(ev->name, "SP change")) { name += QString(":%1").arg((double) ev->value / 1000); } else { name += QString(":%1").arg(ev->value); } } else if (ev->name && name == "SP change") { name += "\n" + tr("Bailing out to OC"); } else { name += ev->flags == SAMPLE_FLAGS_BEGIN ? tr(" begin", "Starts with space!") : ev->flags == SAMPLE_FLAGS_END ? tr(" end", "Starts with space!") : ""; } //item->setToolTipController(toolTip); //item->addToolTip(name); item->setToolTip(name); } void ProfileGraphicsView::create_ruler() { int x,y; struct plot_info *pi = &gc.pi; struct plot_data *data = pi->entry; RulerNodeItem *first = new RulerNodeItem(0, gc); RulerNodeItem *second = new RulerNodeItem(0, gc); x = SCALEXGC(data->sec); y = data->depth; first->setPos(x,y); data = pi->entry+(pi->nr-1); x = SCALEXGC(data->sec); y = data->depth; second->setPos(x,y); //Make sure that both points already have their entries first->recalculate(); second->recalculate(); rulerItem = new RulerItem(0, first, second); first->setRuler(rulerItem); second->setRuler(rulerItem); } void ProfileGraphicsView::add_ruler() { if (! scene()->items().contains(rulerItem)) { scene()->addItem(rulerItem->sourceNode()); scene()->addItem(rulerItem->destNode()); scene()->addItem(rulerItem); rulerItem->recalculate(); } } void ProfileGraphicsView::remove_ruler() { if (rulerItem) { if (scene()->items().contains(rulerItem)) scene()->removeItem(rulerItem); if (scene()->items().contains(rulerItem->sourceNode())) scene()->removeItem(rulerItem->sourceNode()); if (scene()->items().contains(rulerItem->destNode())) scene()->removeItem(rulerItem->destNode()); } } void ProfileGraphicsView::plot_depth_profile() { int i, incr; int sec, depth; struct plot_data *entry; int maxtime, maxdepth, marker, maxline; int increments[8] = { 10, 20, 30, 60, 5*60, 10*60, 15*60, 30*60 }; /* Get plot scaling limits */ maxtime = get_maxtime(&gc.pi); maxdepth = get_maxdepth(&gc.pi); gc.maxtime = maxtime; /* Time markers: at most every 10 seconds, but no more than 12 markers. * We start out with 10 seconds and increment up to 30 minutes, * depending on the dive time. * This allows for 6h dives - enough (I hope) for even the craziest * divers - but just in case, for those 8h depth-record-breaking dives, * we double the interval if this still doesn't get us to 12 or fewer * time markers */ i = 0; while (i < 7 && maxtime / increments[i] > 12) i++; incr = increments[i]; while (maxtime / incr > 12) incr *= 2; gc.leftx = 0; gc.rightx = maxtime; gc.topy = 0; gc.bottomy = 1.0; last_gc = gc; QColor c = getColor(TIME_GRID); for (i = incr; i < maxtime; i += incr) { QGraphicsLineItem *item = new QGraphicsLineItem(SCALEGC(i, 0), SCALEGC(i, 1)); QPen pen(defaultPen); pen.setColor(c); item->setPen(pen); scene()->addItem(item); } timeMarkers = new QGraphicsRectItem(); /* now the text on the time markers */ struct text_render_options tro = {DEPTH_TEXT_SIZE, TIME_TEXT, CENTER, LINE_DOWN}; if (maxtime < 600) { /* Be a bit more verbose with shorter dives */ for (i = incr; i < maxtime; i += incr) plot_text(&tro, QPointF(i, 0), QString("%1:%2").arg(i/60).arg(i%60, 2, 10, QChar('0')), timeMarkers); } else { /* Only render the time on every second marker for normal dives */ for (i = incr; i < maxtime; i += 2 * incr) plot_text(&tro, QPointF(i, 0), QString("%1").arg(QString::number(i/60)), timeMarkers); } timeMarkers->setPos(0,0); scene()->addItem(timeMarkers); /* Depth markers: every 30 ft or 10 m*/ gc.leftx = 0; gc.rightx = 1.0; gc.topy = 0; gc.bottomy = maxdepth; marker = M_OR_FT(10,30); maxline = qMax(gc.pi.maxdepth + marker, maxdepth * 2 / 3); c = getColor(DEPTH_GRID); for (i = marker; i < maxline; i += marker) { QGraphicsLineItem *item = new QGraphicsLineItem(SCALEGC(0, i), SCALEGC(1, i)); QPen pen(defaultPen); pen.setColor(c); item->setPen(pen); scene()->addItem(item); } gc.leftx = 0; gc.rightx = maxtime; c = getColor(MEAN_DEPTH); /* Show mean depth */ if (! gc.printer) { QGraphicsLineItem *item = new QGraphicsLineItem(SCALEGC(0, gc.pi.meandepth), SCALEGC(gc.pi.entry[gc.pi.nr - 1].sec, gc.pi.meandepth)); QPen pen(defaultPen); pen.setColor(c); item->setPen(pen); scene()->addItem(item); struct text_render_options tro = {DEPTH_TEXT_SIZE, MEAN_DEPTH, LEFT, TOP}; QString depthLabel = get_depth_string(gc.pi.meandepth, true, true); plot_text(&tro, QPointF(gc.leftx, gc.pi.meandepth), depthLabel, item); tro.hpos = RIGHT; plot_text(&tro, QPointF(gc.pi.entry[gc.pi.nr - 1].sec, gc.pi.meandepth), depthLabel, item); } #if 0 /* * These are good for debugging text placement etc, * but not for actual display.. */ if (0) { plot_smoothed_profile(gc, pi); plot_minmax_profile(gc, pi); } #endif /* Do the depth profile for the neat fill */ gc.topy = 0; gc.bottomy = maxdepth; entry = gc.pi.entry; QPolygonF p; QLinearGradient pat(0.0,0.0,0.0,scene()->height()); QGraphicsPolygonItem *neatFill = NULL; p.append(QPointF(SCALEGC(0, 0))); for (i = 0; i < gc.pi.nr; i++, entry++) p.append(QPointF(SCALEGC(entry->sec, entry->depth))); /* Show any ceiling we may have encountered */ if (prefs.profile_dc_ceiling) { for (i = gc.pi.nr - 1; i >= 0; i--, entry--) { if (!entry->in_deco) { /* not in deco implies this is a safety stop, no ceiling */ p.append(QPointF(SCALEGC(entry->sec, 0))); } else if (entry->stopdepth < entry->depth) { p.append(QPointF(SCALEGC(entry->sec, entry->stopdepth))); } else { p.append(QPointF(SCALEGC(entry->sec, entry->depth))); } } } pat.setColorAt(1, getColor(DEPTH_BOTTOM)); pat.setColorAt(0, getColor(DEPTH_TOP)); neatFill = new QGraphicsPolygonItem(); neatFill->setPolygon(p); neatFill->setBrush(QBrush(pat)); neatFill->setPen(QPen(QBrush(Qt::transparent),0)); scene()->addItem(neatFill); /* if the user wants the deco ceiling more visible, do that here (this * basically draws over the background that we had allowed to shine * through so far) */ if (prefs.profile_dc_ceiling && prefs.profile_red_ceiling) { p.clear(); pat.setColorAt(0, getColor(CEILING_SHALLOW)); pat.setColorAt(1, getColor(CEILING_DEEP)); entry = gc.pi.entry; p.append(QPointF(SCALEGC(0, 0))); for (i = 0; i < gc.pi.nr; i++, entry++) { if (entry->in_deco && entry->stopdepth) { if (entry->stopdepth < entry->depth) { p.append(QPointF(SCALEGC(entry->sec, entry->stopdepth))); } else { p.append(QPointF(SCALEGC(entry->sec, entry->depth))); } } else { p.append(QPointF(SCALEGC(entry->sec, 0))); } } neatFill = new QGraphicsPolygonItem(); neatFill->setBrush(QBrush(pat)); neatFill->setPolygon(p); neatFill->setPen(QPen(QBrush(Qt::NoBrush),0)); scene()->addItem(neatFill); } /* finally, plot the calculated ceiling over all this */ if (prefs.profile_calc_ceiling) { pat.setColorAt(0, getColor(CALC_CEILING_SHALLOW)); pat.setColorAt(1, getColor(CALC_CEILING_DEEP)); entry = gc.pi.entry; p.clear(); p.append(QPointF(SCALEGC(0, 0))); for (i = 0; i < gc.pi.nr; i++, entry++) { if (entry->ceiling) p.append(QPointF(SCALEGC(entry->sec, entry->ceiling))); else p.append(QPointF(SCALEGC(entry->sec, 0))); } p.append(QPointF(SCALEGC((entry-1)->sec, 0))); neatFill = new QGraphicsPolygonItem(); neatFill->setPolygon(p); neatFill->setPen(QPen(QBrush(Qt::NoBrush),0)); neatFill->setBrush(pat); scene()->addItem(neatFill); } /* plot the calculated ceiling for all tissues */ if (prefs.profile_calc_ceiling && prefs.calc_all_tissues){ int k; for (k=0; k<16; k++){ pat.setColorAt(0, getColor(CALC_CEILING_SHALLOW)); pat.setColorAt(1, QColor(100, 100, 100, 50)); entry = gc.pi.entry; p.clear(); p.append(QPointF(SCALEGC(0, 0))); for (i = 0; i < gc.pi.nr; i++, entry++) { if ((entry->ceilings)[k]) p.append(QPointF(SCALEGC(entry->sec, (entry->ceilings)[k]))); else p.append(QPointF(SCALEGC(entry->sec, 0))); } p.append(QPointF(SCALEGC((entry-1)->sec, 0))); neatFill = new QGraphicsPolygonItem(); neatFill->setPolygon(p); neatFill->setBrush(pat); scene()->addItem(neatFill); } } /* next show where we have been bad and crossed the dc's ceiling */ if (prefs.profile_dc_ceiling) { pat.setColorAt(0, getColor(CEILING_SHALLOW)); pat.setColorAt(1, getColor(CEILING_DEEP)); entry = gc.pi.entry; p.clear(); p.append(QPointF(SCALEGC(0, 0))); for (i = 0; i < gc.pi.nr; i++, entry++) p.append(QPointF(SCALEGC(entry->sec, entry->depth))); for (i-- , entry--; i >= 0; i--, entry--) { if (entry->in_deco && entry->stopdepth > entry->depth) { p.append(QPointF(SCALEGC(entry->sec, entry->stopdepth))); } else { p.append(QPointF(SCALEGC(entry->sec, entry->depth))); } } } neatFill = new QGraphicsPolygonItem(); neatFill->setPolygon(p); neatFill->setPen(QPen(QBrush(Qt::NoBrush),0)); neatFill->setBrush(QBrush(pat)); scene()->addItem(neatFill); /* Now do it again for the velocity colors */ entry = gc.pi.entry; for (i = 1; i < gc.pi.nr; i++) { entry++; sec = entry->sec; /* we want to draw the segments in different colors * representing the vertical velocity, so we need to * chop this into short segments */ depth = entry->depth; QGraphicsLineItem *item = new QGraphicsLineItem(SCALEGC(entry[-1].sec, entry[-1].depth), SCALEGC(sec, depth)); QPen pen(defaultPen); pen.setColor(getColor((color_indice_t)(VELOCITY_COLORS_START_IDX + entry->velocity))); item->setPen(pen); scene()->addItem(item); } } QGraphicsItemGroup *ProfileGraphicsView::plot_text(text_render_options_t *tro,const QPointF& pos, const QString& text, QGraphicsItem *parent) { QFont fnt(font()); QFontMetrics fm(fnt); if (printMode) fnt.setPixelSize(tro->size); QPointF point(SCALEGC(pos.x(), pos.y())); // This is neded because of the SCALE macro. double dx = tro->hpos * (fm.width(text)); double dy = tro->vpos * (fm.height()); QGraphicsItemGroup *group = new QGraphicsItemGroup(parent); QPainterPath textPath; /* addText() uses bottom-left text baseline and the -3 offset is probably slightly off * for different font sizes. */ textPath.addText(0, fm.height() - 3, fnt, text); QPainterPathStroker stroker; stroker.setWidth(3); QGraphicsPathItem *strokedItem = new QGraphicsPathItem(stroker.createStroke(textPath), group); strokedItem->setBrush(QBrush(getColor(TEXT_BACKGROUND))); strokedItem->setPen(Qt::NoPen); QGraphicsPathItem *textItem = new QGraphicsPathItem(textPath, group); textItem->setBrush(QBrush(getColor(tro->color))); textItem->setPen(Qt::NoPen); group->setPos(point.x() + dx, point.y() + dy); if (!printMode) group->setFlag(QGraphicsItem::ItemIgnoresTransformations); if (!parent) scene()->addItem(group); return group; } void ProfileGraphicsView::resizeEvent(QResizeEvent *event) { refresh(); } void ProfileGraphicsView::plot_temperature_profile() { int last = 0; if (!setup_temperature_limits(&gc)) return; QPointF from; QPointF to; QColor color = getColor(TEMP_PLOT); for (int i = 0; i < gc.pi.nr; i++) { struct plot_data *entry = gc.pi.entry + i; int mkelvin = entry->temperature; int sec = entry->sec; if (!mkelvin) { if (!last) continue; mkelvin = last; } if (last) { to = QPointF(SCALEGC(sec, mkelvin)); QGraphicsLineItem *item = new QGraphicsLineItem(from.x(), from.y(), to.x(), to.y()); QPen pen(defaultPen); pen.setColor(color); item->setPen(pen); scene()->addItem(item); from = to; } else { from = QPointF(SCALEGC(sec, mkelvin)); } last = mkelvin; } } void ProfileGraphicsView::edit_dive_time(const QString& time) { // this should set the full time of the dive. refresh(); } void ProfileGraphicsView::on_rulerAction() { rulerEnabled = !rulerEnabled; refresh(); } void ProfileGraphicsView::on_scaleAction() { zoomed_plot = !zoomed_plot; refresh(); } void ToolTipItem::addToolTip(const QString& toolTip, const QIcon& icon) { QGraphicsPixmapItem *iconItem = 0; double yValue = title->boundingRect().height() + SPACING; Q_FOREACH(ToolTip t, toolTips) { yValue += t.second->boundingRect().height(); } if (!icon.isNull()) { iconItem = new QGraphicsPixmapItem(icon.pixmap(ICON_SMALL,ICON_SMALL), this); iconItem->setPos(SPACING, yValue); } QGraphicsSimpleTextItem *textItem = new QGraphicsSimpleTextItem(toolTip, this); textItem->setPos(SPACING + ICON_SMALL + SPACING, yValue); textItem->setBrush(QBrush(Qt::white)); textItem->setFlag(ItemIgnoresTransformations); toolTips.push_back(qMakePair(iconItem, textItem)); expand(); } void ToolTipItem::refresh(struct graphics_context *gc, QPointF pos) { clear(); int time = (pos.x() * gc->maxtime) / gc->maxx; char buffer[500]; get_plot_details(gc, time, buffer, 500); addToolTip(QString(buffer)); QList items = scene()->items(pos, Qt::IntersectsItemShape, Qt::DescendingOrder, transform()); Q_FOREACH(QGraphicsItem *item, items) { if (!item->toolTip().isEmpty()) addToolTip(item->toolTip()); } } void ToolTipItem::clear() { Q_FOREACH(ToolTip t, toolTips) { delete t.first; delete t.second; } toolTips.clear(); } void ToolTipItem::setRect(const QRectF& r) { // qDeleteAll(childItems()); delete background; rectangle = r; setBrush(QBrush(Qt::white)); setPen(QPen(Qt::black, 0.5)); // Creates a 2pixels border QPainterPath border; border.addRoundedRect(-4, -4, rectangle.width() + 8, rectangle.height() + 10, 3, 3); border.addRoundedRect(-1, -1, rectangle.width() + 3, rectangle.height() + 4, 3, 3); setPath(border); QPainterPath bg; bg.addRoundedRect(-1, -1, rectangle.width() + 3, rectangle.height() + 4, 3, 3); QColor c = QColor(Qt::black); c.setAlpha(155); QGraphicsPathItem *b = new QGraphicsPathItem(bg, this); b->setFlag(ItemStacksBehindParent); b->setFlags(ItemIgnoresTransformations); b->setBrush(c); b->setPen(QPen(QBrush(Qt::transparent), 0)); b->setZValue(-10); background = b; updateTitlePosition(); } void ToolTipItem::collapse() { QPropertyAnimation *animation = new QPropertyAnimation(this, "rect"); animation->setDuration(100); animation->setStartValue(nextRectangle); animation->setEndValue(QRect(0, 0, ICON_SMALL, ICON_SMALL)); animation->start(QAbstractAnimation::DeleteWhenStopped); clear(); status = COLLAPSED; } void ToolTipItem::expand() { if (!title) return; double width = 0, height = title->boundingRect().height() + SPACING; Q_FOREACH(ToolTip t, toolTips) { if (t.second->boundingRect().width() > width) width = t.second->boundingRect().width(); height += t.second->boundingRect().height(); } /* Left padding, Icon Size, space, right padding */ width += SPACING + ICON_SMALL + SPACING + SPACING; if (width < title->boundingRect().width() + SPACING*2) width = title->boundingRect().width() + SPACING*2; if (height < ICON_SMALL) height = ICON_SMALL; nextRectangle.setWidth(width); nextRectangle.setHeight(height); QPropertyAnimation *animation = new QPropertyAnimation(this, "rect"); animation->setDuration(100); animation->setStartValue(rectangle); animation->setEndValue(nextRectangle); animation->start(QAbstractAnimation::DeleteWhenStopped); status = EXPANDED; } ToolTipItem::ToolTipItem(QGraphicsItem* parent): QGraphicsPathItem(parent), background(0) { title = new QGraphicsSimpleTextItem(tr("Information"), this); separator = new QGraphicsLineItem(this); setFlags(ItemIgnoresTransformations | ItemIsMovable | ItemClipsChildrenToShape); status = COLLAPSED; updateTitlePosition(); setZValue(99); } ToolTipItem::~ToolTipItem() { clear(); } void ToolTipItem::updateTitlePosition() { if (rectangle.width() < title->boundingRect().width() + SPACING*4) { QRectF newRect = rectangle; newRect.setWidth(title->boundingRect().width() + SPACING*4); newRect.setHeight((newRect.height() && isExpanded()) ? newRect.height() : ICON_SMALL); setRect(newRect); } title->setPos(boundingRect().width()/2 - title->boundingRect().width()/2 -1, 0); title->setFlag(ItemIgnoresTransformations); title->setPen(QPen(Qt::white, 1)); title->setBrush(Qt::white); if (toolTips.size() > 0) { double x1 = 3; double y1 = title->pos().y() + SPACING/2 + title->boundingRect().height(); double x2 = boundingRect().width() - 10; double y2 = y1; separator->setLine(x1, y1, x2, y2); separator->setFlag(ItemIgnoresTransformations); separator->setPen(QPen(Qt::white)); separator->show(); } else { separator->hide(); } } bool ToolTipItem::isExpanded() { return status == EXPANDED; } void ToolTipItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { persistPos(); QGraphicsPathItem::mouseReleaseEvent(event); } void ToolTipItem::persistPos() { QPoint currentPos = scene()->views().at(0)->mapFromScene(pos()); QSettings s; s.beginGroup("ProfileMap"); s.setValue("tooltip_position", currentPos); s.endGroup(); } void ToolTipItem::readPos() { QSettings s; s.beginGroup("ProfileMap"); QPointF value = scene()->views().at(0)->mapToScene( s.value("tooltip_position").toPoint() ); if (!scene()->sceneRect().contains(value)){ value = QPointF(0,0); } setPos(value); } QColor EventItem::getColor(const color_indice_t i) { return profile_color[i].at((isGrayscale) ? 1 : 0); } EventItem::EventItem(struct event *ev, QGraphicsItem* parent, bool grayscale): QGraphicsPixmapItem(parent), ev(ev), isGrayscale(grayscale) { if(ev->name && (strcmp(ev->name, "bookmark") == 0 || strcmp(ev->name, "heading") == 0)) { setPixmap( QPixmap(QString(":flag")).scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } else { setPixmap( QPixmap(QString(":warning")).scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation)); } } RulerNodeItem::RulerNodeItem(QGraphicsItem *parent, graphics_context context) : QGraphicsEllipseItem(parent), gc(context), entry(NULL) , ruler(NULL) { setRect(QRect(QPoint(-8,8),QPoint(8,-8))); setBrush(QColor(0xff, 0, 0, 127)); setPen(QColor("#FF0000")); setFlag(QGraphicsItem::ItemIsMovable); setFlag(ItemSendsGeometryChanges); setFlag(ItemIgnoresTransformations); } void RulerNodeItem::setRuler(RulerItem *r) { ruler = r; } void RulerNodeItem::recalculate() { struct plot_info *pi = &gc.pi; struct plot_data *data = pi->entry+(pi->nr-1); uint16_t count = 0; if (x() < 0) { setPos(0, y()); } else if (x() > SCALEXGC(data->sec)) { setPos(SCALEXGC(data->sec), y()); } else { data = pi->entry; count=0; while (SCALEXGC(data->sec) < x() && count < pi->nr) { data = pi->entry+count; count++; } setPos(SCALEGC(data->sec, data->depth)); entry=data; } } QVariant RulerNodeItem::itemChange(GraphicsItemChange change, const QVariant &value) { if(change == ItemPositionHasChanged) { recalculate(); if(ruler != NULL) ruler->recalculate(); if (scene()) { scene()->update(); } } return QGraphicsEllipseItem::itemChange(change, value); } RulerItem::RulerItem(QGraphicsItem *parent, RulerNodeItem *sourceNode, RulerNodeItem *destNode) : QGraphicsObject(parent), source(sourceNode), dest(destNode) { recalculate(); } void RulerItem::recalculate() { char buffer[500]; QPointF tmp; QFont font; QFontMetrics fm(font); if (source == NULL || dest == NULL) return; prepareGeometryChange(); startPoint = mapFromItem(source, 0, 0); endPoint = mapFromItem(dest, 0, 0); if (startPoint.x() > endPoint.x()) { tmp = endPoint; endPoint = startPoint; startPoint = tmp; } QLineF line(startPoint, endPoint); compare_samples(source->entry, dest->entry, buffer, 500, 1); text = QString(buffer); QRect r = fm.boundingRect(QRect(QPoint(10,-1*INT_MAX), QPoint(line.length()-10, 0)), Qt::TextWordWrap, text); if (r.height() < 10) height = 10; else height = r.height(); QLineF line_n = line.normalVector(); line_n.setLength(height); if (scene()) { /* Determine whether we draw down or upwards */ if (scene()->sceneRect().contains(line_n.p2()) && scene()->sceneRect().contains(endPoint+QPointF(line_n.dx(),line_n.dy()))) paint_direction = -1; else paint_direction = 1; } } RulerNodeItem *RulerItem::sourceNode() const { return source; } RulerNodeItem *RulerItem::destNode() const { return dest; } void RulerItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { QLineF line(startPoint, endPoint); QLineF line_n = line.normalVector(); painter->setPen(QColor(Qt::black)); painter->setBrush(Qt::NoBrush); line_n.setLength(height); if (paint_direction == 1) line_n.setAngle(line_n.angle()+180); painter->drawLine(line); painter->drawLine(line_n); painter->drawLine(line_n.p1() + QPointF(line.dx(), line.dy()), line_n.p2() + QPointF(line.dx(), line.dy())); //Draw Text painter->save(); painter->translate(startPoint.x(), startPoint.y()); painter->rotate(line.angle()*-1); if (paint_direction == 1) painter->translate(0, height); painter->setPen(Qt::black); painter->drawText(QRectF(QPointF(10,-1*height), QPointF(line.length()-10, 0)), Qt::TextWordWrap, text); painter->restore(); } QRectF RulerItem::boundingRect() const { return shape().controlPointRect(); } QPainterPath RulerItem::shape() const { QPainterPath path; QLineF line(startPoint, endPoint); QLineF line_n = line.normalVector(); line_n.setLength(height); if (paint_direction == 1) line_n.setAngle(line_n.angle()+180); path.moveTo(startPoint); path.lineTo(line_n.p2()); path.lineTo(line_n.p2() + QPointF(line.dx(), line.dy())); path.lineTo(endPoint); path.lineTo(startPoint); return path; } GraphicsTextEditor::GraphicsTextEditor(QGraphicsItem* parent): QGraphicsTextItem(parent) { } void GraphicsTextEditor::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) { // Remove the proxy filter so we can focus here. mainWindow()->graphics()->setFocusProxy(0); setTextInteractionFlags(Qt::TextEditorInteraction | Qt::TextEditable); } void GraphicsTextEditor::keyReleaseEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Enter || event->key() == Qt::Key_Return){ setTextInteractionFlags(Qt::NoTextInteraction); emit editingFinished( toPlainText() ); mainWindow()->graphics()->setFocusProxy(mainWindow()->dive_list()); return; } emit textChanged( toPlainText() ); QGraphicsTextItem::keyReleaseEvent(event); } Subsurface-4.0.2/qt-ui/profilegraphics.h000066400000000000000000000126711226345450700202270ustar00rootroot00000000000000#ifndef PROFILEGRAPHICS_H #define PROFILEGRAPHICS_H #include "graphicsview-common.h" #include "../display.h" #include #include #include #include #include #include struct text_render_options; struct graphics_context; struct plot_info; typedef struct text_render_options text_render_options_t; /* To use a tooltip, simply ->setToolTip on the QGraphicsItem that you want * or, if it's a "global" tooltip, set it on the mouseMoveEvent of the ProfileGraphicsView. */ class ToolTipItem :public QObject, public QGraphicsPathItem { Q_OBJECT void updateTitlePosition(); Q_PROPERTY(QRectF rect READ boundingRect WRITE setRect) public: enum Status{COLLAPSED, EXPANDED}; enum {ICON_SMALL = 16, ICON_MEDIUM = 24, ICON_BIG = 32, SPACING=4}; explicit ToolTipItem(QGraphicsItem* parent = 0); virtual ~ToolTipItem(); void collapse(); void expand(); void clear(); void addToolTip(const QString& toolTip, const QIcon& icon = QIcon()); void refresh(struct graphics_context* gc, QPointF pos); bool isExpanded(); void persistPos(); void readPos(); void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); public slots: void setRect(const QRectF& rect); private: typedef QPair ToolTip; QVector toolTips; QGraphicsPathItem *background; QGraphicsLineItem *separator; QGraphicsSimpleTextItem *title; Status status; QRectF rectangle; QRectF nextRectangle; }; class RulerItem; class RulerNodeItem : public QObject, public QGraphicsEllipseItem { Q_OBJECT friend class RulerItem; public: explicit RulerNodeItem(QGraphicsItem* parent, graphics_context gc); void setRuler(RulerItem *r); void recalculate(); protected: QVariant itemChange(GraphicsItemChange change, const QVariant & value ); private: graphics_context gc; struct plot_data *entry; RulerItem* ruler; }; class RulerItem : public QGraphicsObject { Q_OBJECT public: explicit RulerItem(QGraphicsItem* parent, RulerNodeItem *sourceMarker, RulerNodeItem *destMarker); void recalculate(); RulerNodeItem* sourceNode() const; RulerNodeItem* destNode() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget * widget = 0); QRectF boundingRect() const; QPainterPath shape() const; private: QPointF startPoint, endPoint; RulerNodeItem *source, *dest; QString text; int height; int paint_direction; }; class EventItem : public QGraphicsPixmapItem { public: explicit EventItem(struct event *ev, QGraphicsItem* parent = 0, bool grayscale = FALSE); struct event* ev; private: QString text; bool isGrayscale; QColor getColor(const color_indice_t i); }; class GraphicsTextEditor : public QGraphicsTextItem{ Q_OBJECT public: GraphicsTextEditor(QGraphicsItem* parent = 0); protected: virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event); virtual void keyReleaseEvent(QKeyEvent* event); signals: void textChanged(const QString& text); void editingFinished(const QString& text); }; class ProfileGraphicsView : public QGraphicsView { Q_OBJECT public: enum Mode{DIVE, PLAN}; ProfileGraphicsView(QWidget* parent = 0); void plot(struct dive *d, bool forceRedraw = FALSE); bool eventFilter(QObject* obj, QEvent* event); void clear(); void setPrintMode(bool mode, bool grayscale = FALSE); protected: void resizeEvent(QResizeEvent *event); void mouseMoveEvent(QMouseEvent* event); void wheelEvent(QWheelEvent* event); void showEvent(QShowEvent* event); void contextMenuEvent(QContextMenuEvent* event); public slots: void refresh(); void edit_dive_time(const QString& time); void on_rulerAction(); void on_scaleAction(); void changeGas(); void hideEvents(); void unhideEvents(); void removeEvent(); void addBookmark(); private: void plot_depth_profile(); QGraphicsItemGroup *plot_text(text_render_options_t *tro, const QPointF& pos, const QString &text, QGraphicsItem *parent = 0); void plot_events(struct divecomputer *dc); void plot_one_event(struct event *event); void plot_temperature_profile(); void plot_cylinder_pressure(); void plot_temperature_text(); void plot_single_temp_text(int sec, int mkelvin); void plot_depth_text(); void plot_text_samples(); void plot_depth_sample(struct plot_data *entry, text_render_options_t *tro); void plot_cylinder_pressure_text(); void plot_pressure_value(int mbar, int sec, double xalign, double yalign); void plot_gas_value(int mbar, int sec, double xalign, double yalign, int o2, int he); void plot_deco_text(); void plot_add_line(int sec, double val, QColor c, QPointF &from); void plot_pp_gas_profile(); void plot_pp_text(); void plot_depth_scale(); void addControlItems(struct dive *d); void create_ruler(); void add_ruler(); void remove_ruler(); QColor getColor(const color_indice_t i); QColor get_sac_color(int sac, int avg_sac); void scrollViewTo(const QPoint pos); void createPPLegend(QString tr, const QColor& c, QPointF& legendPos); QPen defaultPen; QBrush defaultBrush; ToolTipItem *toolTip; graphics_context gc; struct dive *dive; struct divecomputer *diveDC; int zoomLevel; bool rulerEnabled; bool printMode; bool isGrayscale; // Top Level Items. QGraphicsItem* profileGrid; QGraphicsItem* timeMarkers; QGraphicsItem* depthMarkers; QGraphicsItem* diveComputer; RulerItem *rulerItem; QGraphicsProxyWidget *toolBarProxy; // For 'Plan' mode.: GraphicsTextEditor *depthEditor; GraphicsTextEditor *timeEditor; enum Mode mode; }; #endif Subsurface-4.0.2/qt-ui/renumber.ui000066400000000000000000000043671226345450700170560ustar00rootroot00000000000000 RenumberDialog 0 0 211 125 Renumber :/subsurface-icon 1 3 New starting number 0 1 99999 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() RenumberDialog accept() 248 254 157 274 buttonBox rejected() RenumberDialog reject() 316 260 286 274 Subsurface-4.0.2/qt-ui/shifttimes.ui000066400000000000000000000071461226345450700174140ustar00rootroot00000000000000 ShiftTimesDialog 0 0 343 177 0 0 Shift selected times :/subsurface-icon 6 9 Shift times of selected dives by 6 9 2000 1 1 0 0 0 2000 1 1 2000 1 1 h:mm Qt::LocalTime earlier later true Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() ShiftTimesDialog accept() 248 254 157 274 buttonBox rejected() ShiftTimesDialog reject() 316 260 286 274 Subsurface-4.0.2/qt-ui/simplewidgets.cpp000066400000000000000000000101341226345450700202510ustar00rootroot00000000000000#include "simplewidgets.h" #include #include #include #include #include #include #include #include #include #include #include #include "../dive.h" #include "mainwindow.h" class MinMaxAvgWidgetPrivate{ public: QLabel *avgIco, *avgValue; QLabel *minIco, *minValue; QLabel *maxIco, *maxValue; MinMaxAvgWidgetPrivate(MinMaxAvgWidget *owner){ avgIco = new QLabel(owner); avgIco->setPixmap(QIcon(":/average").pixmap(16,16)); avgIco->setToolTip(QObject::tr("Average")); minIco = new QLabel(owner); minIco->setPixmap(QIcon(":/minimum").pixmap(16,16)); minIco->setToolTip(QObject::tr("Minimum")); maxIco = new QLabel(owner); maxIco->setPixmap(QIcon(":/maximum").pixmap(16,16)); maxIco->setToolTip(QObject::tr("Maximum")); avgValue = new QLabel(owner); minValue = new QLabel(owner); maxValue = new QLabel(owner); QGridLayout *formLayout = new QGridLayout(); formLayout->addWidget(maxIco, 0, 0); formLayout->addWidget(maxValue, 0, 1); formLayout->addWidget(avgIco, 1, 0); formLayout->addWidget(avgValue, 1, 1); formLayout->addWidget(minIco, 2, 0); formLayout->addWidget(minValue, 2, 1); owner->setLayout(formLayout); } }; double MinMaxAvgWidget::average() const { return d->avgValue->text().toDouble(); } double MinMaxAvgWidget::maximum() const { return d->maxValue->text().toDouble(); } double MinMaxAvgWidget::minimum() const { return d->minValue->text().toDouble(); } MinMaxAvgWidget::MinMaxAvgWidget(QWidget* parent) : d(new MinMaxAvgWidgetPrivate(this)){ } MinMaxAvgWidget::~MinMaxAvgWidget() { } void MinMaxAvgWidget::clear() { d->avgValue->setText(QString()); d->maxValue->setText(QString()); d->minValue->setText(QString()); } void MinMaxAvgWidget::setAverage(double average) { d->avgValue->setText(QString::number(average)); } void MinMaxAvgWidget::setMaximum(double maximum) { d->maxValue->setText(QString::number(maximum)); } void MinMaxAvgWidget::setMinimum(double minimum) { d->minValue->setText(QString::number(minimum)); } void MinMaxAvgWidget::setAverage(const QString& average) { d->avgValue->setText(average); } void MinMaxAvgWidget::setMaximum(const QString& maximum) { d->maxValue->setText(maximum); } void MinMaxAvgWidget::setMinimum(const QString& minimum) { d->minValue->setText(minimum); } RenumberDialog* RenumberDialog::instance() { static RenumberDialog* self = new RenumberDialog(mainWindow()); return self; } void RenumberDialog::buttonClicked(QAbstractButton* button) { if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole){ qDebug() << "Renumbering."; renumber_dives(ui.spinBox->value()); } } RenumberDialog::RenumberDialog(QWidget *parent): QDialog(parent) { ui.setupUi(this); connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); } ShiftTimesDialog* ShiftTimesDialog::instance() { static ShiftTimesDialog* self = new ShiftTimesDialog(mainWindow()); return self; } void ShiftTimesDialog::buttonClicked(QAbstractButton* button) { int amount; if (ui.buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole){ amount = ui.timeEdit->time().hour() * 3600 + ui.timeEdit->time().minute() * 60; if (ui.backwards->isChecked()) amount *= -1; if (amount != 0) { // DANGER, DANGER - this could get our dive_table unsorted... shift_times(amount); sort_table(&dive_table); mark_divelist_changed(TRUE); mainWindow()->dive_list()->rememberSelection(); mainWindow()->refreshDisplay(); mainWindow()->dive_list()->restoreSelection(); } } } ShiftTimesDialog::ShiftTimesDialog(QWidget *parent): QDialog(parent) { ui.setupUi(this); connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); } bool isGnome3Session() { #if defined(QT_OS_WIW) || defined(QT_OS_MAC) return false; #else if (qApp->style()->objectName() != "gtk+") return false; QProcess p; p.start("pidof", QStringList() << "gnome-shell" ); p.waitForFinished(-1); QString p_stdout = p.readAllStandardOutput(); return !p_stdout.isEmpty(); #endif } Subsurface-4.0.2/qt-ui/simplewidgets.h000066400000000000000000000025271226345450700177250ustar00rootroot00000000000000#ifndef SIMPLEWIDGETS_H #define SIMPLEWIDGETS_H class MinMaxAvgWidgetPrivate; class QAbstractButton; #include #include #include "ui_renumber.h" #include "ui_shifttimes.h" class MinMaxAvgWidget : public QWidget{ Q_OBJECT Q_PROPERTY(double minimum READ minimum WRITE setMinimum) Q_PROPERTY(double maximum READ maximum WRITE setMaximum) Q_PROPERTY(double average READ average WRITE setAverage) public: MinMaxAvgWidget(QWidget *parent); ~MinMaxAvgWidget(); double minimum() const; double maximum() const; double average() const; void setMinimum(double minimum); void setMaximum(double maximum); void setAverage(double average); void setMinimum(const QString& minimum); void setMaximum(const QString& maximum); void setAverage(const QString& average); void clear(); private: QScopedPointer d; }; class RenumberDialog : public QDialog { Q_OBJECT public: static RenumberDialog *instance(); private slots: void buttonClicked(QAbstractButton *button); private: explicit RenumberDialog(QWidget *parent); Ui::RenumberDialog ui; }; class ShiftTimesDialog : public QDialog { Q_OBJECT public: static ShiftTimesDialog *instance(); private slots: void buttonClicked(QAbstractButton *button); private: explicit ShiftTimesDialog(QWidget *parent); Ui::ShiftTimesDialog ui; }; bool isGnome3Session(); #endif Subsurface-4.0.2/qt-ui/starwidget.cpp000066400000000000000000000057211226345450700175540ustar00rootroot00000000000000#include "starwidget.h" #include #include #include #include #include #include #include #include QPixmap* StarWidget::activeStar = 0; QPixmap* StarWidget::inactiveStar = 0; QPixmap StarWidget::starActive() { return (*activeStar); } QPixmap StarWidget::starInactive() { return (*inactiveStar); } int StarWidget::currentStars() const { return current; } void StarWidget::mouseReleaseEvent(QMouseEvent* event) { if (readOnly) { return; } int starClicked = event->pos().x() / IMG_SIZE + 1; if (starClicked > TOTALSTARS) starClicked = TOTALSTARS; if (current == starClicked) current -= 1; else current = starClicked; Q_EMIT valueChanged(current); update(); } void StarWidget::paintEvent(QPaintEvent* event) { QPainter p(this); for(int i = 0; i < current; i++) p.drawPixmap(i * IMG_SIZE + SPACING, 0, starActive()); for(int i = current; i < TOTALSTARS; i++) p.drawPixmap(i * IMG_SIZE + SPACING, 0, starInactive()); if(hasFocus()){ QStyleOptionFocusRect option; option.initFrom(this); option.backgroundColor = palette().color(QPalette::Background); style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &p, this); } } void StarWidget::setCurrentStars(int value) { current = value; update(); Q_EMIT valueChanged(current); } StarWidget::StarWidget(QWidget* parent, Qt::WindowFlags f): QWidget(parent, f), current(0), readOnly(false) { if (!activeStar) { activeStar = new QPixmap(); QSvgRenderer render(QString(":star")); QPixmap renderedStar(IMG_SIZE, IMG_SIZE); renderedStar.fill(Qt::transparent); QPainter painter(&renderedStar); render.render(&painter, QRectF(0, 0, IMG_SIZE, IMG_SIZE)); (*activeStar) = renderedStar; } if (!inactiveStar) { inactiveStar = new QPixmap(); (*inactiveStar) = grayImage(activeStar); } setFocusPolicy(Qt::StrongFocus); } QPixmap StarWidget::grayImage(QPixmap* coloredImg) { QImage img = coloredImg->toImage(); for (int i = 0; i < img.width(); ++i) { for (int j = 0; j < img.height(); ++j) { QRgb rgb = img.pixel(i, j); if (!rgb) continue; QColor c(rgb); int gray = (c.red() + c.green() + c.blue()) / 3; img.setPixel(i, j, qRgb(gray, gray, gray)); } } return QPixmap::fromImage(img); } QSize StarWidget::sizeHint() const { return QSize(IMG_SIZE * TOTALSTARS + SPACING * (TOTALSTARS-1), IMG_SIZE); } void StarWidget::setReadOnly(bool r) { readOnly = r; } void StarWidget::focusInEvent(QFocusEvent* event) { setFocus(); QWidget::focusInEvent(event); } void StarWidget::focusOutEvent(QFocusEvent* event) { QWidget::focusOutEvent(event); } void StarWidget::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Right){ if (currentStars() < TOTALSTARS){ setCurrentStars( currentStars()+1); } }else if(event->key() == Qt::Key_Down || event->key() == Qt::Key_Left){ if(currentStars() > 0){ setCurrentStars( currentStars()-1); } } } Subsurface-4.0.2/qt-ui/starwidget.h000066400000000000000000000016061226345450700172170ustar00rootroot00000000000000#ifndef STARWIDGET_H #define STARWIDGET_H #include enum StarConfig {SPACING = 2, IMG_SIZE = 16, TOTALSTARS = 5}; class StarWidget : public QWidget { Q_OBJECT public: explicit StarWidget(QWidget* parent = 0, Qt::WindowFlags f = 0); int currentStars() const; /*reimp*/ QSize sizeHint() const; static QPixmap starActive(); static QPixmap starInactive(); signals: void valueChanged(int stars); public slots: void setCurrentStars(int value); void setReadOnly( bool readOnly); protected: /*reimp*/ void mouseReleaseEvent(QMouseEvent* ); /*reimp*/ void paintEvent(QPaintEvent* ); /*reimp*/ void focusInEvent(QFocusEvent*); /*reimp*/ void focusOutEvent(QFocusEvent*); /*reimp*/ void keyPressEvent(QKeyEvent*); private: int current; bool readOnly; static QPixmap* activeStar; static QPixmap* inactiveStar; QPixmap grayImage(QPixmap *coloredImg); }; #endif // STARWIDGET_H Subsurface-4.0.2/qt-ui/subsurfacewebservices.cpp000066400000000000000000000561471226345450700220130ustar00rootroot00000000000000#include "subsurfacewebservices.h" #include "../webservice.h" #include "mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "../dive.h" #include "../divelist.h" #ifdef Q_OS_UNIX # include // for dup(2) #endif struct dive_table gps_location_table; static bool merge_locations_into_dives(void); static bool is_automatic_fix(struct dive *gpsfix) { if (gpsfix && gpsfix->location && (!strcmp(gpsfix->location, "automatic fix") || !strcmp(gpsfix->location, "Auto-created dive"))) return TRUE; return FALSE; } #define SAME_GROUP 6 * 3600 // six hours static bool merge_locations_into_dives(void) { int i, nr = 0, changed = 0; struct dive *gpsfix, *last_named_fix = NULL, *dive; sort_table(&gps_location_table); for_each_gps_location(i, gpsfix) { if (is_automatic_fix(gpsfix)) { dive = find_dive_including(gpsfix->when); if (dive && !dive_has_gps_location(dive)) { #if DEBUG_WEBSERVICE struct tm tm; utc_mkdate(gpsfix->when, &tm); printf("found dive named %s @ %04d-%02d-%02d %02d:%02d:%02d\n", gpsfix->location, tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); #endif changed++; copy_gps_location(gpsfix, dive); } } else { if (last_named_fix && dive_within_time_range(last_named_fix, gpsfix->when, SAME_GROUP)) { nr++; } else { nr = 1; last_named_fix = gpsfix; } dive = find_dive_n_near(gpsfix->when, nr, SAME_GROUP); if (dive) { if (!dive_has_gps_location(dive)) { copy_gps_location(gpsfix, dive); changed++; } if (!dive->location) { dive->location = strdup(gpsfix->location); changed++; } } else { struct tm tm; utc_mkdate(gpsfix->when, &tm); #if DEBUG_WEBSERVICE printf("didn't find dive matching gps fix named %s @ %04d-%02d-%02d %02d:%02d:%02d\n", gpsfix->location, tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); #endif } } } return changed > 0; } static void clear_table(struct dive_table *table) { int i; for (i = 0; i < table->nr; i++) free(table->dives[i]); table->nr = 0; } bool DivelogsDeWebServices::prepare_dives_for_divelogs(const QString &tempfile, const bool selected, QString *errorMsg) { static const char errPrefix[] = "divelog.de-upload:"; if (!amount_selected) { *errorMsg = tr("no dives were selected"); return false; } xsltStylesheetPtr xslt = NULL; struct zip *zip; xslt = get_stylesheet("divelogs-export.xslt"); if (!xslt) { qDebug() << errPrefix << "missing stylesheet"; return false; } int error_code; zip = zip_open(QFile::encodeName(tempfile), ZIP_CREATE, &error_code); if (!zip) { char buffer[1024]; zip_error_to_str(buffer, sizeof buffer, error_code, errno); *errorMsg = tr("failed to create zip file for upload: %1") .arg(QString::fromLocal8Bit(buffer)); return false; } /* walk the dive list in chronological order */ for (int i = 0; i < dive_table.nr; i++) { FILE *f; char filename[PATH_MAX]; int streamsize; char *membuf; xmlDoc *transformed; struct zip_source *s; /* * Get the i'th dive in XML format so we can process it. * We need to save to a file before we can reload it back into memory... */ struct dive *dive = get_dive(i); if (!dive) continue; if (selected && !dive->selected) continue; f = tmpfile(); if (!f) { *errorMsg = tr("cannot create temporary file: %1").arg(qt_error_string()); goto error_close_zip; } save_dive(f, dive); fseek(f, 0, SEEK_END); streamsize = ftell(f); rewind(f); membuf = (char *)malloc(streamsize + 1); if (!membuf || !fread(membuf, streamsize, 1, f)) { *errorMsg = tr("internal error: %1").arg(qt_error_string()); fclose(f); free((void *)membuf); goto error_close_zip; } membuf[streamsize] = 0; fclose(f); /* * Parse the memory buffer into XML document and * transform it to divelogs.de format, finally dumping * the XML into a character buffer. */ xmlDoc *doc = xmlReadMemory(membuf, streamsize, "divelog", NULL, 0); if (!doc) { qWarning() << errPrefix << "could not parse back into memory the XML file we've just created!"; *errorMsg = tr("internal error"); free((void *)membuf); goto error_close_zip; } free((void *)membuf); transformed = xsltApplyStylesheet(xslt, doc, NULL); xmlDocDumpMemory(transformed, (xmlChar **) &membuf, &streamsize); xmlFreeDoc(doc); xmlFreeDoc(transformed); /* * Save the XML document into a zip file. */ snprintf(filename, PATH_MAX, "%d.xml", i + 1); s = zip_source_buffer(zip, membuf, streamsize, 1); if (s) { int64_t ret = zip_add(zip, filename, s); if (ret == -1) qDebug() << errPrefix << "failed to include dive:" << i; } } zip_close(zip); xsltFreeStylesheet(xslt); return true; error_close_zip: zip_close(zip); QFile::remove(tempfile); xsltFreeStylesheet(xslt); return false; } WebServices::WebServices(QWidget* parent, Qt::WindowFlags f): QDialog(parent, f) , reply(0) { ui.setupUi(this); connect(ui.buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); connect(ui.download, SIGNAL(clicked(bool)), this, SLOT(startDownload())); connect(ui.upload, SIGNAL(clicked(bool)), this, SLOT(startUpload())); connect(&timeout, SIGNAL(timeout()), this, SLOT(downloadTimedOut())); ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); timeout.setSingleShot(true); defaultApplyText = ui.buttonBox->button(QDialogButtonBox::Apply)->text(); } void WebServices::hidePassword() { ui.password->hide(); ui.passLabel->hide(); } void WebServices::hideUpload() { ui.upload->hide(); ui.download->show(); } void WebServices::hideDownload() { ui.download->hide(); ui.upload->show(); } QNetworkAccessManager *WebServices::manager() { static QNetworkAccessManager *manager = new QNetworkAccessManager(qApp); return manager; } void WebServices::downloadTimedOut() { if (!reply) return; reply->deleteLater(); reply = NULL; resetState(); ui.status->setText(tr("Operation timed out")); } void WebServices::updateProgress(qint64 current, qint64 total) { if (!reply) return; if (total == -1) { total = INT_MAX / 2 - 1; } if (total >= INT_MAX / 2) { // over a gigabyte! if (total >= Q_INT64_C(1) << 47) { total >>= 16; current >>= 16; } total >>= 16; current >>= 16; } ui.progressBar->setRange(0, total); ui.progressBar->setValue(current); ui.status->setText(tr("Transfering data...")); // reset the timer: 30 seconds after we last got any data timeout.start(); } void WebServices::connectSignalsForDownload(QNetworkReply *reply) { connect(reply, SIGNAL(finished()), this, SLOT(downloadFinished())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(updateProgress(qint64,qint64))); timeout.start(30000); // 30s } void WebServices::resetState() { ui.download->setEnabled(true); ui.upload->setEnabled(true); ui.userID->setEnabled(true); ui.password->setEnabled(true); ui.progressBar->reset(); ui.progressBar->setRange(0,1); ui.status->setText(QString()); ui.buttonBox->button(QDialogButtonBox::Apply)->setText(defaultApplyText); } // # // # // # Subsurface Web Service Implementation. // # // # SubsurfaceWebServices* SubsurfaceWebServices::instance() { static SubsurfaceWebServices *self = new SubsurfaceWebServices(mainWindow()); self->setAttribute(Qt::WA_QuitOnClose, false); return self; } SubsurfaceWebServices::SubsurfaceWebServices(QWidget* parent, Qt::WindowFlags f) { QSettings s; ui.userID->setText(s.value("subsurface_webservice_uid").toString().toUpper()); hidePassword(); hideUpload(); } void SubsurfaceWebServices::buttonClicked(QAbstractButton* button) { ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); switch(ui.buttonBox->buttonRole(button)){ case QDialogButtonBox::ApplyRole:{ clear_table(&gps_location_table); QByteArray url = tr("Webservice").toLocal8Bit(); parse_xml_buffer(url.data(), downloadedData.data(), downloadedData.length(), &gps_location_table, NULL, NULL); /* now merge the data in the gps_location table into the dive_table */ if (merge_locations_into_dives()) { mark_divelist_changed(TRUE); } /* store last entered uid in config */ QSettings s; s.setValue("subsurface_webservice_uid", ui.userID->text().toUpper()); s.sync(); hide(); close(); resetState(); } break; case QDialogButtonBox::RejectRole: if (reply != NULL && reply->isOpen()) { reply->abort(); delete reply; reply = NULL; } resetState(); break; case QDialogButtonBox::HelpRole: QDesktopServices::openUrl(QUrl("http://api.hohndel.org")); break; default: break; } } void SubsurfaceWebServices::startDownload() { QUrl url("http://api.hohndel.org/api/dive/get/"); url.addQueryItem("login", ui.userID->text().toUpper()); QNetworkRequest request; request.setUrl(url); request.setRawHeader("Accept", "text/xml"); reply = manager()->get(request); ui.status->setText(tr("Connecting...")); ui.progressBar->setRange(0,0); // this makes the progressbar do an 'infinite spin' ui.download->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); connectSignalsForDownload(reply); } void SubsurfaceWebServices::downloadFinished() { if (!reply) return; ui.progressBar->setRange(0,1); downloadedData = reply->readAll(); ui.download->setEnabled(true); ui.status->setText(tr("Download finished")); uint resultCode = download_dialog_parse_response(downloadedData); setStatusText(resultCode); if (resultCode == DD_STATUS_OK){ ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); } reply->deleteLater(); reply = NULL; } void SubsurfaceWebServices::downloadError(QNetworkReply::NetworkError) { resetState(); ui.status->setText(tr("Download error: %1").arg(reply->errorString())); reply->deleteLater(); reply = NULL; } void SubsurfaceWebServices::setStatusText(int status) { QString text; switch (status) { case DD_STATUS_ERROR_CONNECT: text = tr("Connection Error: "); break; case DD_STATUS_ERROR_ID: text = tr("Invalid user identifier!"); break; case DD_STATUS_ERROR_PARSE: text = tr("Cannot parse response!"); break; case DD_STATUS_OK: text = tr("Download Success!"); break; } ui.status->setText(text); } /* requires that there is a or tag under the tag */ void SubsurfaceWebServices::download_dialog_traverse_xml(xmlNodePtr node, unsigned int *download_status) { xmlNodePtr cur_node; for (cur_node = node; cur_node; cur_node = cur_node->next) { if ((!strcmp((const char *)cur_node->name, (const char *)"download")) && (!strcmp((const char *)xmlNodeGetContent(cur_node), (const char *)"ok"))) { *download_status = DD_STATUS_OK; return; } else if (!strcmp((const char *)cur_node->name, (const char *)"error")) { *download_status = DD_STATUS_ERROR_ID; return; } } } unsigned int SubsurfaceWebServices::download_dialog_parse_response(const QByteArray& xml) { xmlNodePtr root; xmlDocPtr doc = xmlParseMemory(xml.data(), xml.length()); unsigned int status = DD_STATUS_ERROR_PARSE; if (!doc) return DD_STATUS_ERROR_PARSE; root = xmlDocGetRootElement(doc); if (!root) { status = DD_STATUS_ERROR_PARSE; goto end; } if (root->children) download_dialog_traverse_xml(root->children, &status); end: xmlFreeDoc(doc); return status; } // # // # // # Divelogs DE Web Service Implementation. // # // # struct DiveListResult { QString errorCondition; QString errorDetails; QByteArray idList; // comma-separated, suitable to be sent in the fetch request int idCount; }; static DiveListResult parseDiveLogsDeDiveList(const QByteArray &xmlData) { /* XML format seems to be: * * * DD.MM.YYYY hh:mm * [repeat ] * * */ QXmlStreamReader reader(xmlData); const QString invalidXmlError = DivelogsDeWebServices::tr("Invalid response from server"); bool seenDiveDates = false; DiveListResult result; result.idCount = 0; if (reader.readNextStartElement() && reader.name() != "DiveDateReader") { result.errorCondition = invalidXmlError; result.errorDetails = DivelogsDeWebServices::tr("Expected XML tag 'DiveDateReader', got instead '%1") .arg(reader.name().toString()); goto out; } while (reader.readNextStartElement()) { if (reader.name() != "DiveDates") { if (reader.name() == "Login") { QString status = reader.readElementText(); // qDebug() << "Login status:" << status; // Note: there has to be a better way to determine a successful login... if (status == "failed") { result.errorCondition = "Login failed"; goto out; } } else { // qDebug() << "Skipping" << reader.name(); } continue; } // process seenDiveDates = true; while (reader.readNextStartElement()) { if (reader.name() != "date") { // qDebug() << "Skipping" << reader.name(); continue; } QStringRef id = reader.attributes().value("divelogsId"); // qDebug() << "Found" << reader.name() << "with id =" << id; if (!id.isEmpty()) { result.idList += id.toLatin1(); result.idList += ','; ++result.idCount; } reader.skipCurrentElement(); } } // chop the ending comma, if any result.idList.chop(1); if (!seenDiveDates) { result.errorCondition = invalidXmlError; result.errorDetails = DivelogsDeWebServices::tr("Expected XML tag 'DiveDates' not found"); } out: if (reader.hasError()) { // if there was an XML error, overwrite the result or other error conditions result.errorCondition = invalidXmlError; result.errorDetails = DivelogsDeWebServices::tr("Malformed XML response. Line %1: %2") .arg(reader.lineNumber()).arg(reader.errorString()); } return result; } DivelogsDeWebServices* DivelogsDeWebServices::instance() { static DivelogsDeWebServices *self = new DivelogsDeWebServices(mainWindow()); self->setAttribute(Qt::WA_QuitOnClose, false); return self; } void DivelogsDeWebServices::downloadDives() { uploadMode = false; resetState(); hideUpload(); exec(); } void DivelogsDeWebServices::prepareDivesForUpload() { QString errorText; /* generate a random filename and create/open that file with zip_open */ QString filename = QDir::tempPath() + "/import-" + QString::number(qrand() % 99999999) + ".dld"; if (prepare_dives_for_divelogs(filename, true, &errorText)) { QFile f(filename); if (f.open(QIODevice::ReadOnly)) { uploadDives((QIODevice *)&f); f.close(); f.remove(); return; } } mainWindow()->showError(errorText); } void DivelogsDeWebServices::uploadDives(QIODevice *dldContent) { QHttpMultiPart mp(QHttpMultiPart::FormDataType); QHttpPart part; QFile *f = (QFile *)dldContent; QFileInfo fi(*f); QString args("form-data; name=\"userfile\"; filename=\"" + fi.absoluteFilePath() + "\""); part.setRawHeader("Content-Disposition", args.toLatin1()); part.setBodyDevice(dldContent); mp.append(part); multipart = ∓ hideDownload(); resetState(); uploadMode = true; ui.buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Apply)->setText(tr("Done")); exec(); multipart = NULL; if (reply != NULL && reply->isOpen()) { reply->abort(); delete reply; reply = NULL; } } DivelogsDeWebServices::DivelogsDeWebServices(QWidget* parent, Qt::WindowFlags f): WebServices(parent, f) { uploadMode = false; QSettings s; ui.userID->setText(s.value("divelogde_user").toString()); ui.password->setText(s.value("divelogde_pass").toString()); hideUpload(); } void DivelogsDeWebServices::startUpload() { QSettings s; s.setValue("divelogde_user", ui.userID->text()); s.setValue("divelogde_pass", ui.password->text()); s.sync(); ui.status->setText(tr("Uploading dive list...")); ui.progressBar->setRange(0,0); // this makes the progressbar do an 'infinite spin' ui.upload->setEnabled(false); ui.userID->setEnabled(false); ui.password->setEnabled(false); QNetworkRequest request; request.setUrl(QUrl("https://divelogs.de/DivelogsDirectImport.php")); request.setRawHeader("Accept", "text/xml, application/xml"); QHttpPart part; part.setRawHeader("Content-Disposition", "form-data; name=\"user\""); part.setBody(ui.userID->text().toUtf8()); multipart->append(part); part.setRawHeader("Content-Disposition", "form-data; name=\"pass\""); part.setBody(ui.password->text().toUtf8()); multipart->append(part); reply = manager()->post(request, multipart); connect(reply, SIGNAL(finished()), this, SLOT(uploadFinished())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(uploadError(QNetworkReply::NetworkError))); connect(reply, SIGNAL(uploadProgress(qint64,qint64)), this, SLOT(updateProgress(qint64,qint64))); timeout.start(30000); // 30s } void DivelogsDeWebServices::startDownload() { ui.status->setText(tr("Downloading dive list...")); ui.progressBar->setRange(0,0); // this makes the progressbar do an 'infinite spin' ui.download->setEnabled(false); ui.userID->setEnabled(false); ui.password->setEnabled(false); QNetworkRequest request; request.setUrl(QUrl("https://divelogs.de/xml_available_dives.php")); request.setRawHeader("Accept", "text/xml, application/xml"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QUrl body; body.addQueryItem("user", ui.userID->text()); body.addQueryItem("pass", ui.password->text()); reply = manager()->post(request, body.encodedQuery()); #else QUrlQuery body; body.addQueryItem("user", ui.userID->text()); body.addQueryItem("pass", ui.password->text()); reply = manager()->post(request, body.query(QUrl::FullyEncoded).toLatin1()) #endif connect(reply, SIGNAL(finished()), this, SLOT(listDownloadFinished())); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError))); timeout.start(30000); // 30s } void DivelogsDeWebServices::listDownloadFinished() { if (!reply) return; QByteArray xmlData = reply->readAll(); reply->deleteLater(); reply = NULL; // parse the XML data we downloaded DiveListResult diveList = parseDiveLogsDeDiveList(xmlData); if (!diveList.errorCondition.isEmpty()) { // error condition resetState(); ui.status->setText(diveList.errorCondition); return; } ui.status->setText(tr("Downloading %1 dives...").arg(diveList.idCount)); QNetworkRequest request; request.setUrl(QUrl("https://divelogs.de/DivelogsDirectExport.php")); request.setRawHeader("Accept", "application/zip, */*"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); #if QT_VERSION < QT_VERSION_CHECK(5,0,0) QUrl body; body.addQueryItem("user", ui.userID->text()); body.addQueryItem("pass", ui.password->text()); body.addQueryItem("ids", diveList.idList); reply = manager()->post(request, body.encodedQuery()); #else QUrlQuery body; body.addQueryItem("user", ui.userID->text()); body.addQueryItem("pass", ui.password->text()); body.addQueryItem("ids", diveList.idList); reply = manager()->post(request, body.query(QUrl::FullyEncoded).toLatin1()) #endif connect(reply, SIGNAL(readyRead()), this, SLOT(saveToZipFile())); connectSignalsForDownload(reply); } void DivelogsDeWebServices::saveToZipFile() { if (!zipFile.isOpen()) { zipFile.setFileTemplate(QDir::tempPath() + "/import-XXXXXX.dld"); zipFile.open(); } zipFile.write(reply->readAll()); } void DivelogsDeWebServices::downloadFinished() { if (!reply) return; ui.download->setEnabled(true); ui.status->setText(tr("Download finished - %1").arg(reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString())); reply->deleteLater(); reply = NULL; int errorcode; zipFile.seek(0); #if defined(Q_OS_UNIX) && defined(LIBZIP_VERSION_MAJOR) int duppedfd = dup(zipFile.handle()); struct zip *zip = zip_fdopen(duppedfd, 0, &errorcode); if (!zip) ::close(duppedfd); #else struct zip *zip = zip_open(QFile::encodeName(zipFile.fileName()), 0, &errorcode); #endif if (!zip) { char buf[512]; zip_error_to_str(buf, sizeof(buf), errorcode, errno); QMessageBox::critical(this, tr("Corrupted download"), tr("The archive could not be opened:\n%1").arg(QString::fromLocal8Bit(buf))); zipFile.close(); return; } // now allow the user to cancel or accept ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); zip_close(zip); zipFile.close(); } void DivelogsDeWebServices::uploadFinished() { if (!reply) return; ui.progressBar->setRange(0,1); ui.upload->setEnabled(true); ui.userID->setEnabled(true); ui.password->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Cancel)->setEnabled(false); ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(true); ui.buttonBox->button(QDialogButtonBox::Apply)->setText(tr("Done")); ui.status->setText(tr("Upload finished")); // check what the server sent us: it might contain // an error condition, such as a failed login QByteArray xmlData = reply->readAll(); reply->deleteLater(); reply = NULL; char *resp = xmlData.data(); if (resp) { char *parsed = strstr(resp, ""); if (parsed) { if (strstr(resp, "succeeded")) { if (strstr(resp, "failed")) { ui.status->setText(tr("Upload failed")); return; } ui.status->setText(tr("Upload successful")); return; } ui.status->setText(tr("Login failed")); return; } ui.status->setText(tr("Cannot parse response")); } } void DivelogsDeWebServices::setStatusText(int status) { } void DivelogsDeWebServices::downloadError(QNetworkReply::NetworkError) { resetState(); ui.status->setText(tr("Error: %1").arg(reply->errorString())); reply->deleteLater(); reply = NULL; } void DivelogsDeWebServices::uploadError(QNetworkReply::NetworkError error) { downloadError(error); } void DivelogsDeWebServices::buttonClicked(QAbstractButton* button) { ui.buttonBox->button(QDialogButtonBox::Apply)->setEnabled(false); switch(ui.buttonBox->buttonRole(button)){ case QDialogButtonBox::ApplyRole:{ /* in 'uploadMode' button is called 'Done' and closes the dialog */ if (uploadMode) { hide(); close(); resetState(); break; } /* parse file and import dives */ char *error = NULL; parse_file(QFile::encodeName(zipFile.fileName()), &error); if (error != NULL) { mainWindow()->showError(error); free(error); } process_dives(TRUE, FALSE); mainWindow()->refreshDisplay(); /* store last entered user/pass in config */ QSettings s; s.setValue("divelogde_user", ui.userID->text()); s.setValue("divelogde_pass", ui.password->text()); s.sync(); hide(); close(); resetState(); } break; case QDialogButtonBox::RejectRole: // these two seem to be causing a crash: // reply->deleteLater(); resetState(); break; case QDialogButtonBox::HelpRole: QDesktopServices::openUrl(QUrl("http://divelogs.de")); break; default: break; } } Subsurface-4.0.2/qt-ui/subsurfacewebservices.h000066400000000000000000000050001226345450700214360ustar00rootroot00000000000000#ifndef SUBSURFACEWEBSERVICES_H #define SUBSURFACEWEBSERVICES_H #include #include #include #include #include #include "ui_webservices.h" class QAbstractButton; class QNetworkReply; class QHttpMultiPart; class WebServices : public QDialog{ Q_OBJECT public: explicit WebServices(QWidget* parent = 0, Qt::WindowFlags f = 0); void hidePassword(); void hideUpload(); void hideDownload(); static QNetworkAccessManager *manager(); private slots: virtual void startDownload() = 0; virtual void startUpload() = 0; virtual void buttonClicked(QAbstractButton* button) = 0; virtual void downloadTimedOut(); protected slots: void updateProgress(qint64 current, qint64 total); protected: void resetState(); void connectSignalsForDownload(QNetworkReply *reply); void connectSignalsForUpload(); Ui::WebServices ui; QNetworkReply *reply; QTimer timeout; QByteArray downloadedData; QString defaultApplyText; }; class SubsurfaceWebServices : public WebServices { Q_OBJECT public: static SubsurfaceWebServices* instance(); private slots: void startDownload(); void buttonClicked(QAbstractButton* button); void downloadFinished(); void downloadError(QNetworkReply::NetworkError error); void startUpload(){} /*no op*/ private: explicit SubsurfaceWebServices(QWidget* parent = 0, Qt::WindowFlags f = 0); void setStatusText(int status); void download_dialog_traverse_xml(xmlNodePtr node, unsigned int *download_status); unsigned int download_dialog_parse_response(const QByteArray& length); }; class DivelogsDeWebServices : public WebServices { Q_OBJECT public: static DivelogsDeWebServices * instance(); void downloadDives(); void prepareDivesForUpload(); private slots: void startDownload(); void buttonClicked(QAbstractButton* button); void saveToZipFile(); void listDownloadFinished(); void downloadFinished(); void uploadFinished(); void downloadError(QNetworkReply::NetworkError error); void uploadError(QNetworkReply::NetworkError error); void startUpload(); private: void uploadDives(QIODevice *dldContent); explicit DivelogsDeWebServices (QWidget* parent = 0, Qt::WindowFlags f = 0); void setStatusText(int status); bool prepare_dives_for_divelogs(const QString &filename, bool selected, QString *errorMsg); void download_dialog_traverse_xml(xmlNodePtr node, unsigned int *download_status); unsigned int download_dialog_parse_response(const QByteArray& length); QHttpMultiPart *multipart; QTemporaryFile zipFile; bool uploadMode; }; #endif Subsurface-4.0.2/qt-ui/tableview.cpp000066400000000000000000000044251226345450700173610ustar00rootroot00000000000000#include "tableview.h" #include "models.h" #include "modeldelegates.h" #include #include #include #include #include TableView::TableView(QWidget *parent) : QWidget(parent) { ui.setupUi(this); ui.tableView->setItemDelegate(new DiveListDelegate); /* There`s mostly a need for a Mac fix here too. */ if (qApp->style()->objectName() == "gtk+") ui.groupBox->layout()->setContentsMargins(0, 9, 0, 0); else ui.groupBox->layout()->setContentsMargins(0, 0, 0, 0); QIcon plusIcon(":plus"); plusBtn = new QPushButton(plusIcon, QString(), ui.groupBox); plusBtn->setFlat(true); plusBtn->setToolTip(tr("Add Cylinder")); plusBtn->setIconSize(QSize(16,16)); connect(plusBtn, SIGNAL(clicked(bool)), this, SIGNAL(addButtonClicked())); } TableView::~TableView() { QSettings s; s.beginGroup(objectName()); for (int i = 0; i < ui.tableView->model()->columnCount(); i++) { s.setValue(QString("colwidth%1").arg(i), ui.tableView->columnWidth(i)); } s.endGroup(); } void TableView::setBtnToolTip(const QString& tooltip) { plusBtn->setToolTip(tooltip); } void TableView::setTitle(const QString& title) { ui.groupBox->setTitle(title); } void TableView::setModel(QAbstractItemModel *model){ ui.tableView->setModel(model); connect(ui.tableView, SIGNAL(clicked(QModelIndex)), model, SLOT(remove(QModelIndex))); QSettings s; s.beginGroup(objectName()); const int columnCount = ui.tableView->model()->columnCount(); for (int i = 0; i < columnCount; i++) { QVariant width = s.value(QString("colwidth%1").arg(i), i == CylindersModel::REMOVE ? 30 : 80 ); ui.tableView->setColumnWidth(i, width.toInt()); } s.endGroup(); QFontMetrics metrics(defaultModelFont()); ui.tableView->horizontalHeader()->setMinimumHeight(metrics.height() + 10); } void TableView::fixPlusPosition() { plusBtn->setGeometry(ui.groupBox->contentsRect().width() - 30, 2, 24,24); } // We need to manually position the 'plus' on cylinder and weight. void TableView::resizeEvent(QResizeEvent* event) { fixPlusPosition(); QWidget::resizeEvent(event); } void TableView::showEvent(QShowEvent* event) { QWidget::showEvent(event); fixPlusPosition(); } void TableView::edit(const QModelIndex& index){ ui.tableView->edit(index); } QTableView *TableView::view(){ return ui.tableView; } Subsurface-4.0.2/qt-ui/tableview.h000066400000000000000000000020761226345450700170260ustar00rootroot00000000000000#ifndef TABLEVIEW_H #define TABLEVIEW_H /* This TableView is prepared to have the CSS, * the methods to restore / save the state of * the column widths and the 'plus' button. */ #include #include "ui_tableview.h" class QPushButton; class QAbstractItemModel; class QModelIndex; class QTableView; class TableView : public QWidget { Q_OBJECT public: TableView(QWidget *parent = 0); virtual ~TableView(); void setTitle(const QString& title); /* The model is expected to have a 'remove' slot, that takes a QModelIndex as parameter. * It's also expected to have the column '1' as a trash icon. I most probably should create a * proxy model and add that column, will mark that as TODO. see? marked. */ void setModel(QAbstractItemModel* model); void setBtnToolTip(const QString& tooltip); void fixPlusPosition(); void edit(const QModelIndex& index); QTableView *view(); protected: virtual void showEvent(QShowEvent* ); virtual void resizeEvent(QResizeEvent* ); signals: void addButtonClicked(); private: Ui::TableView ui; QPushButton *plusBtn; }; #endif Subsurface-4.0.2/qt-ui/tableview.ui000066400000000000000000000022661226345450700172150ustar00rootroot00000000000000 TableView 0 0 410 309 0 0 0 0 10 0 0 Subsurface-4.0.2/qt-ui/tagwidget.cpp000066400000000000000000000110431226345450700173500ustar00rootroot00000000000000#include "tagwidget.h" #include #include #include #include #include TagWidget::TagWidget(QWidget *parent) : GroupedLineEdit(parent), m_completer(NULL) { connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(reparse())); connect(this, SIGNAL(textChanged()), this, SLOT(reparse())); QColor textColor = palette().color(QPalette::Text); qreal h, s, l, a; textColor.getHslF(&h, &s, &l, &a); // I use dark themes if (l <= 0.3 ){ // very dark text. get a brigth background addColor( QColor(Qt::red).lighter(120) ); addColor( QColor(Qt::green).lighter(120) ); addColor( QColor(Qt::blue).lighter(120) ); } else if ( l <= 0.6 ){ // moderated dark text. get a somewhat brigth background addColor( QColor(Qt::red).lighter(60) ); addColor( QColor(Qt::green).lighter(60) ); addColor( QColor(Qt::blue).lighter(60) ); } else{ addColor( QColor(Qt::red).darker(120) ); addColor( QColor(Qt::green).darker(120) ); addColor( QColor(Qt::blue).darker(120) ); } // light text. get a dark background. } void TagWidget::setCompleter(QCompleter *completer) { m_completer = completer; m_completer->setWidget(this); connect(m_completer, SIGNAL(activated(QString)), this, SLOT(completionSelected(QString))); connect(m_completer, SIGNAL(highlighted(QString)), this, SLOT(completionSelected(QString))); } QPair TagWidget::getCursorTagPosition() { int i = 0, start = 0, end = 0; /* Parse string near cursor */ i = cursorPosition(); while (--i > 0) { if (text().at(i) == ',') { if (i > 0 && text().at(i-1) != '\\') { i++; break; } } } start = i; while (++i < text().length()) { if (text().at(i) == ',') { if (i > 0 && text().at(i-1) != '\\') break; } } end = i; if (start < 0 || end < 0) { start = 0; end = 0; } return qMakePair(start,end); } enum ParseState {FINDSTART, FINDEND}; void TagWidget::highlight() { int i = 0, start = 0, end = 0; ParseState state = FINDEND; removeAllBlocks(); while(i < text().length()) { if (text().at(i) == ',') { if (state == FINDSTART) { /* Detect empty tags */ } else if (state == FINDEND) { /* Found end of tag */ if (i > 1) { if(text().at(i-1) != '\\') { addBlock(start, end); state = FINDSTART; } } else { state = FINDSTART; } } } else if (text().at(i) == ' ') { /* Handled */ } else { /* Found start of tag */ if (state == FINDSTART) { state = FINDEND; start = i; } else if (state == FINDEND) { end = i; } } i++; } if (state == FINDEND) { if (end < start) end = text().length()-1; if (text().length() > 0) addBlock(start, end); } } void TagWidget::reparse() { highlight(); QPair pos = getCursorTagPosition(); QString currentText; if (pos.first >= 0 && pos.second > 0) currentText = text().mid(pos.first, pos.second-pos.first).trimmed(); else currentText = ""; if (m_completer) { m_completer->setCompletionPrefix(currentText); if (m_completer->completionCount() == 1) { if (m_completer->currentCompletion() == currentText) { QAbstractItemView *popup = m_completer->popup(); if (popup) popup->hide(); } else m_completer->complete(); } else { m_completer->complete(); } } } void TagWidget::completionSelected(QString completion) { QPair pos; pos = getCursorTagPosition(); if (pos.first >= 0 && pos.second > 0) { setText(text().remove(pos.first, pos.second-pos.first).insert(pos.first, completion)); setCursorPosition(pos.first+completion.length()); } else { setText(completion.append(", ")); setCursorPosition(text().length()); } } void TagWidget::setCursorPosition(int position) { blockSignals(true); GroupedLineEdit::setCursorPosition(position); blockSignals(false); } void TagWidget::setText(QString text) { blockSignals(true); GroupedLineEdit::setText(text); blockSignals(false); highlight(); } void TagWidget::clear() { blockSignals(true); GroupedLineEdit::clear(); blockSignals(false); } void TagWidget::keyPressEvent(QKeyEvent *e) { switch (e->key()) { case Qt::Key_Return: case Qt::Key_Enter: case Qt::Key_Tab: /* * Fake the QLineEdit behaviour by simply * closing the QAbstractViewitem */ if (m_completer) { QAbstractItemView *popup = m_completer->popup(); if (popup) popup->hide(); } } if (e->key() == Qt::Key_Tab) { // let's pretend this is a comma instead QKeyEvent fakeEvent(e->type(), Qt::Key_Comma, e->modifiers(), QString(",")); GroupedLineEdit::keyPressEvent(&fakeEvent); } else { GroupedLineEdit::keyPressEvent(e); } } Subsurface-4.0.2/qt-ui/tagwidget.h000066400000000000000000000011311226345450700170120ustar00rootroot00000000000000#ifndef __TAGWIDGET_H #define __TAGWIDGET_H #include "groupedlineedit.h" #include #include class TagWidget : public GroupedLineEdit { Q_OBJECT public: explicit TagWidget(QWidget *parent = 0); void setCompleter(QCompleter *completer); QPair getCursorTagPosition(); void highlight(); void setText(QString text); void clear(); void setCursorPosition(int position); public slots: void reparse(); void completionSelected(QString); protected: void keyPressEvent(QKeyEvent *e); private: QCompleter *m_completer; }; #endif /* __TAGWIDGET_H */ Subsurface-4.0.2/qt-ui/webservices.ui000066400000000000000000000070001226345450700175430ustar00rootroot00000000000000 WebServices 0 0 425 169 Webservice Connection :/subsurface-icon Status: Enter your ID here Download Qt::Horizontal QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Help 0 User ID Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse Password QLineEdit::Password Upload userID password download upload buttonBox buttonBox accepted() WebServices accept() 248 254 157 274 buttonBox rejected() WebServices reject() 316 260 286 274 Subsurface-4.0.2/qthelper.cpp000066400000000000000000000146601226345450700161660ustar00rootroot00000000000000#include "qthelper.h" #include "qt-ui/mainwindow.h" #include "qt-gui.h" #include #include #include #include #define tr(_arg) mainWindow()->information()->tr(_arg) DiveComputerList::DiveComputerList() { } DiveComputerList::~DiveComputerList() { } bool DiveComputerNode::operator == (const DiveComputerNode &a) const { return this->model == a.model && this->deviceId == a.deviceId && this->firmware == a.firmware && this->serialNumber == a.serialNumber && this->nickName == a.nickName; } bool DiveComputerNode::operator !=(const DiveComputerNode &a) const { return !(*this == a); } bool DiveComputerNode::changesValues(const DiveComputerNode &b) const { if (this->model != b.model || this->deviceId != b.deviceId) { qDebug("DiveComputerNodes were not for the same DC"); return false; } return (b.firmware != "" && this->firmware != b.firmware) || (b.serialNumber != "" && this->serialNumber != b.serialNumber) || (b.nickName != "" && this->nickName != b.nickName); } const DiveComputerNode *DiveComputerList::getExact(QString m, uint32_t d) { for (QMap::iterator it = dcMap.find(m); it != dcMap.end() && it.key() == m; ++it) if (it->deviceId == d) return &*it; return NULL; } const DiveComputerNode *DiveComputerList::get(QString m) { QMap::iterator it = dcMap.find(m); if (it != dcMap.end()) return &*it; return NULL; } void DiveComputerList::addDC(QString m, uint32_t d, QString n, QString s, QString f) { if (m == "" || d == 0) return; const DiveComputerNode *existNode = this->getExact(m, d); DiveComputerNode newNode(m, d, s, f, n); if (existNode) { if (newNode.changesValues(*existNode)) { if (n != "" && existNode->nickName != n) qDebug("new nickname %s for DC model %s deviceId 0x%x", n.toUtf8().data(), m.toUtf8().data(), d); if (f != "" && existNode->firmware != f) qDebug("new firmware version %s for DC model %s deviceId 0x%x", f.toUtf8().data(), m.toUtf8().data(), d); if (s != "" && existNode->serialNumber != s) qDebug("new serial number %s for DC model %s deviceId 0x%x", s.toUtf8().data(), m.toUtf8().data(), d); } else { return; } dcMap.remove(m, *existNode); } dcMap.insert(m, newNode); } void DiveComputerList::rmDC(QString m, uint32_t d) { const DiveComputerNode *existNode = this->getExact(m, d); dcMap.remove(m, *existNode); } QString weight_string(int weight_in_grams) { QString str; if (get_units()->weight == units::KG) { int gr = weight_in_grams % 1000; int kg = weight_in_grams / 1000; if (kg >= 20.0) { str = QString("0"); } else { str = QString("%1.%2").arg(kg).arg((unsigned)(gr) / 100); } } else { double lbs = grams_to_lbs(weight_in_grams); str = QString("%1").arg(lbs, 0, 'f', lbs >= 40.0 ? 0 : 1 ); } return (str); } bool parseGpsText(const QString& gps_text, double *latitude, double *longitude) { enum { SECONDS, MINUTES, DECIMAL } gpsStyle = DECIMAL; int eastWest = 4; QString regExp; /* an empty string is interpreted as 0.0,0.0 and therefore "no gps location" */ if (gps_text.trimmed() == "") { *latitude = 0.0; *longitude = 0.0; return true; } // trying to parse all formats in one regexp might be possible, but it seems insane // so handle the three formats we understand separately if (gps_text.count(QChar('"')) == 2) { gpsStyle = SECONDS; regExp = QString("\\s*([NS%1%2])\\s*(\\d+)[" UTF8_DEGREE "\\s]+(\\d+)[\'\\s]+(\\d+)([,\\.](\\d+))?[^EW%3%4]*" "([EW%6%7])\\s*(\\d+)[" UTF8_DEGREE "\\s]+(\\d+)[\'\\s]+(\\d+)([,\\.](\\d+))?") .arg(tr("N")).arg(tr("S")).arg(tr("E")).arg(tr("W")).arg(tr("E")).arg(tr("W")); } else if (gps_text.count(QChar('\'')) == 2) { gpsStyle = MINUTES; regExp = QString("\\s*([NS%1%2])\\s*(\\d+)[" UTF8_DEGREE "\\s]+(\\d+)([,\\.](\\d+))?[^EW%3%4]*" "([EW%6%7])\\s*(\\d+)[" UTF8_DEGREE "\\s]+(\\d+)([,\\.](\\d+))?") .arg(tr("N")).arg(tr("S")).arg(tr("E")).arg(tr("W")).arg(tr("E")).arg(tr("W")); } else { regExp = QString("\\s*([-NS%1%2]?)\\s*(\\d+)[,\\.](\\d+)[^-EW%3%4\\d]*([-EW%5%6]?)\\s*(\\d+)[,\\.](\\d+)") .arg(tr("N")).arg(tr("S")).arg(tr("E")).arg(tr("W")).arg(tr("E")).arg(tr("W")); } QRegExp r(regExp); if (r.indexIn(gps_text) != -1) { // qDebug() << "Hemisphere" << r.cap(1) << "deg" << r.cap(2) << "min" << r.cap(3) << "decimal" << r.cap(4); // qDebug() << "Hemisphere" << r.cap(5) << "deg" << r.cap(6) << "min" << r.cap(7) << "decimal" << r.cap(8); switch(gpsStyle) { case SECONDS: *latitude = r.cap(2).toInt() + r.cap(3).toInt() / 60.0 + (r.cap(4) + QString(".") + r.cap(6)).toDouble() / 3600.0; *longitude = r.cap(8).toInt() + r.cap(9).toInt() / 60.0 + (r.cap(10) + QString(".") + r.cap(12)).toDouble() / 3600.0; eastWest = 7; break; case MINUTES: *latitude = r.cap(2).toInt() + (r.cap(3) + QString(".") + r.cap(5)).toDouble() / 60.0; *longitude = r.cap(7).toInt() + (r.cap(8) + QString(".") + r.cap(10)).toDouble() / 60.0; eastWest = 6; break; case DECIMAL: default: *latitude = (r.cap(2) + QString(".") + r.cap(3)).toDouble(); *longitude = (r.cap(5) + QString(".") + r.cap(6)).toDouble(); eastWest = 4; break; } if (r.cap(1) == "S" || r.cap(1) == tr("S") || r.cap(1) == "-") *latitude *= -1.0; if (r.cap(eastWest) == "W" || r.cap(5) == tr("W") || r.cap(5) == "-") *longitude *= -1.0; // qDebug("%s -> %8.5f / %8.5f", gps_text.toLocal8Bit().data(), *latitude, *longitude); return true; } return false; } bool gpsHasChanged(struct dive *dive, struct dive *master, const QString& gps_text, bool *parsed) { double latitude, longitude; int latudeg, longudeg; /* if we have a master and the dive's gps address is different from it, * don't change the dive */ if (master && (master->latitude.udeg != dive->latitude.udeg || master->longitude.udeg != dive->longitude.udeg)) return false; if (!(*parsed = parseGpsText(gps_text, &latitude, &longitude))) return false; latudeg = rint(1000000 * latitude); longudeg = rint(1000000 * longitude); /* if dive gps didn't change, nothing changed */ if (dive->latitude.udeg == latudeg && dive->longitude.udeg == longudeg) return false; /* ok, update the dive and mark things changed */ dive->latitude.udeg = latudeg; dive->longitude.udeg = longudeg; return true; } QList< int > getDivesInTrip ( dive_trip_t* trip ) { QList ret; for(int i = 0; i < dive_table.nr; i++){ struct dive *d = get_dive(i); if (d->divetrip == trip){ ret.push_back(get_divenr(d)); } } return ret; } Subsurface-4.0.2/qthelper.h000066400000000000000000000025701226345450700156300ustar00rootroot00000000000000#ifndef QTHELPER_H #define QTHELPER_H #include #include #include #include "dive.h" #include "divelist.h" #include // global pointers for our translation extern QTranslator *qtTranslator, *ssrfTranslator; class DiveComputerNode { public: DiveComputerNode(QString m, uint32_t d, QString s, QString f, QString n) : model(m), deviceId(d), serialNumber(s), firmware(f), nickName(n) {}; bool operator ==(const DiveComputerNode &a) const; bool operator !=(const DiveComputerNode &a) const; bool changesValues(const DiveComputerNode &b) const; QString model; uint32_t deviceId; QString serialNumber; QString firmware; QString nickName; }; class DiveComputerList { public: DiveComputerList(); ~DiveComputerList(); const DiveComputerNode *getExact(QString m, uint32_t d); const DiveComputerNode *get(QString m); void addDC(QString m, uint32_t d, QString n = "", QString s = "", QString f = ""); void rmDC(QString m, uint32_t d); DiveComputerNode matchDC(QString m, uint32_t d); DiveComputerNode matchModel(QString m); QMultiMap dcMap; QMultiMap dcWorkingMap; }; QString weight_string(int weight_in_grams); bool gpsHasChanged(struct dive* dive, struct dive *master, const QString &gps_text, bool *parsed); QList getDivesInTrip(dive_trip_t *trip); #endif // QTHELPER_H Subsurface-4.0.2/satellite.svg000066400000000000000000000123351226345450700163420ustar00rootroot00000000000000 image/svg+xml Subsurface-4.0.2/save-xml.c000066400000000000000000000405271226345450700155370ustar00rootroot00000000000000#include #include #include #include #include #include #include #include "dive.h" #include "device.h" static void show_milli(FILE *f, const char *pre, int value, const char *unit, const char *post) { int i; char buf[4]; unsigned v; fputs(pre, f); v = value; if (value < 0) { putc('-', f); v = -value; } for (i = 2; i >= 0; i--) { buf[i] = (v % 10) + '0'; v /= 10; } buf[3] = 0; if (buf[2] == '0') { buf[2] = 0; if (buf[1] == '0') buf[1] = 0; } fprintf(f, "%u.%s%s%s", v, buf, unit, post); } static void show_temperature(FILE *f, temperature_t temp, const char *pre, const char *post) { if (temp.mkelvin) show_milli(f, pre, temp.mkelvin - ZERO_C_IN_MKELVIN, " C", post); } static void show_depth(FILE *f, depth_t depth, const char *pre, const char *post) { if (depth.mm) show_milli(f, pre, depth.mm, " m", post); } static void show_duration(FILE *f, duration_t duration, const char *pre, const char *post) { if (duration.seconds) fprintf(f, "%s%u:%02u min%s", pre, FRACTION(duration.seconds, 60), post); } static void show_pressure(FILE *f, pressure_t pressure, const char *pre, const char *post) { if (pressure.mbar) show_milli(f, pre, pressure.mbar, " bar", post); } static void show_salinity(FILE *f, int salinity, const char *pre, const char *post) { if (salinity) fprintf(f, "%s%d g/l%s", pre, salinity / 10, post); } /* * We're outputting utf8 in xml. * We need to quote the characters <, >, &. * * Technically I don't think we'd necessarily need to quote the control * characters, but at least libxml2 doesn't like them. It doesn't even * allow them quoted. So we just skip them and replace them with '?'. * * If we do this for attributes, we need to quote the quotes we use too. */ static void quote(FILE *f, const char *text, int is_attribute) { const char *p = text; for (;;) { const char *escape; switch (*p++) { default: continue; case 0: escape = NULL; break; case 1 ... 8: case 11: case 12: case 14 ... 31: escape = "?"; break; case '<': escape = "<"; break; case '>': escape = ">"; break; case '&': escape = "&"; break; case '\'': if (!is_attribute) continue; escape = "'"; break; case '\"': if (!is_attribute) continue; escape = """; break; } fwrite(text, (p - text - 1), 1, f); if (!escape) break; fputs(escape, f); text = p; } } static void show_utf8(FILE *f, const char *text, const char *pre, const char *post, int is_attribute) { int len; if (!text) return; while (isspace(*text)) text++; len = strlen(text); if (!len) return; while (len && isspace(text[len-1])) len--; /* FIXME! Quoting! */ fputs(pre, f); quote(f, text, is_attribute); fputs(post, f); } static void save_depths(FILE *f, struct divecomputer *dc) { /* What's the point of this dive entry again? */ if (!dc->maxdepth.mm && !dc->meandepth.mm) return; fputs(" maxdepth, " max='", "'"); show_depth(f, dc->meandepth, " mean='", "'"); fputs(" />\n", f); } static void save_dive_temperature(FILE *f, struct dive *dive) { if (!dive->airtemp.mkelvin && !dive->watertemp.mkelvin) return; if (dive->airtemp.mkelvin == dc_airtemp(&dive->dc) && dive->watertemp.mkelvin == dc_watertemp(&dive->dc)) return; fputs(" airtemp.mkelvin && dive->airtemp.mkelvin != dc_airtemp(&dive->dc)) show_temperature(f, dive->airtemp, " air='", "'"); if (dive->watertemp.mkelvin && dive->watertemp.mkelvin != dc_watertemp(&dive->dc)) show_temperature(f, dive->watertemp, " water='", "'"); fputs("/>\n", f); } static void save_temperatures(FILE *f, struct divecomputer *dc) { if (!dc->airtemp.mkelvin && !dc->watertemp.mkelvin) return; fputs(" airtemp, " air='", "'"); show_temperature(f, dc->watertemp, " water='", "'"); fputs(" />\n", f); } static void save_airpressure(FILE *f, struct divecomputer *dc) { if (!dc->surface_pressure.mbar) return; fputs(" surface_pressure, " pressure='", "'"); fputs(" />\n", f); } static void save_salinity(FILE *f, struct divecomputer *dc) { /* only save if we have a value that isn't the default of sea water */ if (!dc->salinity || dc->salinity == SEAWATER_SALINITY) return; fputs(" salinity, " salinity='", "'"); fputs(" />\n", f); } /* * Format degrees to within 6 decimal places. That's about 0.1m * on a great circle (ie longitude at equator). And micro-degrees * is also enough to fit in a fixed-point 32-bit integer. */ static int format_degrees(char *buffer, degrees_t value) { int udeg = value.udeg; const char *sign = ""; if (udeg < 0) { sign = "-"; udeg = -udeg; } return sprintf(buffer, "%s%u.%06u", sign, udeg / 1000000, udeg % 1000000); } static int format_location(char *buffer, degrees_t latitude, degrees_t longitude) { int len = sprintf(buffer, "gps='"); len += format_degrees(buffer+len, latitude); buffer[len++] = ' '; len += format_degrees(buffer+len, longitude); buffer[len++] = '\''; return len; } static void show_location(FILE *f, struct dive *dive) { char buffer[80]; const char *prefix = " "; degrees_t latitude = dive->latitude; degrees_t longitude = dive->longitude; /* * Ok, theoretically I guess you could dive at * exactly 0,0. But we don't support that. So * if you do, just fudge it a bit, and say that * you dove a few meters away. */ if (latitude.udeg || longitude.udeg) { int len = sprintf(buffer, " location) { memcpy(buffer+len, "/>\n", 4); fputs(buffer, f); return; } buffer[len++] = '>'; buffer[len] = 0; prefix = buffer; } show_utf8(f, dive->location, prefix,"\n", 0); } static void save_overview(FILE *f, struct dive *dive) { show_location(f, dive); show_utf8(f, dive->divemaster, " ","\n", 0); show_utf8(f, dive->buddy, " ","\n", 0); show_utf8(f, dive->notes, " ","\n", 0); show_utf8(f, dive->suit, " ","\n", 0); } static int nr_cylinders(struct dive *dive) { int nr; for (nr = MAX_CYLINDERS; nr; --nr) { cylinder_t *cylinder = dive->cylinder+nr-1; if (!cylinder_nodata(cylinder)) break; } return nr; } static void save_cylinder_info(FILE *f, struct dive *dive) { int i, nr; nr = nr_cylinders(dive); for (i = 0; i < nr; i++) { cylinder_t *cylinder = dive->cylinder+i; int volume = cylinder->type.size.mliter; const char *description = cylinder->type.description; int o2 = cylinder->gasmix.o2.permille; int he = cylinder->gasmix.he.permille; fprintf(f, " type.workingpressure, " workpressure='", "'"); show_utf8(f, description, " description='", "'", 1); if (o2) { fprintf(f, " o2='%u.%u%%'", FRACTION(o2, 10)); if (he) fprintf(f, " he='%u.%u%%'", FRACTION(he, 10)); } show_pressure(f, cylinder->start, " start='", "'"); show_pressure(f, cylinder->end, " end='", "'"); fprintf(f, " />\n"); } } static int nr_weightsystems(struct dive *dive) { int nr; for (nr = MAX_WEIGHTSYSTEMS; nr; --nr) { weightsystem_t *ws = dive->weightsystem+nr-1; if (!weightsystem_none(ws)) break; } return nr; } static void save_weightsystem_info(FILE *f, struct dive *dive) { int i, nr; nr = nr_weightsystems(dive); for (i = 0; i < nr; i++) { weightsystem_t *ws = dive->weightsystem+i; int grams = ws->weight.grams; const char *description = ws->description; fprintf(f, " \n"); } } static void show_index(FILE *f, int value, const char *pre, const char *post) { if (value) fprintf(f, " %s%d%s", pre, value, post); } static void save_sample(FILE *f, struct sample *sample, struct sample *old) { fprintf(f, " time.seconds,60)); show_milli(f, " depth='", sample->depth.mm, " m", "'"); show_temperature(f, sample->temperature, " temp='", "'"); show_pressure(f, sample->cylinderpressure, " pressure='", "'"); /* * We only show sensor information for samples with pressure, and only if it * changed from the previous sensor we showed. */ if (sample->cylinderpressure.mbar && sample->sensor != old->sensor) { fprintf(f, " sensor='%d'", sample->sensor); old->sensor = sample->sensor; } /* the deco/ndl values are stored whenever they change */ if (sample->ndl.seconds != old->ndl.seconds) { fprintf(f, " ndl='%u:%02u min'", FRACTION(sample->ndl.seconds, 60)); old->ndl = sample->ndl; } if (sample->in_deco != old->in_deco) { fprintf(f, " in_deco='%d'", sample->in_deco ? 1 : 0); old->in_deco = sample->in_deco; } if (sample->stoptime.seconds != old->stoptime.seconds) { fprintf(f, " stoptime='%u:%02u min'", FRACTION(sample->stoptime.seconds, 60)); old->stoptime = sample->stoptime; } if (sample->stopdepth.mm != old->stopdepth.mm) { show_milli(f, " stopdepth='", sample->stopdepth.mm, " m", "'"); old->stopdepth = sample->stopdepth; } if (sample->cns != old->cns) { fprintf(f, " cns='%u%%'", sample->cns); old->cns = sample->cns; } if (sample->po2 != old->po2) { show_milli(f, " po2='", sample->po2, " bar", "'"); old->po2 = sample->po2; } fprintf(f, " />\n"); } static void save_one_event(FILE *f, struct event *ev) { fprintf(f, " time.seconds,60)); show_index(f, ev->type, "type='", "'"); show_index(f, ev->flags, "flags='", "'"); show_index(f, ev->value, "value='", "'"); show_utf8(f, ev->name, " name='", "'", 1); fprintf(f, " />\n"); } static void save_events(FILE *f, struct event *ev) { while (ev) { save_one_event(f, ev); ev = ev->next; } } static void save_tags(FILE *f, struct tag_entry *tag_list) { int more = 0; struct tag_entry *tmp = tag_list->next; /* Only write tag attribute if the list contains at least one item */ if (tmp != NULL) { fprintf(f, " tags='"); while (tmp != NULL) { if (more) fprintf(f, ", "); /* If the tag has been translated, write the source to the xml file */ if (tmp->tag->source != NULL) quote(f, tmp->tag->source, 0); else quote(f, tmp->tag->name, 0); tmp = tmp->next; more = 1; } fprintf(f, "'"); } } static void show_date(FILE *f, timestamp_t when) { struct tm tm; utc_mkdate(when, &tm); fprintf(f, " date='%04u-%02u-%02u'", tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday); fprintf(f, " time='%02u:%02u:%02u'", tm.tm_hour, tm.tm_min, tm.tm_sec); } static void save_samples(FILE *f, int nr, struct sample *s) { struct sample dummy = { }; while (--nr >= 0) { save_sample(f, s, &dummy); s++; } } static void save_dc(FILE *f, struct dive *dive, struct divecomputer *dc) { fprintf(f, " model, " model='", "'", 1); if (dc->deviceid) fprintf(f, " deviceid='%08x'", dc->deviceid); if (dc->diveid) fprintf(f, " diveid='%08x'", dc->diveid); if (dc->when && dc->when != dive->when) show_date(f, dc->when); if (dc->duration.seconds && dc->duration.seconds != dive->dc.duration.seconds) show_duration(f, dc->duration, " duration='", "'"); fprintf(f, ">\n"); save_depths(f, dc); save_temperatures(f, dc); save_airpressure(f, dc); save_salinity(f, dc); show_duration(f, dc->surfacetime, " ", "\n"); save_events(f, dc->events); save_samples(f, dc->samples, dc->sample); fprintf(f, " \n"); } void save_dive(FILE *f, struct dive *dive) { struct divecomputer *dc; fputs("number) fprintf(f, " number='%d'", dive->number); if (dive->tripflag == NO_TRIP) fprintf(f, " tripflag='NOTRIP'"); if (dive->rating) fprintf(f, " rating='%d'", dive->rating); if (dive->visibility) fprintf(f, " visibility='%d'", dive->visibility); if (dive->tag_list != NULL) save_tags(f, dive->tag_list); show_date(f, dive->when); fprintf(f, " duration='%u:%02u min'>\n", FRACTION(dive->dc.duration.seconds, 60)); save_overview(f, dive); save_cylinder_info(f, dive); save_weightsystem_info(f, dive); save_dive_temperature(f, dive); /* Save the dive computer data */ dc = &dive->dc; do { save_dc(f, dive, dc); dc = dc->next; } while (dc); fprintf(f, "\n"); } static void save_trip(FILE *f, dive_trip_t *trip) { int i; struct dive *dive; fprintf(f, "when); show_utf8(f, trip->location, " location=\'","\'", 1); fprintf(f, ">\n"); show_utf8(f, trip->notes, "","\n", 0); /* * Incredibly cheesy: we want to save the dives sorted, and they * are sorted in the dive array.. So instead of using the dive * list in the trip, we just traverse the global dive array and * check the divetrip pointer.. */ for_each_dive(i, dive) { if (dive->divetrip == trip) save_dive(f, dive); } fprintf(f, "\n"); } static void save_one_device(FILE *f, const char * model, uint32_t deviceid, const char *nickname, const char *serial_nr, const char *firmware) { /* Nicknames that are empty or the same as the device model are not interesting */ if (nickname) { if (!*nickname || !strcmp(model, nickname)) nickname = NULL; } /* Serial numbers that are empty are not interesting */ if (serial_nr && !*serial_nr) serial_nr = NULL; /* Firmware strings that are empty are not interesting */ if (firmware && !*firmware) firmware = NULL; /* Do we have anything interesting about this dive computer to save? */ if (!serial_nr && !nickname && !firmware) return; fprintf(f, "\n"); } #define VERSION 2 void save_dives(const char *filename) { save_dives_logic(filename, FALSE); } void save_dives_logic(const char *filename, const bool select_only) { int i; struct dive *dive; dive_trip_t *trip; FILE *f = subsurface_fopen(filename, "w"); if (!f) return; fprintf(f, "\n\n", VERSION); /* save the dive computer nicknames, if any */ call_for_each_dc(f, save_one_device); if (autogroup) fprintf(f, "\n"); fprintf(f, "\n\n"); for (trip = dive_trip_list; trip != NULL; trip = trip->next) trip->index = 0; /* save the dives */ for_each_dive(i, dive) { if (select_only) { if(!dive->selected) continue; save_dive(f, dive); } else { trip = dive->divetrip; /* Bare dive without a trip? */ if (!trip) { save_dive(f, dive); continue; } /* Have we already seen this trip (and thus saved this dive?) */ if (trip->index) continue; /* We haven't seen this trip before - save it and all dives */ trip->index = 1; save_trip(f, trip); } } fprintf(f, "\n\n"); fclose(f); } void export_dives_uddf(const char *filename, const bool selected) { FILE *f; size_t streamsize; char *membuf; xmlDoc *doc; xsltStylesheetPtr xslt = NULL; xmlDoc *transformed; if (!filename) return; /* Save XML to file and convert it into a memory buffer */ save_dives_logic(filename, selected); f = subsurface_fopen(filename, "r"); fseek(f, 0, SEEK_END); streamsize = ftell(f); rewind(f); membuf = malloc(streamsize + 1); if (!membuf || !fread(membuf, streamsize, 1, f)) { fprintf(stderr, "Failed to read memory buffer\n"); return; } membuf[streamsize] = 0; fclose(f); unlink(filename); /* * Parse the memory buffer into XML document and * transform it to UDDF format, finally dumping * the XML into a character buffer. */ doc = xmlReadMemory(membuf, strlen(membuf), "divelog", NULL, 0); if (!doc) { fprintf(stderr, "Failed to read XML memory\n"); return; } free((void *)membuf); /* Convert to UDDF format */ xslt = get_stylesheet("uddf-export.xslt"); if (!xslt) { fprintf(stderr, "Failed to open UDDF conversion stylesheet\n"); return; } transformed = xsltApplyStylesheet(xslt, doc, NULL); xsltFreeStylesheet(xslt); xmlFreeDoc(doc); /* Write the transformed XML to file */ f = subsurface_fopen(filename, "w"); xmlDocFormatDump(f, transformed, 1); xmlFreeDoc(transformed); fclose(f); } Subsurface-4.0.2/scripts/000077500000000000000000000000001226345450700153165ustar00rootroot00000000000000Subsurface-4.0.2/scripts/check-version000077500000000000000000000025251226345450700200100ustar00rootroot00000000000000#!/bin/sh # $1 - version string # options: # -c colored grep (implies -d) # -d debug # -r release (exit status error; when called from Makefile) # To validate relevant files are up to date, you would run the script # from command line before tagging: # # $ scripts/check-version -cr set -eu #set -x # You would typically add/remove files to/from the list files="Documentation/user-manual.txt Makefile README ReleaseNotes.txt" whine() { echo "$0: $*" >&2 } croak() { whine "$*" exit 1 } color=n debug=n release=n while getopts cdr opt; do case $opt in c) color=y debug=y ;; d) debug=y ;; r) release=y ;; *) croak "invalid option" ;; esac done shift $(($OPTIND - 1)) if [ $debug = y ]; then opts=-n else opts=-q fi [ $color = n ] || opts="${opts:+$opts }--color" v=${1:-} v=${v#v} case $v in *-*) # Ignore development versions if [ $release = y ]; then croak "'$v' not a release tag" else exit 0 fi ;; ''|*[!.0-9]*) croak "invalid version string '$v'" ;; esac whine "checking for version $v" saveIFS=$IFS IFS=. set -- $v IFS=$saveIFS v= while [ $# -gt 0 ]; do v=${v:+$v\\.}$1 shift done sts=0 for f in $files; do grep -EH $opts \ -e "(VERSION=|[Ss]ubsurface[[:blank:]]+)?\" \ $f || { [ $release != y ] || sts=1 whine "'$f' may need updating" } done exit $sts Subsurface-4.0.2/scripts/get-version000077500000000000000000000022441226345450700175100ustar00rootroot00000000000000#!/bin/sh # $1 - os name {linux|darwin|win} # $2 - [optional] raw version string "vX.Y-patchN-sha1". as from `git describe' # (see below) set -eu #set -x croak() { echo "$0: $*" >&2 exit 1 } [ $# -ge 1 ] || croak "missing OS argument" os=$1 if [ $# -eq 2 ] && [ "$2" ]; then v0=$2 else cmd="git describe --tags --abbrev=12" v0=$($cmd) || croak "odd; command '$cmd' failed" fi # strip off the 'v' prefix, if any v0=${v0#v} case $os in linux) v=$v0 ;; darwin|win) # just the dots in the version string - this way we can # count them IFS=. set -- $v0 # split $v0 using $IFS separator dots=$(($# - 1)) # use positional argument count # split version string using a '-' separator IFS=- set -- $v0 v=$1 # do we need to add another digit? # We know there are 1 or 2 dots in $v, so if it's just one # or we are trying to get to 4, add one digit if [ $dots -eq 1 ] || [ $os = win ]; then if [ $# -gt 1 ]; then v=$v.$2 else v=$v.0 fi fi # and if it was just one dot and we want 4, at another 0 if [ $dots -eq 1 ] && [ $os = win ]; then v=$v.0 fi ;; *) v=git.missing.please.hardcode.version ;; esac printf '%s' $v Subsurface-4.0.2/scripts/parse-descriptor.pl000066400000000000000000000016321226345450700211430ustar00rootroot00000000000000use Carp; #set command line arguments my ($infi, $outfi) = @ARGV; my ($type) = $outfi =~ /\.([^.]+)$/; open(my $fh, "<", $infi) || croak "can't open $infi: $!"; open(STDOUT, ">", $outfi) || croak "can't open $outfi: $!"; my $lastVend = ""; while (<$fh>) { my ($vend, $mod, $set) = split('\t', $_); if ($type eq "html") { if ($vend eq $lastVend) { printf(", %s", $mod); } else { if ($lastVend eq "") { printf("
%s
\n\t
    \n\t
  • %s", $vend, $mod); } else { printf("
  • \n\t
\n
\n
%s
\n\t
    \n\t
  • %s", $vend, $mod); } } } else { if ($vend eq $lastVend) { printf(", %s", $mod); } else { if ($lastVend eq "") { printf("%s: %s", $vend, $mod); } else { printf("\n%s: %s", $vend, $mod); } } } $lastVend = $vend; } if ($type eq "html") { print("
  • \n\t
\n
\n
"); } close $fh; Subsurface-4.0.2/scripts/win-ldd.pl000066400000000000000000000031631226345450700172140ustar00rootroot00000000000000#!perl use strict; my %deploy; my $objdump = $ENV{objdump} ? $ENV{objdump} : "objdump"; my @searchdirs; my @systemdirs = (qr|^c:/windows|i, qr|^c:/winnt|i, qr|^/c/windows|i, qr|^/c/winnt|); sub addDependenciesFor($) { open OBJDUMP, "-|", $objdump, "-p", $_[0] or die; while () { last if /^The Import Tables/; } while () { next unless /DLL Name: (.*)/; $deploy{$1} = 0 unless defined($deploy{$1}); last if /^\w/; } close OBJDUMP; } sub findMissingDependencies { for my $name (keys %deploy) { next if $deploy{$name}; my $path; for my $dir (@searchdirs) { my $fpath = "$dir/$name"; my $lcfpath = "$dir/" . lc($name); if (-e $fpath) { $path = $fpath; } elsif (-e $lcfpath) { $path = $lcfpath; } else { next; } addDependenciesFor($path); last; } $path = "/missing/file" unless $path; $deploy{$name} = $path; } } for (@ARGV) { s/^-L//; next if /^-/; if (-d $_) { push @searchdirs, $_; } elsif (-f $_) { # Add $_'s path to the search list too my $dirname = $_; $dirname =~ s,/[^/]+$,,; unshift @searchdirs, $dirname; $deploy{$_} = $_; addDependenciesFor($_); } } # Append PATH to @searchdirs @searchdirs = (@searchdirs, split(/:/, $ENV{PATH})); # Remove system dirs from @searchdirs @searchdirs = grep { my $sys = 0; for my $rx (@systemdirs) { if ($_ =~ $rx) { $sys = 1; last; } } !$sys; } @searchdirs; while (1) { findMissingDependencies(); my $i = 0; while (my ($name, $path) = each(%deploy)) { next if $path; ++$i; last; } last if $i == 0; } for (sort values %deploy) { next if $_ eq "/missing/file"; print "$_\n"; } Subsurface-4.0.2/sha1.c000066400000000000000000000207561226345450700146410ustar00rootroot00000000000000/* * SHA1 routine optimized to do word accesses rather than byte accesses, * and to avoid unnecessary copies into the context array. * * This was initially based on the Mozilla SHA1 implementation, although * none of the original Mozilla code remains. */ /* this is only to get definitions for memcpy(), ntohl() and htonl() */ #include #include #ifdef WIN32 #include #else #include #endif #include "sha1.h" #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) /* * Force usage of rol or ror by selecting the one with the smaller constant. * It _can_ generate slightly smaller code (a constant of 1 is special), but * perhaps more importantly it's possibly faster on any uarch that does a * rotate with a loop. */ #define SHA_ASM(op, x, n) ({ unsigned int __res; __asm__(op " %1,%0":"=r" (__res):"i" (n), "0" (x)); __res; }) #define SHA_ROL(x,n) SHA_ASM("rol", x, n) #define SHA_ROR(x,n) SHA_ASM("ror", x, n) #else #define SHA_ROT(X,l,r) (((X) << (l)) | ((X) >> (r))) #define SHA_ROL(X,n) SHA_ROT(X,n,32-(n)) #define SHA_ROR(X,n) SHA_ROT(X,32-(n),n) #endif /* * If you have 32 registers or more, the compiler can (and should) * try to change the array[] accesses into registers. However, on * machines with less than ~25 registers, that won't really work, * and at least gcc will make an unholy mess of it. * * So to avoid that mess which just slows things down, we force * the stores to memory to actually happen (we might be better off * with a 'W(t)=(val);asm("":"+m" (W(t))' there instead, as * suggested by Artur Skawina - that will also make gcc unable to * try to do the silly "optimize away loads" part because it won't * see what the value will be). * * Ben Herrenschmidt reports that on PPC, the C version comes close * to the optimized asm with this (ie on PPC you don't want that * 'volatile', since there are lots of registers). * * On ARM we get the best code generation by forcing a full memory barrier * between each SHA_ROUND, otherwise gcc happily get wild with spilling and * the stack frame size simply explode and performance goes down the drain. */ #if defined(__i386__) || defined(__x86_64__) #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val)) #elif defined(__GNUC__) && defined(__arm__) #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0) #else #define setW(x, val) (W(x) = (val)) #endif /* * Performance might be improved if the CPU architecture is OK with * unaligned 32-bit loads and a fast ntohl() is available. * Otherwise fall back to byte loads and shifts which is portable, * and is faster on architectures with memory alignment issues. */ #if defined(__i386__) || defined(__x86_64__) || \ defined(_M_IX86) || defined(_M_X64) || \ defined(__ppc__) || defined(__ppc64__) || \ defined(__powerpc__) || defined(__powerpc64__) || \ defined(__s390__) || defined(__s390x__) #define get_be32(p) ntohl(*(unsigned int *)(p)) #define put_be32(p, v) do { *(unsigned int *)(p) = htonl(v); } while (0) #else #define get_be32(p) ( \ (*((unsigned char *)(p) + 0) << 24) | \ (*((unsigned char *)(p) + 1) << 16) | \ (*((unsigned char *)(p) + 2) << 8) | \ (*((unsigned char *)(p) + 3) << 0) ) #define put_be32(p, v) do { \ unsigned int __v = (v); \ *((unsigned char *)(p) + 0) = __v >> 24; \ *((unsigned char *)(p) + 1) = __v >> 16; \ *((unsigned char *)(p) + 2) = __v >> 8; \ *((unsigned char *)(p) + 3) = __v >> 0; } while (0) #endif /* This "rolls" over the 512-bit array */ #define W(x) (array[(x)&15]) /* * Where do we get the source from? The first 16 iterations get it from * the input data, the next mix it from the 512-bit array. */ #define SHA_SRC(t) get_be32((unsigned char *) block + (t)*4) #define SHA_MIX(t) SHA_ROL(W((t)+13) ^ W((t)+8) ^ W((t)+2) ^ W(t), 1); #define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \ unsigned int TEMP = input(t); setW(t, TEMP); \ E += TEMP + SHA_ROL(A,5) + (fn) + (constant); \ B = SHA_ROR(B, 2); } while (0) #define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) #define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E ) #define T_20_39(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1, A, B, C, D, E ) #define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E ) #define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E ) static void blk_SHA1_Block(blk_SHA_CTX *ctx, const void *block) { unsigned int A,B,C,D,E; unsigned int array[16]; A = ctx->H[0]; B = ctx->H[1]; C = ctx->H[2]; D = ctx->H[3]; E = ctx->H[4]; /* Round 1 - iterations 0-16 take their input from 'block' */ T_0_15( 0, A, B, C, D, E); T_0_15( 1, E, A, B, C, D); T_0_15( 2, D, E, A, B, C); T_0_15( 3, C, D, E, A, B); T_0_15( 4, B, C, D, E, A); T_0_15( 5, A, B, C, D, E); T_0_15( 6, E, A, B, C, D); T_0_15( 7, D, E, A, B, C); T_0_15( 8, C, D, E, A, B); T_0_15( 9, B, C, D, E, A); T_0_15(10, A, B, C, D, E); T_0_15(11, E, A, B, C, D); T_0_15(12, D, E, A, B, C); T_0_15(13, C, D, E, A, B); T_0_15(14, B, C, D, E, A); T_0_15(15, A, B, C, D, E); /* Round 1 - tail. Input from 512-bit mixing array */ T_16_19(16, E, A, B, C, D); T_16_19(17, D, E, A, B, C); T_16_19(18, C, D, E, A, B); T_16_19(19, B, C, D, E, A); /* Round 2 */ T_20_39(20, A, B, C, D, E); T_20_39(21, E, A, B, C, D); T_20_39(22, D, E, A, B, C); T_20_39(23, C, D, E, A, B); T_20_39(24, B, C, D, E, A); T_20_39(25, A, B, C, D, E); T_20_39(26, E, A, B, C, D); T_20_39(27, D, E, A, B, C); T_20_39(28, C, D, E, A, B); T_20_39(29, B, C, D, E, A); T_20_39(30, A, B, C, D, E); T_20_39(31, E, A, B, C, D); T_20_39(32, D, E, A, B, C); T_20_39(33, C, D, E, A, B); T_20_39(34, B, C, D, E, A); T_20_39(35, A, B, C, D, E); T_20_39(36, E, A, B, C, D); T_20_39(37, D, E, A, B, C); T_20_39(38, C, D, E, A, B); T_20_39(39, B, C, D, E, A); /* Round 3 */ T_40_59(40, A, B, C, D, E); T_40_59(41, E, A, B, C, D); T_40_59(42, D, E, A, B, C); T_40_59(43, C, D, E, A, B); T_40_59(44, B, C, D, E, A); T_40_59(45, A, B, C, D, E); T_40_59(46, E, A, B, C, D); T_40_59(47, D, E, A, B, C); T_40_59(48, C, D, E, A, B); T_40_59(49, B, C, D, E, A); T_40_59(50, A, B, C, D, E); T_40_59(51, E, A, B, C, D); T_40_59(52, D, E, A, B, C); T_40_59(53, C, D, E, A, B); T_40_59(54, B, C, D, E, A); T_40_59(55, A, B, C, D, E); T_40_59(56, E, A, B, C, D); T_40_59(57, D, E, A, B, C); T_40_59(58, C, D, E, A, B); T_40_59(59, B, C, D, E, A); /* Round 4 */ T_60_79(60, A, B, C, D, E); T_60_79(61, E, A, B, C, D); T_60_79(62, D, E, A, B, C); T_60_79(63, C, D, E, A, B); T_60_79(64, B, C, D, E, A); T_60_79(65, A, B, C, D, E); T_60_79(66, E, A, B, C, D); T_60_79(67, D, E, A, B, C); T_60_79(68, C, D, E, A, B); T_60_79(69, B, C, D, E, A); T_60_79(70, A, B, C, D, E); T_60_79(71, E, A, B, C, D); T_60_79(72, D, E, A, B, C); T_60_79(73, C, D, E, A, B); T_60_79(74, B, C, D, E, A); T_60_79(75, A, B, C, D, E); T_60_79(76, E, A, B, C, D); T_60_79(77, D, E, A, B, C); T_60_79(78, C, D, E, A, B); T_60_79(79, B, C, D, E, A); ctx->H[0] += A; ctx->H[1] += B; ctx->H[2] += C; ctx->H[3] += D; ctx->H[4] += E; } void blk_SHA1_Init(blk_SHA_CTX *ctx) { ctx->size = 0; /* Initialize H with the magic constants (see FIPS180 for constants) */ ctx->H[0] = 0x67452301; ctx->H[1] = 0xefcdab89; ctx->H[2] = 0x98badcfe; ctx->H[3] = 0x10325476; ctx->H[4] = 0xc3d2e1f0; } void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, unsigned long len) { unsigned int lenW = ctx->size & 63; ctx->size += len; /* Read the data into W and process blocks as they get full */ if (lenW) { unsigned int left = 64 - lenW; if (len < left) left = len; memcpy(lenW + (char *)ctx->W, data, left); lenW = (lenW + left) & 63; len -= left; data = ((const char *)data + left); if (lenW) return; blk_SHA1_Block(ctx, ctx->W); } while (len >= 64) { blk_SHA1_Block(ctx, data); data = ((const char *)data + 64); len -= 64; } if (len) memcpy(ctx->W, data, len); } void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx) { static const unsigned char pad[64] = { 0x80 }; unsigned int padlen[2]; int i; /* Pad with a binary 1 (ie 0x80), then zeroes, then length */ padlen[0] = htonl((uint32_t)(ctx->size >> 29)); padlen[1] = htonl((uint32_t)(ctx->size << 3)); i = ctx->size & 63; blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i))); blk_SHA1_Update(ctx, padlen, 8); /* Output hash */ for (i = 0; i < 5; i++) put_be32(hashout + i*4, ctx->H[i]); } Subsurface-4.0.2/sha1.h000066400000000000000000000016441226345450700146410ustar00rootroot00000000000000/* * SHA1 routine optimized to do word accesses rather than byte accesses, * and to avoid unnecessary copies into the context array. * * This was initially based on the Mozilla SHA1 implementation, although * none of the original Mozilla code remains. */ typedef struct { unsigned long long size; unsigned int H[5]; unsigned int W[16]; } blk_SHA_CTX; void blk_SHA1_Init(blk_SHA_CTX *ctx); void blk_SHA1_Update(blk_SHA_CTX *ctx, const void *dataIn, unsigned long len); void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx); /* Make us use the standard names */ #define SHA_CTX blk_SHA_CTX #define SHA1_Init blk_SHA1_Init #define SHA1_Update blk_SHA1_Update #define SHA1_Final blk_SHA1_Final /* Trivial helper function */ static inline void SHA1(const void *dataIn, unsigned long len, unsigned char hashout[20]) { SHA_CTX ctx; SHA1_Init(&ctx); SHA1_Update(&ctx, dataIn, len); SHA1_Final(hashout, &ctx); } Subsurface-4.0.2/statistics.c000066400000000000000000000244401226345450700161710ustar00rootroot00000000000000/* statistics.c * * core logic for the Info & Stats page - * char *get_time_string(int seconds, int maxdays); * char *get_minutes(int seconds); * void process_all_dives(struct dive *dive, struct dive **prev_dive); * void get_selected_dives_text(char *buffer, int size); */ #include "gettext.h" #include #include #include "dive.h" #include "display.h" #include "divelist.h" #include "statistics.h" static stats_t stats; stats_t stats_selection; stats_t *stats_monthly = NULL; stats_t *stats_yearly = NULL; stats_t *stats_by_trip = NULL; static void process_temperatures(struct dive *dp, stats_t *stats) { int min_temp, mean_temp, max_temp = 0; max_temp = dp->maxtemp.mkelvin; if (max_temp && (!stats->max_temp || max_temp > stats->max_temp)) stats->max_temp = max_temp; min_temp = dp->mintemp.mkelvin; if (min_temp && (!stats->min_temp || min_temp < stats->min_temp)) stats->min_temp = min_temp; if (min_temp || max_temp) { mean_temp = min_temp; if (mean_temp) mean_temp = (mean_temp + max_temp) / 2; else mean_temp = max_temp; stats->combined_temp += get_temp_units(mean_temp, NULL); stats->combined_count++; } } static void process_dive(struct dive *dp, stats_t *stats) { int old_tt, sac_time = 0; int duration = dp->duration.seconds; old_tt = stats->total_time.seconds; stats->total_time.seconds += duration; if (duration > stats->longest_time.seconds) stats->longest_time.seconds = duration; if (stats->shortest_time.seconds == 0 || duration < stats->shortest_time.seconds) stats->shortest_time.seconds = duration; if (dp->maxdepth.mm > stats->max_depth.mm) stats->max_depth.mm = dp->maxdepth.mm; if (stats->min_depth.mm == 0 || dp->maxdepth.mm < stats->min_depth.mm) stats->min_depth.mm = dp->maxdepth.mm; process_temperatures(dp, stats); /* Maybe we should drop zero-duration dives */ if (!duration) return; stats->avg_depth.mm = (1.0 * old_tt * stats->avg_depth.mm + duration * dp->meandepth.mm) / stats->total_time.seconds; if (dp->sac > 2800) { /* less than .1 cuft/min (2800ml/min) is bogus */ sac_time = stats->total_sac_time + duration; stats->avg_sac.mliter = (1.0 * stats->total_sac_time * stats->avg_sac.mliter + duration * dp->sac) / sac_time ; if (dp->sac > stats->max_sac.mliter) stats->max_sac.mliter = dp->sac; if (stats->min_sac.mliter == 0 || dp->sac < stats->min_sac.mliter) stats->min_sac.mliter = dp->sac; stats->total_sac_time = sac_time; } } char *get_minutes(int seconds) { static char buf[80]; snprintf(buf, sizeof(buf), "%d:%.2d", FRACTION(seconds, 60)); return buf; } void process_all_dives(struct dive *dive, struct dive **prev_dive) { int idx; struct dive *dp; struct tm tm; int current_year = 0; int current_month = 0; int year_iter = 0; int month_iter = 0; int prev_month = 0, prev_year = 0; int trip_iter = 0; dive_trip_t *trip_ptr = 0; unsigned int size; *prev_dive = NULL; memset(&stats, 0, sizeof(stats)); if (dive_table.nr > 0) { stats.shortest_time.seconds = dive_table.dives[0]->duration.seconds; stats.min_depth.mm = dive_table.dives[0]->maxdepth.mm; stats.selection_size = dive_table.nr; } /* allocate sufficient space to hold the worst * case (one dive per year or all dives during * one month) for yearly and monthly statistics*/ if (stats_yearly != NULL) { free(stats_yearly); free(stats_monthly); free(stats_by_trip); } size = sizeof(stats_t) * (dive_table.nr + 1); stats_yearly = malloc(size); stats_monthly = malloc(size); stats_by_trip = malloc(size); if (!stats_yearly || !stats_monthly || !stats_by_trip) return; memset(stats_yearly, 0, size); memset(stats_monthly, 0, size); memset(stats_by_trip, 0, size); stats_yearly[0].is_year = TRUE; /* this relies on the fact that the dives in the dive_table * are in chronological order */ for (idx = 0; idx < dive_table.nr; idx++) { dp = dive_table.dives[idx]; if (dive && dp->when == dive->when) { /* that's the one we are showing */ if (idx > 0) *prev_dive = dive_table.dives[idx-1]; } process_dive(dp, &stats); /* yearly statistics */ utc_mkdate(dp->when, &tm); if (current_year == 0) current_year = tm.tm_year + 1900; if (current_year != tm.tm_year + 1900) { current_year = tm.tm_year + 1900; process_dive(dp, &(stats_yearly[++year_iter])); stats_yearly[year_iter].is_year = TRUE; } else { process_dive(dp, &(stats_yearly[year_iter])); } stats_yearly[year_iter].selection_size++; stats_yearly[year_iter].period = current_year; if (dp->divetrip != NULL) { if (trip_ptr != dp->divetrip) { trip_ptr = dp->divetrip; trip_iter++; } /* stats_by_trip[0] is all the dives combined */ stats_by_trip[0].selection_size++; process_dive(dp, &(stats_by_trip[0])); stats_by_trip[0].is_trip = TRUE; stats_by_trip[0].location = strdup("All (by trip stats)"); process_dive(dp, &(stats_by_trip[trip_iter])); stats_by_trip[trip_iter].selection_size++; stats_by_trip[trip_iter].is_trip = TRUE; stats_by_trip[trip_iter].location = dp->divetrip->location; } /* monthly statistics */ if (current_month == 0) { current_month = tm.tm_mon + 1; } else { if (current_month != tm.tm_mon + 1) current_month = tm.tm_mon + 1; if (prev_month != current_month || prev_year != current_year) month_iter++; } process_dive(dp, &(stats_monthly[month_iter])); stats_monthly[month_iter].selection_size++; stats_monthly[month_iter].period = current_month; prev_month = current_month; prev_year = current_year; } } /* make sure we skip the selected summary entries */ void process_selected_dives(void) { struct dive *dive; unsigned int i, nr; memset(&stats_selection, 0, sizeof(stats_selection)); nr = 0; for_each_dive(i, dive) { if (dive->selected) { process_dive(dive, &stats_selection); nr++; } } stats_selection.selection_size = nr; } char *get_time_string(int seconds, int maxdays) { static char buf[80]; if (maxdays && seconds > 3600 * 24 * maxdays) { snprintf(buf, sizeof(buf), translate("gettextFromC","more than %d days"), maxdays); } else { int days = seconds / 3600 / 24; int hours = (seconds - days * 3600 * 24) / 3600; int minutes = (seconds - days * 3600 * 24 - hours * 3600) / 60; if (days > 0) snprintf(buf, sizeof(buf), translate("gettextFromC","%dd %dh %dmin"), days, hours, minutes); else snprintf(buf, sizeof(buf), translate("gettextFromC","%dh %dmin"), hours, minutes); } return buf; } /* this gets called when at least two but not all dives are selected */ static void get_ranges(char *buffer, int size) { int i, len; int first = -1, last = -1; snprintf(buffer, size, "%s", translate("gettextFromC","for dives #")); for (i = 0; i < dive_table.nr; i++) { struct dive *dive = get_dive(i); if (! dive->selected) continue; if (dive->number < 1) { /* uhh - weird numbers - bail */ snprintf(buffer, size, "%s", translate("gettextFromC","for selected dives")); return; } len = strlen(buffer); if (last == -1) { snprintf(buffer + len, size - len, "%d", dive->number); first = last = dive->number; } else { if (dive->number == last + 1) { last++; continue; } else { if (first == last) snprintf(buffer + len, size - len, ", %d", dive->number); else if (first + 1 == last) snprintf(buffer + len, size - len, ", %d, %d", last, dive->number); else snprintf(buffer + len, size - len, "-%d, %d", last, dive->number); first = last = dive->number; } } } len = strlen(buffer); if (first != last) { if (first + 1 == last) snprintf(buffer + len, size - len, ", %d", last); else snprintf(buffer + len, size - len, "-%d", last); } } void get_selected_dives_text(char *buffer, int size) { if (amount_selected == 1) { if (current_dive) snprintf(buffer, size, translate("gettextFromC","for dive #%d"), current_dive->number); else snprintf(buffer, size, "%s", translate("gettextFromC","for selected dive")); } else if (amount_selected == dive_table.nr) { snprintf(buffer, size, "%s", translate("gettextFromC","for all dives")); } else if (amount_selected == 0) { snprintf(buffer, size, "%s", translate("gettextFromC","(no dives)")); } else { get_ranges(buffer, size); if (strlen(buffer) == size -1) { /* add our own ellipse... the way Pango does this is ugly * as it will leave partial numbers there which I don't like */ int offset = 4; while (offset < size && isdigit(buffer[size - offset])) offset++; strcpy(buffer + size - offset, "..."); } } } static bool is_gas_used(struct dive *dive, int idx) { struct divecomputer *dc = &dive->dc; bool firstGasExplicit = FALSE; if (cylinder_none(&dive->cylinder[idx])) return FALSE; while (dc) { struct event *event = get_next_event(dc->events, "gaschange"); while (event) { if (event->time.seconds < 30) firstGasExplicit = TRUE; if (get_cylinder_index(dive, event) == idx) return TRUE; event = get_next_event(event->next, "gaschange"); } dc = dc->next; } if (idx == 0 && !firstGasExplicit) return TRUE; return FALSE; } void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS]) { int idx; for (idx = 0; idx < MAX_CYLINDERS; idx++) { cylinder_t *cyl = &dive->cylinder[idx]; pressure_t start, end; if (!is_gas_used(dive, idx)) continue; start = cyl->start.mbar ? cyl->start : cyl->sample_start; end = cyl->end.mbar ? cyl->end : cyl->sample_end; if (start.mbar && end.mbar) gases[idx].mliter = gas_volume(cyl, start) - gas_volume(cyl, end); } } #define MAXBUF 80 /* for the O2/He readings just create a list of them */ char *get_gaslist(struct dive *dive) { int idx, offset = 0; static char buf[MAXBUF]; int o2, he; buf[0] = '\0'; for (idx = 0; idx < MAX_CYLINDERS; idx++) { cylinder_t *cyl; if (!is_gas_used(dive, idx)) continue; cyl = &dive->cylinder[idx]; o2 = get_o2(&cyl->gasmix); he = get_he(&cyl->gasmix); if (offset > 0) { strncpy(buf + offset, "\n", MAXBUF - offset); offset = strlen(buf); } if (is_air(o2, he)) strncpy(buf + offset, translate("gettextFromC","air"), MAXBUF - offset); else if (he == 0) snprintf(buf + offset, MAXBUF - offset, translate("gettextFromC","EAN%d"), (o2 + 5) / 10); else snprintf(buf + offset, MAXBUF - offset, "%d/%d", (o2 + 5) / 10, (he + 5) / 10); offset = strlen(buf); } if (*buf == '\0') strncpy(buf, translate("gettextFromC","air"), MAXBUF); return buf; } Subsurface-4.0.2/statistics.h000066400000000000000000000023241226345450700161730ustar00rootroot00000000000000/* * statistics.h * * core logic functions called from statistics UI * common types and variables */ #ifndef STATISTICS_H #define STATISTICS_H #ifdef __cplusplus extern "C" { #endif typedef struct { int period; duration_t total_time; /* avg_time is simply total_time / nr -- let's not keep this */ duration_t shortest_time; duration_t longest_time; depth_t max_depth; depth_t min_depth; depth_t avg_depth; volume_t max_sac; volume_t min_sac; volume_t avg_sac; int max_temp; int min_temp; double combined_temp; unsigned int combined_count; unsigned int selection_size; unsigned int total_sac_time; bool is_year; bool is_trip; char *location; } stats_t; extern stats_t stats_selection; extern stats_t *stats_yearly; extern stats_t *stats_monthly; extern stats_t *stats_by_trip; extern char *get_time_string(int seconds, int maxdays); extern char *get_minutes(int seconds); extern void process_all_dives(struct dive *dive, struct dive **prev_dive); extern void get_selected_dives_text(char *buffer, int size); extern void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS]); extern char *get_gaslist(struct dive *dive); extern void process_selected_dives(void); #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/strtod.c000066400000000000000000000051601226345450700153140ustar00rootroot00000000000000/* * Sane helper for 'strtod()'. * * Sad that we even need this, but the C library version has * insane locale behavior, and while the Qt "doDouble()" routines * are better in that regard, they don't have an end pointer * (having replaced it with the completely idiotic "ok" boolean * pointer instead). * * I wonder what drugs people are on sometimes. * * Right now we support the following flags to limit the * parsing some ways: * * STRTOD_NO_SIGN - don't accept signs * STRTOD_NO_DOT - no decimal dots, I'm European * STRTOD_NO_COMMA - no comma, please, I'm C locale * STRTOD_NO_EXPONENT - no exponent parsing, I'm human * * The "negative" flags are so that the common case can just * use a flag value of 0, and only if you have some special * requirements do you need to state those with explicit flags. * * So if you want the C locale kind of parsing, you'd use the * STRTOD_NO_COMMA flag to disallow a decimal comma. But if you * want a more relaxed "Hey, Europeans are people too, even if * they have locales with commas", just pass in a zero flag. */ #include #include "dive.h" double strtod_flags(const char *str, const char **ptr, unsigned int flags) { char c; const char *p = str, *ep; double val = 0.0; double decimal = 1.0; int sign = 0, esign = 0; int numbers = 0, dot = 0; /* skip spaces */ while (isspace(c = *p++)) /* */; /* optional sign */ if (!(flags & STRTOD_NO_SIGN)) { switch (c) { case '-': sign = 1; /* fallthrough */ case '+': c = *p++; } } /* Mantissa */ for (;;c = *p++) { if ((c == '.' && !(flags & STRTOD_NO_DOT)) || (c == ',' && !(flags & STRTOD_NO_COMMA))) { if (dot) goto done; dot = 1; continue; } if (c >= '0' && c <= '9') { numbers++; if (dot) { decimal /= 10; val += (c - '0') * decimal; } else { val = (val * 10) + (c - '0'); } continue; } if (c != 'e' && c != 'E') goto done; if (flags & STRTOD_NO_EXPONENT) goto done; break; } if (!numbers) goto done; /* Exponent */ ep = p; c = *ep++; switch (c) { case '-': esign = 1; /* fallthrough */ case '+': c = *ep++; } if (c >= '0' && c <= '9') { p = ep; int exponent = c - '0'; for (;;) { c = *p++; if (c < '0' || c > '9') break; exponent *= 10; exponent += c - '0'; } /* We're not going to bother playing games */ if (exponent > 308) exponent = 308; while (exponent-- > 0) { if (esign) val /= 10; else val *= 10; } } done: if (!numbers) goto no_conversion; if (ptr) *ptr = p-1; return sign ? -val : val; no_conversion: if (ptr) *ptr = str; return 0.0; } Subsurface-4.0.2/subsurface-configure.pri000066400000000000000000000113561226345450700204720ustar00rootroot00000000000000# # Global settings # # Set some C constructs to be diagnosed as errors: # - calling implicit functions # - casting from integers to pointers or vice-versa without an explicit cast # Also turn on C99 mode with GNU extensions *-g++*: QMAKE_CFLAGS += -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=implicit-int # these warnings are in general just wrong and annoying - but should be # turned on every once in a while in case they do show the occasional # actual bug # turns out the gcc 4.2 (as used on MacOS 10.6) doesn't have no-unused-result, yet *-clang*: QMAKE_CFLAGS += -Wno-unused-result -Wno-pointer-sign -fno-strict-overflow *-g++*: { system( g++ --version | grep -e "4\\.2\\." > /dev/null ) { QMAKE_CFLAGS += -Wno-pointer-sign -fno-strict-overflow } else { QMAKE_CFLAGS += -Wno-unused-result -Wno-pointer-sign -fno-strict-overflow } } *-clang*: QMAKE_CFLAGS += -Wno-format-security *-g++*: QMAKE_CXXFLAGS += -fno-strict-overflow !win32: !mac: { *-g++*: QMAKE_CXXFLAGS += -Wno-maybe-uninitialized *-g++*: QMAKE_CFLAGS += -Wno-maybe-uninitialized } mac: QMAKE_CLAGS += -mmacosx-version-min=10.5 mac: QMAKE_CXXLAGS += -mmacosx-version-min=10.5 !win32-msvc*: QMAKE_CFLAGS += -std=gnu99 # Don't turn warnings on (but don't suppress them either) CONFIG -= warn_on warn_off # Turn exceptions off !win32-msvc*: QMAKE_CXXFLAGS += -fno-exceptions CONFIG += exceptions_off # Check if we have pkg-config isEmpty(PKG_CONFIG):PKG_CONFIG=pkg-config equals($$QMAKE_HOST.os, "Windows"):NUL=NUL else:NUL=/dev/null PKG_CONFIG_OUT = $$system($$PKG_CONFIG --version 2> $$NUL) !isEmpty(PKG_CONFIG_OUT) { CONFIG += link_pkgconfig } else { message("pkg-config not found, no detection performed. See README for details") } # # Find libdivecomputer # !isEmpty(LIBDCDEVEL) { # find it next to our sources INCLUDEPATH += ../libdivecomputer/include LIBS += ../libdivecomputer/src/.libs/libdivecomputer.a LIBDC_LA = ../libdivecomputer/src/libdivecomputer.la } else:!isEmpty(CROSS_PATH):exists($${CROSS_PATH}"/lib/libdivecomputer.a"):exists($${CROSS_PATH}"/lib/libusb-1.0.a") { LIBS += $${CROSS_PATH}"/lib/libdivecomputer.a" $${CROSS_PATH}"/lib/libusb-1.0.a" } else:exists(/usr/local/lib/libdivecomputer.a) { LIBS += /usr/local/lib/libdivecomputer.a LIBDC_LA = /usr/local/lib/libdivecomputer.la } else:exists(/usr/local/lib64/libdivecomputer.a) { LIBS += /usr/local/lib64/libdivecomputer.a LIBDC_LA = /usr/local/lib64/libdivecomputer.la } else:link_pkgconfig { # find it via pkg-config, but we need to pass the --static flag, # so we can't use the PKGCONFIG variable. LIBS += $$system($$PKG_CONFIG --static --libs libdivecomputer) LIBDC_CFLAGS = $$system($$PKG_CONFIG --static --cflags libdivecomputer) QMAKE_CFLAGS += $$LIBDC_CFLAGS QMAKE_CXXFLAGS += $$LIBDC_CFLAGS unset(LIBDC_CFLAGS) } !isEmpty(LIBDC_LA):exists($$LIBDC_LA) { # Source the libtool .la file to get the dependent libs LIBS += $$system(". $$LIBDC_LA && echo \$dependency_libs") unset(LIBDC_LA) } # # Find libxml2 and libxslt # # They come with shell scripts that contain the information we need, so we just # run them. They also come with pkg-config files, but those are missing on # Mac (where they are part of the XCode-supplied tools). # XML2_CFLAGS = $$system(xml2-config --cflags 2>$$NUL) XSLT_CFLAGS = $$system(xslt-config --cflags 2>$$NUL) XML2_LIBS = $$system(xml2-config --libs 2>$$NUL) XSLT_LIBS = $$system(xslt-config --libs 2>$$NUL) link_pkgconfig { isEmpty(XML2_CFLAGS)|isEmpty(XML2_LIBS) { XML2_CFLAGS = $$system($$PKG_CONFIG --cflags libxml2 2> $$NUL) XML2_LIBS = $$system($$PKG_CONFIG --libs libxml2 2> $$NUL) } isEmpty(XSLT_CFLAGS)|isEmpty(XSLT_LIBS) { XSLT_CFLAGS = $$system($$PKG_CONFIG --cflags libxslt 2> $$NUL) XSLT_LIBS = $$system($$PKG_CONFIG --libs libxslt 2> $$NUL) } isEmpty(XML2_CFLAGS)|isEmpty(XML2_LIBS): \ error("Could not find libxml2. Did you forget to install it?") isEmpty(XSLT_CFLAGS)|isEmpty(XSLT_LIBS): \ error("Could not find libxslt. Did you forget to install it?") } QMAKE_CFLAGS *= $$XML2_CFLAGS $$XSLT_CFLAGS QMAKE_CXXFLAGS *= $$XML2_CFLAGS $$XSLT_CFLAGS LIBS *= $$XML2_LIBS $$XSLT_LIBS # # Find other pkg-config-based projects # We're searching for: # libzip # sqlite3 link_pkgconfig: PKGCONFIG += libzip sqlite3 # Add libiconv if needed link_pkgconfig: packagesExist(libiconv): PKGCONFIG += libiconv # # Find libmarble # # Before Marble 4.9, the GeoDataTreeModel.h header wasn't installed # Check if it's present by trying to compile # ### FIXME: implement that win32: CONFIG(debug, debug|release): LIBS += -lmarblewidgetd else: LIBS += -lmarblewidget # # Platform-specific changes # win32 { LIBS += -lwsock32 DEFINES -= UNICODE } # # misc # !equals(V, 1): !equals(QMAKE_HOST.os, "Windows"): CONFIG += silent MOC_DIR = .moc UI_DIR = .uic RCC_DIR = .rcc OBJECTS_DIR = .obj Subsurface-4.0.2/subsurface-gen-version.pri000066400000000000000000000022511226345450700207370ustar00rootroot00000000000000# Generate the ssrf-version.h file VERSION_FILE = ssrf-version.h macx: VER_OS = darwin unix: !macx: VER_OS = linux win32: VER_OS = win exists(.git/HEAD): { win32: SET_GIT_DIR = set GIT_DIR else: SET_GIT_DIR = GIT_DIR GIT_HEAD = .git/HEAD VERSION_SCRIPT = $$PWD/scripts/get-version # always use linux here -------------------vvv so we get the true full version FULL_VERSION = "`$$VERSION_SCRIPT linux`" PRODVERSION_STRING = $$system("sh scripts/get-version win $$FULL_VERSION || $${VERSION}.0.0") VERSION_STRING = $$system("sh scripts/get-version linux $$FULL_VERSION || $${VERSION}") version_h.depends = $$VERSION_SCRIPT $$PWD/.git/$$system("$$SET_GIT_DIR=$$PWD/.git git rev-parse --symbolic-full-name HEAD") version_h.commands = echo \\$${LITERAL_HASH}define VERSION_STRING \\\"`GIT_DIR=$$PWD/.git $$VERSION_SCRIPT $$VER_OS`\\\" > ${QMAKE_FILE_OUT} version_h.input = GIT_HEAD version_h.output = $$VERSION_FILE version_h.variable_out = GENERATED_FILES version_h.CONFIG = ignore_no_exist QMAKE_EXTRA_COMPILERS += version_h } else { # This is probably a package FULL_VERSION = $$VERSION system(echo \\$${LITERAL_HASH}define VERSION_STRING \\\"$$VERSION\\\" > $$VERSION_FILE) } Subsurface-4.0.2/subsurface-icon.bmp000066400000000000000000001161661226345450700174320ustar00rootroot00000000000000BMv6(dd @ [ηϰT ДxxxrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrsvzzzzzzЈGynMO&J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J b>{9h¿_9J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J kIU=¼N$J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J `9/N#J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J jG ϛZ2J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J rҁtJ J J J J J J J J J J J J J J J J J J J J J J J J J J J J Z4Q)J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J W. ijEK K K K K K K K K K K K K K K K K K K K K K K K K K K K K нѿL"K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K tRŕO&K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!_7K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!oLͮ析K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!c7zK!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!K!P&vL!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!^0h:L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!kL!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!Z-X)L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!vfL!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!X)ӾS&L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!L!mgL"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"V*ʮN#L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"L"eeM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"V)M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"bdM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"V(jM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"bbM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"T({VM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"bbN"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"\0nEN"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"N"bbN#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#~[a4N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#c`N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#£Y+N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#R(cY1N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#c`N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#ĵW*N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#ĨɾrW/N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#N#c_O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#T'pKO#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#d=ŬhCO#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#O#c_O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$Y-ӾȼO$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$pU,O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$c^O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$T'e6ӿiO$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$ϼkX0O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$O$c]P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$U(f7U,P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$g>öt_7P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$c~\P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$T'f6P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$ȩe4e4n@lѻpNQ&P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$c~[P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$U'g7d=P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$P$Q%rFR&T'X*].c3i:vɴ~_P$P$P$P$P$P$P$P$P$P$P$P$P$P$c}[P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%T(j=нP%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%P%yVĵZ,P%P%P%P%P%W)_/e4{Rn@s^5P%P%P%P%P%P%P%P%P%P%P%P%P%c}[Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%[,ǧwQ%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%ѼkS'Q%Q%Q%Q%Q%Q%Q%T'Z+Y+e4e4vKfɬͳк{WQ%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%c}YQ%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%R%k<{Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%b9`1Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%R%U(Y+\._0a1c2d3e4e4b1Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%c}YQ%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Y+ȪQ%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%ŨȩV)Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%Q%c}YR%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%S%m?R%R%R%R%R%R%R%R%R%R%R%R%Z.aR%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%b}YR&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&R&R&R&R&R&R&R&R&R&R&~rIR&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&c}YR&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&S'oBҼR&R&R&R&R&R&R&R&R&V*_2R&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&c}YR&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&]-g7]uR&R&R&R&R&R&R&R&c:Z,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&R&c~YS&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&S&U(X*c2eεS&S&S&S&S&S&S&S&ge4e4oBbmd4`0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0_0w[`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0tKȬhd4b1`1a1b2b3d2`1`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0z[`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0b1d4e3c3`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0{[`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`1`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0`0|\`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1`1~\a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1p@a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1e4h9l=qBuEyJ}N~OVY^eggg`]ZTR|MuFo@h8b1a1a1a1a1a1a1a1a1a1a1a1a1^e6a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1d3k;qBwH~OZÓk̢~Գ©ɴоŭѰƙsUvFi:a1a1a1a1a1a1a1Ĭ\l;b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1g6m=tEzKScǛtЫؼ˶μҮ_tDd3b1b1b1韣Э[vGk;b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2d4i:p@wG}NX‘hʡ|ұīμ׻_m=b2ʕϽػΦĔk]WS~PzL{L{L{L|N~P~PRYdƗoˡ}ЬָưϽȞxαt] ¾ЮΘZJxdVF%гÿѪ!pgSubsurface-4.0.2/subsurface-icon.h000066400000000000000000013647661226345450700171170ustar00rootroot00000000000000/* GdkPixbuf RGBA C-Source image dump 1-byte-run-length-encoded */ static const GdkPixdata subsurface_icon_pixbuf = { 0x47646b50, /* Pixbuf magic: 'GdkP' */ 24 + 115974, /* header length + pixel_data length */ 0x2010002, /* pixdata_type */ 1024, /* rowstride */ 256, /* width */ 256, /* height */ /* pixel_data: */ "\231!H\211\0\377\323\332\317\377\316\323\332\317\377\257!H\211\0\202" "\323\332\317\377\5\322\330\316\377\315\323\311\377\321\320\307\377\307" "\316\303\377\310\307\276\377\202\301\310\275\377\211\306\306\275\377" "\215\305\307\303\377\231\310\307\276\377\261\305\307\303\377\2\310\307" "\276\377\301\310\275\377\343\306\306\275\377\10\301\310\275\377\306\314" "\302\377\314\313\302\377\321\320\307\377\330\327\316\377\322\330\316" "\377\323\332\317\377\330\327\316\377\250!H\211\0\4\323\332\317\377\322" "\330\316\377\307\316\303\377\310\307\276\377\202\300\277\266\377\3\272" "\272\261\377\257\257\246\377\254\253\242\377\202\252\254\251\377\202" "\254\253\242\377\207\252\254\251\377\215\251\250\240\377\214\250\247" "\236\377\1\245\244\233\377\205\243\245\242\377\206\245\244\233\377\1" "\242\242\231\377\260\240\237\226\377\321\240\242\237\377\206\240\237" "\226\377\206\240\242\237\377\206\240\237\226\377\203\240\242\237\377" "\12\245\244\233\377\251\250\240\377\256\255\244\377\263\271\257\377\300" "\277\266\377\306\306\275\377\301\310\275\377\321\320\307\377\322\330" "\316\377\323\332\317\377\243!H\211\0\202\323\332\317\377\10\315\323\311" "\377\301\310\275\377\300\277\266\377\272\272\261\377\254\253\242\377" "\231\230\220\377\203\205\202\377\206\205}\377\211\203\205\202\377\207" "\207\211\206\377\2\212\214\211\377\207\211\206\377\206\212\214\211\377" "\217\216\220\215\377\212\222\224\221\377\262\227\231\226\377\320\222" "\224\221\377\207\227\231\226\377\1\240\237\226\377\204\234\236\234\377" "\1\240\242\237\377\207\243\245\242\377\16\252\254\251\377\243\245\242" "\377\227\231\226\377\222\224\221\377\216\220\215\377\207\211\206\377" "\203\205\202\377\227\231\226\377\257\257\246\377\272\272\261\377\300" "\277\266\377\301\310\275\377\315\323\311\377\323\332\317\377\240!H\211" "\0\13\330\327\316\377\315\323\311\377\301\310\275\377\300\277\266\377" "\252\254\251\377\222\224\221\377\203\205\202\377~\200}\377\234\236\234" "\377\265\267\264\377\305\307\303\377\206\317\322\316\377\206\327\331" "\326\377\206\334\337\333\377\204\343\345\342\377\210\351\353\347\377" "\204\355\357\353\377\1\356\360\355\377\203\360\362\357\377\2\356\360" "\355\377\360\362\357\377\204\362\364\361\377\1\365\367\363\377\204\367" "\371\366\377\262\365\367\363\377\230\367\371\366\377\1\365\367\363\377" "\261\362\364\361\377\1\365\367\363\377\205\367\371\366\377\227\365\367" "\363\377\15\360\362\357\377\343\345\342\377\327\331\326\377\276\301\275" "\377\240\242\237\377\203\205\202\377\207\211\206\377\227\231\226\377" "\263\262\251\377\300\277\266\377\301\310\275\377\322\330\316\377\323" "\332\317\377\234!H\211\0\12\323\332\317\377\322\330\316\377\310\307\276" "\377\300\277\266\377\256\255\244\377\216\220\215\377~\200}\377\234\236" "\234\377\305\307\303\377\351\353\347\377\202\360\362\357\377\1\362\364" "\361\377\215\360\362\357\377\226\356\360\355\377\1\355\357\353\377\203" "\356\360\355\377\206\355\357\353\377\3\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\202\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377\204" "\355\357\353\377\203\353\356\352\377\204\355\357\353\377\4\353\356\352" "\377\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352" "\377\202\355\357\353\377\1\353\356\352\377\206\355\357\353\377\1\353" "\356\352\377\207\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\202\353\356\352\377\202\355\357\353\377\202\353\356\352\377\3\355" "\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352" "\377\263\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\204\355\357\353" "\377\1\353\356\352\377\204\355\357\353\377\203\353\356\352\377\204\355" "\357\353\377\203\353\356\352\377\17\355\357\353\377\356\360\355\377\360" "\362\357\377\362\364\361\377\360\362\357\377\351\353\347\377\276\301" "\275\377\227\231\226\377~\200}\377\227\231\226\377\261\263\257\377\300" "\277\266\377\314\313\302\377\330\327\316\377\323\332\317\377\231!H\211" "\0\10\323\332\317\377\315\323\311\377\300\277\266\377\263\271\257\377" "\222\224\221\377~\200}\377\240\242\237\377\327\331\326\377\202\360\362" "\357\377\204\353\356\352\377\204\355\357\353\377\202\353\356\352\377" "\202\355\357\353\377\206\353\356\352\377\1\355\357\353\377\202\353\356" "\352\377\1\355\357\353\377\206\353\356\352\377\1\355\357\353\377\210" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\203\353\356\352\377\1\355\357\353\377\203\353\356\352\377\3\355" "\357\353\377\353\356\352\377\355\357\353\377\207\353\356\352\377\203" "\355\357\353\377\203\353\356\352\377\202\355\357\353\377\211\353\356" "\352\377\202\355\357\353\377\210\353\356\352\377\203\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\211\353\356\352\377\1" "\355\357\353\377\204\353\356\352\377\3\355\357\353\377\353\356\352\377" "\355\357\353\377\203\353\356\352\377\1\355\357\353\377\204\353\356\352" "\377\1\355\357\353\377\205\353\356\352\377\203\355\357\353\377\202\353" "\356\352\377\202\355\357\353\377\206\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\206\353\356\352\377\1\355\357" "\353\377\210\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\203\353\356\352\377\1\355\357\353\377\203\353\356\352" "\377\3\355\357\353\377\353\356\352\377\355\357\353\377\207\353\356\352" "\377\203\355\357\353\377\203\353\356\352\377\202\355\357\353\377\211" "\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377" "\203\353\356\352\377\12\362\364\361\377\360\362\357\377\317\322\316\377" "\227\231\226\377~\200}\377\234\236\234\377\272\272\261\377\306\306\275" "\377\315\323\311\377\323\332\317\377\227!H\211\0\15\323\332\317\377\314" "\313\302\377\300\277\266\377\243\245\242\377\203\205\202\377\216\220" "\215\377\327\331\326\377\365\367\363\377\356\360\355\377\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357\353" "\377\1\353\356\352\377\212\355\357\353\377\1\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377" "\203\355\357\353\377\2\353\356\352\377\355\357\353\377\202\353\356\352" "\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352" "\377\205\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\203\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355\357" "\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377\204\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\202\353\356\352\377" "\2\355\357\353\377\353\356\352\377\204\355\357\353\377\205\353\356\352" "\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\202\353" "\356\352\377\2\355\357\353\377\353\356\352\377\203\355\357\353\377\203" "\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202" "\353\356\352\377\202\355\357\353\377\204\353\356\352\377\203\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355" "\357\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\1\353\356\352\377\212\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\204\355\357\353\377\1" "\353\356\352\377\203\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377" "\202\353\356\352\377\205\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\2\353\356\352\377" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352" "\377\203\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352" "\377\204\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\2\355\357\353\377\353\356\352\377\204\355\357\353\377" "\203\353\356\352\377\12\355\357\353\377\360\362\357\377\362\364\361\377" "\313\315\312\377\212\214\211\377\207\211\206\377\257\257\246\377\300" "\277\266\377\307\316\303\377\323\332\317\377\224!H\211\0\13\330\327\316" "\377\323\332\317\377\310\307\276\377\272\272\261\377\227\231\226\377" "~\200}\377\252\254\251\377\355\357\353\377\360\362\357\377\351\353\347" "\377\353\356\352\377\203\355\357\353\377\203\353\356\352\377\211\355" "\357\353\377\204\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\203\355\357\353\377\1\353" "\356\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377\202" "\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357" "\353\377\5\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353" "\377\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377\204" "\355\357\353\377\1\353\356\352\377\204\355\357\353\377\204\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\3\355\357\353\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\203\353\356\352\377\3\355\357\353\377\353\356\352" "\377\355\357\353\377\202\353\356\352\377\4\355\357\353\377\353\356\352" "\377\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\4\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\203\355\357\353\377\203\353\356\352\377\211\355\357\353\377\204" "\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\2\353\356\352\377\355\357\353\377\202\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377\5\353\356" "\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\204\355\357\353\377" "\1\353\356\352\377\204\355\357\353\377\204\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377\202" "\355\357\353\377\12\353\356\352\377\351\353\347\377\360\362\357\377\351" "\353\347\377\252\254\251\377~\200}\377\240\242\237\377\300\277\266\377" "\314\313\302\377\330\327\316\377\222!H\211\0\202\322\330\316\377\12\306" "\306\275\377\263\271\257\377\220\217\207\377~\200}\377\276\301\275\377" "\365\367\363\377\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\202\355\357\353\377\205\353\356\352\377\3\355\357\353\377" "\353\356\352\377\355\357\353\377\203\353\356\352\377\1\355\357\353\377" "\206\353\356\352\377\1\355\357\353\377\221\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\205\353\356\352\377\1" "\355\357\353\377\203\353\356\352\377\3\355\357\353\377\353\356\352\377" "\355\357\353\377\211\353\356\352\377\1\355\357\353\377\216\353\356\352" "\377\202\355\357\353\377\205\353\356\352\377\1\355\357\353\377\213\353" "\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\217\353" "\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\203\353\356\352\377\202\355\357\353\377\205\353\356\352\377\3\355\357" "\353\377\353\356\352\377\355\357\353\377\203\353\356\352\377\1\355\357" "\353\377\206\353\356\352\377\1\355\357\353\377\221\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\205\353\356\352" "\377\1\355\357\353\377\203\353\356\352\377\3\355\357\353\377\353\356" "\352\377\355\357\353\377\211\353\356\352\377\1\355\357\353\377\216\353" "\356\352\377\202\355\357\353\377\205\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\12\355\357\353\377\353\356\352\377\355\357\353\377" "\365\367\363\377\305\307\303\377~\200}\377\222\224\221\377\272\272\261" "\377\301\310\275\377\323\332\317\377\221!H\211\0\11\323\332\317\377\305" "\307\303\377\265\267\264\377\216\220\215\377\203\205\202\377\313\315" "\312\377\365\367\363\377\355\357\353\377\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\377\355\357\353\377\1\353\356\352\377\333" "\355\357\353\377\11\353\356\352\377\355\357\353\377\365\367\363\377\334" "\337\333\377\212\214\211\377\216\220\215\377\272\272\261\377\310\307" "\276\377\323\332\317\377\217!H\211\0\10\330\327\316\377\310\307\276\377" "\272\272\261\377\216\220\215\377~\200}\377\313\315\312\377\360\362\357" "\377\353\356\352\377\203\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\205\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\202\355\357\353\377\206\353\356\352\377\1\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\202\355\357\353\377\202\353\356\352\377\4\355\357" "\353\377\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\203\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\3\355\357\353\377\353\356\352" "\377\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356" "\352\377\2\355\357\353\377\353\356\352\377\204\355\357\353\377\202\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\204\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353" "\377\204\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1\353" "\356\352\377\202\355\357\353\377\206\353\356\352\377\202\355\357\353" "\377\5\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377" "\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\202\355\357\353\377\205\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\202\355\357\353\377\206\353\356" "\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\4\355\357\353\377\353\356\352\377\355\357\353" "\377\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355" "\357\353\377\203\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\2\355\357\353\377\353\356" "\352\377\204\355\357\353\377\202\353\356\352\377\202\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377\2\355\357" "\353\377\353\356\352\377\202\355\357\353\377\204\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\204\355\357\353\377\10\353\356\352" "\377\356\360\355\377\343\345\342\377\212\214\211\377\216\220\215\377" "\300\277\266\377\314\313\302\377\323\332\317\377\215!H\211\0\7\323\332" "\317\377\314\313\302\377\300\277\266\377\231\230\220\377~\200}\377\276" "\301\275\377\365\367\363\377\203\353\356\352\377\4\355\357\353\377\353" "\356\352\377\355\357\353\377\353\356\352\377\203\355\357\353\377\204" "\353\356\352\377\210\355\357\353\377\204\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\203\355\357\353\377\2\353\356\352\377\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\203\355\357\353\377\203\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377\203" "\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377\202" "\355\357\353\377\204\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356" "\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\203\355\357\353\377\202\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\202" "\355\357\353\377\203\353\356\352\377\1\355\357\353\377\205\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\4\355\357\353\377\353\356" "\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\4\355\357\353\377\353\356\352\377\355\357\353\377\353\356" "\352\377\203\355\357\353\377\204\353\356\352\377\210\355\357\353\377" "\204\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\2\353\356\352\377" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377\203" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\203\353\356\352\377\203\355\357\353\377\3\353\356\352\377" "\355\357\353\377\353\356\352\377\202\355\357\353\377\204\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\3\355\357\353\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\203\353\356\352\377\7\360\362\357\377\343\345\342\377\212\214\211\377" "\231\230\220\377\300\277\266\377\321\320\307\377\323\332\317\377\213" "!H\211\0\7\323\332\317\377\321\320\307\377\300\277\266\377\234\236\234" "\377~\200}\377\252\254\251\377\362\364\361\377\203\355\357\353\377\1" "\353\356\352\377\202\355\357\353\377\202\353\356\352\377\202\355\357" "\353\377\205\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\206\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356" "\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\4\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\203\353\356\352\377\202\355\357\353\377\202\353\356\352\377\3\355" "\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377" "\1\355\357\353\377\203\353\356\352\377\1\355\357\353\377\203\353\356" "\352\377\1\355\357\353\377\204\353\356\352\377\2\355\357\353\377\353" "\356\352\377\202\355\357\353\377\204\353\356\352\377\202\355\357\353" "\377\207\353\356\352\377\1\355\357\353\377\203\353\356\352\377\3\355" "\357\353\377\353\356\352\377\355\357\353\377\205\353\356\352\377\1\355" "\357\353\377\207\353\356\352\377\5\355\357\353\377\353\356\352\377\355" "\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\202" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\202\355\357\353\377\205\353\356\352\377\3\355\357\353\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\202\355\357\353\377\206" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353" "\377\203\353\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355" "\357\353\377\202\353\356\352\377\4\355\357\353\377\353\356\352\377\355" "\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356\352\377" "\203\355\357\353\377\203\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\203\353\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357" "\353\377\203\353\356\352\377\1\355\357\353\377\204\353\356\352\377\2" "\355\357\353\377\353\356\352\377\202\355\357\353\377\204\353\356\352" "\377\202\355\357\353\377\211\353\356\352\377\7\356\360\355\377\334\337" "\333\377~\200}\377\243\245\242\377\300\277\266\377\315\323\311\377\322" "\330\316\377\212!H\211\0\7\322\330\316\377\274\302\270\377\252\254\251" "\377~\200}\377\222\224\221\377\356\360\355\377\355\357\353\377\203\353" "\356\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377\202" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\215\355\357\353" "\377\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\5\353\356\352\377\355\357\353\377\353\356\352\377" "\355\357\353\377\353\356\352\377\206\355\357\353\377\5\353\356\352\377" "\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\206" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352" "\377\212\355\357\353\377\203\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\206\355\357\353\377\205\353\356\352\377\204\355\357" "\353\377\1\353\356\352\377\203\355\357\353\377\202\353\356\352\377\207" "\355\357\353\377\10\353\356\352\377\355\357\353\377\353\356\352\377\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357" "\353\377\204\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355" "\357\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377" "\215\355\357\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\202\355\357\353\377\5\353\356\352\377\355\357\353\377" "\353\356\352\377\355\357\353\377\353\356\352\377\206\355\357\353\377" "\5\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\206\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\212\355\357\353\377\203\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\206\355\357\353\377\205\353\356\352" "\377\204\355\357\353\377\2\353\356\352\377\355\357\353\377\202\353\356" "\352\377\6\365\367\363\377\313\315\312\377~\200}\377\257\257\246\377" "\306\306\275\377\323\332\317\377\211!H\211\0\11\330\327\316\377\310\307" "\276\377\272\272\261\377\207\211\206\377\203\205\202\377\327\331\326" "\377\362\364\361\377\353\356\352\377\355\357\353\377\203\353\356\352" "\377\1\355\357\353\377\204\353\356\352\377\1\355\357\353\377\205\353" "\356\352\377\203\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\206\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\206\353\356\352\377\1\355\357\353\377\210\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377\203\353\356" "\352\377\1\355\357\353\377\203\353\356\352\377\3\355\357\353\377\353" "\356\352\377\355\357\353\377\207\353\356\352\377\203\355\357\353\377" "\203\353\356\352\377\202\355\357\353\377\211\353\356\352\377\202\355" "\357\353\377\210\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\204\353\356\352\377\202\355\357\353\377\1\353" "\356\352\377\202\355\357\353\377\211\353\356\352\377\1\355\357\353\377" "\204\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377" "\203\353\356\352\377\1\355\357\353\377\204\353\356\352\377\1\355\357" "\353\377\205\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\202\355\357\353\377\206\353\356\352\377\1\355\357\353\377\202\353\356" "\352\377\1\355\357\353\377\206\353\356\352\377\1\355\357\353\377\210" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\203\353\356\352\377\1\355\357\353\377\203\353\356\352\377\3\355" "\357\353\377\353\356\352\377\355\357\353\377\207\353\356\352\377\203" "\355\357\353\377\203\353\356\352\377\202\355\357\353\377\211\353\356" "\352\377\202\355\357\353\377\210\353\356\352\377\203\355\357\353\377" "\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353" "\377\6\365\367\363\377\252\254\251\377\211\210\200\377\272\272\261\377" "\307\316\303\377\323\332\317\377\207!H\211\0\7\322\330\316\377\315\323" "\311\377\300\277\266\377\227\231\226\377~\200}\377\261\263\257\377\365" "\367\363\377\202\353\356\352\377\207\355\357\353\377\1\353\356\352\377" "\221\355\357\353\377\1\353\356\352\377\235\355\357\353\377\1\353\356" "\352\377\210\355\357\353\377\1\353\356\352\377\216\355\357\353\377\1" "\353\356\352\377\250\355\357\353\377\1\353\356\352\377\202\355\357\353" "\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\207\355" "\357\353\377\1\353\356\352\377\221\355\357\353\377\1\353\356\352\377" "\235\355\357\353\377\1\353\356\352\377\210\355\357\353\377\1\353\356" "\352\377\216\355\357\353\377\1\353\356\352\377\231\355\357\353\377\7" "\353\356\352\377\355\357\353\377\351\353\347\377\212\214\211\377\240" "\237\226\377\274\302\270\377\322\330\316\377\207!H\211\0\7\323\332\317" "\377\310\307\276\377\257\257\246\377\203\205\202\377\216\220\215\377" "\351\353\347\377\355\357\353\377\203\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377\202\355\357" "\353\377\205\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\206\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\216\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\203\353\356\352\377\1\355\357\353\377\203\353\356\352\377\3\355\357" "\353\377\353\356\352\377\355\357\353\377\211\353\356\352\377\1\355\357" "\353\377\203\353\356\352\377\1\355\357\353\377\213\353\356\352\377\1" "\355\357\353\377\205\353\356\352\377\1\355\357\353\377\207\353\356\352" "\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353\377\221\353" "\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\203\353\356\352\377\202\355\357\353\377\205\353\356\352\377\3\355\357" "\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\206\353\356\352\377\1\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\216\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\203\353\356\352\377\1\355\357\353\377\203" "\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\211" "\353\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353" "\377\213\353\356\352\377\1\355\357\353\377\205\353\356\352\377\1\355" "\357\353\377\207\353\356\352\377\1\355\357\353\377\204\353\356\352\377" "\6\360\362\357\377\313\315\312\377\203\205\202\377\261\263\257\377\306" "\314\302\377\323\332\317\377\206!H\211\0\6\315\323\311\377\300\277\266" "\377\222\224\221\377~\200}\377\276\301\275\377\360\362\357\377\202\355" "\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377" "\4\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\203" "\355\357\353\377\203\353\356\352\377\211\355\357\353\377\204\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\2\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\5\353\356\352\377" "\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\203" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\204\355\357\353\377\1\353" "\356\352\377\204\355\357\353\377\204\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\203\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377" "\202\353\356\352\377\4\355\357\353\377\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\202\353\356\352\377\4\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\203\355\357\353" "\377\203\353\356\352\377\211\355\357\353\377\204\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\2" "\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\5\353\356\352\377\355\357" "\353\377\353\356\352\377\355\357\353\377\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\1" "\355\357\353\377\202\353\356\352\377\204\355\357\353\377\1\353\356\352" "\377\204\355\357\353\377\204\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\10\353\356\352\377\355\357\353\377\351\353\347\377\360" "\362\357\377\222\224\221\377\240\237\226\377\300\277\266\377\315\323" "\311\377\205!H\211\0\5\323\332\317\377\310\307\276\377\263\262\251\377" "\203\205\202\377\212\214\211\377\205\353\356\352\377\4\355\357\353\377" "\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377" "\203\353\356\352\377\1\355\357\353\377\204\353\356\352\377\204\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\206\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356" "\352\377\1\355\357\353\377\202\353\356\352\377\202\355\357\353\377\1" "\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357" "\353\377\2\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\203\353\356\352\377\1\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\204\355\357\353\377\203\353\356" "\352\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\204" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353" "\377\204\353\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355" "\357\353\377\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377\2\353\356" "\352\377\355\357\353\377\204\353\356\352\377\2\355\357\353\377\353\356" "\352\377\202\355\357\353\377\205\353\356\352\377\4\355\357\353\377\353" "\356\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377\203" "\353\356\352\377\1\355\357\353\377\204\353\356\352\377\204\355\357\353" "\377\202\353\356\352\377\202\355\357\353\377\206\353\356\352\377\1\355" "\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356" "\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\2\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\203\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\202\353\356\352\377\204\355\357\353\377\203\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\204\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\204\353\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\205\353\356\352\377\6" "\360\362\357\377\317\322\316\377~\200}\377\272\272\261\377\307\316\303" "\377\323\332\317\377\204!H\211\0\12\322\330\316\377\300\277\266\377\227" "\231\226\377~\200}\377\265\267\264\377\362\364\361\377\351\353\347\377" "\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\202\355\357\353\377\3\353\356\352\377\355\357\353" "\377\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\212\355\357\353\377\1\353\356\352\377\204" "\355\357\353\377\1\353\356\352\377\203\355\357\353\377\2\353\356\352" "\377\355\357\353\377\206\353\356\352\377\202\355\357\353\377\1\353\356" "\352\377\210\355\357\353\377\203\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\205\355\357\353\377\202\353\356\352\377\1\355\357\353" "\377\203\353\356\352\377\203\355\357\353\377\3\353\356\352\377\355\357" "\353\377\353\356\352\377\203\355\357\353\377\203\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\206\355\357\353\377\202\353\356" "\352\377\1\355\357\353\377\202\353\356\352\377\204\355\357\353\377\1" "\353\356\352\377\203\355\357\353\377\1\353\356\352\377\206\355\357\353" "\377\203\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\203\353\356\352\377\1\355\357\353\377\202\353\356\352\377\4\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\202\355\357\353\377\3\353\356\352\377" "\355\357\353\377\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\1\353\356\352\377\212\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\204\355\357\353\377\1" "\353\356\352\377\203\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\2\355\357\353\377\353\356\352\377\210\355\357\353" "\377\203\353\356\352\377\1\355\357\353\377\202\353\356\352\377\205\355" "\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377" "\203\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377" "\203\355\357\353\377\203\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\206\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\6\356\360\355\377\355" "\357\353\377\222\224\221\377\240\237\226\377\276\301\275\377\323\332" "\317\377\203!H\211\0\7\323\332\317\377\314\313\302\377\272\272\261\377" "\212\214\211\377\203\205\202\377\334\337\333\377\356\360\355\377\203" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\4\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377" "\204\355\357\353\377\202\353\356\352\377\211\355\357\353\377\1\353\356" "\352\377\203\355\357\353\377\210\356\360\355\377\213\360\362\357\377" "\211\356\360\355\377\206\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377\211" "\355\357\353\377\203\353\356\352\377\204\355\357\353\377\1\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\202\355\357\353\377\1\353" "\356\352\377\206\355\357\353\377\1\353\356\352\377\210\355\357\353\377" "\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\4\355\357\353\377\353\356\352" "\377\355\357\353\377\353\356\352\377\204\355\357\353\377\202\353\356" "\352\377\211\355\357\353\377\204\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\204\355\357\353\377\202\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355" "\357\353\377\202\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\205\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\202\355\357\353\377\1\353\356\352\377\211\355\357\353\377" "\203\353\356\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377\206" "\355\357\353\377\1\353\356\352\377\207\355\357\353\377\6\353\356\352" "\377\365\367\363\377\265\267\264\377\220\217\207\377\272\272\261\377" "\321\320\307\377\203!H\211\0\6\323\332\317\377\301\310\275\377\254\253" "\242\377~\200}\377\243\245\242\377\362\364\361\377\204\355\357\353\377" "\1\353\356\352\377\207\355\357\353\377\1\353\356\352\377\207\355\357" "\353\377\203\353\356\352\377\5\351\353\347\377\355\357\353\377\356\360" "\355\377\360\362\357\377\362\364\361\377\202\365\364\353\377\5\356\360" "\355\377\353\356\352\377\343\351\353\377\340\345\350\377\333\341\343" "\377\204\325\336\346\377\202\321\331\342\377\206\314\330\346\377\2\321" "\331\342\377\314\330\346\377\202\321\331\342\377\204\325\336\346\377" "\1\333\341\343\377\202\340\345\350\377\4\343\351\353\377\351\353\347" "\377\353\356\352\377\356\360\355\377\202\365\364\353\377\1\373\362\353" "\377\202\365\364\353\377\1\366\360\357\377\202\356\360\355\377\3\355" "\357\353\377\353\356\352\377\351\353\347\377\206\353\356\352\377\205" "\355\357\353\377\1\353\356\352\377\246\355\357\353\377\3\353\356\352" "\377\355\357\353\377\353\356\352\377\206\355\357\353\377\1\353\356\352" "\377\207\355\357\353\377\1\353\356\352\377\257\355\357\353\377\1\353" "\356\352\377\210\355\357\353\377\1\353\356\352\377\216\355\357\353\377" "\1\353\356\352\377\234\355\357\353\377\7\351\353\347\377\356\360\355" "\377\353\345\344\377~\200}\377\263\262\251\377\314\313\302\377\323\332" "\317\377\202!H\211\0\13\322\330\316\377\301\310\275\377\231\230\220\377" "~\200}\377\276\301\275\377\360\362\357\377\353\356\352\377\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\207\355\357\353" "\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\356" "\360\355\377\3\360\362\357\377\365\364\353\377\360\362\357\377\202\356" "\360\355\377\5\340\345\350\377\314\330\346\377\301\320\344\377\253\306" "\336\377\237\277\333\377\202\221\266\330\377\4\210\261\331\377\203\254" "\323\377z\251\326\377{\242\321\377\203o\235\320\377\203k\227\312\377" "\206c\226\316\377\202k\227\312\377\1c\226\316\377\202k\227\312\377\202" "o\235\320\377\203t\244\321\377\202z\251\326\377\2\203\254\323\377\210" "\261\331\377\202\221\266\330\377\11\226\272\334\377\237\277\333\377\253" "\306\336\377\264\313\335\377\301\320\344\377\314\330\346\377\325\336" "\346\377\340\345\350\377\353\356\352\377\203\356\360\355\377\203\360" "\362\357\377\2\362\364\361\377\365\364\353\377\202\360\362\357\377\202" "\356\360\355\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353" "\377\1\353\356\352\377\207\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\204\355\357\353\377\1\353\356\352\377" "\203\355\357\353\377\1\353\356\352\377\212\355\357\353\377\5\353\356" "\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\202\355\357\353\377\5\353\356\352\377\355\357\353\377\353\356\352" "\377\355\357\353\377\353\356\352\377\207\355\357\353\377\1\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\215\355\357\353\377\1\353" "\356\352\377\204\355\357\353\377\1\353\356\352\377\226\355\357\353\377" "\3\353\356\352\377\355\357\353\377\353\356\352\377\210\355\357\353\377" "\1\353\356\352\377\202\355\357\353\377\1\353\356\352\377\213\355\357" "\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\207\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\204\355\357\353\377\1\353\356\352" "\377\203\355\357\353\377\2\353\356\352\377\356\360\355\377\202\360\362" "\357\377\6\325\336\346\377\226\272\334\377\177\216\233\377\245\244\233" "\377\301\310\275\377\323\332\317\377\202!H\211\0\5\315\323\311\377\272" "\272\261\377\212\214\211\377\203\205\202\377\351\353\347\377\202\353" "\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353" "\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\13\366\360\357\377\365\364\353" "\377\356\360\355\377\333\341\343\377\314\330\346\377\253\306\336\377" "\237\277\333\377\203\254\323\377{\242\321\377k\227\312\377c\226\316\377" "\202X\214\304\377\202Q\206\275\377\10S~\266\377Ey\265\377>s\257\377C" "o\255\377@k\250\377=h\245\3779e\242\377+c\244\377\202)a\242\377\212$" "_\237\377\2&`\240\377)a\242\377\2029e\242\377\202=h\245\377\2""7n\251" "\377@k\250\377\202>s\257\377\1Ey\265\377\202S~\266\377\2X\202\273\377" "Q\206\275\377\202X\214\304\377\3^\222\312\377f\223\305\377k\227\312\377" "\202o\235\320\377\21t\244\321\377\203\254\323\377\210\261\331\377\226" "\272\334\377\237\277\333\377\263\307\340\377\267\317\341\377\306\322" "\340\377\314\330\346\377\325\336\346\377\340\345\350\377\351\353\347" "\377\356\360\355\377\375\365\355\377\373\362\353\377\365\364\353\377" "\360\362\357\377\202\356\360\355\377\206\355\357\353\377\1\353\356\352" "\377\202\355\357\353\377\207\353\356\352\377\1\355\357\353\377\203\353" "\356\352\377\1\355\357\353\377\207\353\356\352\377\1\355\357\353\377" "\207\353\356\352\377\5\355\357\353\377\353\356\352\377\355\357\353\377" "\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\205\353\356\352\377\3\355\357\353\377\353\356\352\377\355" "\357\353\377\202\353\356\352\377\202\355\357\353\377\206\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353" "\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\4\355\357\353\377\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357" "\353\377\203\353\356\352\377\202\355\357\353\377\202\353\356\352\377" "\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356" "\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353\377\203" "\353\356\352\377\1\355\357\353\377\204\353\356\352\377\1\355\357\353" "\377\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377\202\355" "\357\353\377\211\353\356\352\377\30\355\357\353\377\362\364\361\377\353" "\356\352\377\306\322\340\377\221\266\330\377c\226\316\377M\200\275\377" "p\205\234\377\231\230\220\377\300\277\266\377\330\327\316\377!H\211\0" "\323\332\317\377\315\323\311\377\263\262\251\377\207\211\206\377\227" "\231\226\377\360\362\357\377\351\353\347\377\353\356\352\377\355\357" "\353\377\353\356\352\377\355\357\353\377\353\356\352\377\204\355\357" "\353\377\30\353\356\352\377\356\360\355\377\362\364\361\377\373\362\353" "\377\353\356\352\377\340\345\350\377\275\315\340\377\226\272\334\377" "\203\254\323\377{\242\321\377k\227\312\377X\214\304\377X\202\273\377" "Ey\265\3777n\251\377=h\245\3779e\242\3774a\235\377)a\242\377#^\236\377" "/[\235\377#^\236\377$_\237\377&`\240\377\207)a\242\377\2114a\235\377" "\2+c\244\3774a\235\377\207)a\242\377\202&`\240\377\1$_\237\377\202#^" "\236\377\7/[\235\377$_\237\377&`\240\377)a\242\377+c\244\3779e\242\377" "=h\245\377\202@k\250\377\1>s\257\377\202Mx\260\377\5X\202\273\377Q\206" "\275\377X\214\304\377^\222\312\377k\227\312\377\202o\235\320\377\22t" "\244\321\377z\251\326\377\203\254\323\377\210\261\331\377\226\272\334" "\377\253\306\336\377\275\315\340\377\314\330\346\377\325\336\346\377" "\343\351\353\377\351\353\347\377\353\356\352\377\356\360\355\377\360" "\362\357\377\373\362\353\377\365\364\353\377\362\364\361\377\360\362" "\357\377\202\356\360\355\377\2\355\357\353\377\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356" "\352\377\202\355\357\353\377\5\353\356\352\377\355\357\353\377\353\356" "\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377\5\353\356" "\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\207\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353" "\356\352\377\215\355\357\353\377\1\353\356\352\377\204\355\357\353\377" "\1\353\356\352\377\226\355\357\353\377\3\353\356\352\377\355\357\353" "\377\353\356\352\377\210\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\205\355\357\353\377\1\353\356\352\377\205" "\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377\202" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1\353\356\352" "\377\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\203\355\357\353\377\26\353\356\352\377\356\360\355\377\365" "\364\353\377\360\362\357\377\343\351\353\377\264\313\335\377\203\254" "\323\377k\227\312\377S~\266\377=h\245\377\"\\\243\377p\205\234\377\220" "\217\207\377\300\277\266\377\315\323\311\377!H\211\0\330\327\316\377" "\307\316\303\377\252\254\251\377~\200}\377\261\263\257\377\360\362\357" "\377\202\353\356\352\377\203\355\357\353\377\23\353\356\352\377\355\357" "\353\377\353\356\352\377\355\357\353\377\356\360\355\377\373\362\353" "\377\355\357\353\377\314\330\346\377\237\277\333\377\203\254\323\377" "k\227\312\377X\214\304\377X\202\273\377Ey\265\3777n\251\377)a\242\377" "/[\235\377$_\237\377&`\240\377\262)a\242\377\202&`\240\377\1$_\237\377" "\202#^\236\377\11/[\235\377&`\240\3779e\242\377=h\245\3777n\251\377>" "s\257\377Ey\265\377S~\266\377X\202\273\377\202X\214\304\377\15^\222\312" "\377k\227\312\377o\235\320\377{\242\321\377\203\254\323\377\221\266\330" "\377\237\277\333\377\253\306\336\377\275\315\340\377\306\322\340\377" "\325\336\346\377\333\341\343\377\351\353\347\377\203\365\364\353\377" "\202\360\362\357\377\204\356\360\355\377\203\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1" "\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\4\355\357\353\377\353\356\352\377\355\357" "\353\377\353\356\352\377\204\355\357\353\377\202\353\356\352\377\211" "\355\357\353\377\204\353\356\352\377\202\355\357\353\377\3\353\356\352" "\377\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\2" "\353\356\352\377\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\205\355\357\353\377\3\353\356\352\377\355\357" "\353\377\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377" "\207\355\357\353\377\2\353\356\352\377\355\357\353\377\203\353\356\352" "\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\202\353" "\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\32\353\356\352\377\355\357\353\377\356\360\355\377\360\362\357\377\373" "\362\353\377\351\353\347\377\267\317\341\377\226\272\334\377o\235\320" "\377X\214\304\377>s\257\377)a\242\377$_\237\377)a\242\3771]\237\377p" "\205\234\377\215\214\204\377\272\272\261\377\315\323\311\377!H\211\0" "\323\332\317\377\310\307\276\377\250\247\236\377~\200}\377\313\315\312" "\377\362\364\361\377\205\355\357\353\377\202\353\356\352\377\12\362\364" "\361\377\355\357\353\377\321\331\342\377\237\277\333\377t\244\321\377" "k\227\312\377Q\206\275\377>s\257\377.e\247\377)a\242\377\202#^\236\377" "\1&`\240\377\203)a\242\377\2464a\235\377\1)a\242\377\2104a\235\377\1" ")a\242\377\2114a\235\377\202)a\242\377\1&`\240\377\202$_\237\377\4#^" "\236\377/[\235\377$_\237\377&`\240\377\202)a\242\377\6""4a\235\3779e" "\242\3777n\251\377>s\257\377Ey\265\377M\200\275\377\202X\214\304\377" "\17f\223\305\377k\227\312\377o\235\320\377{\242\321\377z\251\326\377" "\203\254\323\377\226\272\334\377\237\277\333\377\275\315\340\377\314" "\330\346\377\325\336\346\377\333\341\343\377\343\351\353\377\351\353" "\347\377\356\360\355\377\202\373\362\353\377\202\360\362\357\377\2\356" "\360\355\377\355\357\353\377\202\351\353\347\377\204\353\356\352\377" "\207\355\357\353\377\1\353\356\352\377\207\355\357\353\377\1\353\356" "\352\377\257\355\357\353\377\1\353\356\352\377\210\355\357\353\377\1" "\353\356\352\377\216\355\357\353\377\1\353\356\352\377\212\355\357\353" "\377\2\353\356\352\377\355\357\353\377\202\353\356\352\377\15\351\353" "\347\377\356\360\355\377\365\364\353\377\356\360\355\377\340\345\350" "\377\301\320\344\377\221\266\330\377t\244\321\377^\222\312\377M\200\275" "\377=h\245\377&`\240\377#^\236\377\203)a\242\377\5""1]\237\377f\177\236" "\377\215\214\204\377\263\262\251\377\321\320\307\377\202\323\332\317" "\377\5\310\307\276\377\240\242\237\377\203\205\202\377\327\331\326\377" "\360\362\357\377\204\353\356\352\377\13\356\360\355\377\365\364\353\377" "\353\356\352\377\275\315\340\377\210\261\331\377k\227\312\377Q\206\275" "\377>s\257\3779e\242\377!]\235\377&`\240\377\317)a\242\377\10&`\240\377" "$_\237\377#^\236\377-Z\234\377$_\237\3774a\235\377=h\245\377@k\250\377" "\202>s\257\377\1Mx\260\377\202Q\206\275\377\7X\214\304\377c\226\316\377" "o\235\320\377t\244\321\377z\251\326\377\210\261\331\377\221\266\330\377" "\202\237\277\333\377\7\264\313\335\377\306\322\340\377\325\336\346\377" "\343\351\353\377\356\360\355\377\360\362\357\377\366\360\357\377\205" "\360\362\357\377\202\356\360\355\377\202\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\204\355\357\353\377\202\353\356\352\377\211\355\357" "\353\377\204\353\356\352\377\202\355\357\353\377\1\353\356\352\377\204" "\355\357\353\377\1\353\356\352\377\212\355\357\353\377\1\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\205\355\357\353\377\1\353" "\356\352\377\205\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\215\355\357\353\377\202\353\356\352\377\210\355\357" "\353\377\3\353\356\352\377\355\357\353\377\356\360\355\377\203\360\362" "\357\377\12\356\360\355\377\325\336\346\377\253\306\336\377\221\266\330" "\377z\251\326\377^\222\312\377S~\266\377>s\257\377)a\242\377#^\236\377" "\206)a\242\377\15""1]\237\377f\177\236\377\215\214\204\377\263\262\251" "\377\307\316\303\377\330\327\316\377\323\332\317\377\305\307\303\377" "\234\236\234\377\212\214\211\377\343\345\342\377\356\360\355\377\355" "\357\353\377\202\353\356\352\377\7\362\364\361\377\343\351\353\377\264" "\313\335\377t\244\321\377X\214\304\377Ey\265\377)a\242\377\202$_\237" "\377\202)a\242\377\1""4a\235\377\322)a\242\377\1""4a\235\377\203)a\242" "\377\1&`\240\377\205$_\237\377\202&`\240\377\6+c\244\3777n\251\377>s" "\257\377Ey\265\377S~\266\377X\202\273\377\202X\214\304\377\22f\223\305" "\377k\227\312\377o\235\320\377t\244\321\377\210\261\331\377\221\266\330" "\377\237\277\333\377\263\307\340\377\306\322\340\377\314\330\346\377" "\325\336\346\377\340\345\350\377\351\353\347\377\356\360\355\377\365" "\364\353\377\373\362\353\377\365\364\353\377\360\362\357\377\202\356" "\360\355\377\207\353\356\352\377\2\355\357\353\377\353\356\352\377\215" "\355\357\353\377\1\353\356\352\377\235\355\357\353\377\1\353\356\352" "\377\210\355\357\353\377\1\353\356\352\377\210\355\357\353\377\1\353" "\356\352\377\205\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\205\353\356\352\377\1\356\360\355\377\202\365\364\353\377\11\343\351" "\353\377\325\336\346\377\275\315\340\377\226\272\334\377z\251\326\377" "k\227\312\377X\214\304\377S~\266\3777n\251\377\203$_\237\377\211)a\242" "\377\4f\177\236\377\215\214\204\377\263\262\251\377\314\313\302\377\202" "\323\332\317\377\3\306\306\275\377\234\236\234\377\216\220\215\377\202" "\356\360\355\377\11\353\356\352\377\360\362\357\377\366\360\357\377\275" "\315\340\377z\251\326\377X\214\304\377>s\257\377)a\242\377#^\236\377" "\343)a\242\377\1""4a\235\377\202)a\242\377\35&`\240\377$_\237\377#^\236" "\377!]\235\377#^\236\377)a\242\3779e\242\377=h\245\3777n\251\377>s\257" "\377Mx\260\377S~\266\377Q\206\275\377X\214\304\377c\226\316\377k\227" "\312\377o\235\320\377{\242\321\377\203\254\323\377\210\261\331\377\221" "\266\330\377\237\277\333\377\253\306\336\377\267\317\341\377\314\330" "\346\377\325\336\346\377\343\351\353\377\351\353\347\377\355\357\353" "\377\202\356\360\355\377\1\360\362\357\377\202\373\362\353\377\1\362" "\364\361\377\202\360\362\357\377\202\356\360\355\377\207\355\357\353" "\377\204\353\356\352\377\202\355\357\353\377\1\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\212\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\205\355\357\353\377\1\353\356" "\352\377\205\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1" "\353\356\352\377\214\355\357\353\377\27\353\356\352\377\355\357\353\377" "\356\360\355\377\360\362\357\377\365\364\353\377\373\362\353\377\365" "\364\353\377\356\360\355\377\353\356\352\377\343\351\353\377\314\330" "\346\377\253\306\336\377\221\266\330\377z\251\326\377o\235\320\377X\214" "\304\377Q\206\275\377>s\257\377=h\245\377&`\240\377#^\236\377)a\242\377" "4a\235\377\213)a\242\377\4f\177\236\377\215\214\204\377\263\262\251\377" "\307\316\303\377\202\323\332\317\377\14\301\310\275\377\234\236\234\377" "\222\224\221\377\367\371\366\377\355\357\353\377\373\362\353\377\325" "\336\346\377\210\261\331\377X\214\304\377@k\250\377/[\235\377$_\237\377" "\357)a\242\377\202&`\240\377\202$_\237\377\202#^\236\377\11/[\235\377" "!]\235\377)a\242\377=h\245\3777n\251\377>s\257\377Ey\265\377S~\266\377" "Q\206\275\377\202X\214\304\377\21^\222\312\377k\227\312\377o\235\320" "\377t\244\321\377\203\254\323\377\210\261\331\377\221\266\330\377\237" "\277\333\377\253\306\336\377\264\313\335\377\306\322\340\377\314\330" "\346\377\325\336\346\377\340\345\350\377\351\353\347\377\356\360\355" "\377\365\364\353\377\202\373\362\353\377\203\360\362\357\377\205\356" "\360\355\377\211\355\357\353\377\202\353\356\352\377\216\355\357\353" "\377\3\353\356\352\377\355\357\353\377\353\356\352\377\206\355\357\353" "\377\202\353\356\352\377\207\355\357\353\377\204\356\360\355\377\25\366" "\360\357\377\365\364\353\377\373\362\353\377\365\364\353\377\351\353" "\347\377\325\336\346\377\314\330\346\377\275\315\340\377\237\277\333" "\377\221\266\330\377z\251\326\377o\235\320\377^\222\312\377X\214\304" "\377M\200\275\377>s\257\3779e\242\377-Z\234\377#^\236\377$_\237\377&" "`\240\377\216)a\242\377\21%^\245\377f\177\236\377\215\214\204\377\263" "\262\251\377\307\316\303\377\330\327\316\377\323\332\317\377\310\307" "\276\377\240\237\226\377\234\236\234\377\367\371\366\377\355\357\353" "\377\253\306\336\377k\227\312\377>s\257\3770\\\236\377#^\236\377\231" ")a\242\377\1""4a\235\377\234)a\242\377\1""4a\235\377\244)a\242\377\1" "4a\235\377\236)a\242\377\3&`\240\377$_\237\377/[\235\377\202-Z\234\377" "\2/[\235\377$_\237\377\202)a\242\377\3""4a\235\3779e\242\377=h\245\377" "\202>s\257\377\6Ey\265\377M\200\275\377Q\206\275\377X\214\304\377^\222" "\312\377k\227\312\377\202o\235\320\377\202{\242\321\377\12\203\254\323" "\377\210\261\331\377\226\272\334\377\237\277\333\377\263\307\340\377" "\301\320\344\377\314\330\346\377\321\331\342\377\325\336\346\377\333" "\341\343\377\202\340\345\350\377\202\343\351\353\377\2\351\353\347\377" "\353\356\352\377\202\356\360\355\377\1\360\362\357\377\203\373\362\353" "\377\1\365\364\353\377\202\360\362\357\377\1\366\360\357\377\204\360" "\362\357\377\207\356\360\355\377\207\360\362\357\377\202\365\364\353" "\377\202\373\362\353\377\33\360\362\357\377\356\360\355\377\355\357\353" "\377\351\353\347\377\343\351\353\377\340\345\350\377\333\341\343\377" "\325\336\346\377\321\331\342\377\301\320\344\377\253\306\336\377\237" "\277\333\377\210\261\331\377z\251\326\377t\244\321\377o\235\320\377k" "\227\312\377X\214\304\377X\202\273\377Ey\265\3777n\251\3779e\242\377" ")a\242\377$_\237\377-Z\234\377#^\236\377&`\240\377\222)a\242\377\17%" "^\245\377Yv\227\377\217\214~\377\261\263\257\377\314\313\302\377\330" "\327\316\377\323\332\317\377\310\307\276\377\240\242\237\377\243\245" "\242\377\360\362\357\377\221\266\330\377X\214\304\3779e\242\377#^\236" "\377\377)a\242\377\211)a\242\377\4&`\240\377$_\237\377#^\236\377/[\235" "\377\202-Z\234\377\4)a\242\3779e\242\377=h\245\377@k\250\377\202>s\257" "\377\4Mx\260\377S~\266\377X\202\273\377Q\206\275\377\202X\214\304\377" "\1^\222\312\377\202k\227\312\377\1o\235\320\377\202t\244\321\377\3z\251" "\326\377\203\254\323\377\210\261\331\377\202\221\266\330\377\204\237" "\277\333\377\3\253\306\336\377\263\307\340\377\275\315\340\377\203\301" "\320\344\377\202\306\322\340\377\211\314\330\346\377\204\306\322\340" "\377\4\301\320\344\377\275\315\340\377\263\307\340\377\253\306\336\377" "\203\237\277\333\377\24\226\272\334\377\221\266\330\377\210\261\331\377" "\203\254\323\377t\244\321\377o\235\320\377k\227\312\377c\226\316\377" "^\222\312\377X\214\304\377Q\206\275\377S~\266\377Ey\265\377>s\257\377" "=h\245\3774a\235\377!]\235\377-Z\234\377#^\236\377&`\240\377\230)a\242" "\377\16%^\245\377Yv\227\377\217\214~\377\263\262\251\377\307\316\303" "\377\330\327\316\377\323\332\317\377\310\307\276\377\242\242\231\377" "\234\236\234\377z\251\326\377>s\257\377#^\236\377$_\237\377\257)a\242" "\377\1""4a\235\377\232)a\242\377\1""4a\235\377\213)a\242\377\1""4a\235" "\377\220)a\242\377\1""4a\235\377\215)a\242\377\1""4a\235\377\207)a\242" "\377\1""4a\235\377\222)a\242\377\1&`\240\377\202$_\237\377\1#^\236\377" "\202/[\235\377\202#^\236\377\202$_\237\377\203&`\240\377\5)a\242\377" "9e\242\377=h\245\377@k\250\3777n\251\377\202>s\257\377\3Ey\265\377S~" "\266\377M\200\275\377\202Q\206\275\377\204X\214\304\377\203^\222\312" "\377\203f\223\305\377\207k\227\312\377\1^\222\312\377\204f\223\305\377" "\1^\222\312\377\204X\214\304\377\202X\202\273\377\2M\200\275\377Ey\265" "\377\202>s\257\377\3@k\250\377.e\247\377)a\242\377\202&`\240\377\1$_" "\237\377\202#^\236\377\4/[\235\377#^\236\377$_\237\377&`\240\377\221" ")a\242\377\1""4a\235\377\212)a\242\377\14%^\245\377Yv\227\377\215\214" "\204\377\261\263\257\377\307\316\303\377\330\327\316\377\323\332\317" "\377\310\307\276\377\242\242\231\377\177\216\233\377Co\255\377-Z\234" "\377\217)a\242\377\1""4a\235\377\222)a\242\377\1""4a\235\377\324)a\242" "\377\1""4a\235\377\227)a\242\377\1""4a\235\377\222)a\242\377\202&`\240" "\377\1$_\237\377\202#^\236\377\2/[\235\377!]\235\377\203-Z\234\377\2" "#^\236\377&`\240\377\204)a\242\377\2169e\242\377\1+c\244\377\202)a\242" "\377\2$_\237\377#^\236\377\203-Z\234\377\2!]\235\377/[\235\377\202$_" "\237\377\1&`\240\377\247)a\242\377\13%^\245\377Pr\230\377\215\214\204" "\377\261\263\257\377\307\316\303\377\330\327\316\377\323\332\317\377" "\301\310\275\377\245\244\233\377p\205\234\377\35Y\240\377\377)a\242\377" "\264)a\242\377\217&`\240\377\263)a\242\377\13%^\245\377Pr\230\377\217" "\214~\377\263\271\257\377\314\313\302\377\330\327\316\377\323\332\317" "\377\306\306\275\377\245\244\233\377p\205\234\377\"\\\243\377\205)a\242" "\377\3""4a\235\377)a\242\3774a\235\377\203)a\242\377\1""4a\235\377\204" ")a\242\377\2024a\235\377\203)a\242\377\2""4a\235\377)a\242\377\2024a" "\235\377\202)a\242\377\2024a\235\377\202)a\242\377\1""4a\235\377\203" ")a\242\377\1""4a\235\377\211)a\242\377\1""4a\235\377\202)a\242\377\3" "4a\235\377)a\242\3774a\235\377\203)a\242\377\1""4a\235\377\202)a\242" "\377\2034a\235\377\2)a\242\3774a\235\377\206)a\242\377\2024a\235\377" "\206)a\242\377\2034a\235\377\6)a\242\3774a\235\377)a\242\3774a\235\377" ")a\242\3774a\235\377\204)a\242\377\1""4a\235\377\204)a\242\377\2024a" "\235\377\2)a\242\3774a\235\377\206)a\242\377\2034a\235\377\204)a\242" "\377\1""4a\235\377\202)a\242\377\2024a\235\377\3)a\242\3774a\235\377" ")a\242\377\2024a\235\377\205)a\242\377\1""4a\235\377\206)a\242\377\3" "4a\235\377)a\242\3774a\235\377\203)a\242\377\1""4a\235\377\204)a\242" "\377\2024a\235\377\203)a\242\377\2""4a\235\377)a\242\377\2024a\235\377" "\202)a\242\377\2024a\235\377\202)a\242\377\1""4a\235\377\203)a\242\377" "\1""4a\235\377\211)a\242\377\1""4a\235\377\202)a\242\377\3""4a\235\377" ")a\242\3774a\235\377\203)a\242\377\1""4a\235\377\202)a\242\377\2034a" "\235\377\2)a\242\3774a\235\377\206)a\242\377\2024a\235\377\206)a\242" "\377\2034a\235\377\6)a\242\3774a\235\377)a\242\3774a\235\377)a\242\377" "4a\235\377\204)a\242\377\1""4a\235\377\204)a\242\377\2024a\235\377\2" ")a\242\3774a\235\377\206)a\242\377\2034a\235\377\204)a\242\377\1""4a" "\235\377\202)a\242\377\2034a\235\377\13""0\\\236\377Pr\230\377\217\214" "~\377\263\262\251\377\314\313\302\377\330\327\316\377\323\332\317\377" "\306\306\275\377\245\244\233\377p\205\234\377/[\235\377\3774a\235\377" "\3664a\235\377\13""0\\\236\377Pr\230\377\215\214\204\377\263\262\251" "\377\307\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377s\203\225\377\40[\241\377\204)a\242\377\3""3`\234\377" ")a\242\3773`\234\377\207)a\242\377\2023`\234\377\207)a\242\377\1""3`" "\234\377\202)a\242\377\1""3`\234\377\203)a\242\377\3""3`\234\377)a\242" "\3773`\234\377\206)a\242\377\5""3`\234\377)a\242\3773`\234\377)a\242" "\3773`\234\377\220)a\242\377\3""3`\234\377)a\242\3773`\234\377\210)a" "\242\377\1""3`\234\377\202)a\242\377\1""3`\234\377\213)a\242\377\1""3" "`\234\377\204)a\242\377\1""3`\234\377\206)a\242\377\2023`\234\377\203" ")a\242\377\1""3`\234\377\211)a\242\377\1""3`\234\377\215)a\242\377\1" "3`\234\377\204)a\242\377\3""3`\234\377)a\242\3773`\234\377\207)a\242" "\377\2023`\234\377\207)a\242\377\1""3`\234\377\202)a\242\377\1""3`\234" "\377\203)a\242\377\3""3`\234\377)a\242\3773`\234\377\206)a\242\377\5" "3`\234\377)a\242\3773`\234\377)a\242\3773`\234\377\220)a\242\377\3""3" "`\234\377)a\242\3773`\234\377\210)a\242\377\1""3`\234\377\202)a\242\377" "\1""3`\234\377\213)a\242\377\1""3`\234\377\204)a\242\377\1""3`\234\377" "\206)a\242\377\2023`\234\377\203)a\242\377\1""3`\234\377\211)a\242\377" "\1""3`\234\377\203)a\242\377\13""0\\\236\377Pr\230\377\215\214\204\377" "\261\263\257\377\307\316\303\377\330\327\316\377\323\332\317\377\306" "\306\275\377\245\244\233\377s\203\225\377\40[\241\377\377&`\240\377\366" "&`\240\377\13/[\235\377Uv\242\377\220\217\207\377\263\262\251\377\307" "\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377s\203\225\377\40[\241\377\202)a\242\377\205&`\240\377\203)a\242" "\377\2&`\240\377)a\242\377\204&`\240\377\1)a\242\377\203&`\240\377\205" ")a\242\377\202&`\240\377\202)a\242\377\202&`\240\377\5)a\242\377&`\240" "\377)a\242\377&`\240\377)a\242\377\202&`\240\377\202)a\242\377\1&`\240" "\377\202)a\242\377\1&`\240\377\202)a\242\377\1&`\240\377\202)a\242\377" "\204&`\240\377\202)a\242\377\202&`\240\377\203)a\242\377\2&`\240\377" ")a\242\377\203&`\240\377\1)a\242\377\202&`\240\377\202)a\242\377\206" "&`\240\377\205)a\242\377\4&`\240\377)a\242\377&`\240\377)a\242\377\211" "&`\240\377\203)a\242\377\203&`\240\377\1)a\242\377\203&`\240\377\203" ")a\242\377\3&`\240\377)a\242\377&`\240\377\213)a\242\377\205&`\240\377" "\2)a\242\377&`\240\377\202)a\242\377\205&`\240\377\203)a\242\377\2&`" "\240\377)a\242\377\204&`\240\377\1)a\242\377\203&`\240\377\205)a\242" "\377\202&`\240\377\202)a\242\377\202&`\240\377\5)a\242\377&`\240\377" ")a\242\377&`\240\377)a\242\377\202&`\240\377\202)a\242\377\1&`\240\377" "\202)a\242\377\1&`\240\377\202)a\242\377\1&`\240\377\202)a\242\377\204" "&`\240\377\202)a\242\377\202&`\240\377\203)a\242\377\2&`\240\377)a\242" "\377\203&`\240\377\1)a\242\377\202&`\240\377\202)a\242\377\206&`\240" "\377\205)a\242\377\4&`\240\377)a\242\377&`\240\377)a\242\377\211&`\240" "\377\203)a\242\377\203&`\240\377\1)a\242\377\203&`\240\377\203)a\242" "\377\2&`\240\377)a\242\377\203&`\240\377\204)a\242\377\14&`\240\377/" "[\235\377Uv\242\377\220\217\207\377\263\262\251\377\314\313\302\377\330" "\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377s\203\225" "\377\40[\241\377\206)a\242\377\1&`\240\377\203)a\242\377\1&`\240\377" "\202)a\242\377\202&`\240\377\216)a\242\377\1&`\240\377\207)a\242\377" "\1&`\240\377\230)a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\204" ")a\242\377\1&`\240\377\216)a\242\377\204&`\240\377\213)a\242\377\202" "&`\240\377\207)a\242\377\211&`\240\377\210)a\242\377\1&`\240\377\206" ")a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\202)a\242\377\202&`" "\240\377\216)a\242\377\1&`\240\377\207)a\242\377\1&`\240\377\230)a\242" "\377\1&`\240\377\203)a\242\377\1&`\240\377\204)a\242\377\1&`\240\377" "\216)a\242\377\204&`\240\377\213)a\242\377\202&`\240\377\216)a\242\377" "\13/[\235\377Uv\242\377\220\217\207\377\263\262\251\377\314\313\302\377" "\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377s\203" "\225\377\40[\241\377\206)a\242\377\1&`\240\377\203)a\242\377\1&`\240" "\377\202)a\242\377\202&`\240\377\216)a\242\377\1&`\240\377\207)a\242" "\377\1&`\240\377\234)a\242\377\1&`\240\377\204)a\242\377\1&`\240\377" "\216)a\242\377\204&`\240\377\213)a\242\377\202&`\240\377\206)a\242\377" "\3&`\240\377)a\242\377+c\244\377\202)a\242\377\202+c\244\377\202)a\242" "\377\203&`\240\377\2)a\242\377&`\240\377\204)a\242\377\1&`\240\377\206" ")a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\202)a\242\377\202&`" "\240\377\216)a\242\377\1&`\240\377\207)a\242\377\1&`\240\377\234)a\242" "\377\1&`\240\377\204)a\242\377\1&`\240\377\216)a\242\377\204&`\240\377" "\213)a\242\377\202&`\240\377\216)a\242\377\15/[\235\377Ns\245\377\212" "\214\211\377\263\262\251\377\314\313\302\377\330\327\316\377\323\332" "\317\377\306\306\275\377\245\244\233\377s\203\225\377\40[\241\377)a\242" "\377&`\240\377\210)a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\205" ")a\242\377\1&`\240\377\212)a\242\377\3&`\240\377)a\242\377&`\240\377" "\204)a\242\377\1&`\240\377\202)a\242\377\202&`\240\377\223)a\242\377" "\1&`\240\377\205)a\242\377\1&`\240\377\222)a\242\377\1&`\240\377\210" ")a\242\377\1&`\240\377\203)a\242\377\202&`\240\377\207)a\242\377\3&`" "\240\377)a\242\377+c\244\377\207.e\247\377\202)a\242\377\3&`\240\377" ")a\242\377&`\240\377\203)a\242\377\3&`\240\377)a\242\377&`\240\377\210" ")a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\205)a\242\377\1&`\240" "\377\212)a\242\377\3&`\240\377)a\242\377&`\240\377\204)a\242\377\1&`" "\240\377\202)a\242\377\202&`\240\377\223)a\242\377\1&`\240\377\205)a" "\242\377\1&`\240\377\222)a\242\377\1&`\240\377\210)a\242\377\1&`\240" "\377\203)a\242\377\202&`\240\377\217)a\242\377\13/[\235\377Ns\245\377" "\212\214\211\377\263\262\251\377\314\313\302\377\330\327\316\377\323" "\332\317\377\306\306\275\377\245\244\233\377s\203\225\377\"\\\243\377" "\206)a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\202)a\242\377\202" "&`\240\377\216)a\242\377\1&`\240\377\207)a\242\377\1&`\240\377\207)a" "\242\377\1&`\240\377\217)a\242\377\202&`\240\377\203)a\242\377\1&`\240" "\377\204)a\242\377\1&`\240\377\210)a\242\377\1&`\240\377\205)a\242\377" "\204&`\240\377\213)a\242\377\202&`\240\377\4)a\242\377&`\240\377)a\242" "\377&`\240\377\203)a\242\377\202&`\240\377\3)a\242\377+c\244\377)a\242" "\377\2020\\\236\377\1)a\242\377\203.e\247\377\1)a\242\377\202&`\240\377" "\203)a\242\377\1&`\240\377\205)a\242\377\2&`\240\377)a\242\377\205&`" "\240\377\1)a\242\377\202&`\240\377\216)a\242\377\1&`\240\377\207)a\242" "\377\1&`\240\377\207)a\242\377\1&`\240\377\217)a\242\377\202&`\240\377" "\203)a\242\377\1&`\240\377\204)a\242\377\1&`\240\377\210)a\242\377\1" "&`\240\377\205)a\242\377\204&`\240\377\213)a\242\377\202&`\240\377\4" ")a\242\377&`\240\377)a\242\377&`\240\377\207)a\242\377\1&`\240\377\202" ")a\242\377\13/[\235\377Ns\245\377\216\220\215\377\257\257\246\377\314" "\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377s\203\225\377-Z\234\377\2063`\234\377\1&`\240\377\2033`\234\377" "\1&`\240\377\2023`\234\377\202&`\240\377\2163`\234\377\1&`\240\377\207" "3`\234\377\1&`\240\377\2303`\234\377\1&`\240\377\2033`\234\377\1&`\240" "\377\2043`\234\377\1&`\240\377\2163`\234\377\204&`\240\377\2133`\234" "\377\202&`\240\377\2103`\234\377\11&`\240\377$_\237\3774a\235\377c\212" "\267\377g\216\273\377[\177\262\3779e\242\377-Z\234\3779e\242\377\202" ".e\247\377\1)a\242\377\202&`\240\377\2033`\234\377\202)a\242\377\205" "&`\240\377\203)a\242\377\2&`\240\377)a\242\377\203&`\240\377\2163`\234" "\377\1&`\240\377\2073`\234\377\1&`\240\377\2303`\234\377\1&`\240\377" "\2033`\234\377\1&`\240\377\2043`\234\377\1&`\240\377\2163`\234\377\204" "&`\240\377\2133`\234\377\202&`\240\377\2163`\234\377\13/[\235\377Ns\245" "\377\212\214\211\377\257\257\246\377\314\313\302\377\330\327\316\377" "\323\332\317\377\306\306\275\377\245\244\233\377s~\213\377\40[\241\377" "\206)a\242\377\1&`\240\377\203)a\242\377\1&`\240\377\202)a\242\377\202" "&`\240\377\216)a\242\377\1&`\240\377\207)a\242\377\1&`\240\377\230)a" "\242\377\1&`\240\377\203)a\242\377\1&`\240\377\204)a\242\377\1&`\240" "\377\216)a\242\377\204&`\240\377\213)a\242\377\202&`\240\377\211)a\242" "\377\11&`\240\3774a\235\377^\205\262\377\321\331\342\377\373\372\361" "\377\340\345\350\377\214\244\302\377.e\247\377\40[\241\377\202.e\247" "\377\2+c\244\377)a\242\377\205&`\240\377\1""3`\234\377\202)a\242\377" "\2""4a\235\377+c\244\377\203.e\247\377\1)a\242\377\204&`\240\377\216" ")a\242\377\1&`\240\377\207)a\242\377\1&`\240\377\230)a\242\377\1&`\240" "\377\203)a\242\377\1&`\240\377\204)a\242\377\1&`\240\377\216)a\242\377" "\204&`\240\377\213)a\242\377\202&`\240\377\216)a\242\377\13/[\235\377" "Ns\245\377\212\214\211\377\257\257\246\377\314\313\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377s~\213\377\40[\241" "\377\204)a\242\377\1""3`\234\377\205)a\242\377\3""3`\234\377)a\242\377" "3`\234\377\230)a\242\377\3""3`\234\377)a\242\3773`\234\377\207)a\242" "\377\3""3`\234\377)a\242\3773`\234\377\206)a\242\377\1""3`\234\377\220" ")a\242\377\2023`\234\377\221)a\242\377\2023`\234\377\202)a\242\377\1" "3`\234\377\202)a\242\377\1""3`\234\377\215)a\242\377\14&`\240\377!]\235" "\377\32U\233\377o\217\267\377\313\324\334\377\376\375\364\377\343\351" "\353\377v\227\277\377\35Y\240\377+c\244\377.e\247\3779e\242\377\202)" "a\242\377\2""4a\235\377+c\244\377\212.e\247\377\2)a\242\377&`\240\377" "\230)a\242\377\3""3`\234\377)a\242\3773`\234\377\207)a\242\377\3""3`" "\234\377)a\242\3773`\234\377\206)a\242\377\1""3`\234\377\220)a\242\377" "\2023`\234\377\221)a\242\377\2023`\234\377\202)a\242\377\1""3`\234\377" "\202)a\242\377\1""3`\234\377\215)a\242\377\1""3`\234\377\202)a\242\377" "\14""3`\234\377!]\235\377Fs\252\377\212\214\211\377\257\257\246\377\314" "\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377s~\213\377\40[\241\377\364&`\240\377\10%U\226\377(W\230\377o" "\217\267\377\340\345\350\377\376\375\364\377\267\306\332\377=h\245\377" "0\\\236\377\205.e\247\377\1""9e\242\377\202=h\245\377\4+c\244\3770\\" "\236\377\40[\241\377\35Y\240\377\202)a\242\377\202.e\247\377\351&`\240" "\377\13-Z\234\377Fs\252\377\212\214\211\377\257\257\246\377\307\316\303" "\377\330\327\316\377\323\332\317\377\301\310\275\377\245\244\233\377" "s~\213\377\40[\241\377\203$_\237\377\2""0\\\236\377$_\237\377\2040\\" "\236\377\202$_\237\377\4""0\\\236\377$_\237\3770\\\236\377$_\237\377" "\2040\\\236\377\202$_\237\377\2020\\\236\377\1$_\237\377\2060\\\236\377" "\204$_\237\377\2030\\\236\377\203$_\237\377\1""0\\\236\377\202$_\237" "\377\2040\\\236\377\4$_\237\3770\\\236\377$_\237\3770\\\236\377\202$" "_\237\377\2020\\\236\377\202$_\237\377\2020\\\236\377\2$_\237\3770\\" "\236\377\202$_\237\377\1""0\\\236\377\202$_\237\377\2020\\\236\377\1" "$_\237\377\2030\\\236\377\204$_\237\377\2040\\\236\377\1$_\237\377\202" "0\\\236\377\2$_\237\3770\\\236\377\203$_\237\377\2040\\\236\377\202$" "_\237\377\2020\\\236\377\202$_\237\377\1""0\\\236\377\202$_\237\377\203" "0\\\236\377\2$_\237\3770\\\236\377\202$_\237\377\2""0\\\236\377$_\237" "\377\2030\\\236\377\1$_\237\377\2030\\\236\377\10$_\237\377(W\230\377" "0\\\236\377\205\241\304\377\360\362\357\377\353\356\352\377^\205\262" "\377\40[\241\377\202)a\242\377\2030\\\236\377\11\40[\241\377&`\240\377" "Mx\260\377o\217\267\377\205\241\304\377\242\266\316\377\301\314\332\377" "\247\272\323\377/[\235\377\202.e\247\377\2&`\240\377$_\237\377\2040\\" "\236\377\202$_\237\377\2020\\\236\377\1$_\237\377\2060\\\236\377\204" "$_\237\377\2030\\\236\377\203$_\237\377\1""0\\\236\377\202$_\237\377" "\2040\\\236\377\4$_\237\3770\\\236\377$_\237\3770\\\236\377\202$_\237" "\377\2020\\\236\377\202$_\237\377\2020\\\236\377\2$_\237\3770\\\236\377" "\202$_\237\377\1""0\\\236\377\202$_\237\377\2020\\\236\377\1$_\237\377" "\2030\\\236\377\204$_\237\377\2040\\\236\377\1$_\237\377\2020\\\236\377" "\2$_\237\3770\\\236\377\203$_\237\377\2040\\\236\377\202$_\237\377\202" "0\\\236\377\202$_\237\377\1""0\\\236\377\202$_\237\377\2030\\\236\377" "\2$_\237\3770\\\236\377\202$_\237\377\2""0\\\236\377$_\237\377\2030\\" "\236\377\1$_\237\377\2020\\\236\377\14$_\237\377-Z\234\377Fs\252\377" "\212\214\211\377\257\257\246\377\314\313\302\377\330\327\316\377\323" "\332\317\377\301\310\275\377\245\244\233\377s~\213\377\40[\241\377\202" "&`\240\377\2020\\\236\377\13$_\237\377&`\240\3770\\\236\377&`\240\377" "0\\\236\377&`\240\377$_\237\377&`\240\377$_\237\377&`\240\377$_\237\377" "\202&`\240\377\2030\\\236\377\205&`\240\377\2020\\\236\377\202&`\240" "\377\2020\\\236\377\203&`\240\377\10""0\\\236\377&`\240\3770\\\236\377" "$_\237\377&`\240\377$_\237\3770\\\236\377&`\240\377\2030\\\236\377\3" "&`\240\3770\\\236\377$_\237\377\202&`\240\377\2040\\\236\377\202&`\240" "\377\1$_\237\377\203&`\240\377\2""0\\\236\377&`\240\377\2030\\\236\377" "\1&`\240\377\2030\\\236\377\4&`\240\3770\\\236\377&`\240\3770\\\236\377" "\202$_\237\377\1""0\\\236\377\205&`\240\377\1""0\\\236\377\204&`\240" "\377\2060\\\236\377\2&`\240\377$_\237\377\204&`\240\377\2""0\\\236\377" "&`\240\377\2020\\\236\377\2&`\240\3770\\\236\377\204&`\240\377\2""0\\" "\236\377&`\240\377\2020\\\236\377\2&`\240\377$_\237\377\205&`\240\377" "\27/[\235\377\32U\233\3774a\235\377\242\266\316\377\367\366\355\377\226" "\255\313\377=h\245\377Mx\260\377V\204\265\377~\232\275\377\242\266\316" "\377\313\324\334\377\351\353\347\377\360\362\357\377\362\364\361\377" "\367\366\355\377\372\371\357\377\365\367\363\377\373\372\361\377\222" "\251\307\377/[\235\377.e\247\377)a\242\377\202$_\237\377\1&`\240\377" "\2030\\\236\377\205&`\240\377\2020\\\236\377\202&`\240\377\2020\\\236" "\377\203&`\240\377\10""0\\\236\377&`\240\3770\\\236\377$_\237\377&`\240" "\377$_\237\3770\\\236\377&`\240\377\2030\\\236\377\3&`\240\3770\\\236" "\377$_\237\377\202&`\240\377\2040\\\236\377\202&`\240\377\1$_\237\377" "\203&`\240\377\2""0\\\236\377&`\240\377\2030\\\236\377\1&`\240\377\203" "0\\\236\377\4&`\240\3770\\\236\377&`\240\3770\\\236\377\202$_\237\377" "\1""0\\\236\377\205&`\240\377\1""0\\\236\377\204&`\240\377\2060\\\236" "\377\2&`\240\377$_\237\377\204&`\240\377\2""0\\\236\377&`\240\377\202" "0\\\236\377\2&`\240\3770\\\236\377\204&`\240\377\2""0\\\236\377&`\240" "\377\2020\\\236\377\2&`\240\377$_\237\377\203&`\240\377\16-Z\234\377" "Fs\252\377\212\214\211\377\257\257\246\377\314\313\302\377\330\327\316" "\377\323\332\317\377\301\310\275\377\245\244\233\377s~\213\377\40[\241" "\3770\\\236\377&`\240\3770\\\236\377\203&`\240\377\2020\\\236\377\202" "&`\240\377\2030\\\236\377\2&`\240\3770\\\236\377\203&`\240\377\2020\\" "\236\377\203&`\240\377\1""0\\\236\377\203&`\240\377\1""0\\\236\377\202" "&`\240\377\1""0\\\236\377\205&`\240\377\1""0\\\236\377\202&`\240\377" "\1""0\\\236\377\202&`\240\377\5""0\\\236\377&`\240\3770\\\236\377&`\240" "\3770\\\236\377\204&`\240\377\2030\\\236\377\202&`\240\377\1""0\\\236" "\377\202&`\240\377\2020\\\236\377\10&`\240\3770\\\236\377&`\240\3770" "\\\236\377&`\240\3770\\\236\377&`\240\3770\\\236\377\203&`\240\377\1" "0\\\236\377\202&`\240\377\1""0\\\236\377\202&`\240\377\1""0\\\236\377" "\203&`\240\377\1""0\\\236\377\203&`\240\377\2020\\\236\377\202&`\240" "\377\1""0\\\236\377\202&`\240\377\2020\\\236\377\205&`\240\377\2020\\" "\236\377\3&`\240\3770\\\236\377&`\240\377\2020\\\236\377\4&`\240\377" "0\\\236\377&`\240\3770\\\236\377\202&`\240\377\1""0\\\236\377\205&`\240" "\377\1""0\\\236\377\202&`\240\377\5#R\231\377Mx\260\377\343\351\353\377" "\333\341\343\377\351\353\347\377\202\373\372\361\377\2\365\367\363\377" "\356\360\355\377\204\353\356\352\377\203\355\357\353\377\6\365\364\353" "\377g\216\273\377\35Y\240\377.e\247\377&`\240\377$_\237\377\202&`\240" "\377\2020\\\236\377\203&`\240\377\1""0\\\236\377\203&`\240\377\1""0\\" "\236\377\202&`\240\377\1""0\\\236\377\205&`\240\377\1""0\\\236\377\202" "&`\240\377\1""0\\\236\377\202&`\240\377\5""0\\\236\377&`\240\3770\\\236" "\377&`\240\3770\\\236\377\204&`\240\377\2030\\\236\377\202&`\240\377" "\1""0\\\236\377\202&`\240\377\2020\\\236\377\10&`\240\3770\\\236\377" "&`\240\3770\\\236\377&`\240\3770\\\236\377&`\240\3770\\\236\377\203&" "`\240\377\1""0\\\236\377\202&`\240\377\1""0\\\236\377\202&`\240\377\1" "0\\\236\377\203&`\240\377\1""0\\\236\377\203&`\240\377\2020\\\236\377" "\202&`\240\377\1""0\\\236\377\202&`\240\377\2020\\\236\377\205&`\240" "\377\2020\\\236\377\3&`\240\3770\\\236\377&`\240\377\2020\\\236\377\4" "&`\240\3770\\\236\377&`\240\3770\\\236\377\202&`\240\377\1""0\\\236\377" "\203&`\240\377\13-Z\234\377Fs\252\377\212\214\211\377\257\257\246\377" "\314\313\302\377\330\327\316\377\323\332\317\377\301\310\275\377\245" "\244\233\377s~\213\377\35Y\240\377\206&`\240\377\1$_\237\377\235&`\240" "\377\1$_\237\377\223&`\240\377\1$_\237\377\205&`\240\377\1$_\237\377" "\227&`\240\377\1$_\237\377\242&`\240\377\202$_\237\377\14.e\247\377\325" "\336\346\377\362\364\361\377\356\360\355\377\355\357\353\377\353\356" "\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\4\360\362\357\377Fs\252\377+c\244\377)a\242\377\202$_\237\377" "\223&`\240\377\1$_\237\377\223&`\240\377\1$_\237\377\205&`\240\377\1" "$_\237\377\227&`\240\377\1$_\237\377\236&`\240\377\14-Z\234\377Fs\252" "\377\206\213\215\377\257\257\246\377\307\316\303\377\330\327\316\377" "\323\332\317\377\301\310\275\377\245\244\233\377u}\205\377\35Y\240\377" "1_\233\377\202$_\237\377\2061_\233\377\202$_\237\377\2""1_\233\377$_" "\237\377\2051_\233\377\203$_\237\377\2111_\233\377\204$_\237\377\202" "1_\233\377\2$_\237\3771_\233\377\202$_\237\377\1""1_\233\377\202$_\237" "\377\4""1_\233\377$_\237\3771_\233\377$_\237\377\2021_\233\377\2$_\237" "\3771_\233\377\203$_\237\377\1""1_\233\377\202$_\237\377\2031_\233\377" "\1$_\237\377\2031_\233\377\5$_\237\3771_\233\377$_\237\3771_\233\377" "$_\237\377\2031_\233\377\1$_\237\377\2021_\233\377\1$_\237\377\2071_" "\233\377\5$_\237\3771_\233\377$_\237\3771_\233\377$_\237\377\2021_\233" "\377\2$_\237\3771_\233\377\202$_\237\377\2021_\233\377\202$_\237\377" "\2021_\233\377\202$_\237\377\2""1_\233\377$_\237\377\2031_\233\377\202" "$_\237\377\2""1_\233\377$_\237\377\2021_\233\377\1$_\237\377\2071_\233" "\377\10$_\237\3770\\\236\377Fs\252\377\340\345\350\377\356\360\355\377" "\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377" "\4\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\203" "\355\357\353\377\10\353\356\352\377\362\364\361\377\301\314\332\3770" "\\\236\377.e\247\377&`\240\377$_\237\3771_\233\377\203$_\237\377\211" "1_\233\377\204$_\237\377\2021_\233\377\2$_\237\3771_\233\377\202$_\237" "\377\1""1_\233\377\202$_\237\377\4""1_\233\377$_\237\3771_\233\377$_" "\237\377\2021_\233\377\2$_\237\3771_\233\377\203$_\237\377\1""1_\233" "\377\202$_\237\377\2031_\233\377\1$_\237\377\2031_\233\377\5$_\237\377" "1_\233\377$_\237\3771_\233\377$_\237\377\2031_\233\377\1$_\237\377\202" "1_\233\377\1$_\237\377\2071_\233\377\5$_\237\3771_\233\377$_\237\377" "1_\233\377$_\237\377\2021_\233\377\2$_\237\3771_\233\377\202$_\237\377" "\2021_\233\377\202$_\237\377\2021_\233\377\202$_\237\377\2""1_\233\377" "$_\237\377\2031_\233\377\202$_\237\377\2""1_\233\377$_\237\377\2021_" "\233\377\1$_\237\377\2031_\233\377\14-Z\234\377Fs\252\377\206\213\215" "\377\257\257\246\377\307\316\303\377\330\327\316\377\323\332\317\377" "\301\310\275\377\245\244\233\377u}\205\377\35Y\240\377$_\237\377\206" "&`\240\377\1$_\237\377\206&`\240\377\1$_\237\377\203&`\240\377\1$_\237" "\377\204&`\240\377\1$_\237\377\214&`\240\377\1$_\237\377\202&`\240\377" "\1$_\237\377\204&`\240\377\1$_\237\377\210&`\240\377\1$_\237\377\202" "&`\240\377\1$_\237\377\203&`\240\377\1$_\237\377\205&`\240\377\1$_\237" "\377\213&`\240\377\1$_\237\377\203&`\240\377\1$_\237\377\207&`\240\377" "\1$_\237\377\202&`\240\377\1$_\237\377\207&`\240\377\4$_\237\377&`\240" "\377$_\237\377&`\240\377\202$_\237\377\4&`\240\377$_\237\377&`\240\377" "$_\237\377\202&`\240\377\1$_\237\377\207&`\240\377\7$_\237\377#^\236" "\377[\177\262\377\353\356\352\377\356\360\355\377\355\357\353\377\353" "\356\352\377\206\355\357\353\377\1\353\356\352\377\205\355\357\353\377" "\2\367\366\355\377c\212\267\377\202)a\242\377\3$_\237\377&`\240\377$" "_\237\377\204&`\240\377\1$_\237\377\214&`\240\377\1$_\237\377\202&`\240" "\377\1$_\237\377\204&`\240\377\1$_\237\377\210&`\240\377\1$_\237\377" "\202&`\240\377\1$_\237\377\203&`\240\377\1$_\237\377\205&`\240\377\1" "$_\237\377\213&`\240\377\1$_\237\377\203&`\240\377\1$_\237\377\207&`" "\240\377\1$_\237\377\202&`\240\377\1$_\237\377\207&`\240\377\4$_\237" "\377&`\240\377$_\237\377&`\240\377\202$_\237\377\4&`\240\377$_\237\377" "&`\240\377$_\237\377\202&`\240\377\1$_\237\377\203&`\240\377\14-Z\234" "\377Fs\252\377\206\213\215\377\257\257\246\377\307\316\303\377\330\327" "\316\377\323\332\317\377\301\310\275\377\245\244\233\377u}\205\377\35" "Y\240\377&`\240\377\2041_\233\377\2&`\240\3771_\233\377\202&`\240\377" "\2021_\233\377\202&`\240\377\2021_\233\377\202&`\240\377\2021_\233\377" "\207&`\240\377\1""1_\233\377\202&`\240\377\3""1_\233\377&`\240\3771_" "\233\377\202&`\240\377\1""1_\233\377\214&`\240\377\1""1_\233\377\202" "&`\240\377\2021_\233\377\203&`\240\377\1""1_\233\377\207&`\240\377\1" "1_\233\377\202&`\240\377\2031_\233\377\2&`\240\3771_\233\377\202&`\240" "\377\3""1_\233\377&`\240\3771_\233\377\203&`\240\377\1""1_\233\377\210" "&`\240\377\1""1_\233\377\203&`\240\377\1""1_\233\377\203&`\240\377\202" "1_\233\377\2&`\240\3771_\233\377\203&`\240\377\1""1_\233\377\204&`\240" "\377\2""1_\233\377&`\240\377\2021_\233\377\2&`\240\3771_\233\377\206" "&`\240\377\5""1_\233\377$_\237\377-Z\234\377c\212\267\377\365\367\363" "\377\205\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352" "\377\206\355\357\353\377\6\353\356\352\377\360\362\357\377\313\324\334" "\377/[\235\377+c\244\377$_\237\377\2021_\233\377\207&`\240\377\1""1_" "\233\377\202&`\240\377\3""1_\233\377&`\240\3771_\233\377\202&`\240\377" "\1""1_\233\377\214&`\240\377\1""1_\233\377\202&`\240\377\2021_\233\377" "\203&`\240\377\1""1_\233\377\207&`\240\377\1""1_\233\377\202&`\240\377" "\2031_\233\377\2&`\240\3771_\233\377\202&`\240\377\3""1_\233\377&`\240" "\3771_\233\377\203&`\240\377\1""1_\233\377\210&`\240\377\1""1_\233\377" "\203&`\240\377\1""1_\233\377\203&`\240\377\2021_\233\377\2&`\240\377" "1_\233\377\203&`\240\377\1""1_\233\377\204&`\240\377\2""1_\233\377&`" "\240\377\2021_\233\377\2&`\240\3771_\233\377\203&`\240\377\13!]\235\377" "7n\251\377\206\213\215\377\256\255\244\377\307\316\303\377\330\327\316" "\377\323\332\317\377\301\310\275\377\245\244\233\377u}\205\377\35Y\240" "\377\372$_\237\377\3-Z\234\377v\227\277\377\373\372\361\377\203\353\356" "\352\377\202\355\357\353\377\5\353\356\352\377\355\357\353\377\353\356" "\352\377\355\357\353\377\353\356\352\377\203\355\357\353\377\6\353\356" "\352\377\355\357\353\377\351\353\347\377\360\362\357\377Mx\260\3770\\" "\236\377\345$_\237\377\14-Z\234\377@k\250\377\206\213\215\377\256\255" "\244\377\307\316\303\377\330\327\316\377\323\332\317\377\310\307\276" "\377\245\244\233\377u}\205\377\35Y\240\377#^\236\377\2030\\\236\377\1" "#^\236\377\2100\\\236\377\202#^\236\377\2020\\\236\377\202#^\236\377" "\2070\\\236\377\1#^\236\377\2020\\\236\377\1#^\236\377\2210\\\236\377" "\1#^\236\377\2030\\\236\377\1#^\236\377\2440\\\236\377\1#^\236\377\207" "0\\\236\377\1#^\236\377\2020\\\236\377\1#^\236\377\2030\\\236\377\1#" "^\236\377\2060\\\236\377\1#^\236\377\2020\\\236\377\1#^\236\377\2020" "\\\236\377\1#^\236\377\2030\\\236\377\10#^\236\377$_\237\377/[\235\377" "\222\251\307\377\367\366\355\377\353\356\352\377\355\357\353\377\353" "\356\352\377\202\355\357\353\377\5\353\356\352\377\355\357\353\377\353" "\356\352\377\355\357\353\377\353\356\352\377\205\355\357\353\377\6\353" "\356\352\377\375\365\355\377\222\251\307\377\35Y\240\377&`\240\377#^" "\236\377\2100\\\236\377\1#^\236\377\2020\\\236\377\1#^\236\377\2210\\" "\236\377\1#^\236\377\2030\\\236\377\1#^\236\377\2440\\\236\377\1#^\236" "\377\2070\\\236\377\1#^\236\377\2020\\\236\377\1#^\236\377\2030\\\236" "\377\1#^\236\377\2060\\\236\377\1#^\236\377\2020\\\236\377\1#^\236\377" "\2030\\\236\377\14-Z\234\377@k\250\377\206\213\215\377\256\255\244\377" "\307\316\303\377\330\327\316\377\323\332\317\377\310\307\276\377\245" "\244\233\377u}\205\377\40[\241\377#^\236\377\2020\\\236\377\2$_\237\377" "0\\\236\377\202$_\237\377\4#^\236\3770\\\236\377$_\237\3770\\\236\377" "\202$_\237\377\2""0\\\236\377#^\236\377\204$_\237\377\203#^\236\377\4" "0\\\236\377#^\236\3770\\\236\377$_\237\377\2020\\\236\377\12$_\237\377" "0\\\236\377#^\236\3770\\\236\377$_\237\377#^\236\3770\\\236\377$_\237" "\377#^\236\3770\\\236\377\203$_\237\377\1#^\236\377\203$_\237\377\202" "#^\236\377\202$_\237\377\2#^\236\377$_\237\377\202#^\236\377\4$_\237" "\377#^\236\3770\\\236\377#^\236\377\203$_\237\377\1""0\\\236\377\202" "#^\236\377\202$_\237\377\1""0\\\236\377\202$_\237\377\2""0\\\236\377" "#^\236\377\202$_\237\377\1#^\236\377\202$_\237\377\4""0\\\236\377#^\236" "\377$_\237\377#^\236\377\203$_\237\377\4""0\\\236\377$_\237\3770\\\236" "\377$_\237\377\202#^\236\377\1""0\\\236\377\202$_\237\377\2020\\\236" "\377\203$_\237\377\1#^\236\377\202$_\237\377\2""0\\\236\377#^\236\377" "\202$_\237\377\1""0\\\236\377\204#^\236\377\4$_\237\377#^\236\3770\\" "\236\377$_\237\377\205#^\236\377\202$_\237\377\202#^\236\377\4&`\240" "\3770\\\236\377\255\274\320\377\362\364\361\377\202\353\356\352\377\203" "\355\357\353\377\1\353\356\352\377\212\355\357\353\377\2\365\364\353" "\377\301\314\332\377\202)a\242\377\2#^\236\377$_\237\377\203#^\236\377" "\4""0\\\236\377#^\236\3770\\\236\377$_\237\377\2020\\\236\377\12$_\237" "\3770\\\236\377#^\236\3770\\\236\377$_\237\377#^\236\3770\\\236\377$" "_\237\377#^\236\3770\\\236\377\203$_\237\377\1#^\236\377\203$_\237\377" "\202#^\236\377\202$_\237\377\2#^\236\377$_\237\377\202#^\236\377\4$_" "\237\377#^\236\3770\\\236\377#^\236\377\203$_\237\377\1""0\\\236\377" "\202#^\236\377\202$_\237\377\1""0\\\236\377\202$_\237\377\2""0\\\236" "\377#^\236\377\202$_\237\377\1#^\236\377\202$_\237\377\4""0\\\236\377" "#^\236\377$_\237\377#^\236\377\203$_\237\377\4""0\\\236\377$_\237\377" "0\\\236\377$_\237\377\202#^\236\377\1""0\\\236\377\202$_\237\377\202" "0\\\236\377\203$_\237\377\1#^\236\377\202$_\237\377\2""0\\\236\377#^" "\236\377\202$_\237\377\1""0\\\236\377\204#^\236\377\3$_\237\377#^\236" "\3770\\\236\377\203$_\237\377\17#^\236\3770\\\236\377#^\236\377-Z\234" "\377@k\250\377\206\213\215\377\256\255\244\377\307\316\303\377\330\327" "\316\377\323\332\317\377\310\307\276\377\245\244\233\377u}\205\377\40" "[\241\377#^\236\377\2040\\\236\377\203$_\237\377\3""0\\\236\377$_\237" "\3770\\\236\377\202$_\237\377\2030\\\236\377\1$_\237\377\2040\\\236\377" "\204$_\237\377\2020\\\236\377\202$_\237\377\2030\\\236\377\1$_\237\377" "\2020\\\236\377\1$_\237\377\2020\\\236\377\5$_\237\3770\\\236\377$_\237" "\3770\\\236\377$_\237\377\2020\\\236\377\1$_\237\377\2020\\\236\377\3" "$_\237\3770\\\236\377$_\237\377\2020\\\236\377\202$_\237\377\2020\\\236" "\377\203$_\237\377\2""0\\\236\377$_\237\377\2020\\\236\377\202$_\237" "\377\2030\\\236\377\1$_\237\377\2060\\\236\377\203$_\237\377\3""0\\\236" "\377$_\237\3770\\\236\377\204$_\237\377\2100\\\236\377\202$_\237\377" "\2""0\\\236\377$_\237\377\2060\\\236\377\203$_\237\377\2""0\\\236\377" "$_\237\377\203#^\236\377\2""0\\\236\377#^\236\377\202)a\242\377\1&`\240" "\377\204#^\236\377\10""3`\234\3770\\\236\377\306\322\340\377\356\360" "\355\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353" "\377\204\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\203\353\356\352\377\10\355\357\353\377\353\356\352\377\356\360\355" "\377\355\357\353\377@k\250\377)a\242\377#^\236\377$_\237\377\2020\\\236" "\377\204$_\237\377\2020\\\236\377\202$_\237\377\2030\\\236\377\1$_\237" "\377\2020\\\236\377\1$_\237\377\2020\\\236\377\5$_\237\3770\\\236\377" "$_\237\3770\\\236\377$_\237\377\2020\\\236\377\1$_\237\377\2020\\\236" "\377\3$_\237\3770\\\236\377$_\237\377\2020\\\236\377\202$_\237\377\202" "0\\\236\377\203$_\237\377\2""0\\\236\377$_\237\377\2020\\\236\377\202" "$_\237\377\2030\\\236\377\1$_\237\377\2060\\\236\377\203$_\237\377\3" "0\\\236\377$_\237\3770\\\236\377\204$_\237\377\2100\\\236\377\202$_\237" "\377\2""0\\\236\377$_\237\377\2060\\\236\377\203$_\237\377\2""0\\\236" "\377$_\237\377\2050\\\236\377\202$_\237\377\14""0\\\236\377-Z\234\377" "@k\250\377\204\211\214\377\256\255\244\377\307\316\303\377\330\327\316" "\377\323\332\317\377\310\307\276\377\245\244\233\377u}\205\377\40[\241" "\377\205#^\236\377\203$_\237\377\3#^\236\377$_\237\377#^\236\377\202" "$_\237\377\203#^\236\377\1$_\237\377\204#^\236\377\204$_\237\377\202" "#^\236\377\202$_\237\377\203#^\236\377\1$_\237\377\202#^\236\377\1$_" "\237\377\202#^\236\377\5$_\237\377#^\236\377$_\237\377#^\236\377$_\237" "\377\202#^\236\377\1$_\237\377\202#^\236\377\3$_\237\377#^\236\377$_" "\237\377\202#^\236\377\202$_\237\377\202#^\236\377\203$_\237\377\2#^" "\236\377$_\237\377\202#^\236\377\202$_\237\377\203#^\236\377\3$_\237" "\377#^\236\377$_\237\377\204#^\236\377\203$_\237\377\3#^\236\377$_\237" "\377#^\236\377\204$_\237\377\210#^\236\377\202$_\237\377\2#^\236\377" "$_\237\377\206#^\236\377\2$_\237\377#^\236\377\202$_\237\377\202#^\236" "\377\11&`\240\377)a\242\377.e\247\377+c\244\377&`\240\377.e\247\3779" "e\242\377+c\244\377&`\240\377\202#^\236\377\3""4a\235\3770\\\236\377" "\340\345\350\377\202\353\356\352\377\3\355\357\353\377\353\356\352\377" "\355\357\353\377\204\353\356\352\377\3\355\357\353\377\353\356\352\377" "\355\357\353\377\203\353\356\352\377\1\355\357\353\377\202\353\356\352" "\377\5\377\371\361\377[\177\262\377)a\242\377#^\236\377$_\237\377\202" "#^\236\377\204$_\237\377\202#^\236\377\202$_\237\377\203#^\236\377\1" "$_\237\377\202#^\236\377\1$_\237\377\202#^\236\377\5$_\237\377#^\236" "\377$_\237\377#^\236\377$_\237\377\202#^\236\377\1$_\237\377\202#^\236" "\377\3$_\237\377#^\236\377$_\237\377\202#^\236\377\202$_\237\377\202" "#^\236\377\203$_\237\377\2#^\236\377$_\237\377\202#^\236\377\202$_\237" "\377\203#^\236\377\3$_\237\377#^\236\377$_\237\377\204#^\236\377\203" "$_\237\377\3#^\236\377$_\237\377#^\236\377\204$_\237\377\210#^\236\377" "\202$_\237\377\2#^\236\377$_\237\377\206#^\236\377\203$_\237\377\2#^" "\236\377$_\237\377\205#^\236\377\202$_\237\377\15#^\236\377-Z\234\377" "@k\250\377\204\211\214\377\256\255\244\377\314\313\302\377\330\327\316" "\377\323\332\317\377\310\307\276\377\245\244\233\377u}\205\377\35Y\240" "\377#^\236\377\2030^\232\377\1#^\236\377\2020^\232\377\202#^\236\377" "\2040^\232\377\202#^\236\377\2070^\232\377\4#^\236\3770^\232\377#^\236" "\3770^\232\377\202#^\236\377\2""0^\232\377#^\236\377\2040^\232\377\1" "#^\236\377\2020^\232\377\1#^\236\377\2200^\232\377\3#^\236\3770^\232" "\377#^\236\377\2030^\232\377\3#^\236\3770^\232\377#^\236\377\2270^\232" "\377\3#^\236\3770^\232\377#^\236\377\2030^\232\377\207#^\236\377\2""0" "^\232\377#^\236\377\2020^\232\377\2#^\236\3770^\232\377\203#^\236\377" "\2)a\242\377+c\244\377\204.e\247\377\2#^\236\377&`\240\377\203.e\247" "\377\6+c\244\3773`\234\3774a\235\377)a\242\377\360\362\357\377\351\353" "\347\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1" "\353\356\352\377\203\355\357\353\377\1\353\356\352\377\206\355\357\353" "\377\6\353\356\352\377\367\366\355\377\205\241\304\3770\\\236\377$_\237" "\377#^\236\377\2030^\232\377\4#^\236\3770^\232\377#^\236\3770^\232\377" "\202#^\236\377\2""0^\232\377#^\236\377\2040^\232\377\1#^\236\377\202" "0^\232\377\1#^\236\377\2200^\232\377\3#^\236\3770^\232\377#^\236\377" "\2030^\232\377\3#^\236\3770^\232\377#^\236\377\2270^\232\377\3#^\236" "\3770^\232\377#^\236\377\2020^\232\377\1#^\236\377\2040^\232\377\1#^" "\236\377\2020^\232\377\1#^\236\377\2030^\232\377\203#^\236\377\2030^" "\232\377\202#^\236\377\2030^\232\377\202#^\236\377\14""0^\232\377\40" "\\\234\377=h\245\377\204\211\214\377\256\255\244\377\307\316\303\377" "\330\327\316\377\323\332\317\377\310\307\276\377\245\244\233\377u}\205" "\377\35Y\240\377\203#^\236\377\2$_\237\3770^\232\377\202$_\237\377\1" "0^\232\377\202$_\237\377\1#^\236\377\202$_\237\377\2""0^\232\377#^\236" "\377\203$_\237\377\1""0^\232\377\202#^\236\377\3""0^\232\377$_\237\377" "0^\232\377\205$_\237\377\1""0^\232\377\202#^\236\377\2""0^\232\377#^" "\236\377\202$_\237\377\1#^\236\377\204$_\237\377\1#^\236\377\2020^\232" "\377\202$_\237\377\1#^\236\377\202$_\237\377\2#^\236\377$_\237\377\202" "#^\236\377\202$_\237\377\202#^\236\377\205$_\237\377\1#^\236\377\202" "$_\237\377\1""0^\232\377\202$_\237\377\1#^\236\377\203$_\237\377\6#^" "\236\3770^\232\377$_\237\377#^\236\377$_\237\3770^\232\377\203$_\237" "\377\2020^\232\377\203$_\237\377\202#^\236\377\1""0^\232\377\202$_\237" "\377\2#^\236\377$_\237\377\204&`\240\377\1$_\237\377\210#^\236\377\1" ")a\242\377\203.e\247\377\4""9e\242\377+c\244\3770\\\236\377+c\244\377" "\202#^\236\377\2$_\237\377)a\242\377\204.e\247\377\3Fs\252\377\362\364" "\361\377\351\353\347\377\202\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\203\355\357\353\377\1\353\356\352\377\203\355\357\353\377\4\360\362" "\357\377\262\302\325\377\35Y\240\377&`\240\377\203#^\236\377\3""0^\232" "\377$_\237\3770^\232\377\205$_\237\377\1""0^\232\377\202#^\236\377\2" "0^\232\377#^\236\377\202$_\237\377\1#^\236\377\204$_\237\377\1#^\236" "\377\2020^\232\377\202$_\237\377\1#^\236\377\202$_\237\377\2#^\236\377" "$_\237\377\202#^\236\377\202$_\237\377\202#^\236\377\205$_\237\377\1" "#^\236\377\202$_\237\377\1""0^\232\377\202$_\237\377\1#^\236\377\203" "$_\237\377\6#^\236\3770^\232\377$_\237\377#^\236\377$_\237\3770^\232" "\377\203$_\237\377\2020^\232\377\203$_\237\377\202#^\236\377\1""0^\232" "\377\202$_\237\377\2""0^\232\377#^\236\377\203$_\237\377\1#^\236\377" "\203$_\237\377\2#^\236\377$_\237\377\2030^\232\377\5$_\237\3770^\232" "\377#^\236\377$_\237\377#^\236\377\206$_\237\377\15#^\236\377\40\\\234" "\377=h\245\377\202\207\212\377\256\255\244\377\307\316\303\377\330\327" "\316\377\323\332\317\377\310\307\276\377\245\244\233\377u}\205\377\40" "[\241\377#^\236\377\203$_\237\377\2""0^\232\377$_\237\377\2020^\232\377" "\205$_\237\377\2""0^\232\377#^\236\377\203$_\237\377\2020^\232\377\3" "$_\237\3770^\232\377$_\237\377\2020^\232\377\204$_\237\377\1""0^\232" "\377\202$_\237\377\1""0^\232\377\211$_\237\377\2020^\232\377\214$_\237" "\377\1#^\236\377\205$_\237\377\1#^\236\377\202$_\237\377\1""0^\232\377" "\205$_\237\377\3#^\236\377$_\237\3770^\232\377\203$_\237\377\1""0^\232" "\377\203$_\237\377\2020^\232\377\203$_\237\377\3#^\236\377$_\237\377" "0^\232\377\202$_\237\377\2#^\236\377&`\240\377\205.e\247\377\3+c\244" "\377)a\242\3774a\235\377\202)a\242\377\202&`\240\377\1)a\242\377\202" ".e\247\377\24)a\242\377\40[\241\3770\\\236\377Mx\260\377v\227\277\377" ")a\242\3773`\234\377\36[\233\377^\205\262\377o\217\267\3770\\\236\377" "/[\235\3770\\\236\377)a\242\377^\205\262\377\362\364\361\377\351\353" "\347\377\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\203" "\355\357\353\377\1\353\356\352\377\203\355\357\353\377\11\356\360\355" "\377\321\331\342\377\35Y\240\377#^\236\377$_\237\3770^\232\377$_\237" "\3770^\232\377$_\237\377\2020^\232\377\204$_\237\377\1""0^\232\377\202" "$_\237\377\1""0^\232\377\211$_\237\377\2020^\232\377\214$_\237\377\1" "#^\236\377\205$_\237\377\1#^\236\377\202$_\237\377\1""0^\232\377\205" "$_\237\377\3#^\236\377$_\237\3770^\232\377\203$_\237\377\1""0^\232\377" "\203$_\237\377\2020^\232\377\203$_\237\377\3#^\236\377$_\237\3770^\232" "\377\202$_\237\377\1""0^\232\377\202$_\237\377\3""0^\232\377$_\237\377" "#^\236\377\205$_\237\377\2030^\232\377\1$_\237\377\2020^\232\377\2$_" "\237\377#^\236\377\207$_\237\377\14\40\\\234\377=h\245\377\202\207\212" "\377\256\255\244\377\314\313\302\377\330\327\316\377\323\332\317\377" "\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377#^\236\377\203" "$_\237\377\1""0^\232\377\210$_\237\377\1""0^\232\377\204$_\237\377\202" "0^\232\377\211$_\237\377\1""0^\232\377\202$_\237\377\1""0^\232\377\211" "$_\237\377\2020^\232\377\235$_\237\377\1""0^\232\377\207$_\237\377\1" "0^\232\377\206$_\237\377\1""0^\232\377\202$_\237\377\2#^\236\377)a\242" "\377\216.e\247\377\12\35Y\240\377>s\257\377\205\241\304\377\306\322\340" "\377\376\375\364\377\262\302\325\377/[\235\377.e\247\377)a\242\377=h" "\245\377\202\340\345\350\377\5\222\251\307\377[\177\262\377#R\231\377" "v\227\277\377\365\364\353\377\204\353\356\352\377\202\355\357\353\377" "\5\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\7\353\356\352\377\356\360\355\377\340\345\350\3777n\251\377+X\232\377" "$_\237\3770^\232\377\211$_\237\377\1""0^\232\377\202$_\237\377\1""0^" "\232\377\211$_\237\377\2020^\232\377\235$_\237\377\1""0^\232\377\207" "$_\237\377\1""0^\232\377\206$_\237\377\1""0^\232\377\202$_\237\377\1" "0^\232\377\212$_\237\377\2020^\232\377\203$_\237\377\1""0^\232\377\211" "$_\237\377\13\40\\\234\3771g\251\377\202\207\212\377\256\255\244\377" "\314\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245" "\244\233\377u}\205\377\40[\241\377\334#^\236\377\5)a\242\377.e\247\377" "=h\245\377.e\247\3770\\\236\377\203\35Y\240\377\16/[\235\3770\\\236\377" ")a\242\377+c\244\377.e\247\377)a\242\377=h\245\377\255\274\320\377\351" "\353\347\377\372\371\357\377\360\362\357\377\356\360\355\377\262\302" "\325\377/[\235\377\202.e\247\377\5""0\\\236\377V\204\265\377\373\372" "\361\377\367\366\355\377\355\357\353\377\202\267\306\332\377\1\360\362" "\357\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\5\353\356" "\352\377\355\357\353\377\360\362\357\377Ns\245\377+X\232\377\343#^\236" "\377\14\40\\\234\3771g\251\377\202\207\212\377\255\254\243\377\314\313" "\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233" "\377u}\205\377\35Y\240\377!]\235\377\203/[\235\377\1!]\235\377\211/[" "\235\377\1!]\235\377\203/[\235\377\1!]\235\377\241/[\235\377\202!]\235" "\377\212/[\235\377\1!]\235\377\232/[\235\377\22!]\235\3770\\\236\377" "V\204\265\377\351\353\347\377\313\324\334\377\274\310\325\377\247\272" "\323\377\226\255\313\377\205\241\304\377o\217\267\377[\177\262\377Fs" "\252\377.e\247\377/[\235\377$_\237\377+X\232\377\301\314\332\377\365" "\364\353\377\202\353\356\352\377\3\360\362\357\377\255\274\320\377\36" "P\227\377\202\35Y\240\377\5\40[\241\377\30N\226\377\242\266\316\377\362" "\364\361\377\355\357\353\377\202\360\362\357\377\5\353\356\352\377\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\202\355" "\357\353\377\5\353\356\352\377\355\357\353\377\353\356\352\377\355\357" "\353\377\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\6\353\356\352\377\373\372\361\377\205\241\304\377$T\225" "\377#^\236\377!]\235\377\241/[\235\377\202!]\235\377\212/[\235\377\1" "!]\235\377\232/[\235\377\3!]\235\377/[\235\377!]\235\377\202/[\235\377" "\1!]\235\377\212/[\235\377\202!]\235\377\202/[\235\377\1!]\235\377\205" "/[\235\377\16,Y\233\377.e\247\377\200\204\207\377\255\254\243\377\314" "\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377u}\205\377\35Y\240\377!]\235\377/[\235\377!]\235\377\203#^\236" "\377\202!]\235\377\12#^\236\377/[\235\377!]\235\377#^\236\377/[\235\377" "#^\236\377!]\235\377#^\236\377/[\235\377#^\236\377\203!]\235\377\3/[" "\235\377#^\236\377!]\235\377\203#^\236\377\6/[\235\377#^\236\377/[\235" "\377!]\235\377/[\235\377!]\235\377\203#^\236\377\1!]\235\377\202/[\235" "\377\202#^\236\377\202!]\235\377\203#^\236\377\1!]\235\377\202#^\236" "\377\4!]\235\377#^\236\377/[\235\377!]\235\377\202#^\236\377\202!]\235" "\377\1#^\236\377\203/[\235\377\4#^\236\377/[\235\377#^\236\377!]\235" "\377\203#^\236\377\3!]\235\377/[\235\377#^\236\377\202!]\235\377\202" "#^\236\377\202/[\235\377\203#^\236\377\1/[\235\377\202#^\236\377\23!" "]\235\377#^\236\377!]\235\377/[\235\377!]\235\377/[\235\377#^\236\377" "/[\235\377!]\235\377/[\235\377o\217\267\377\372\371\357\377\360\362\357" "\377\365\367\363\377\372\371\357\377\373\372\361\377\375\365\355\377" "\362\364\361\377\360\362\357\377\202\355\357\353\377\6\333\341\343\377" "\77l\243\377&`\240\3777n\251\377\355\357\353\377\356\360\355\377\202" "\355\357\353\377\2\351\353\347\377\333\341\343\377\203\340\345\350\377" "\202\333\341\343\377\1\356\360\355\377\204\355\357\353\377\1\353\356" "\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1" "\353\356\352\377\203\355\357\353\377\1\353\356\352\377\203\355\357\353" "\377\10\353\356\352\377\355\357\353\377\353\356\352\377\372\371\357\377" "\242\266\316\377\36P\227\377!]\235\377#^\236\377\203!]\235\377\3/[\235" "\377#^\236\377!]\235\377\203#^\236\377\6/[\235\377#^\236\377/[\235\377" "!]\235\377/[\235\377!]\235\377\203#^\236\377\1!]\235\377\202/[\235\377" "\202#^\236\377\202!]\235\377\203#^\236\377\1!]\235\377\202#^\236\377" "\4!]\235\377#^\236\377/[\235\377!]\235\377\202#^\236\377\202!]\235\377" "\1#^\236\377\203/[\235\377\4#^\236\377/[\235\377#^\236\377!]\235\377" "\203#^\236\377\3!]\235\377/[\235\377#^\236\377\202!]\235\377\202#^\236" "\377\202/[\235\377\203#^\236\377\1/[\235\377\202#^\236\377\10!]\235\377" "#^\236\377!]\235\377/[\235\377!]\235\377/[\235\377#^\236\377/[\235\377" "\202!]\235\377\1/[\235\377\202#^\236\377\6!]\235\377/[\235\377#^\236" "\377/[\235\377!]\235\377/[\235\377\205#^\236\377\5!]\235\377#^\236\377" "!]\235\377#^\236\377/[\235\377\204#^\236\377\15/[\235\377\40\\\234\377" ".e\247\377\200\204\207\377\255\254\243\377\314\313\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240" "\377!]\235\377\212/[\235\377\1#^\236\377\204/[\235\377\1#^\236\377\205" "/[\235\377\2#^\236\377/[\235\377\202#^\236\377\1/[\235\377\202#^\236" "\377\202/[\235\377\205#^\236\377\216/[\235\377\1#^\236\377\202/[\235" "\377\1#^\236\377\203/[\235\377\3#^\236\377/[\235\377#^\236\377\204/[" "\235\377\1#^\236\377\210/[\235\377\1#^\236\377\205/[\235\377\1#^\236" "\377\202/[\235\377\5#^\236\377/[\235\377#^\236\377/[\235\377#^\236\377" "\202/[\235\377\202#^\236\377\4!]\235\377,Y\233\377~\232\275\377\365\364" "\353\377\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377\10" "\356\360\355\377\360\362\357\377Uy\253\3770\\\236\377.e\247\377#R\231" "\377\205\241\304\377\367\366\355\377\202\353\356\352\377\210\355\357" "\353\377\2\353\356\352\377\355\357\353\377\207\353\356\352\377\5\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\6\353\356\352\377\362" "\364\361\377\313\324\334\377+X\232\377\40\\\234\377#^\236\377\205/[\235" "\377\2#^\236\377/[\235\377\202#^\236\377\1/[\235\377\202#^\236\377\202" "/[\235\377\205#^\236\377\216/[\235\377\1#^\236\377\202/[\235\377\1#^" "\236\377\203/[\235\377\3#^\236\377/[\235\377#^\236\377\204/[\235\377" "\1#^\236\377\210/[\235\377\1#^\236\377\205/[\235\377\1#^\236\377\202" "/[\235\377\5#^\236\377/[\235\377#^\236\377/[\235\377#^\236\377\202/[" "\235\377\1#^\236\377\204/[\235\377\202#^\236\377\202/[\235\377\1#^\236" "\377\217/[\235\377\202#^\236\377\14/[\235\377\40\\\234\377.e\247\377" "\200\204\207\377\255\254\243\377\314\313\302\377\330\327\316\377\323" "\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377\203" "!]\235\377\203#^\236\377\1!]\235\377\202#^\236\377\202!]\235\377\4#^" "\236\377/[\235\377#^\236\377!]\235\377\204#^\236\377\2!]\235\377/[\235" "\377\210#^\236\377\2/[\235\377!]\235\377\205#^\236\377\3/[\235\377#^" "\236\377/[\235\377\202#^\236\377\2/[\235\377!]\235\377\203#^\236\377" "\1!]\235\377\202#^\236\377\4/[\235\377#^\236\377/[\235\377!]\235\377" "\202#^\236\377\202!]\235\377\2#^\236\377/[\235\377\203#^\236\377\1!]" "\235\377\205#^\236\377\1/[\235\377\202#^\236\377\2/[\235\377!]\235\377" "\202#^\236\377\1/[\235\377\207#^\236\377\6!]\235\377#^\236\377/[\235" "\377#^\236\377!]\235\377#^\236\377\203!]\235\377\3-Z\234\377\222\251" "\307\377\365\364\353\377\203\353\356\352\377\1\355\357\353\377\202\353" "\356\352\377\12\355\357\353\377\367\366\355\377c\212\267\377\35Y\240" "\377.e\247\377\40[\241\377V\204\265\377\325\336\346\377\360\362\357\377" "\353\356\352\377\205\355\357\353\377\1\353\356\352\377\207\355\357\353" "\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\204" "\355\357\353\377\7\360\362\357\377\340\345\350\377=h\245\377-Z\234\377" "#^\236\377!]\235\377#^\236\377\202!]\235\377\1/[\235\377\210#^\236\377" "\2/[\235\377!]\235\377\205#^\236\377\3/[\235\377#^\236\377/[\235\377" "\202#^\236\377\2/[\235\377!]\235\377\203#^\236\377\1!]\235\377\202#^" "\236\377\4/[\235\377#^\236\377/[\235\377!]\235\377\202#^\236\377\202" "!]\235\377\2#^\236\377/[\235\377\203#^\236\377\1!]\235\377\205#^\236" "\377\1/[\235\377\202#^\236\377\2/[\235\377!]\235\377\202#^\236\377\1" "/[\235\377\207#^\236\377\5!]\235\377#^\236\377/[\235\377#^\236\377!]" "\235\377\202#^\236\377\3/[\235\377#^\236\377/[\235\377\203#^\236\377" "\2!]\235\377/[\235\377\202#^\236\377\1!]\235\377\206#^\236\377\3!]\235" "\377#^\236\377/[\235\377\206#^\236\377\14!]\235\377\40\\\234\377.e\247" "\377\200\204\207\377\255\254\243\377\314\313\302\377\330\327\316\377" "\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377" "\203!]\235\377\203/]\231\377\1!]\235\377\202/]\231\377\202!]\235\377" "\4/]\231\377!]\235\377/]\231\377!]\235\377\204/]\231\377\202!]\235\377" "\210/]\231\377\202!]\235\377\205/]\231\377\3!]\235\377/]\231\377!]\235" "\377\202/]\231\377\202!]\235\377\203/]\231\377\1!]\235\377\202/]\231" "\377\2!]\235\377/]\231\377\202!]\235\377\202/]\231\377\202!]\235\377" "\205/]\231\377\1!]\235\377\205/]\231\377\1!]\235\377\202/]\231\377\202" "!]\235\377\202/]\231\377\1!]\235\377\207/]\231\377\5!]\235\377/]\231" "\377!]\235\377/]\231\377!]\235\377\202/]\231\377\5!]\235\377$_\237\377" "\35Y\240\377\235\261\311\377\365\367\363\377\203\353\356\352\377\203" "\355\357\353\377\10\375\365\355\377v\227\277\3770\\\236\377)a\242\377" "/[\235\377\235\261\311\377\360\362\357\377\356\360\355\377\202\353\356" "\352\377\205\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\203\355\357\353\377\202\353\356\352\377\2\355\357\353" "\377\353\356\352\377\202\355\357\353\377\1\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\3" "\356\360\355\377Mx\260\377)a\242\377\202.e\247\377\1&`\240\377\202!]" "\235\377\2/]\231\377!]\235\377\210/]\231\377\202!]\235\377\205/]\231" "\377\3!]\235\377/]\231\377!]\235\377\202/]\231\377\202!]\235\377\203" "/]\231\377\1!]\235\377\202/]\231\377\2!]\235\377/]\231\377\202!]\235" "\377\202/]\231\377\202!]\235\377\205/]\231\377\1!]\235\377\205/]\231" "\377\1!]\235\377\202/]\231\377\202!]\235\377\202/]\231\377\1!]\235\377" "\207/]\231\377\5!]\235\377/]\231\377!]\235\377/]\231\377!]\235\377\202" "/]\231\377\3!]\235\377/]\231\377!]\235\377\203/]\231\377\202!]\235\377" "\202/]\231\377\1!]\235\377\206/]\231\377\3!]\235\377/]\231\377!]\235" "\377\206/]\231\377\16!]\235\377\40\\\234\377+c\244\377\202\207\212\377" "\255\254\243\377\314\313\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\245\244\233\377u}\205\377\35Y\240\377!]\235\377/[\235\377" "\204#^\236\377\3!]\235\377/[\235\377#^\236\377\202/[\235\377\203#^\236" "\377\5!]\235\377#^\236\377/[\235\377#^\236\377/[\235\377\202#^\236\377" "\3/[\235\377#^\236\377/[\235\377\203#^\236\377\3/[\235\377#^\236\377" "/[\235\377\207#^\236\377\5/[\235\377#^\236\377/]\231\377#^\236\377/[" "\235\377\220#^\236\377\202/[\235\377\3!]\235\377#^\236\377!]\235\377" "\206#^\236\377\3/[\235\377#^\236\377!]\235\377\204#^\236\377\1/[\235" "\377\203#^\236\377\1/[\235\377\205#^\236\377\202!]\235\377\1#^\236\377" "\202!]\235\377\5""9e\242\377\35Y\240\377\255\274\320\377\365\367\363" "\377\353\356\352\377\202\355\357\353\377\202\353\356\352\377\11\377\371" "\361\377\205\241\304\377/[\235\377-Z\234\377Mx\260\377\313\324\334\377" "\372\371\357\377\355\357\353\377\353\356\352\377\222\355\357\353\377" "\1\353\356\352\377\206\355\357\353\377\1\353\356\352\377\203\355\357" "\353\377\5\362\364\361\377\222\251\307\377\30N\226\3770\\\236\377+c\244" "\377\202.e\247\377\1)a\242\377\202!]\235\377\203#^\236\377\1/[\235\377" "\203#^\236\377\3/[\235\377#^\236\377/[\235\377\207#^\236\377\5/[\235" "\377#^\236\377/]\231\377#^\236\377/[\235\377\220#^\236\377\202/[\235" "\377\3!]\235\377#^\236\377!]\235\377\206#^\236\377\3/[\235\377#^\236" "\377!]\235\377\204#^\236\377\1/[\235\377\203#^\236\377\1/[\235\377\205" "#^\236\377\1!]\235\377\202/[\235\377\1#^\236\377\202/[\235\377\2#^\236" "\377/[\235\377\203#^\236\377\5/[\235\377#^\236\377/[\235\377#^\236\377" "/[\235\377\211#^\236\377\1/[\235\377\205#^\236\377\13\40\\\234\377)a" "\242\377\200\204\207\377\255\254\243\377\314\313\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240" "\377\206!]\235\377\203/[\235\377\202!]\235\377\1/[\235\377\204!]\235" "\377\1/[\235\377\204!]\235\377\205/[\235\377\1!]\235\377\202/[\235\377" "\206!]\235\377\1/[\235\377\211!]\235\377\1/[\235\377\202!]\235\377\1" "/[\235\377\205!]\235\377\1/[\235\377\202!]\235\377\203/[\235\377\2!]" "\235\377/[\235\377\203!]\235\377\5/[\235\377!]\235\377/[\235\377!]\235" "\377/[\235\377\206!]\235\377\203/[\235\377\6!]\235\377/[\235\377!]\235" "\377/[\235\377!]\235\377/[\235\377\202!]\235\377\3#^\236\377!]\235\377" "$_\237\377\202.e\247\377\22\35Y\240\377\267\306\332\377\365\364\353\377" "\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\365" "\367\363\377\242\266\316\377\30W\235\377/[\235\377~\232\275\377\360\362" "\357\377\365\364\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\355\357\353\377\203\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\203\355\357\353\377\206\353\356\352\377\3\355\357\353\377" "\353\356\352\377\355\357\353\377\202\353\356\352\377\4\355\357\353\377" "\353\356\352\377\355\357\353\377\353\356\352\377\203\355\357\353\377" "\15\353\356\352\377\351\353\347\377\321\331\342\377\205\241\304\3777" "n\251\377/[\235\3779e\242\377.e\247\377+c\244\377#^\236\377!]\235\377" "/[\235\377!]\235\377\203/[\235\377\1!]\235\377\202/[\235\377\206!]\235" "\377\1/[\235\377\211!]\235\377\1/[\235\377\202!]\235\377\1/[\235\377" "\205!]\235\377\1/[\235\377\202!]\235\377\203/[\235\377\2!]\235\377/[" "\235\377\203!]\235\377\5/[\235\377!]\235\377/[\235\377!]\235\377/[\235" "\377\206!]\235\377\203/[\235\377\10!]\235\377/[\235\377!]\235\377/[\235" "\377!]\235\377/[\235\377!]\235\377/[\235\377\207!]\235\377\202/[\235" "\377\210!]\235\377\203/[\235\377\206!]\235\377\203/[\235\377\15!]\235" "\377\40\\\234\377)a\242\377\200\204\207\377\255\254\243\377\314\313\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377" "u}\205\377\35Y\240\377!]\235\377\202/]\231\377\203#^\236\377\1/]\231" "\377\203#^\236\377\5/]\231\377#^\236\377/]\231\377#^\236\377/]\231\377" "\204#^\236\377\202/]\231\377\211#^\236\377\2/]\231\377#^\236\377\202" "/]\231\377\202#^\236\377\2/]\231\377#^\236\377\202/]\231\377\1#^\236" "\377\202/]\231\377\203#^\236\377\1/]\231\377\204#^\236\377\202/]\231" "\377\203#^\236\377\1/]\231\377\205#^\236\377\3/]\231\377#^\236\377/]" "\231\377\203#^\236\377\1/]\231\377\202#^\236\377\202/]\231\377\202#^" "\236\377\1/]\231\377\207#^\236\377\2/]\231\377#^\236\377\202/]\231\377" "\2!]\235\377$_\237\377\202.e\247\377\4\35Y\240\377c\212\267\377\351\353" "\347\377\356\360\355\377\202\355\357\353\377\7\353\356\352\377\362\364" "\361\377\255\274\320\377\35Y\240\377Fs\252\377\274\310\325\377\372\371" "\357\377\202\355\357\353\377\1\353\356\352\377\215\355\357\353\377\1" "\353\356\352\377\204\355\357\353\377\3\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\203\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\17\353\356\352\377\355\357" "\353\377\353\356\352\377\356\360\355\377\373\372\361\377\343\351\353" "\377\205\241\304\3770\\\236\377)a\242\377.e\247\377+c\244\377#^\236\377" "!]\235\377#^\236\377/]\231\377\206#^\236\377\2/]\231\377#^\236\377\202" "/]\231\377\202#^\236\377\2/]\231\377#^\236\377\202/]\231\377\1#^\236" "\377\202/]\231\377\203#^\236\377\1/]\231\377\204#^\236\377\202/]\231" "\377\203#^\236\377\1/]\231\377\205#^\236\377\3/]\231\377#^\236\377/]" "\231\377\203#^\236\377\1/]\231\377\202#^\236\377\202/]\231\377\202#^" "\236\377\1/]\231\377\207#^\236\377\2/]\231\377#^\236\377\203/]\231\377" "\211#^\236\377\1/]\231\377\202#^\236\377\1/]\231\377\206#^\236\377\1" "/]\231\377\210#^\236\377\14/]\231\377\40\\\234\377)a\242\377\200\204" "\207\377\255\254\243\377\307\316\303\377\330\327\316\377\323\332\317" "\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377\325-Z\234" "\377\22/[\235\377-Z\234\377$_\237\377.e\247\3779e\242\377\35Y\240\377" "o\217\267\377\367\366\355\377\356\360\355\377\353\356\352\377\355\357" "\353\377\353\356\352\377\355\357\353\377\340\345\350\377&`\240\377\35" "Y\240\377\333\341\343\377\372\371\357\377\202\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\210\355\357\353\377\1\353\356\352\377" "\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\202\355\357\353\377\11\353\356\352\377\360\362\357\377" "\372\371\357\377\306\322\340\377@k\250\377)a\242\377.e\247\377+c\244" "\377/[\235\377\337-Z\234\377\14,Y\233\3771]\237\377z\202\211\377\254" "\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306" "\275\377\245\244\233\377u}\205\377\35Y\240\377\40\\\234\377\323!]\235" "\377\3-Z\234\377\40\\\234\377)a\242\377\202.e\247\377\3\35Y\240\377~" "\232\275\377\362\364\361\377\204\355\357\353\377\202\353\356\352\377" "\6\356\360\355\377\321\331\342\377^\205\262\377@k\250\377\343\351\353" "\377\360\362\357\377\205\353\356\352\377\1\355\357\353\377\205\353\356" "\352\377\1\355\357\353\377\205\353\356\352\377\1\355\357\353\377\207" "\353\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357\353" "\377\202\353\356\352\377\3\356\360\355\377\360\362\357\377\356\360\355" "\377\203\353\356\352\377\12\355\357\353\377\351\353\347\377\362\364\361" "\377\340\345\350\377[\177\262\377\35Y\240\3779e\242\377.e\247\377!]\235" "\377-Z\234\377\335!]\235\377\14,Y\233\3771]\237\377z\202\211\377\255" "\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306" "\275\377\245\244\233\377u}\205\377\35Y\240\377\40\\\234\377\202-Z\234" "\377\3!]\235\377-Z\234\377!]\235\377\205-Z\234\377\202!]\235\377\203" "-Z\234\377\1!]\235\377\203-Z\234\377\203!]\235\377\2-Z\234\377!]\235" "\377\202-Z\234\377\202!]\235\377\202-Z\234\377\1!]\235\377\203-Z\234" "\377\204!]\235\377\202-Z\234\377\2!]\235\377-Z\234\377\202!]\235\377" "\203-Z\234\377\204!]\235\377\202-Z\234\377\1!]\235\377\202-Z\234\377" "\203!]\235\377\2-Z\234\377!]\235\377\204-Z\234\377\2!]\235\377-Z\234" "\377\202!]\235\377\7-Z\234\377!]\235\377-Z\234\377!]\235\377-Z\234\377" "!]\235\377-Z\234\377\206!]\235\377\202\40\\\234\377\1)a\242\377\202." "e\247\377\5\35Y\240\377\222\251\307\377\365\367\363\377\356\360\355\377" "\353\356\352\377\205\355\357\353\377\7\353\356\352\377\360\362\357\377" "\373\372\361\377\247\272\323\377v\227\277\377\343\351\353\377\356\360" "\355\377\203\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\207\355\357\353\377\1\353\356\352\377\202\355\357\353" "\377\3\353\356\352\377\355\357\353\377\353\356\352\377\204\355\357\353" "\377\3\353\356\352\377\355\357\353\377\353\356\352\377\203\355\357\353" "\377\11\343\351\353\377\333\341\343\377\351\353\347\377\365\364\353\377" "\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\202\360\362\357\377\2[\177\262\3770\\\236\377\202.e\247" "\377\2!]\235\377\40\\\234\377\202-Z\234\377\202!]\235\377\202-Z\234\377" "\1!]\235\377\203-Z\234\377\204!]\235\377\202-Z\234\377\2!]\235\377-Z" "\234\377\202!]\235\377\203-Z\234\377\204!]\235\377\202-Z\234\377\1!]" "\235\377\202-Z\234\377\203!]\235\377\2-Z\234\377!]\235\377\204-Z\234" "\377\2!]\235\377-Z\234\377\202!]\235\377\7-Z\234\377!]\235\377-Z\234" "\377!]\235\377-Z\234\377!]\235\377-Z\234\377\205!]\235\377\202-Z\234" "\377\202!]\235\377\203-Z\234\377\202!]\235\377\3-Z\234\377!]\235\377" "-Z\234\377\202!]\235\377\2-Z\234\377!]\235\377\207-Z\234\377\202!]\235" "\377\202-Z\234\377\1!]\235\377\204-Z\234\377\202!]\235\377\15-Z\234\377" ",Y\233\3771]\237\377z\202\211\377\255\254\243\377\307\316\303\377\330" "\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377" "\35Y\240\377\40\\\234\377\202-Z\234\377\5!]\235\377-Z\234\377!]\235\377" "-Z\234\377\40\\\234\377\203-Z\234\377\202!]\235\377\203\40\\\234\377" "\2!]\235\377\40\\\234\377\202-Z\234\377\203!]\235\377\202\40\\\234\377" "\2-Z\234\377\40\\\234\377\202!]\235\377\3-Z\234\377\40\\\234\377!]\235" "\377\202-Z\234\377\2\40\\\234\377-Z\234\377\203!]\235\377\202-Z\234\377" "\2!]\235\377-Z\234\377\202!]\235\377\203-Z\234\377\204!]\235\377\202" "-Z\234\377\1!]\235\377\203-Z\234\377\202!]\235\377\4-Z\234\377!]\235" "\377-Z\234\377\40\\\234\377\202-Z\234\377\2!]\235\377-Z\234\377\202!" "]\235\377\7-Z\234\377!]\235\377-Z\234\377!]\235\377-Z\234\377!]\235\377" "-Z\234\377\206!]\235\377\10\40\\\234\377)a\242\377.e\247\377+c\244\377" "\35Y\240\377\226\255\313\377\367\366\355\377\351\353\347\377\211\355" "\357\353\377\6\351\353\347\377\365\364\353\377\340\345\350\377\321\331" "\342\377\356\360\355\377\353\356\352\377\202\355\357\353\377\1\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\212\355\357\353\377\5" "\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\202\355\357\353\377\7\353\356\352\377\355\357\353\377\353" "\356\352\377\355\357\353\377\353\356\352\377\365\367\363\377\226\255" "\313\377\2029e\242\377\2\242\266\316\377\365\364\353\377\202\353\356" "\352\377\202\355\357\353\377\12\353\356\352\377\356\360\355\377\355\357" "\353\377V\204\265\377\40[\241\3779e\242\377!]\235\377\40\\\234\377-Z" "\234\377\40\\\234\377\202!]\235\377\3-Z\234\377\40\\\234\377!]\235\377" "\202-Z\234\377\2\40\\\234\377-Z\234\377\203!]\235\377\202-Z\234\377\2" "!]\235\377-Z\234\377\202!]\235\377\203-Z\234\377\204!]\235\377\202-Z" "\234\377\1!]\235\377\203-Z\234\377\202!]\235\377\4-Z\234\377!]\235\377" "-Z\234\377\40\\\234\377\202-Z\234\377\2!]\235\377-Z\234\377\202!]\235" "\377\7-Z\234\377!]\235\377-Z\234\377!]\235\377-Z\234\377!]\235\377-Z" "\234\377\205!]\235\377\202-Z\234\377\202!]\235\377\202\40\\\234\377\1" "-Z\234\377\202!]\235\377\10\40\\\234\377!]\235\377\40\\\234\377!]\235" "\377-Z\234\377\40\\\234\377!]\235\377-Z\234\377\204\40\\\234\377\202" "-Z\234\377\202!]\235\377\202-Z\234\377\1!]\235\377\203-Z\234\377\1\40" "\\\234\377\202!]\235\377\15-Z\234\377,Y\233\3771]\237\377z\202\211\377" "\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\245\244\233\377u}\205\377\35Y\240\377\40\\\234\377\205." "\\\230\377\1\40\\\234\377\207.\\\230\377\1\40\\\234\377\255.\\\230\377" "\3\40\\\234\377.\\\230\377\40\\\234\377\221.\\\230\377\4\40\\\234\377" ".\\\230\377\40\\\234\377)a\242\377\202.e\247\377\3\35Y\240\377\247\272" "\323\377\367\366\355\377\202\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\204\355\357\353\377\203\353\356\352\377" "\3\355\357\353\377\356\360\355\377\353\356\352\377\203\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\5\353\356\352\377\355\357\353\377\353\356\352\377\355" "\357\353\377\353\356\352\377\202\355\357\353\377\17\353\356\352\377\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\360\362" "\357\377\247\272\323\377-Z\234\377/]\231\3770\\\236\377\353\356\352\377" "\351\353\347\377\370\363\361\377\360\362\357\377\356\360\355\377\202" "\353\356\352\377\5\356\360\355\377\360\362\357\377^\205\262\377+X\232" "\377\40\\\234\377\244.\\\230\377\3\40\\\234\377.\\\230\377\40\\\234\377" "\227.\\\230\377\1\40\\\234\377\235.\\\230\377\21\40\\\234\377,Y\233\377" "0\\\236\377z\202\211\377\255\254\243\377\306\314\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240" "\377\40\\\234\377-Z\234\377.\\\230\377!]\235\377\40\\\234\377\204!]\235" "\377\1.\\\230\377\204!]\235\377\1\40\\\234\377\203!]\235\377\1\40\\\234" "\377\217!]\235\377\1\40\\\234\377\202!]\235\377\202.\\\230\377\210!]" "\235\377\1\40\\\234\377\204!]\235\377\202\40\\\234\377\206!]\235\377" "\7\40\\\234\377!]\235\377-Z\234\377.\\\230\377\40\\\234\377!]\235\377" ".\\\230\377\205!]\235\377\3.\\\230\377!]\235\377.\\\230\377\206!]\235" "\377\2\40\\\234\377#^\236\377\202.e\247\377\3)a\242\377\262\302\325\377" "\377\371\361\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377" "\207\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\207\355\357\353\377\1\353\356\352\377\202\355\357\353" "\377\3\353\356\352\377\355\357\353\377\353\356\352\377\204\355\357\353" "\377\3\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357\353" "\377\20\356\360\355\377\313\324\334\377\35Y\240\3771_\233\377/[\235\377" "\333\341\343\377\372\371\357\377\262\302\325\3777n\251\377\313\324\334" "\377\370\363\361\377\355\357\353\377\353\356\352\377\375\365\355\377" "\313\324\334\377(W\230\377\213!]\235\377\1\40\\\234\377\202!]\235\377" "\202.\\\230\377\210!]\235\377\1\40\\\234\377\204!]\235\377\202\40\\\234" "\377\206!]\235\377\7\40\\\234\377!]\235\377-Z\234\377.\\\230\377\40\\" "\234\377!]\235\377.\\\230\377\205!]\235\377\3.\\\230\377!]\235\377.\\" "\230\377\215!]\235\377\1.\\\230\377\202!]\235\377\3\40\\\234\377!]\235" "\377\40\\\234\377\202!]\235\377\1\40\\\234\377\205!]\235\377\1.\\\230" "\377\204!]\235\377\7-Z\234\377\40\\\234\377!]\235\377.\\\230\377-Z\234" "\377!]\235\377.\\\230\377\202!]\235\377\16\40\\\234\377,Y\233\3770\\" "\236\377\200\204\207\377\255\254\243\377\306\314\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240" "\377\40\\\234\377-Z\234\377\202!]\235\377\3-Z\234\377!]\235\377-Z\234" "\377\207!]\235\377\1\40\\\234\377\203!]\235\377\1-Z\234\377\217!]\235" "\377\1\40\\\234\377\214!]\235\377\1-Z\234\377\204!]\235\377\202-Z\234" "\377\206!]\235\377\5-Z\234\377!]\235\377-Z\234\377!]\235\377-Z\234\377" "\220!]\235\377\2\40\\\234\3774a\235\377\202)a\242\377\3\274\310\325\377" "\367\366\355\377\353\356\352\377\245\355\357\353\377\3\353\356\352\377" "\355\357\353\377\353\356\352\377\206\355\357\353\377\22\353\356\352\377" "\355\357\353\377\340\345\350\377\35Y\240\3774a\235\377-Z\234\377\313" "\324\334\377o\217\267\377)a\242\377\32U\233\377[\177\262\377\372\371" "\357\377\351\353\347\377\353\356\352\377\365\367\363\377b\200\256\377" "!R\223\377\40\\\234\377\212!]\235\377\1\40\\\234\377\214!]\235\377\1" "-Z\234\377\204!]\235\377\202-Z\234\377\206!]\235\377\5-Z\234\377!]\235" "\377-Z\234\377!]\235\377-Z\234\377\225!]\235\377\1\40\\\234\377\204!" "]\235\377\3\40\\\234\377!]\235\377\40\\\234\377\202!]\235\377\1\40\\" "\234\377\212!]\235\377\202-Z\234\377\202!]\235\377\1-Z\234\377\204!]" "\235\377\14-Z\234\377,Y\233\3770\\\236\377\200\204\207\377\255\254\243" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377u}\205\377\35Y\240\377\203\40\\\234\377\203!]\235\377" "\1\40\\\234\377\202!]\235\377\202\40\\\234\377\203!]\235\377\1\40\\\234" "\377\204!]\235\377\2\40\\\234\377.\\\230\377\211!]\235\377\2\40\\\234" "\377!]\235\377\202\40\\\234\377\204!]\235\377\1.\\\230\377\203!]\235" "\377\1\40\\\234\377\203!]\235\377\1\40\\\234\377\205!]\235\377\1\40\\" "\234\377\202!]\235\377\202\40\\\234\377\203!]\235\377\5-Z\234\377!]\235" "\377\40\\\234\377!]\235\377\40\\\234\377\203!]\235\377\1.\\\230\377\202" "!]\235\377\202\40\\\234\377\202!]\235\377\1.\\\230\377\205!]\235\377" "\1.\\\230\377\202.e\247\377\2\306\322\340\377\373\372\361\377\203\353" "\356\352\377\202\355\357\353\377\1\353\356\352\377\204\355\357\353\377" "\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\202\355\357\353\377\205" "\353\356\352\377\202\355\357\353\377\4\353\356\352\377\355\357\353\377" "\353\356\352\377\355\357\353\377\202\353\356\352\377\3\351\353\347\377" "=h\245\377/[\235\377\202\40\\\234\377\13""0\\\236\377\325\336\346\377" "\214\244\302\377#R\231\377\242\266\316\377\367\366\355\377\360\362\357" "\377\301\314\332\377\30L\223\377.\\\230\377\40\\\234\377\206!]\235\377" "\2\40\\\234\377!]\235\377\202\40\\\234\377\204!]\235\377\1.\\\230\377" "\203!]\235\377\1\40\\\234\377\203!]\235\377\1\40\\\234\377\205!]\235" "\377\1\40\\\234\377\202!]\235\377\202\40\\\234\377\203!]\235\377\5-Z" "\234\377!]\235\377\40\\\234\377!]\235\377\40\\\234\377\203!]\235\377" "\1.\\\230\377\202!]\235\377\202\40\\\234\377\202!]\235\377\1.\\\230\377" "\207!]\235\377\3\40\\\234\377!]\235\377.\\\230\377\202\40\\\234\377\210" "!]\235\377\2\40\\\234\377.\\\230\377\202!]\235\377\1\40\\\234\377\206" "!]\235\377\3\40\\\234\377!]\235\377.\\\230\377\206!]\235\377\15\40\\" "\234\377,Y\233\3770\\\236\377\200\204\207\377\254\253\242\377\307\316" "\303\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233" "\377u}\205\377\35Y\240\377\40\\\234\377\202.\\\230\377\203!]\235\377" "\1.\\\230\377\202!]\235\377\202.\\\230\377\4!]\235\377.\\\230\377!]\235" "\377.\\\230\377\204!]\235\377\202.\\\230\377\211!]\235\377\204.\\\230" "\377\202!]\235\377\3.\\\230\377!]\235\377.\\\230\377\202!]\235\377\202" ".\\\230\377\203!]\235\377\1.\\\230\377\202!]\235\377\2.\\\230\377!]\235" "\377\202.\\\230\377\202!]\235\377\202.\\\230\377\205!]\235\377\3.\\\230" "\377!]\235\377.\\\230\377\203!]\235\377\1.\\\230\377\202!]\235\377\202" ".\\\230\377\202!]\235\377\1.\\\230\377\204!]\235\377\6\40\\\234\377#" "^\236\3770\\\236\377~\232\275\377\373\372\361\377\351\353\347\377\202" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1\353\356\352" "\377\204\355\357\353\377\202\353\356\352\377\2\355\357\353\377\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\202" "\355\357\353\377\205\353\356\352\377\202\355\357\353\377\4\353\356\352" "\377\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352" "\377\17\355\357\353\377Mx\260\377-Z\234\377\40\\\234\3770^\232\377)a" "\242\377\325\336\346\377\373\372\361\377\313\324\334\377[\177\262\377" "\333\341\343\377\376\375\364\377c\212\267\377(W\230\377\40\\\234\377" "\207!]\235\377\204.\\\230\377\202!]\235\377\3.\\\230\377!]\235\377.\\" "\230\377\202!]\235\377\202.\\\230\377\203!]\235\377\1.\\\230\377\202" "!]\235\377\2.\\\230\377!]\235\377\202.\\\230\377\202!]\235\377\202.\\" "\230\377\205!]\235\377\3.\\\230\377!]\235\377.\\\230\377\203!]\235\377" "\1.\\\230\377\202!]\235\377\202.\\\230\377\202!]\235\377\1.\\\230\377" "\207!]\235\377\2.\\\230\377!]\235\377\203.\\\230\377\204!]\235\377\1" ".\\\230\377\203!]\235\377\202.\\\230\377\202!]\235\377\1.\\\230\377\206" "!]\235\377\3.\\\230\377!]\235\377.\\\230\377\206!]\235\377\17.\\\230" "\377,Y\233\3770\\\236\377z\202\211\377\254\253\242\377\307\316\303\377" "\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205" "\377\35Y\240\377\40\\\234\377-Z\234\377\40\\\234\377\206-Z\234\377\1" "\40\\\234\377\204-Z\234\377\1\40\\\234\377\226-Z\234\377\202\40\\\234" "\377\215-Z\234\377\1\40\\\234\377\212-Z\234\377\1\40\\\234\377\202-Z" "\234\377\1\40\\\234\377\204-Z\234\377\202\40\\\234\377\2-Z\234\377\40" "\\\234\377\205-Z\234\377\5\40\\\234\377$_\237\377\35Y\240\377\267\306" "\332\377\360\362\357\377\202\353\356\352\377\246\355\357\353\377\3\353" "\356\352\377\355\357\353\377\353\356\352\377\206\355\357\353\377\202" "\353\356\352\377\7\360\362\357\377^\205\262\377,Y\233\377\36[\233\377" "#^\236\377)a\242\377\333\341\343\377\202\360\362\357\377\5\355\357\353" "\377\333\341\343\377\343\351\353\377=h\245\377+X\232\377\217-Z\234\377" "\202\40\\\234\377\215-Z\234\377\1\40\\\234\377\212-Z\234\377\1\40\\\234" "\377\202-Z\234\377\1\40\\\234\377\204-Z\234\377\202\40\\\234\377\2-Z" "\234\377\40\\\234\377\213-Z\234\377\3\40\\\234\377-Z\234\377\40\\\234" "\377\202-Z\234\377\3\40\\\234\377-Z\234\377\40\\\234\377\210-Z\234\377" "\1\40\\\234\377\207-Z\234\377\1\40\\\234\377\202-Z\234\377\1\40\\\234" "\377\203-Z\234\377\13,Y\233\3770\\\236\377z\202\211\377\254\253\242\377" "\307\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377\245" "\244\233\377u}\205\377\35Y\240\377\321,Y\233\377\4$_\237\377=h\245\377" "\325\336\346\377\360\362\357\377\203\353\356\352\377\204\355\357\353" "\377\4\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377" "\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377\206\355\357" "\353\377\1\353\356\352\377\207\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\202\353\356\352\377\16\367\366\355\377v" "\227\277\377\35Y\240\377+X\232\377/[\235\377)a\242\377\333\341\343\377" "\360\362\357\377\353\356\352\377\356\360\355\377\372\371\357\377\301" "\314\332\377,Y\233\377+X\232\377\337,Y\233\377\14+X\232\3770\\\236\377" "z\202\211\377\254\253\242\377\307\316\303\377\330\327\316\377\323\332" "\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377,Y\233" "\377\204-Z\234\377\203,Y\233\377\204-Z\234\377\6,Y\233\377\40\\\234\377" "-Z\234\377\40\\\234\377-Z\234\377,Y\233\377\203-Z\234\377\3\40\\\234" "\377-Z\234\377\40\\\234\377\202-Z\234\377\1\40\\\234\377\203-Z\234\377" "\202,Y\233\377\202-Z\234\377\1\40\\\234\377\204-Z\234\377\1,Y\233\377" "\203-Z\234\377\202,Y\233\377\211-Z\234\377\3\40\\\234\377-Z\234\377," "Y\233\377\202-Z\234\377\5\40\\\234\377,Y\233\377\40\\\234\377,Y\233\377" "\40\\\234\377\207-Z\234\377\1\40\\\234\377\204-Z\234\377\7,Y\233\377" "-Z\234\377\40\\\234\377,Y\233\377\40\\\234\3770\\\236\377[\177\262\377" "\202\356\360\355\377\4\355\357\353\377\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\207\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\206\355\357\353\377\202\353\356\352\377\202\355\357\353\377\2\353\356" "\352\377\355\357\353\377\203\353\356\352\377\202\355\357\353\377\4\353" "\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\202\353" "\356\352\377\20\375\365\355\377\214\244\302\377\32U\233\377+X\232\377" "#^\236\377+c\244\377\333\341\343\377\360\362\357\377\355\357\353\377" "\353\356\352\377\375\365\355\377\235\261\311\377\13R\227\377,Y\233\377" "-Z\234\377\40\\\234\377\202-Z\234\377\1\40\\\234\377\203-Z\234\377\202" ",Y\233\377\202-Z\234\377\1\40\\\234\377\204-Z\234\377\1,Y\233\377\203" "-Z\234\377\202,Y\233\377\211-Z\234\377\3\40\\\234\377-Z\234\377,Y\233" "\377\202-Z\234\377\5\40\\\234\377,Y\233\377\40\\\234\377,Y\233\377\40" "\\\234\377\207-Z\234\377\1\40\\\234\377\204-Z\234\377\12,Y\233\377-Z" "\234\377\40\\\234\377-Z\234\377,Y\233\377-Z\234\377,Y\233\377-Z\234\377" ",Y\233\377\40\\\234\377\202,Y\233\377\203-Z\234\377\3\40\\\234\377-Z" "\234\377,Y\233\377\202-Z\234\377\1,Y\233\377\202-Z\234\377\2\40\\\234" "\377,Y\233\377\202\40\\\234\377\206-Z\234\377\2\40\\\234\377,Y\233\377" "\202-Z\234\377\1\40\\\234\377\203-Z\234\377\14+X\232\377%^\245\377z\202" "\211\377\254\253\242\377\307\316\303\377\330\327\316\377\323\332\317" "\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377,Y\233\377" "\205\40\\\234\377\1,Y\233\377\203\40\\\234\377\5,Y\233\377\40\\\234\377" ",Y\233\377\40\\\234\377,Y\233\377\205\40\\\234\377\1,Y\233\377\211\40" "\\\234\377\204,Y\233\377\202\40\\\234\377\1,Y\233\377\204\40\\\234\377" "\1,Y\233\377\212\40\\\234\377\1,Y\233\377\202\40\\\234\377\202,Y\233" "\377\203\40\\\234\377\5,Y\233\377\40\\\234\377,Y\233\377\40\\\234\377" ",Y\233\377\203\40\\\234\377\1,Y\233\377\203\40\\\234\377\1,Y\233\377" "\206\40\\\234\377\5,Y\233\377/[\235\3770\\\236\377~\232\275\377\375\365" "\355\377\204\353\356\352\377\204\355\357\353\377\1\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\202\355\357\353\377\1\353\356\352" "\377\206\355\357\353\377\1\353\356\352\377\210\355\357\353\377\1\353" "\356\352\377\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\202\355\357\353\377\2\353\356\352\377\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\20\353\356\352\377\355\357" "\353\377\372\371\357\377\242\266\316\377,Y\233\377\36[\233\377!]\235" "\377)a\242\377\333\341\343\377\360\362\357\377\355\357\353\377\353\356" "\352\377\362\364\361\377o\217\267\377'V\227\377,Y\233\377\210\40\\\234" "\377\204,Y\233\377\202\40\\\234\377\1,Y\233\377\204\40\\\234\377\1,Y" "\233\377\212\40\\\234\377\1,Y\233\377\202\40\\\234\377\202,Y\233\377" "\203\40\\\234\377\5,Y\233\377\40\\\234\377,Y\233\377\40\\\234\377,Y\233" "\377\203\40\\\234\377\1,Y\233\377\203\40\\\234\377\1,Y\233\377\212\40" "\\\234\377\2,Y\233\377\40\\\234\377\203,Y\233\377\210\40\\\234\377\1" ",Y\233\377\203\40\\\234\377\1,Y\233\377\210\40\\\234\377\1,Y\233\377" "\206\40\\\234\377\15,Y\233\377+X\232\3770\\\236\377z\202\211\377\254" "\253\242\377\307\316\303\377\330\327\316\377\323\332\317\377\306\306" "\275\377\245\244\233\377u}\205\377\35Y\240\377\36[\233\377\204,[\227" "\377\204\36[\233\377\4,[\227\377\36[\233\377,[\227\377\36[\233\377\202" ",[\227\377\2\36[\233\377,[\227\377\202\36[\233\377\5,[\227\377\36[\233" "\377,[\227\377\36[\233\377,[\227\377\203\36[\233\377\202,[\227\377\205" "\36[\233\377\202,[\227\377\202\36[\233\377\1,[\227\377\203\36[\233\377" "\1,[\227\377\202\36[\233\377\202,[\227\377\1\36[\233\377\204,[\227\377" "\202\36[\233\377\1,[\227\377\203\36[\233\377\1,[\227\377\202\36[\233" "\377\11,[\227\377\36[\233\377,[\227\377\36[\233\377,[\227\377\36[\233" "\377,[\227\377\36[\233\377,[\227\377\205\36[\233\377\2,[\227\377\36[" "\233\377\202,[\227\377\6\36[\233\3771_\233\3770\\\236\377\262\302\325" "\377\360\362\357\377\355\357\353\377\202\353\356\352\377\1\355\357\353" "\377\204\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\204\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\2\353\356\352\377\355\357\353\377\204\353\356\352\377\2\355\357" "\353\377\353\356\352\377\202\355\357\353\377\4\353\356\352\377\355\357" "\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\14\367\366" "\355\377\274\310\325\3770\\\236\377)a\242\3774a\235\377)a\242\377\333" "\341\343\377\360\362\357\377\355\357\353\377\351\353\347\377\362\364" "\361\377Fs\252\377\203\36[\233\377\1,[\227\377\203\36[\233\377\202,[" "\227\377\205\36[\233\377\202,[\227\377\202\36[\233\377\1,[\227\377\203" "\36[\233\377\1,[\227\377\202\36[\233\377\202,[\227\377\1\36[\233\377" "\204,[\227\377\202\36[\233\377\1,[\227\377\203\36[\233\377\1,[\227\377" "\202\36[\233\377\11,[\227\377\36[\233\377,[\227\377\36[\233\377,[\227" "\377\36[\233\377,[\227\377\36[\233\377,[\227\377\205\36[\233\377\2,[" "\227\377\36[\233\377\203,[\227\377\2\36[\233\377,[\227\377\210\36[\233" "\377\4,[\227\377\36[\233\377,[\227\377\36[\233\377\202,[\227\377\1\36" "[\233\377\202,[\227\377\205\36[\233\377\205,[\227\377\205\36[\233\377" "\202,[\227\377\202\36[\233\377\13/[\235\377z\202\211\377\254\253\242" "\377\307\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377u}\205\377\35Y\240\377\36[\233\377\202,[\227\377\203" "\40\\\234\377\1\36[\233\377\203\40\\\234\377\5,Y\233\377\40\\\234\377" "\36[\233\377\40\\\234\377\36[\233\377\204\40\\\234\377\2,[\227\377\36" "[\233\377\211\40\\\234\377\2\36[\233\377,Y\233\377\202\36[\233\377\202" "\40\\\234\377\1\36[\233\377\204\40\\\234\377\2\36[\233\377,[\227\377" "\203\40\\\234\377\1,[\227\377\205\40\\\234\377\1\36[\233\377\202\40\\" "\234\377\202\36[\233\377\203\40\\\234\377\5,Y\233\377\40\\\234\377\36" "[\233\377\40\\\234\377\36[\233\377\203\40\\\234\377\1,Y\233\377\202\40" "\\\234\377\202\36[\233\377\202\40\\\234\377\1,[\227\377\203\40\\\234" "\377\6\36[\233\3774a\235\3770\\\236\377\343\351\353\377\353\356\352\377" "\355\357\353\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377" "\202\355\357\353\377\1\353\356\352\377\204\355\357\353\377\202\353\356" "\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\203\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\202\355\357\353\377\17\353\356" "\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352" "\377\355\357\353\377\362\364\361\377\313\324\334\377)a\242\377.e\247" "\3779e\242\377+c\244\377\325\336\346\377\360\362\357\377\355\357\353" "\377\202\351\353\347\377\3+X\232\377/]\231\377\36[\233\377\210\40\\\234" "\377\2\36[\233\377,Y\233\377\202\36[\233\377\202\40\\\234\377\1\36[\233" "\377\204\40\\\234\377\2\36[\233\377,[\227\377\203\40\\\234\377\1,[\227" "\377\205\40\\\234\377\1\36[\233\377\202\40\\\234\377\202\36[\233\377" "\203\40\\\234\377\5,Y\233\377\40\\\234\377\36[\233\377\40\\\234\377\36" "[\233\377\203\40\\\234\377\1,Y\233\377\202\40\\\234\377\202\36[\233\377" "\202\40\\\234\377\1,[\227\377\207\40\\\234\377\5\36[\233\377\40\\\234" "\377\36[\233\377,Y\233\377\36[\233\377\210\40\\\234\377\1\36[\233\377" "\203\40\\\234\377\1\36[\233\377\210\40\\\234\377\1,Y\233\377\206\40\\" "\234\377\202\36[\233\377\12/[\235\377}\201\204\377\254\253\242\377\307" "\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377u}\205\377\35Y\240\377\203\36[\233\377\202,[\227\377\4,Y\233" "\377\36[\233\377\40\\\234\377,Y\233\377\202\36[\233\377\2\40\\\234\377" "\36[\233\377\202,[\227\377\3,Y\233\377\40\\\234\377,Y\233\377\203\36" "[\233\377\204\40\\\234\377\202\36[\233\377\202\40\\\234\377\205\36[\233" "\377\2,[\227\377\40\\\234\377\211\36[\233\377\1\40\\\234\377\202\36[" "\233\377\3\40\\\234\377\36[\233\377\40\\\234\377\202\36[\233\377\2,Y" "\233\377\40\\\234\377\202\36[\233\377\203\40\\\234\377\12\36[\233\377" "\40\\\234\377\36[\233\377,[\227\377\36[\233\377\40\\\234\377,Y\233\377" "\40\\\234\377\36[\233\377\40\\\234\377\206\36[\233\377\202\40\\\234\377" "\202\36[\233\377\5)a\242\377Uy\253\377\365\364\353\377\351\353\347\377" "\355\357\353\377\211\353\356\352\377\202\355\357\353\377\210\353\356" "\352\377\203\355\357\353\377\207\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\206\353\356\352\377\3\355\357" "\353\377\353\356\352\377\355\357\353\377\204\353\356\352\377\3\355\357" "\353\377\353\356\352\377\355\357\353\377\202\356\360\355\377\13@k\250" "\377/[\235\377)a\242\3770\\\236\377\325\336\346\377\360\362\357\377\355" "\357\353\377\360\362\357\377\301\314\332\377+X\232\377.\\\230\377\204" "\40\\\234\377\202\36[\233\377\202\40\\\234\377\205\36[\233\377\2,[\227" "\377\40\\\234\377\211\36[\233\377\1\40\\\234\377\202\36[\233\377\3\40" "\\\234\377\36[\233\377\40\\\234\377\202\36[\233\377\2,Y\233\377\40\\" "\234\377\202\36[\233\377\203\40\\\234\377\12\36[\233\377\40\\\234\377" "\36[\233\377,[\227\377\36[\233\377\40\\\234\377,Y\233\377\40\\\234\377" "\36[\233\377\40\\\234\377\206\36[\233\377\205\40\\\234\377\4,[\227\377" "\40\\\234\377\36[\233\377\40\\\234\377\205\36[\233\377\1\40\\\234\377" "\203\36[\233\377\202\40\\\234\377\202\36[\233\377\6,[\227\377,Y\233\377" "\36[\233\377,Y\233\377\36[\233\377,Y\233\377\203\40\\\234\377\2\36[\233" "\377,[\227\377\205\36[\233\377\202\40\\\234\377\202\36[\233\377\12/[" "\235\377z\202\211\377\254\253\242\377\307\316\303\377\330\327\316\377" "\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377" "\203\36[\233\377\4,[\227\377\36[\233\377,Y\233\377\36[\233\377\204,Y" "\233\377\1\40\\\234\377\203\36[\233\377\11,Y\233\377\40\\\234\377,Y\233" "\377\36[\233\377,[\227\377\36[\233\377\40\\\234\377,Y\233\377,[\227\377" "\203\36[\233\377\2\40\\\234\377,[\227\377\202\36[\233\377\1,Y\233\377" "\203\36[\233\377\1\40\\\234\377\202\36[\233\377\1,Y\233\377\206\36[\233" "\377\1\40\\\234\377\202\36[\233\377\1\40\\\234\377\203,Y\233\377\3\36" "[\233\377,Y\233\377,[\227\377\202\36[\233\377\5,Y\233\377\40\\\234\377" ",Y\233\377\36[\233\377\40\\\234\377\203\36[\233\377\1\40\\\234\377\203" ",Y\233\377\1\40\\\234\377\206\36[\233\377\11,Y\233\377\40\\\234\377\36" "[\233\377!]\235\377/[\235\377\205\241\304\377\365\364\353\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\1\355\357\353\377\204\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\204\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355" "\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\206\353\356\352\377\202\355\357\353\377" "\12\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\353" "\356\352\377\355\357\353\377\353\356\352\377\360\362\357\377\321\331" "\342\377v\227\277\377\202c\212\267\377\6\340\345\350\377\356\360\355" "\377\353\356\352\377\365\367\363\377\242\266\316\377'V\227\377\202\40" "\\\234\377\2,Y\233\377,[\227\377\203\36[\233\377\2\40\\\234\377,[\227" "\377\202\36[\233\377\1,Y\233\377\203\36[\233\377\1\40\\\234\377\202\36" "[\233\377\1,Y\233\377\206\36[\233\377\1\40\\\234\377\202\36[\233\377" "\1\40\\\234\377\203,Y\233\377\3\36[\233\377,Y\233\377,[\227\377\202\36" "[\233\377\5,Y\233\377\40\\\234\377,Y\233\377\36[\233\377\40\\\234\377" "\203\36[\233\377\1\40\\\234\377\203,Y\233\377\1\40\\\234\377\206\36[" "\233\377\1,Y\233\377\202\40\\\234\377\1,Y\233\377\202\36[\233\377\3," "Y\233\377\36[\233\377,Y\233\377\205\36[\233\377\4,Y\233\377\36[\233\377" ",Y\233\377\36[\233\377\202\40\\\234\377\10\36[\233\377,Y\233\377\36[" "\233\377,Y\233\377\36[\233\377,Y\233\377\36[\233\377,Y\233\377\203\40" "\\\234\377\3,Y\233\377\36[\233\377,Y\233\377\204\36[\233\377\2,[\227" "\377\40\\\234\377\202\36[\233\377\13/[\235\377z\202\211\377\254\253\242" "\377\307\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377u}\205\377\35Y\240\377\36[\233\377\204,[\227\377\2\40" "\\\234\377,[\227\377\205\40\\\234\377\203,[\227\377\203\40\\\234\377" "\203,[\227\377\204\40\\\234\377\202,[\227\377\202\40\\\234\377\202,[" "\227\377\1\40\\\234\377\203,[\227\377\1\40\\\234\377\202,[\227\377\1" "\40\\\234\377\206,[\227\377\1\40\\\234\377\202,[\227\377\204\40\\\234" "\377\1,[\227\377\202\40\\\234\377\202,[\227\377\203\40\\\234\377\2,[" "\227\377\40\\\234\377\203,[\227\377\205\40\\\234\377\206,[\227\377\202" "\40\\\234\377\5\36[\233\377$_\237\377\"\\\243\377\262\302\325\377\365" "\367\363\377\202\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\204\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1\355\357" "\353\377\204\353\356\352\377\202\355\357\353\377\202\353\356\352\377" "\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\2\353\356\352\377\355\357\353\377\204\353\356\352\377\2\355\357\353" "\377\353\356\352\377\204\355\357\353\377\3\353\356\352\377\355\357\353" "\377\353\356\352\377\202\355\357\353\377\6\353\356\352\377\360\362\357" "\377\365\367\363\377\360\362\357\377\362\364\361\377\355\357\353\377" "\202\353\356\352\377\3\373\372\361\377~\232\275\377%U\226\377\205\40" "\\\234\377\202,[\227\377\202\40\\\234\377\202,[\227\377\1\40\\\234\377" "\203,[\227\377\1\40\\\234\377\202,[\227\377\1\40\\\234\377\206,[\227" "\377\1\40\\\234\377\202,[\227\377\204\40\\\234\377\1,[\227\377\202\40" "\\\234\377\202,[\227\377\203\40\\\234\377\2,[\227\377\40\\\234\377\203" ",[\227\377\205\40\\\234\377\206,[\227\377\205\40\\\234\377\6,[\227\377" "\40\\\234\377,[\227\377\40\\\234\377,[\227\377\40\\\234\377\203,[\227" "\377\4\40\\\234\377,[\227\377\40\\\234\377,[\227\377\202\40\\\234\377" "\7,[\227\377\40\\\234\377,[\227\377\40\\\234\377,[\227\377\40\\\234\377" ",[\227\377\205\40\\\234\377\2,[\227\377\40\\\234\377\204,[\227\377\202" "\40\\\234\377\14,[\227\377\36[\233\377-Z\234\377z\202\211\377\254\253" "\242\377\307\316\303\377\330\327\316\377\323\332\317\377\306\306\275" "\377\245\244\233\377u}\205\377\35Y\240\377\203\36[\233\377\203,Y\233" "\377\1\36[\233\377\205,Y\233\377\3\36[\233\377,Y\233\377\36[\233\377" "\204,Y\233\377\202\36[\233\377\211,Y\233\377\2\36[\233\377,Y\233\377" "\202\36[\233\377\202,Y\233\377\1\36[\233\377\204,Y\233\377\202\36[\233" "\377\203,Y\233\377\1\36[\233\377\205,Y\233\377\1\36[\233\377\202,Y\233" "\377\202\36[\233\377\205,Y\233\377\3\36[\233\377,Y\233\377\36[\233\377" "\206,Y\233\377\202\36[\233\377\202,Y\233\377\12\36[\233\377,Y\233\377" "\36[\233\377+X\232\377&`\240\377@k\250\377\325\336\346\377\360\362\357" "\377\353\356\352\377\355\357\353\377\204\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\204\355\357" "\353\377\2\353\356\352\377\355\357\353\377\203\353\356\352\377\3\355" "\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\4\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\203\355" "\357\353\377\205\353\356\352\377\202\355\357\353\377\3\375\365\355\377" "c\212\267\377!R\223\377\212,Y\233\377\2\36[\233\377,Y\233\377\202\36" "[\233\377\202,Y\233\377\1\36[\233\377\204,Y\233\377\202\36[\233\377\203" ",Y\233\377\1\36[\233\377\205,Y\233\377\1\36[\233\377\202,Y\233\377\202" "\36[\233\377\205,Y\233\377\3\36[\233\377,Y\233\377\36[\233\377\206,Y" "\233\377\202\36[\233\377\202,Y\233\377\1\36[\233\377\207,Y\233\377\5" "\36[\233\377,Y\233\377\36[\233\377,Y\233\377\36[\233\377\210,Y\233\377" "\1\36[\233\377\203,Y\233\377\1\36[\233\377\217,Y\233\377\14\36[\233\377" "+X\232\377\40[\241\377z\202\211\377\254\253\242\377\307\316\303\377\330" "\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377" "\30W\235\377\317+X\232\377\3)a\242\377Mx\260\377\367\366\355\377\202" "\355\357\353\377\203\353\356\352\377\1\355\357\353\377\204\353\356\352" "\377\2\355\357\353\377\353\356\352\377\202\355\357\353\377\204\353\356" "\352\377\202\355\357\353\377\207\353\356\352\377\1\355\357\353\377\203" "\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377\205" "\353\356\352\377\1\355\357\353\377\207\353\356\352\377\5\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377" "\202\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\6\355\357\353\377\356\360\355\377\351\353" "\347\377Uy\253\377$T\225\377,Y\233\377\341+X\232\377\13\40[\241\377z" "\202\211\377\254\253\242\377\307\316\303\377\330\327\316\377\323\332" "\317\377\306\306\275\377\245\244\233\377u}\205\377\35Y\240\377+X\232" "\377\206\36[\233\377\1+X\232\377\205\36[\233\377\5+X\232\377\36[\233" "\377+X\232\377\36[\233\377+X\232\377\203\36[\233\377\2+X\232\377\36[" "\233\377\202+X\232\377\2\36[\233\377+X\232\377\203\36[\233\377\1+X\232" "\377\203\36[\233\377\1+X\232\377\223\36[\233\377\1+X\232\377\203\36[" "\233\377\202+X\232\377\4\36[\233\377+X\232\377\36[\233\377+X\232\377" "\207\36[\233\377\1+X\232\377\206\36[\233\377\5,Y\233\377)a\242\377~\232" "\275\377\372\371\357\377\353\356\352\377\203\355\357\353\377\1\353\356" "\352\377\207\355\357\353\377\1\353\356\352\377\224\355\357\353\377\1" "\353\356\352\377\204\355\357\353\377\1\353\356\352\377\204\355\357\353" "\377\3\353\356\352\377\355\357\353\377\353\356\352\377\206\355\357\353" "\377\1\353\356\352\377\207\355\357\353\377\11\353\356\352\377\355\357" "\353\377\356\360\355\377\333\341\343\377\77l\243\377'V\227\377,Y\233" "\377+X\232\377\36[\233\377\202+X\232\377\2\36[\233\377+X\232\377\203" "\36[\233\377\1+X\232\377\203\36[\233\377\1+X\232\377\223\36[\233\377" "\1+X\232\377\203\36[\233\377\202+X\232\377\4\36[\233\377+X\232\377\36" "[\233\377+X\232\377\207\36[\233\377\1+X\232\377\206\36[\233\377\1+X\232" "\377\206\36[\233\377\203+X\232\377\203\36[\233\377\2+X\232\377\36[\233" "\377\202+X\232\377\2\36[\233\377+X\232\377\202\36[\233\377\204+X\232" "\377\206\36[\233\377\1+X\232\377\203\36[\233\377\1+X\232\377\203\36[" "\233\377\17+X\232\377\35Y\240\377z\202\211\377\254\253\242\377\307\316" "\303\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233" "\377u}\205\377\30W\235\377\32Y\231\377,[\227\377+X\232\377,[\227\377" "\202\32Y\231\377\13,[\227\377\32Y\231\377+X\232\377\32Y\231\377+X\232" "\377,[\227\377\32Y\231\377+X\232\377\32Y\231\377+X\232\377,[\227\377" "\202+X\232\377\202,[\227\377\4+X\232\377,[\227\377+X\232\377,[\227\377" "\202+X\232\377\202,[\227\377\204+X\232\377\3,[\227\377\32Y\231\377,[" "\227\377\202\32Y\231\377\203+X\232\377\203,[\227\377\2+X\232\377,[\227" "\377\203\32Y\231\377\202,[\227\377\204+X\232\377\202\32Y\231\377\202" ",[\227\377\4+X\232\377\32Y\231\377+X\232\377,[\227\377\205+X\232\377" "\5,[\227\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377\203+X\232\377" "\10,[\227\377\32Y\231\377#^\236\377\40[\241\377\274\310\325\377\360\362" "\357\377\353\356\352\377\355\357\353\377\213\353\356\352\377\1\355\357" "\353\377\215\353\356\352\377\1\355\357\353\377\227\353\356\352\377\1" "\355\357\353\377\205\353\356\352\377\1\355\357\353\377\203\353\356\352" "\377\12\355\357\353\377\360\362\357\377\321\331\342\377)a\242\377(W\230" "\377\36[\233\377+X\232\377,[\227\377+X\232\377,[\227\377\202+X\232\377" "\202,[\227\377\204+X\232\377\3,[\227\377\32Y\231\377,[\227\377\202\32" "Y\231\377\203+X\232\377\203,[\227\377\2+X\232\377,[\227\377\203\32Y\231" "\377\202,[\227\377\204+X\232\377\202\32Y\231\377\202,[\227\377\4+X\232" "\377\32Y\231\377+X\232\377,[\227\377\205+X\232\377\5,[\227\377+X\232" "\377\32Y\231\377+X\232\377\32Y\231\377\203+X\232\377\1,[\227\377\204" "+X\232\377\202,[\227\377\203+X\232\377\202\32Y\231\377\203+X\232\377" "\1\32Y\231\377\202+X\232\377\202,[\227\377\1+X\232\377\202,[\227\377" "\206+X\232\377\3,[\227\377+X\232\377,[\227\377\203+X\232\377\25,[\227" "\377+X\232\377\32Y\231\377+X\232\377,[\227\377+X\232\377\32Y\231\377" "\35Y\240\377z\202\211\377\254\253\242\377\307\316\303\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\30W\235" "\377\32Y\231\377,[\227\377\32Y\231\377\36[\233\377\202\32Y\231\377\202" "\36[\233\377\202+X\232\377\2\32Y\231\377\36[\233\377\203\32Y\231\377" "\2+X\232\377\36[\233\377\202\32Y\231\377\202,[\227\377\204\36[\233\377" "\202\32Y\231\377\202\36[\233\377\202\32Y\231\377\202+X\232\377\3,[\227" "\377\32Y\231\377\36[\233\377\204\32Y\231\377\1+X\232\377\203,[\227\377" "\2\32Y\231\377\36[\233\377\202\32Y\231\377\4\36[\233\377,[\227\377\36" "[\233\377+X\232\377\202\32Y\231\377\1\36[\233\377\202\32Y\231\377\202" "\36[\233\377\4+X\232\377\32Y\231\377\36[\233\377,[\227\377\202\32Y\231" "\377\1\36[\233\377\202\32Y\231\377\202\36[\233\377\202+X\232\377\204" "\32Y\231\377\2+X\232\377\32Y\231\377\202)a\242\377\2\351\353\347\377" "\353\356\352\377\204\355\357\353\377\3\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\207\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\212\355\357\353\377\5\353\356\352\377\355\357\353\377\353\356\352\377" "\355\357\353\377\353\356\352\377\202\355\357\353\377\5\353\356\352\377" "\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\207" "\355\357\353\377\202\353\356\352\377\4\360\362\357\377\301\314\332\377" "\32U\233\377\32Y\231\377\205\36[\233\377\202\32Y\231\377\202\36[\233" "\377\202\32Y\231\377\202+X\232\377\3,[\227\377\32Y\231\377\36[\233\377" "\204\32Y\231\377\1+X\232\377\203,[\227\377\2\32Y\231\377\36[\233\377" "\202\32Y\231\377\4\36[\233\377,[\227\377\36[\233\377+X\232\377\202\32" "Y\231\377\1\36[\233\377\202\32Y\231\377\202\36[\233\377\4+X\232\377\32" "Y\231\377\36[\233\377,[\227\377\202\32Y\231\377\1\36[\233\377\202\32" "Y\231\377\202\36[\233\377\202+X\232\377\204\32Y\231\377\203\36[\233\377" "\7\32Y\231\377\36[\233\377,[\227\377\36[\233\377\32Y\231\377\36[\233" "\377+X\232\377\203\32Y\231\377\1+X\232\377\204\32Y\231\377\202\36[\233" "\377\5\32Y\231\377\36[\233\377,[\227\377+X\232\377\32Y\231\377\202+X" "\232\377\1\32Y\231\377\203\36[\233\377\1,[\227\377\202+X\232\377\4\32" "Y\231\377\36[\233\377+X\232\377\32Y\231\377\202\36[\233\377\202\32Y\231" "\377\12\35Y\240\377z\202\211\377\254\253\242\377\307\316\303\377\330" "\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377" "\30W\235\377\203\32Y\231\377\1\36[\233\377\202\32Y\231\377\3+X\232\377" "\32Y\231\377+X\232\377\202\32Y\231\377\4+X\232\377\32Y\231\377+X\232" "\377\32Y\231\377\204+X\232\377\202\32Y\231\377\203+X\232\377\1\36[\233" "\377\203+X\232\377\3,[\227\377+X\232\377\32Y\231\377\202+X\232\377\202" "\32Y\231\377\1+X\232\377\203\32Y\231\377\203+X\232\377\4\32Y\231\377" ",[\227\377+X\232\377,[\227\377\203\32Y\231\377\2,[\227\377\36[\233\377" "\202\32Y\231\377\202+X\232\377\202\32Y\231\377\10+X\232\377\36[\233\377" "+X\232\377\32Y\231\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377\207" "+X\232\377\1\32Y\231\377\202+X\232\377\203\32Y\231\377\3""0\\\236\377" "[\177\262\377\356\360\355\377\202\353\356\352\377\202\355\357\353\377" "\204\353\356\352\377\202\355\357\353\377\202\353\356\352\377\203\355" "\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\202\355\357\353\377\203\353\356\352\377\1\355\357\353" "\377\205\353\356\352\377\6\355\357\353\377\353\356\352\377\355\357\353" "\377\367\366\355\377\360\362\357\377\353\356\352\377\203\355\357\353" "\377\202\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\202\353\356\352\377\5\362\364\361\377\242\266\316\377\13R\227\377" "\32Y\231\377\36[\233\377\203+X\232\377\1\36[\233\377\203+X\232\377\3" ",[\227\377+X\232\377\32Y\231\377\202+X\232\377\202\32Y\231\377\1+X\232" "\377\203\32Y\231\377\203+X\232\377\4\32Y\231\377,[\227\377+X\232\377" ",[\227\377\203\32Y\231\377\2,[\227\377\36[\233\377\202\32Y\231\377\202" "+X\232\377\202\32Y\231\377\10+X\232\377\36[\233\377+X\232\377\32Y\231" "\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377\207+X\232\377\1\32Y" "\231\377\202+X\232\377\2\32Y\231\377,[\227\377\204+X\232\377\3,[\227" "\377\36[\233\377\32Y\231\377\202+X\232\377\202\32Y\231\377\203+X\232" "\377\202\32Y\231\377\10+X\232\377\36[\233\377+X\232\377\32Y\231\377+" "X\232\377,[\227\377+X\232\377\32Y\231\377\204+X\232\377\3,[\227\377+" "X\232\377\32Y\231\377\203+X\232\377\3\36[\233\377+X\232\377\32Y\231\377" "\202+X\232\377\202\32Y\231\377\15\35Y\240\377z\202\211\377\254\253\242" "\377\307\316\303\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377u}\205\377\30W\235\377\32Y\231\377\36[\233\377+X\232" "\377\204\36[\233\377\2+X\232\377\36[\233\377\202+X\232\377\1\36[\233" "\377\202+X\232\377\4\36[\233\377+X\232\377\36[\233\377+X\232\377\203" "\36[\233\377\2+X\232\377\36[\233\377\202+X\232\377\2\36[\233\377+X\232" "\377\203\36[\233\377\203+X\232\377\6,[\227\377+X\232\377\36[\233\377" "+X\232\377\36[\233\377+X\232\377\207\36[\233\377\1+X\232\377\204\36[" "\233\377\202+X\232\377\1\36[\233\377\203+X\232\377\1\36[\233\377\202" "+X\232\377\3\36[\233\377+X\232\377\36[\233\377\202+X\232\377\206\36[" "\233\377\202+X\232\377\203\36[\233\377\6\32Y\231\377\40\\\234\377\35" "Y\240\377\205\241\304\377\372\371\357\377\353\356\352\377\203\355\357" "\353\377\202\353\356\352\377\211\355\357\353\377\202\353\356\352\377" "\211\355\357\353\377\1\353\356\352\377\210\355\357\353\377\1\353\356" "\352\377\207\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\6\355\357\353\377\356\360\355\377\262\302\325\377\343" "\351\353\377\360\362\357\377\353\356\352\377\203\355\357\353\377\1\353" "\356\352\377\203\355\357\353\377\6\353\356\352\377\351\353\347\377\365" "\367\363\377~\232\275\377$T\225\377\32Y\231\377\202+X\232\377\1\36[\233" "\377\202+X\232\377\2\36[\233\377+X\232\377\203\36[\233\377\203+X\232" "\377\6,[\227\377+X\232\377\36[\233\377+X\232\377\36[\233\377+X\232\377" "\207\36[\233\377\1+X\232\377\204\36[\233\377\202+X\232\377\1\36[\233" "\377\203+X\232\377\1\36[\233\377\202+X\232\377\3\36[\233\377+X\232\377" "\36[\233\377\202+X\232\377\206\36[\233\377\202+X\232\377\202\36[\233" "\377\1+X\232\377\202\36[\233\377\1+X\232\377\204\36[\233\377\2+X\232" "\377\36[\233\377\203+X\232\377\203\36[\233\377\204+X\232\377\2\36[\233" "\377+X\232\377\202\36[\233\377\204+X\232\377\206\36[\233\377\1+X\232" "\377\203\36[\233\377\1+X\232\377\202\36[\233\377\15+X\232\377\32Y\231" "\377\35Y\240\377z\202\211\377\254\253\242\377\307\316\303\377\330\327" "\316\377\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\32" "U\233\377\32Y\231\377\211\36[\233\377\1,[\227\377\203\36[\233\377\1," "[\227\377\217\36[\233\377\1+X\232\377\202\36[\233\377\1,[\227\377\202" "\36[\233\377\1,[\227\377\217\36[\233\377\1,[\227\377\202\36[\233\377" "\1,[\227\377\203\36[\233\377\1+X\232\377\202\36[\233\377\1,[\227\377" "\210\36[\233\377\1\32Y\231\377\203\36[\233\377\202\32Y\231\377\4#^\236" "\3770\\\236\377\262\302\325\377\375\365\355\377\204\355\357\353\377\202" "\353\356\352\377\207\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\211\355\357\353\377\1\353\356\352\377\207\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\12\355\357\353\377\353\356\352\377" "\355\357\353\377\367\366\355\377\267\306\332\377\30L\223\377Bf\235\377" "\333\341\343\377\362\364\361\377\353\356\352\377\202\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\6\353\356\352\377\351\353\347" "\377\367\366\355\377^\205\262\377%U\226\377\32Y\231\377\212\36[\233\377" "\1+X\232\377\202\36[\233\377\1,[\227\377\202\36[\233\377\1,[\227\377" "\217\36[\233\377\1,[\227\377\202\36[\233\377\1,[\227\377\203\36[\233" "\377\1+X\232\377\202\36[\233\377\1,[\227\377\210\36[\233\377\1\32Y\231" "\377\215\36[\233\377\1+X\232\377\202\32Y\231\377\204\36[\233\377\2,[" "\227\377+X\232\377\202\36[\233\377\1+X\232\377\203\36[\233\377\1+X\232" "\377\210\36[\233\377\1+X\232\377\207\36[\233\377\14\32Y\231\377\35Y\240" "\377z\202\211\377\254\253\242\377\307\316\303\377\330\327\316\377\323" "\332\317\377\306\306\275\377\245\244\233\377u}\205\377\32U\233\377\32" "Y\231\377\202,[\227\377\1\36[\233\377\203,[\227\377\203\36[\233\377\2" ",[\227\377\36[\233\377\203,[\227\377\202\36[\233\377\204,[\227\377\204" "\36[\233\377\202,[\227\377\202\36[\233\377\203,[\227\377\1\36[\233\377" "\202,[\227\377\1\36[\233\377\211,[\227\377\1\36[\233\377\202,[\227\377" "\2\36[\233\377,[\227\377\202\36[\233\377\202,[\227\377\1\36[\233\377" "\202,[\227\377\203\36[\233\377\2,[\227\377\36[\233\377\203,[\227\377" "\1\36[\233\377\202,[\227\377\203\36[\233\377\204,[\227\377\10\36[\233" "\377\32Y\231\377)a\242\377.e\247\377\333\341\343\377\360\362\357\377" "\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\204\353\356\352\377\2\355\357\353\377\353\356" "\352\377\202\355\357\353\377\204\353\356\352\377\202\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377\1\355\357" "\353\377\203\353\356\352\377\203\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\207\353\356\352" "\377\7\367\366\355\377\205\241\304\377(W\230\377!R\223\377/]\231\377" "\325\336\346\377\362\364\361\377\203\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\6\351\353\347\377\376\375\364\3779e\242\377" ",[\227\377\36[\233\377,[\227\377\204\36[\233\377\202,[\227\377\202\36" "[\233\377\203,[\227\377\1\36[\233\377\202,[\227\377\1\36[\233\377\211" ",[\227\377\1\36[\233\377\202,[\227\377\2\36[\233\377,[\227\377\202\36" "[\233\377\202,[\227\377\1\36[\233\377\202,[\227\377\203\36[\233\377\2" ",[\227\377\36[\233\377\203,[\227\377\1\36[\233\377\202,[\227\377\203" "\36[\233\377\205,[\227\377\203\36[\233\377\6,[\227\377\36[\233\377,[" "\227\377\36[\233\377,[\227\377\36[\233\377\211,[\227\377\202\36[\233" "\377\2,[\227\377\36[\233\377\203,[\227\377\202\36[\233\377\1,[\227\377" "\203\36[\233\377\204,[\227\377\202\36[\233\377\1,[\227\377\202\36[\233" "\377\14,[\227\377\32Y\231\377,Y\233\377z\202\211\377\254\253\242\377" "\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245" "\244\233\377u}\205\377\32U\233\377\315+X\232\377\3+c\244\377Fs\252\377" "\375\365\355\377\206\355\357\353\377\3\353\356\352\377\355\357\353\377" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\207\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\207\355\357\353\377\1\353\356\352\377\202\355\357\353\377\4\353\356" "\352\377\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356" "\352\377\11\362\364\361\377o\217\267\3770\\\236\377+c\244\377/[\235\377" "@k\250\377\351\353\347\377\355\357\353\377\353\356\352\377\203\355\357" "\353\377\5\351\353\347\377\367\366\355\377\351\353\347\377~\232\275\377" "!R\223\377\344+X\232\377\12\35Y\240\377z\202\211\377\254\253\242\377" "\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245" "\244\233\377u}\205\377\32U\233\377\313+X\232\377\6\32Y\231\377+X\232" "\377&`\240\377~\232\275\377\367\366\355\377\353\356\352\377\205\355\357" "\353\377\1\353\356\352\377\246\355\357\353\377\2\353\356\352\377\355" "\357\353\377\202\353\356\352\377\3\362\364\361\377o\217\267\377&`\240" "\377\202.e\247\377\4""0\\\236\377c\212\267\377\362\364\361\377\355\357" "\353\377\202\353\356\352\377\6\360\362\357\377\373\372\361\377\242\266" "\316\3779e\242\377\30L\223\377\32Y\231\377\344+X\232\377\12\35Y\240\377" "z\202\211\377\254\253\242\377\306\314\302\377\330\327\316\377\323\332" "\317\377\306\306\275\377\245\244\233\377u}\205\377\32U\233\377\203+X" "\232\377\204*Z\225\377\2+X\232\377*Z\225\377\202+X\232\377\203*Z\225" "\377\3+X\232\377*Z\225\377+X\232\377\202*Z\225\377\202+X\232\377\205" "*Z\225\377\1+X\232\377\203*Z\225\377\203+X\232\377\203*Z\225\377\202" "+X\232\377\1*Z\225\377\205+X\232\377\202*Z\225\377\2+X\232\377*Z\225" "\377\203+X\232\377\2*Z\225\377+X\232\377\202*Z\225\377\202+X\232\377" "\203*Z\225\377\2+X\232\377*Z\225\377\203+X\232\377\3*Z\225\377+X\232" "\377*Z\225\377\202+X\232\377\202*Z\225\377\1+X\232\377\202*Z\225\377" "\7+X\232\377#^\236\377\35Y\240\377\274\310\325\377\360\362\357\377\355" "\357\353\377\353\356\352\377\203\355\357\353\377\203\353\356\352\377" "\1\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356" "\352\377\202\355\357\353\377\203\353\356\352\377\2\355\357\353\377\353" "\356\352\377\206\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\202\353\356\352\377\204\355\357\353\377\1\353\356\352\377\204\355\357" "\353\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\3\365\367\363\377c\212\267\377\32U\233" "\377\203-Z\234\377\12\30N\226\377\222\251\307\377\375\365\355\377\351" "\353\347\377\373\372\361\377\313\324\334\377^\205\262\377\30L\223\377" "$T\225\377\32Y\231\377\202*Z\225\377\202+X\232\377\205*Z\225\377\1+X" "\232\377\203*Z\225\377\203+X\232\377\203*Z\225\377\202+X\232\377\1*Z" "\225\377\205+X\232\377\202*Z\225\377\2+X\232\377*Z\225\377\203+X\232" "\377\2*Z\225\377+X\232\377\202*Z\225\377\202+X\232\377\203*Z\225\377" "\2+X\232\377*Z\225\377\203+X\232\377\3*Z\225\377+X\232\377*Z\225\377" "\202+X\232\377\202*Z\225\377\1+X\232\377\202*Z\225\377\2+X\232\377*Z" "\225\377\202+X\232\377\202*Z\225\377\3+X\232\377*Z\225\377+X\232\377" "\202*Z\225\377\202+X\232\377\207*Z\225\377\202+X\232\377\203*Z\225\377" "\202+X\232\377\205*Z\225\377\3+X\232\377*Z\225\377+X\232\377\204*Z\225" "\377\202+X\232\377\14*Z\225\377+X\232\377\35Y\240\377z\202\211\377\254" "\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306" "\275\377\242\242\231\377u}\205\377\32U\233\377\207+X\232\377\1\32Y\231" "\377\203+X\232\377\2\32Y\231\377*Z\225\377\203+X\232\377\3\32Y\231\377" "+X\232\377*Z\225\377\202+X\232\377\203\32Y\231\377\203+X\232\377\202" "\32Y\231\377\204+X\232\377\3\32Y\231\377+X\232\377\32Y\231\377\202+X" "\232\377\1*Z\225\377\205+X\232\377\2*Z\225\377\32Y\231\377\202+X\232" "\377\1\32Y\231\377\202+X\232\377\1\32Y\231\377\202+X\232\377\1\32Y\231" "\377\202+X\232\377\203\32Y\231\377\2+X\232\377\32Y\231\377\203+X\232" "\377\5\32Y\231\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377\205+X" "\232\377\6(Y\224\377$_\237\377.e\247\377\325\336\346\377\356\360\355" "\377\353\356\352\377\205\355\357\353\377\3\353\356\352\377\355\357\353" "\377\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\204\355\357\353\377\1\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\1\353" "\356\352\377\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\4\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\202" "\353\356\352\377\3\356\360\355\377\262\302\325\377\226\255\313\377\203" "\235\261\311\377\10\242\266\316\377=h\245\377\301\314\332\377\372\371" "\357\377\214\244\302\377$T\225\377!R\223\377,[\227\377\203+X\232\377" "\1*Z\225\377\202+X\232\377\203\32Y\231\377\203+X\232\377\202\32Y\231" "\377\204+X\232\377\3\32Y\231\377+X\232\377\32Y\231\377\202+X\232\377" "\1*Z\225\377\205+X\232\377\2*Z\225\377\32Y\231\377\202+X\232\377\1\32" "Y\231\377\202+X\232\377\1\32Y\231\377\202+X\232\377\1\32Y\231\377\202" "+X\232\377\203\32Y\231\377\2+X\232\377\32Y\231\377\203+X\232\377\5\32" "Y\231\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377\206+X\232\377\203" "\32Y\231\377\5+X\232\377\32Y\231\377+X\232\377\32Y\231\377+X\232\377" "\202\32Y\231\377\204+X\232\377\4*Z\225\377+X\232\377*Z\225\377+X\232" "\377\202\32Y\231\377\2+X\232\377\32Y\231\377\206+X\232\377\203\32Y\231" "\377\204+X\232\377\1*Z\225\377\202+X\232\377\202\32Y\231\377\14*Z\225" "\377+X\232\377\35Y\240\377z\202\211\377\254\253\242\377\306\314\302\377" "\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205" "\377\32U\233\377\213+X\232\377\1\32Y\231\377\206+X\232\377\1*Z\225\377" "\202+X\232\377\203\32Y\231\377\203+X\232\377\202\32Y\231\377\206+X\232" "\377\1\32Y\231\377\210+X\232\377\202\32Y\231\377\210+X\232\377\1\32Y" "\231\377\202+X\232\377\203\32Y\231\377\2+X\232\377\32Y\231\377\203+X" "\232\377\3\32Y\231\377+X\232\377\32Y\231\377\207+X\232\377\6\32Y\231" "\377#^\236\377[\177\262\377\351\353\347\377\356\360\355\377\353\356\352" "\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377\204\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\3\355\357\353\377\353" "\356\352\377\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\203\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\203\353\356\352\377\6\355\357\353\377\353\356" "\352\377\355\357\353\377\353\356\352\377\360\362\357\377\365\367\363" "\377\202\362\364\361\377\7\365\364\353\377\376\375\364\377Mx\260\377" "9e\242\377\77l\243\377\32N\217\377(W\230\377\202\32Y\231\377\203+X\232" "\377\1*Z\225\377\202+X\232\377\203\32Y\231\377\203+X\232\377\202\32Y" "\231\377\206+X\232\377\1\32Y\231\377\210+X\232\377\202\32Y\231\377\210" "+X\232\377\1\32Y\231\377\202+X\232\377\203\32Y\231\377\2+X\232\377\32" "Y\231\377\203+X\232\377\3\32Y\231\377+X\232\377\32Y\231\377\210+X\232" "\377\1\32Y\231\377\203+X\232\377\5\32Y\231\377+X\232\377\32Y\231\377" "+X\232\377\32Y\231\377\205+X\232\377\1*Z\225\377\203+X\232\377\1\32Y" "\231\377\211+X\232\377\203\32Y\231\377\204+X\232\377\1\32Y\231\377\207" "+X\232\377\11z\202\211\377\254\253\242\377\306\314\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205\377\32U\233" "\377\203+X\232\377\203\32Y\231\377\1+X\232\377\202\32Y\231\377\202+X" "\232\377\4\32Y\231\377*Z\225\377\32Y\231\377+X\232\377\204\32Y\231\377" "\202+X\232\377\211\32Y\231\377\203+X\232\377\203\32Y\231\377\3+X\232" "\377\32Y\231\377*Z\225\377\202\32Y\231\377\202+X\232\377\203\32Y\231" "\377\1+X\232\377\202\32Y\231\377\1+X\232\377\202\32Y\231\377\1+X\232" "\377\202\32Y\231\377\202+X\232\377\205\32Y\231\377\3+X\232\377\32Y\231" "\377+X\232\377\203\32Y\231\377\1+X\232\377\202\32Y\231\377\202+X\232" "\377\6\32Y\231\377+X\232\377\36[\233\377\40[\241\377v\227\277\377\372" "\371\357\377\206\355\357\353\377\202\353\356\352\377\2\355\357\353\377" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\204\355\357\353" "\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\203\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356" "\352\377\206\355\357\353\377\203\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\205\353\356\352\377\10\373\372\361" "\377Ns\245\377!R\223\377(W\230\377,[\227\377+X\232\377\32Y\231\377+X" "\232\377\204\32Y\231\377\202+X\232\377\211\32Y\231\377\203+X\232\377" "\203\32Y\231\377\3+X\232\377\32Y\231\377*Z\225\377\202\32Y\231\377\202" "+X\232\377\203\32Y\231\377\1+X\232\377\202\32Y\231\377\1+X\232\377\202" "\32Y\231\377\1+X\232\377\202\32Y\231\377\202+X\232\377\205\32Y\231\377" "\3+X\232\377\32Y\231\377+X\232\377\203\32Y\231\377\1+X\232\377\202\32" "Y\231\377\202+X\232\377\202\32Y\231\377\1+X\232\377\207\32Y\231\377\1" "+X\232\377\202\32Y\231\377\202+X\232\377\204\32Y\231\377\1*Z\225\377" "\203\32Y\231\377\1+X\232\377\203\32Y\231\377\1+X\232\377\206\32Y\231" "\377\3+X\232\377\32Y\231\377+X\232\377\206\32Y\231\377\1*Z\225\377\202" "+X\232\377\16z\202\211\377\254\253\242\377\306\314\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205\377\32U\233" "\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377*Z\225\377\202\32Y\231" "\377\1+X\232\377\202\32Y\231\377\1+X\232\377\203\32Y\231\377\1+X\232" "\377\203\32Y\231\377\1*Z\225\377\204\32Y\231\377\1*Z\225\377\202\32Y" "\231\377\1+X\232\377\202\32Y\231\377\1*Z\225\377\204\32Y\231\377\1*Z" "\225\377\202\32Y\231\377\2+X\232\377\32Y\231\377\202+X\232\377\4\32Y" "\231\377*Z\225\377+X\232\377\32Y\231\377\202*Z\225\377\4\32Y\231\377" "+X\232\377\32Y\231\377+X\232\377\211\32Y\231\377\3+X\232\377*Z\225\377" "\32Y\231\377\202+X\232\377\2\32Y\231\377+X\232\377\202\32Y\231\377\2" "+X\232\377*Z\225\377\203\32Y\231\377\5+X\232\3770^\232\3770\\\236\377" "\255\274\320\377\362\364\361\377\203\353\356\352\377\203\355\357\353" "\377\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377\2\355" "\357\353\377\353\356\352\377\202\355\357\353\377\204\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\2\353\356\352\377\355\357\353" "\377\204\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357" "\353\377\2\353\356\352\377\355\357\353\377\202\353\356\352\377\5\367" "\366\355\377\313\324\334\377,[\227\377(W\230\377+X\232\377\203\32Y\231" "\377\1+X\232\377\203\32Y\231\377\1*Z\225\377\204\32Y\231\377\1*Z\225" "\377\202\32Y\231\377\1+X\232\377\202\32Y\231\377\1*Z\225\377\204\32Y" "\231\377\1*Z\225\377\202\32Y\231\377\2+X\232\377\32Y\231\377\202+X\232" "\377\4\32Y\231\377*Z\225\377+X\232\377\32Y\231\377\202*Z\225\377\4\32" "Y\231\377+X\232\377\32Y\231\377+X\232\377\211\32Y\231\377\3+X\232\377" "*Z\225\377\32Y\231\377\202+X\232\377\2\32Y\231\377+X\232\377\202\32Y" "\231\377\2+X\232\377*Z\225\377\204\32Y\231\377\2+X\232\377\32Y\231\377" "\202+X\232\377\202\32Y\231\377\1+X\232\377\204\32Y\231\377\1+X\232\377" "\203\32Y\231\377\1*Z\225\377\202\32Y\231\377\1*Z\225\377\205\32Y\231" "\377\4*Z\225\377\32Y\231\377+X\232\377\32Y\231\377\202*Z\225\377\211" "\32Y\231\377\1+X\232\377\202\32Y\231\377\202+X\232\377\11z\202\211\377" "\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\242\242\231\377u}\205\377\32U\233\377\313+X\232\377\3""4" "a\235\377)a\242\377\340\345\350\377\202\355\357\353\377\1\353\356\352" "\377\202\355\357\353\377\2\353\356\352\377\355\357\353\377\204\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\3\355\357\353\377\353" "\356\352\377\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\203\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\203\353\356\352\377\2\355\357\353\377\353\356" "\352\377\203\355\357\353\377\7\351\353\347\377\353\356\352\377\367\366" "\355\377\333\341\343\377Bf\235\377%U\226\377\32Y\231\377\355+X\232\377" "\12z\202\211\377\254\253\242\377\306\314\302\377\330\327\316\377\323" "\332\317\377\306\306\275\377\242\242\231\377u}\205\377\32U\233\377+X" "\232\377\311\32Y\231\377\7(Y\224\377+c\244\377Fs\252\377\367\366\355" "\377\351\353\347\377\355\357\353\377\353\356\352\377\205\355\357\353" "\377\1\353\356\352\377\207\355\357\353\377\1\353\356\352\377\224\355" "\357\353\377\1\353\356\352\377\204\355\357\353\377\1\353\356\352\377" "\204\355\357\353\377\13\353\356\352\377\355\357\353\377\353\356\352\377" "\355\357\353\377\353\356\352\377\362\364\361\377\367\366\355\377\351" "\353\347\377\214\244\302\3770^\232\377$T\225\377\355\32Y\231\377\13+" "X\232\377\35Y\240\377z\202\211\377\254\253\242\377\306\314\302\377\330" "\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205\377" "\32U\233\377\312(W\230\377\5\32Y\231\3770\\\236\377v\227\277\377\365" "\364\353\377\351\353\347\377\203\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\204\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\1\353\356\352\377\203\355" "\357\353\377\1\353\356\352\377\202\355\357\353\377\4\353\356\352\377" "\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\203\353\356\352\377\7\360\362\357\377\301\314\332" "\377o\217\267\377\37Q\222\377\30L\223\377$T\225\377+X\232\377\356(W\230" "\377\13\35Y\240\377z\202\211\377\254\253\242\377\306\314\302\377\330" "\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205\377" "\32U\233\377(W\230\377\310(Y\224\377\7&W\222\377!]\235\377\35Y\240\377" "\255\274\320\377\365\367\363\377\353\356\352\377\355\357\353\377\202" "\353\356\352\377\203\355\357\353\377\211\353\356\352\377\202\355\357" "\353\377\210\353\356\352\377\203\355\357\353\377\202\353\356\352\377" "\1\355\357\353\377\204\353\356\352\377\202\355\357\353\377\1\353\356" "\352\377\203\355\357\353\377\206\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\6\365\364\353\377o\217\267\377\30W\235\377*Z\225\377" "+X\232\377(W\230\377\356(Y\224\377\14(W\230\377+X\232\377z\202\211\377" "\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\242\242\231\377u}\205\377#R\231\377(Y\224\377\215\32Y\231" "\377\1(W\230\377\271\32Y\231\377\6(W\230\377'V\227\377#^\236\377=h\245" "\377\321\331\342\377\360\362\357\377\210\355\357\353\377\3\353\356\352" "\377\355\357\353\377\353\356\352\377\202\355\357\353\377\1\353\356\352" "\377\207\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377" "\1\353\356\352\377\212\355\357\353\377\4\353\356\352\377\355\357\353" "\377\353\356\352\377\355\357\353\377\202\353\356\352\377\5\375\365\355" "\377\226\255\313\377\35Y\240\377\36[\233\377(W\230\377\210\32Y\231\377" "\1(W\230\377\346\32Y\231\377\14(W\230\377+X\232\377z\202\211\377\254" "\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306" "\275\377\242\242\231\377u}\205\377\32U\233\377(W\230\377\202+X\232\377" "\1\32Y\231\377\202(W\230\377\3\32Y\231\377+X\232\377\32Y\231\377\204" "+X\232\377\3\32Y\231\377(W\230\377\32Y\231\377\202+X\232\377\1(Y\224" "\377\206+X\232\377\202\32Y\231\377\202+X\232\377\1\32Y\231\377\204+X" "\232\377\1(W\230\377\202+X\232\377\2(W\230\377+X\232\377\202\32Y\231" "\377\202+X\232\377\202\32Y\231\377\202+X\232\377\1(W\230\377\205+X\232" "\377\1\32Y\231\377\206+X\232\377\2(W\230\377+X\232\377\202\32Y\231\377" "\206+X\232\377\2(W\230\377\32Y\231\377\202(W\230\377\2$_\237\377Mx\260" "\377\202\356\360\355\377\202\355\357\353\377\202\353\356\352\377\204" "\355\357\353\377\2\353\356\352\377\355\357\353\377\204\353\356\352\377" "\2\355\357\353\377\353\356\352\377\204\355\357\353\377\202\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\204\355\357\353\377\2\353" "\356\352\377\355\357\353\377\203\353\356\352\377\207\355\357\353\377" "\2\353\356\352\377\355\357\353\377\202\353\356\352\377\15\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377" "\367\366\355\377\262\302\325\377)a\242\377!]\235\377(W\230\377\32Y\231" "\377+X\232\377\32Y\231\377\204+X\232\377\3\32Y\231\377(W\230\377\32Y" "\231\377\202+X\232\377\1(Y\224\377\206+X\232\377\202\32Y\231\377\202" "+X\232\377\1\32Y\231\377\204+X\232\377\1(W\230\377\202+X\232\377\2(W" "\230\377+X\232\377\202\32Y\231\377\202+X\232\377\202\32Y\231\377\202" "+X\232\377\1(W\230\377\205+X\232\377\1\32Y\231\377\206+X\232\377\2(W" "\230\377+X\232\377\202\32Y\231\377\206+X\232\377\5(W\230\377\32Y\231" "\377+X\232\377(Y\224\377\32Y\231\377\204+X\232\377\3(Y\224\377+X\232" "\377(Y\224\377\204+X\232\377\3\32Y\231\377+X\232\377(Y\224\377\202\32" "Y\231\377\3(W\230\377+X\232\377\32Y\231\377\205+X\232\377\2\32Y\231\377" "+X\232\377\203\32Y\231\377\206+X\232\377\202\32Y\231\377\2+X\232\377" "(W\230\377\203+X\232\377\17(W\230\377+X\232\377z\202\211\377\254\253" "\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275" "\377\242\242\231\377u}\205\377\32U\233\377(W\230\377\32Y\231\377+X\232" "\377\32Y\231\377\202(W\230\377\203\32Y\231\377\7(W\230\377\32Y\231\377" "+X\232\377(W\230\377\32Y\231\377(W\230\377\32Y\231\377\202+X\232\377" "\1(Y\224\377\202\32Y\231\377\202+X\232\377\2\32Y\231\377+X\232\377\202" "\32Y\231\377\202+X\232\377\202\32Y\231\377\5(Y\224\377\32Y\231\377+X" "\232\377(W\230\377+X\232\377\202(W\230\377\1+X\232\377\203\32Y\231\377" "\1+X\232\377\203\32Y\231\377\202(W\230\377\202\32Y\231\377\5+X\232\377" "\32Y\231\377(Y\224\377\32Y\231\377+X\232\377\202(W\230\377\203+X\232" "\377\4(W\230\377+X\232\377(W\230\377\32Y\231\377\204+X\232\377\12(Y\224" "\377+X\232\377(W\230\377(Y\224\377(W\230\377+X\232\377&`\240\377o\217" "\267\377\373\372\361\377\353\356\352\377\202\355\357\353\377\1\353\356" "\352\377\205\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356" "\352\377\202\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\2\355\357\353\377\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\204\355\357\353" "\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\207\355" "\357\353\377\1\353\356\352\377\202\355\357\353\377\4\353\356\352\377" "\355\357\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377" "\5\370\363\361\377\313\324\334\377=h\245\377!]\235\377'V\227\377\203" "\32Y\231\377\7(W\230\377\32Y\231\377+X\232\377(W\230\377\32Y\231\377" "(W\230\377\32Y\231\377\202+X\232\377\1(Y\224\377\202\32Y\231\377\202" "+X\232\377\2\32Y\231\377+X\232\377\202\32Y\231\377\202+X\232\377\202" "\32Y\231\377\5(Y\224\377\32Y\231\377+X\232\377(W\230\377+X\232\377\202" "(W\230\377\1+X\232\377\203\32Y\231\377\1+X\232\377\203\32Y\231\377\202" "(W\230\377\202\32Y\231\377\5+X\232\377\32Y\231\377(Y\224\377\32Y\231" "\377+X\232\377\202(W\230\377\203+X\232\377\4(W\230\377+X\232\377(W\230" "\377\32Y\231\377\204+X\232\377\6(Y\224\377+X\232\377(W\230\377(Y\224" "\377(W\230\377(Y\224\377\204\32Y\231\377\10+X\232\377(Y\224\377+X\232" "\377(Y\224\377+X\232\377\32Y\231\377+X\232\377\32Y\231\377\202(W\230" "\377\1(Y\224\377\202\32Y\231\377\1(W\230\377\202\32Y\231\377\202+X\232" "\377\1\32Y\231\377\202+X\232\377\2\32Y\231\377+X\232\377\203\32Y\231" "\377\203+X\232\377\2\32Y\231\377+X\232\377\203\32Y\231\377\2+X\232\377" "(W\230\377\203+X\232\377\15(W\230\377+X\232\377z\202\211\377\254\253" "\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275" "\377\242\242\231\377u}\205\377\32U\233\377(W\230\377\32Y\231\377\202" "+X\232\377\13(Y\224\377+X\232\377(W\230\377\32Y\231\377+X\232\377(W\230" "\377(Y\224\377+X\232\377(W\230\377+X\232\377(W\230\377\203+X\232\377" "\202(Y\224\377\4\32Y\231\377(Y\224\377+X\232\377\32Y\231\377\206+X\232" "\377\204(Y\224\377\202+X\232\377\3(W\230\377+X\232\377(Y\224\377\202" "+X\232\377\1(Y\224\377\202+X\232\377\202\32Y\231\377\7(W\230\377+X\232" "\377\32Y\231\377(Y\224\377+X\232\377\32Y\231\377(Y\224\377\202+X\232" "\377\202(W\230\377\204+X\232\377\2(Y\224\377(W\230\377\205+X\232\377" "\1(Y\224\377\202+X\232\377\202(W\230\377\5,Y\233\3770\\\236\377\247\272" "\323\377\362\364\361\377\353\356\352\377\202\355\357\353\377\3\353\356" "\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353\377\3" "\353\356\352\377\355\357\353\377\353\356\352\377\202\372\371\357\377" "\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\202\355\357\353\377\203" "\353\356\352\377\7\365\364\353\377\375\365\355\377\360\362\357\377\356" "\360\355\377\343\351\353\377Co\255\377+X\232\377\202(W\230\377\10\32" "Y\231\377+X\232\377(W\230\377(Y\224\377+X\232\377(W\230\377+X\232\377" "(W\230\377\203+X\232\377\202(Y\224\377\4\32Y\231\377(Y\224\377+X\232" "\377\32Y\231\377\206+X\232\377\204(Y\224\377\202+X\232\377\3(W\230\377" "+X\232\377(Y\224\377\202+X\232\377\1(Y\224\377\202+X\232\377\202\32Y" "\231\377\7(W\230\377+X\232\377\32Y\231\377(Y\224\377+X\232\377\32Y\231" "\377(Y\224\377\202+X\232\377\202(W\230\377\204+X\232\377\2(Y\224\377" "(W\230\377\205+X\232\377\1(Y\224\377\202+X\232\377\202(W\230\377\2(Y" "\224\377+X\232\377\203\32Y\231\377\1+X\232\377\203(Y\224\377\4+X\232" "\377(Y\224\377+X\232\377(Y\224\377\202(W\230\377\2(Y\224\377+X\232\377" "\202\32Y\231\377\1(Y\224\377\203+X\232\377\1(Y\224\377\202+X\232\377" "\6\32Y\231\377(Y\224\377\32Y\231\377+X\232\377\32Y\231\377(Y\224\377" "\202+X\232\377\2(Y\224\377+X\232\377\202\32Y\231\377\202+X\232\377\2" "\32Y\231\377(Y\224\377\202+X\232\377\14(W\230\377\35Y\240\377z\202\211" "\377\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377" "\306\306\275\377\242\242\231\377u}\205\377#R\231\377+X\232\377\202(W" "\230\377\2+X\232\377(Y\224\377\204+X\232\377\202(W\230\377\4+X\232\377" "(W\230\377+X\232\377(W\230\377\203+X\232\377\1(Y\224\377\202(W\230\377" "\211+X\232\377\1(W\230\377\202(Y\224\377\1(W\230\377\202+X\232\377\3" "(W\230\377+X\232\377(W\230\377\202+X\232\377\2(Y\224\377(W\230\377\203" "+X\232\377\1(W\230\377\202+X\232\377\2(Y\224\377+X\232\377\202(W\230" "\377\202+X\232\377\202(W\230\377\205+X\232\377\3(W\230\377+X\232\377" "(W\230\377\203+X\232\377\1(Y\224\377\203+X\232\377\4(W\230\377$_\237" "\377\40[\241\377\333\341\343\377\205\355\357\353\377\1\353\356\352\377" "\203\355\357\353\377\207\353\356\352\377\6\351\353\347\377\367\366\355" "\377v\227\277\377[\177\262\377\355\357\353\377\356\360\355\377\203\353" "\356\352\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355\357" "\353\377\1\353\356\352\377\204\355\357\353\377\204\353\356\352\377\11" "\360\362\357\377\242\266\316\377\205\241\304\377\274\310\325\377\343" "\351\353\377\373\372\361\377Fs\252\377%U\226\377(Y\224\377\203+X\232" "\377\202(W\230\377\4+X\232\377(W\230\377+X\232\377(W\230\377\203+X\232" "\377\1(Y\224\377\202(W\230\377\211+X\232\377\1(W\230\377\202(Y\224\377" "\1(W\230\377\202+X\232\377\3(W\230\377+X\232\377(W\230\377\202+X\232" "\377\2(Y\224\377(W\230\377\203+X\232\377\1(W\230\377\202+X\232\377\2" "(Y\224\377+X\232\377\202(W\230\377\202+X\232\377\202(W\230\377\205+X" "\232\377\3(W\230\377+X\232\377(W\230\377\203+X\232\377\1(Y\224\377\202" "+X\232\377\5(Y\224\377(W\230\377(Y\224\377+X\232\377(W\230\377\203+X" "\232\377\7(Y\224\377+X\232\377(Y\224\377+X\232\377(W\230\377+X\232\377" "(Y\224\377\202(W\230\377\1(Y\224\377\203+X\232\377\1(W\230\377\203+X" "\232\377\1(W\230\377\203+X\232\377\1(W\230\377\206+X\232\377\1(W\230" "\377\210+X\232\377\202(W\230\377\12\35Y\240\377z\202\211\377\254\253" "\242\377\314\313\302\377\330\327\316\377\323\332\317\377\306\306\275" "\377\242\242\231\377u}\205\377#R\231\377\206(W\230\377\1\32Y\231\377" "\204(W\230\377\1+X\232\377\203(W\230\377\2\32Y\231\377+X\232\377\205" "(W\230\377\3+X\232\377(W\230\377+X\232\377\202(W\230\377\202+X\232\377" "\202(W\230\377\202(Y\224\377\202(W\230\377\1+X\232\377\204(W\230\377" "\202(Y\224\377\2(W\230\377\32Y\231\377\205(W\230\377\1(Y\224\377\204" "(W\230\377\1(Y\224\377\202(W\230\377\203+X\232\377\210(W\230\377\1(Y" "\224\377\202(W\230\377\6(Y\224\377'V\227\377$_\237\377Fs\252\377\360" "\362\357\377\351\353\347\377\203\355\357\353\377\3\353\356\352\377\355" "\357\353\377\353\356\352\377\205\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\11\353\356\352\377\365\364\353\377\247\272\323\377\30" "L\223\377.e\247\377\351\353\347\377\356\360\355\377\355\357\353\377\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\204\355\357\353" "\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377\206\355" "\357\353\377\202\353\356\352\377\202\355\357\353\377\14\353\356\352\377" "\355\357\353\377\360\362\357\377\255\274\320\377#R\231\377\37Q\222\377" "\32N\217\377\77l\243\3774a\235\377(W\230\377+X\232\377\32Y\231\377\204" "(W\230\377\1+X\232\377\203(W\230\377\2\32Y\231\377+X\232\377\205(W\230" "\377\3+X\232\377(W\230\377+X\232\377\202(W\230\377\202+X\232\377\202" "(W\230\377\202(Y\224\377\202(W\230\377\1+X\232\377\204(W\230\377\202" "(Y\224\377\2(W\230\377\32Y\231\377\205(W\230\377\1(Y\224\377\204(W\230" "\377\1(Y\224\377\202(W\230\377\203+X\232\377\210(W\230\377\1(Y\224\377" "\202(W\230\377\1(Y\224\377\204(W\230\377\1\32Y\231\377\210(W\230\377" "\1(Y\224\377\203(W\230\377\1\32Y\231\377\204(W\230\377\202+X\232\377" "\4(W\230\377+X\232\377(W\230\377(Y\224\377\210(W\230\377\4(Y\224\377" "\32Y\231\377(W\230\377(Y\224\377\203(W\230\377\1+X\232\377\202(W\230" "\377\12\35Y\240\377z\202\211\377\254\253\242\377\314\313\302\377\330" "\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205\377" "\32U\233\377\206+X\232\377\202\32Y\231\377\206+X\232\377\3\32Y\231\377" "+X\232\377\32Y\231\377\205+X\232\377\202\32Y\231\377\210+X\232\377\1" "\32Y\231\377\214+X\232\377\1\32Y\231\377\202+X\232\377\1\32Y\231\377" "\202+X\232\377\1\32Y\231\377\205+X\232\377\1\32Y\231\377\204+X\232\377" "\1\32Y\231\377\210+X\232\377\6(W\230\377\32Y\231\377\35Y\240\377v\227" "\277\377\365\364\353\377\353\356\352\377\203\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\203\353\356\352\377\203\355\357\353\377" "\7\356\360\355\377\355\357\353\377Fs\252\377$T\225\3779e\242\377\343" "\351\353\377\356\360\355\377\202\355\357\353\377\1\353\356\352\377\206" "\355\357\353\377\1\353\356\352\377\207\355\357\353\377\202\353\356\352" "\377\204\355\357\353\377\1\353\356\352\377\202\351\353\347\377\10\353" "\356\352\377\356\360\355\377\325\336\346\3770\\\236\377\40\\\234\377" "(W\230\377!R\223\377'V\227\377\202+X\232\377\202\32Y\231\377\206+X\232" "\377\3\32Y\231\377+X\232\377\32Y\231\377\205+X\232\377\202\32Y\231\377" "\210+X\232\377\1\32Y\231\377\214+X\232\377\1\32Y\231\377\202+X\232\377" "\1\32Y\231\377\202+X\232\377\1\32Y\231\377\205+X\232\377\1\32Y\231\377" "\204+X\232\377\1\32Y\231\377\210+X\232\377\202\32Y\231\377\203+X\232" "\377\202\32Y\231\377\207+X\232\377\202\32Y\231\377\211+X\232\377\1\32" "Y\231\377\224+X\232\377\13(W\230\377+X\232\377z\202\211\377\254\253\242" "\377\314\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\242\242\231\377u}\205\377\13R\227\377\307(W\230\377\6'V\227\377\36[" "\233\377\35Y\240\377\242\266\316\377\372\371\357\377\353\356\352\377" "\211\355\357\353\377\1\353\356\352\377\204\355\357\353\377\7\360\362" "\357\377\301\314\332\377\13R\227\377+X\232\3779e\242\377\340\345\350" "\377\360\362\357\377\226\355\357\353\377\202\353\356\352\377\2\360\362" "\357\377\365\367\363\377\202\362\364\361\377\4\351\353\347\377Fs\252" "\377(W\230\377&W\222\377\363(W\230\377\13'V\227\377+X\232\377z\202\211" "\377\254\253\242\377\314\313\302\377\330\327\316\377\323\332\317\377" "\306\306\275\377\242\242\231\377u}\205\377\36P\227\377\307'V\227\377" "\5%U\226\377!]\235\377.e\247\377\313\324\334\377\362\364\361\377\204" "\355\357\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377\205" "\355\357\353\377\14\353\356\352\377\355\357\353\377\353\356\352\377\367" "\366\355\377~\232\275\377\32N\217\377+X\232\377+c\244\377\333\341\343" "\377\360\362\357\377\355\357\353\377\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\204\355\357\353\377\1\353\356\352\377\203\355" "\357\353\377\1\353\356\352\377\206\355\357\353\377\12\353\356\352\377" "\356\360\355\377\333\341\343\377c\212\267\377v\227\277\377\255\274\320" "\377\313\324\334\377\340\345\350\377b\200\256\377\34O\220\377\364'V\227" "\377\14%U\226\377+X\232\377z\202\211\377\254\253\242\377\314\313\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377" "u}\205\377\36P\227\377(W\230\377\202'V\227\377\203(W\230\377\1'V\227" "\377\202(W\230\377\202'V\227\377\4(W\230\377'V\227\377(W\230\377'V\227" "\377\204(W\230\377\1'V\227\377\212(W\230\377\4&W\222\377(W\230\377'V" "\227\377&W\222\377\202(W\230\377\3'V\227\377(W\230\377&W\222\377\202" "(W\230\377\202'V\227\377\203(W\230\377\1'V\227\377\202(W\230\377\4'V" "\227\377(W\230\377&W\222\377'V\227\377\202(W\230\377\202'V\227\377\205" "(W\230\377\3'V\227\377(W\230\377'V\227\377\206(W\230\377\3'V\227\377" "0\\\236\3777n\251\377\202\356\360\355\377\1\353\356\352\377\203\355\357" "\353\377\3\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357" "\353\377\204\353\356\352\377\202\355\357\353\377\10\372\371\357\377=" "h\245\377%U\226\377(W\230\377)a\242\377\325\336\346\377\360\362\357\377" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\203\355\357\353\377\1\353" "\356\352\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\202\353\356\352\377\11\360\362\357\377\351\353\347\377Mx\260\377\30" "N\226\3770\\\236\377Fs\252\3779e\242\377$T\225\377'V\227\377\204(W\230" "\377\1'V\227\377\202(W\230\377\202'V\227\377\4(W\230\377'V\227\377(W" "\230\377'V\227\377\204(W\230\377\1'V\227\377\212(W\230\377\4&W\222\377" "(W\230\377'V\227\377&W\222\377\202(W\230\377\3'V\227\377(W\230\377&W" "\222\377\202(W\230\377\202'V\227\377\203(W\230\377\1'V\227\377\202(W" "\230\377\4'V\227\377(W\230\377&W\222\377'V\227\377\202(W\230\377\202" "'V\227\377\205(W\230\377\3'V\227\377(W\230\377'V\227\377\206(W\230\377" "\2&W\222\377'V\227\377\202(W\230\377\1'V\227\377\207(W\230\377\2'V\227" "\377(W\230\377\203'V\227\377\204(W\230\377\1'V\227\377\203(W\230\377" "\202'V\227\377\211(W\230\377\4'V\227\377(W\230\377&W\222\377'V\227\377" "\205(W\230\377\202'V\227\377\13+X\232\377z\202\211\377\254\253\242\377" "\314\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377\242" "\242\231\377u}\205\377\36P\227\377(W\230\377\202'V\227\377\203(W\230" "\377\1'V\227\377\202(W\230\377\202'V\227\377\4(W\230\377'V\227\377(W" "\230\377'V\227\377\204(W\230\377\2'V\227\377&W\222\377\211(W\230\377" "\202&W\222\377\1'V\227\377\203(W\230\377\3'V\227\377(W\230\377&W\222" "\377\202(W\230\377\202'V\227\377\203(W\230\377\1'V\227\377\202(W\230" "\377\1'V\227\377\202(W\230\377\1'V\227\377\202(W\230\377\202'V\227\377" "\205(W\230\377\3'V\227\377(W\230\377'V\227\377\203(W\230\377\1&W\222" "\377\202(W\230\377\4'V\227\377)a\242\377^\205\262\377\377\371\361\377" "\202\353\356\352\377\203\355\357\353\377\3\353\356\352\377\355\357\353" "\377\353\356\352\377\202\355\357\353\377\205\353\356\352\377\11\362\364" "\361\377\313\324\334\377$T\225\377(W\230\377'V\227\377)a\242\377\321" "\331\342\377\360\362\357\377\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\202\353" "\356\352\377\202\355\357\353\377\203\353\356\352\377\7\360\362\357\377" "\370\363\361\377v\227\277\377\35Y\240\377)a\242\377.e\247\377!]\235\377" "\203'V\227\377\202(W\230\377\1'V\227\377\202(W\230\377\202'V\227\377" "\4(W\230\377'V\227\377(W\230\377'V\227\377\204(W\230\377\2'V\227\377" "&W\222\377\211(W\230\377\202&W\222\377\1'V\227\377\203(W\230\377\3'V" "\227\377(W\230\377&W\222\377\202(W\230\377\202'V\227\377\203(W\230\377" "\1'V\227\377\202(W\230\377\1'V\227\377\202(W\230\377\1'V\227\377\202" "(W\230\377\202'V\227\377\205(W\230\377\3'V\227\377(W\230\377'V\227\377" "\203(W\230\377\1&W\222\377\203(W\230\377\1'V\227\377\202(W\230\377\1" "'V\227\377\207(W\230\377\2'V\227\377(W\230\377\203'V\227\377\204(W\230" "\377\1'V\227\377\203(W\230\377\202'V\227\377\202(W\230\377\1&W\222\377" "\206(W\230\377\1'V\227\377\202(W\230\377\1'V\227\377\205(W\230\377\15" "'V\227\377%U\226\377+X\232\377}\201\204\377\254\253\242\377\314\313\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377" "u}\205\377\36P\227\377(W\230\377\202'V\227\377\6(W\230\377&W\222\377" "(W\230\377'V\227\377&W\222\377(W\230\377\202'V\227\377\4&W\222\377'V" "\227\377(W\230\377'V\227\377\204(W\230\377\202'V\227\377\7(W\230\377" "&W\222\377(W\230\377&W\222\377(W\230\377&W\222\377'V\227\377\202&W\222" "\377\204'V\227\377\5(W\230\377&W\222\377'V\227\377(W\230\377'V\227\377" "\202(W\230\377\202'V\227\377\203(W\230\377\7'V\227\377&W\222\377(W\230" "\377'V\227\377(W\230\377&W\222\377'V\227\377\202(W\230\377\202'V\227" "\377\204&W\222\377\10(W\230\377'V\227\377(W\230\377'V\227\377(W\230\377" "&W\222\377(W\230\377'V\227\377\202&W\222\377\4(W\230\3770\\\236\377\222" "\251\307\377\365\367\363\377\212\355\357\353\377\203\353\356\352\377" "\202\355\357\353\377\10\373\372\361\377\222\251\307\377\30L\223\377(" "W\230\3771U\222\3770\\\236\377\301\314\332\377\365\367\363\377\202\355" "\357\353\377\1\353\356\352\377\206\355\357\353\377\1\353\356\352\377" "\207\355\357\353\377\202\353\356\352\377\204\355\357\353\377\203\353" "\356\352\377\7\367\366\355\377\205\241\304\377\30W\235\377+c\244\377" ".e\247\377#^\236\377%U\226\377\203(W\230\377\3'V\227\377&W\222\377(W" "\230\377\202'V\227\377\4&W\222\377'V\227\377(W\230\377'V\227\377\204" "(W\230\377\202'V\227\377\7(W\230\377&W\222\377(W\230\377&W\222\377(W" "\230\377&W\222\377'V\227\377\202&W\222\377\204'V\227\377\5(W\230\377" "&W\222\377'V\227\377(W\230\377'V\227\377\202(W\230\377\202'V\227\377" "\203(W\230\377\7'V\227\377&W\222\377(W\230\377'V\227\377(W\230\377&W" "\222\377'V\227\377\202(W\230\377\202'V\227\377\204&W\222\377\10(W\230" "\377'V\227\377(W\230\377'V\227\377(W\230\377&W\222\377(W\230\377'V\227" "\377\202&W\222\377\202'V\227\377\202(W\230\377\1'V\227\377\205(W\230" "\377\4&W\222\377(W\230\377'V\227\377(W\230\377\203'V\227\377\1&W\222" "\377\203(W\230\377\4'V\227\377(W\230\377'V\227\377&W\222\377\202'V\227" "\377\6&W\222\377(W\230\377'V\227\377&W\222\377(W\230\377&W\222\377\202" "(W\230\377\3&W\222\377'V\227\377(W\230\377\202'V\227\377\204(W\230\377" "\1&W\222\377\202'V\227\377\12+X\232\377z\202\211\377\254\253\242\377" "\314\313\302\377\330\327\316\377\323\332\317\377\306\306\275\377\242" "\242\231\377u}\205\377\36P\227\377\206(W\230\377\1'V\227\377\207(W\230" "\377\1'V\227\377\257(W\230\377\1'V\227\377\207(W\230\377\10'V\227\377" "(W\230\377\30L\223\377\321\331\342\377\365\367\363\377\356\360\355\377" "\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202\353" "\356\352\377\3\360\362\357\377\77l\243\377\37Q\222\377\202'V\227\377" "\3+X\232\377\262\302\325\377\367\366\355\377\202\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356" "\352\377\1\355\357\353\377\203\353\356\352\377\202\355\357\353\377\202" "\353\356\352\377\203\355\357\353\377\2\353\356\352\377\355\357\353\377" "\202\353\356\352\377\7\355\357\353\377\373\372\361\377\235\261\311\377" "0\\\236\377)a\242\377.e\247\377#^\236\377\202'V\227\377\2(W\230\377'" "V\227\377\207(W\230\377\1'V\227\377\257(W\230\377\1'V\227\377\210(W\230" "\377\1'V\227\377\216(W\230\377\1'V\227\377\227(W\230\377\1'V\227\377" "\206(W\230\377\14%U\226\377+X\232\377z\202\211\377\254\253\242\377\314" "\313\302\377\330\327\316\377\323\332\317\377\301\310\275\377\242\242" "\231\377u}\205\377\36P\227\377(W\230\377\212'V\227\377\1(W\230\377\203" "'V\227\377\202(W\230\377\203'V\227\377\4(W\230\377'V\227\377(W\230\377" "'V\227\377\202(W\230\377\1'V\227\377\202(W\230\377\4'V\227\377&W\222" "\377(W\230\377'V\227\377\203(W\230\377\202'V\227\377\2&W\222\377(W\230" "\377\205'V\227\377\5(W\230\377'V\227\377&W\222\377(W\230\377'V\227\377" "\202(W\230\377\205'V\227\377\203(W\230\377\7'V\227\377(W\230\377'V\227" "\377(W\230\377'V\227\377(W\230\377'V\227\377\204(W\230\377\7'V\227\377" "!R\223\377~\232\275\377\305\316\326\377\351\353\347\377\373\372\361\377" "\365\367\363\377\202\351\353\347\377\1\353\356\352\377\206\355\357\353" "\377\202\353\356\352\377\4\362\364\361\377\262\302\325\377\22I\220\377" "(W\230\377\202'V\227\377\3\13R\227\377\242\266\316\377\373\372\361\377" "\202\353\356\352\377\202\355\357\353\377\202\353\356\352\377\204\355" "\357\353\377\1\353\356\352\377\203\355\357\353\377\1\353\356\352\377" "\212\355\357\353\377\202\353\356\352\377\4\355\357\353\377\373\372\361" "\377\262\302\325\3770\\\236\377\202.e\247\377\3#^\236\377'V\227\377(" "W\230\377\205'V\227\377\1(W\230\377\203'V\227\377\202(W\230\377\203'" "V\227\377\4(W\230\377'V\227\377(W\230\377'V\227\377\202(W\230\377\1'" "V\227\377\202(W\230\377\4'V\227\377&W\222\377(W\230\377'V\227\377\203" "(W\230\377\202'V\227\377\2&W\222\377(W\230\377\205'V\227\377\5(W\230" "\377'V\227\377&W\222\377(W\230\377'V\227\377\202(W\230\377\205'V\227" "\377\203(W\230\377\7'V\227\377(W\230\377'V\227\377(W\230\377'V\227\377" "(W\230\377'V\227\377\203(W\230\377\2&W\222\377(W\230\377\202'V\227\377" "\2(W\230\377'V\227\377\203(W\230\377\2'V\227\377(W\230\377\203'V\227" "\377\1(W\230\377\210'V\227\377\203(W\230\377\204'V\227\377\1(W\230\377" "\204'V\227\377\202(W\230\377\202'V\227\377\1(W\230\377\202'V\227\377" "\2(W\230\377'V\227\377\202(W\230\377\14'V\227\377%U\226\377+X\232\377" "z\202\211\377\254\253\242\377\314\313\302\377\330\327\316\377\323\332" "\317\377\301\310\275\377\242\242\231\377u}\205\377\36P\227\377\311(W" "\230\377\13\32N\217\377\27M\215\377\77l\243\377o\217\267\377\246\265" "\311\377\351\353\347\377\365\367\363\377\367\366\355\377\360\362\357" "\377\355\357\353\377\353\356\352\377\202\355\357\353\377\6\353\356\352" "\377\355\357\353\377\356\360\355\377\360\362\357\377\77l\243\377$T\225" "\377\202(W\230\377\6'V\227\377\30L\223\377\205\241\304\377\373\372\361" "\377\355\357\353\377\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\206\355\357\353\377\202\353\356\352\377\202\355\357" "\353\377\1\353\356\352\377\202\355\357\353\377\3\351\353\347\377\372" "\371\357\377\262\302\325\377\202)a\242\377\3.e\247\377#^\236\377%U\226" "\377\357(W\230\377\13%U\226\377+X\232\377z\202\211\377\254\253\242\377" "\314\313\302\377\330\327\316\377\323\332\317\377\301\310\275\377\242" "\242\231\377u}\205\377\13R\227\377\312'V\227\377\2%U\226\377\37Q\222" "\377\202\32N\217\377\7!R\223\377b\200\256\377\246\265\311\377\321\331" "\342\377\372\371\357\377\367\366\355\377\355\357\353\377\203\353\356" "\352\377\3\376\375\364\377~\232\275\377\32N\217\377\204'V\227\377\4\32" "N\217\377g\216\273\377\362\364\361\377\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353" "\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355\357\353\377" "\1\353\356\352\377\204\355\357\353\377\205\353\356\352\377\5\355\357" "\353\377\353\356\352\377\372\371\357\377\301\314\332\377)a\242\377\202" ".e\247\377\2\40\\\234\377%U\226\377\356'V\227\377\13%U\226\377+X\232" "\377z\202\211\377\254\253\242\377\306\314\302\377\330\327\316\377\323" "\332\317\377\301\310\275\377\242\242\231\377u}\205\377\36P\227\377\315" "%U\226\377\16&W\222\377(Y\224\377\36P\221\377\30L\223\377,[\227\377N" "s\245\377\214\244\302\377\333\341\343\377\360\362\357\377\373\372\361" "\377\351\353\347\377v\221\264\377\34O\220\377&W\222\377\204%U\226\377" "\5\36P\221\377Uy\253\377\356\360\355\377\355\357\353\377\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\203\353\356\352\377\203\355\357\353" "\377\1\353\356\352\377\202\355\357\353\377\202\353\356\352\377\1\355" "\357\353\377\205\353\356\352\377\4\355\357\353\377\351\353\347\377\372" "\371\357\377\274\310\325\377\202)a\242\377\4.e\247\377\36[\233\377$T" "\225\377'V\227\377\354%U\226\377\14$T\225\377+X\232\377}\201\204\377" "\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\301" "\310\275\377\242\242\231\377u}\205\377\36P\227\377'V\227\377\202%U\226" "\377\3'V\227\377%U\226\377'V\227\377\205%U\226\377\1'V\227\377\203%U" "\226\377\2'V\227\377%U\226\377\202'V\227\377\202%U\226\377\203'V\227" "\377\3%U\226\377'V\227\3771U\222\377\203'V\227\377\204%U\226\377\1'V" "\227\377\202%U\226\377\1'V\227\377\202%U\226\377\1'V\227\377\202%U\226" "\377\1&W\222\377\203%U\226\377\202'V\227\377\2%U\226\377'V\227\377\202" "%U\226\377\202'V\227\377\203%U\226\377\202'V\227\377\203%U\226\377\1" "'V\227\377\202%U\226\377\202'V\227\377\206%U\226\377\2""1U\222\377%U" "\226\377\202'V\227\377\16%U\226\377'V\227\377%U\226\377$T\225\377\37" "Q\222\377#I\213\377\30L\223\377\77l\243\377~\232\275\3774a\235\377#I" "\213\377%U\226\377'V\227\3771U\222\377\202%U\226\377\5'V\227\377!R\223" "\377$_\237\377\351\353\347\377\355\357\353\377\202\353\356\352\377\1" "\355\357\353\377\202\353\356\352\377\203\355\357\353\377\206\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377" "\206\353\356\352\377\16\355\357\353\377\353\356\352\377\355\357\353\377" "\353\356\352\377\372\371\357\377\262\302\325\377&`\240\377+c\244\377" ".e\247\377\32Y\231\377%U\226\377'V\227\377%U\226\377'V\227\377\203%U" "\226\377\2'V\227\377%U\226\377\202'V\227\377\202%U\226\377\203'V\227" "\377\3%U\226\377'V\227\3771U\222\377\203'V\227\377\204%U\226\377\1'V" "\227\377\202%U\226\377\1'V\227\377\202%U\226\377\1'V\227\377\202%U\226" "\377\1&W\222\377\203%U\226\377\202'V\227\377\2%U\226\377'V\227\377\202" "%U\226\377\202'V\227\377\203%U\226\377\202'V\227\377\203%U\226\377\1" "'V\227\377\202%U\226\377\202'V\227\377\206%U\226\377\2""1U\222\377%U" "\226\377\202'V\227\377\1%U\226\377\203'V\227\377\202%U\226\377\1'V\227" "\377\203%U\226\377\1'V\227\377\202%U\226\377\1""1U\222\377\202%U\226" "\377\202'V\227\377\202%U\226\377\2'V\227\3771U\222\377\202%U\226\377" "\3'V\227\3771U\222\377%U\226\377\202'V\227\377\2%U\226\377'V\227\377" "\202%U\226\377\205'V\227\377\23%U\226\377$T\225\377+X\232\377}\201\204" "\377\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377" "\301\310\275\377\242\242\231\377u}\205\377\36P\227\377'V\227\377&W\222" "\377%U\226\377'V\227\377%U\226\377'V\227\377&W\222\377\202%U\226\377" "\3&W\222\377%U\226\377'V\227\377\203%U\226\377\204'V\227\377\2%U\226" "\377&W\222\377\205'V\227\377\1""1U\222\377\203'V\227\377\204%U\226\377" "\202'V\227\377\2&W\222\377'V\227\377\202%U\226\377\4'V\227\377&W\222" "\377%U\226\3771U\222\377\203%U\226\377\202'V\227\377\2%U\226\377'V\227" "\377\202%U\226\377\202'V\227\377\202%U\226\377\203'V\227\377\203%U\226" "\377\1'V\227\377\202%U\226\377\202'V\227\377\1&W\222\377\205%U\226\377" "\17""1U\222\377%U\226\3771U\222\377'V\227\377%U\226\377'V\227\3771U\222" "\377'V\227\377%U\226\377'V\227\377%U\226\377\36P\221\377\22I\220\377" "!R\223\377'V\227\377\202%U\226\377\1""1U\222\377\202%U\226\377\5'V\227" "\3770T\221\377\36P\227\377\321\331\342\377\356\360\355\377\210\355\357" "\353\377\1\353\356\352\377\210\355\357\353\377\1\353\356\352\377\207" "\355\357\353\377\1\353\356\352\377\202\355\357\353\377\2\353\356\352" "\377\355\357\353\377\202\353\356\352\377\3\373\372\361\377\242\266\316" "\377-Z\234\377\202.e\247\377\2(W\230\377%U\226\377\202'V\227\377\203" "%U\226\377\204'V\227\377\2%U\226\377&W\222\377\205'V\227\377\1""1U\222" "\377\203'V\227\377\204%U\226\377\202'V\227\377\2&W\222\377'V\227\377" "\202%U\226\377\4'V\227\377&W\222\377%U\226\3771U\222\377\203%U\226\377" "\202'V\227\377\2%U\226\377'V\227\377\202%U\226\377\202'V\227\377\202" "%U\226\377\203'V\227\377\203%U\226\377\1'V\227\377\202%U\226\377\202" "'V\227\377\1&W\222\377\205%U\226\377\10""1U\222\377%U\226\3771U\222\377" "'V\227\377%U\226\377'V\227\3771U\222\377'V\227\377\202%U\226\377\1'V" "\227\377\203%U\226\377\1'V\227\377\202%U\226\377\1""1U\222\377\202%U" "\226\377\202'V\227\377\202%U\226\377\2'V\227\3771U\222\377\202%U\226" "\377\7'V\227\3771U\222\377%U\226\3771U\222\377'V\227\377%U\226\377'V" "\227\377\202%U\226\377\205'V\227\377\15%U\226\377$T\225\377+X\232\377" "}\201\204\377\254\253\242\377\306\314\302\377\330\327\316\377\323\332" "\317\377\301\310\275\377\242\242\231\377u}\205\377\36P\227\377'V\227" "\377\202&W\222\377\2'V\227\377%U\226\377\202&W\222\377\202%U\226\377" "\202&W\222\377\7'V\227\377&W\222\377%U\226\377'V\227\377&W\222\377%U" "\226\377'V\227\377\203&W\222\377\203'V\227\377\1%U\226\377\202&W\222" "\377\202'V\227\377\2&W\222\377%U\226\377\203&W\222\377\3'V\227\377%U" "\226\377'V\227\377\202&W\222\377\1%U\226\377\202&W\222\377\2'V\227\377" "&W\222\377\202%U\226\377\202&W\222\377\1'V\227\377\205&W\222\377\4'V" "\227\377%U\226\377&W\222\377%U\226\377\202&W\222\377\202%U\226\377\202" "&W\222\377\202%U\226\377\203&W\222\377\205%U\226\377\203&W\222\377\10" "'V\227\377%U\226\377'V\227\377&W\222\377'V\227\377%U\226\377&W\222\377" "'V\227\377\204&W\222\377\202%U\226\377\202&W\222\377\203%U\226\377\3" "\37Q\222\377\242\266\316\377\362\364\361\377\205\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\1\355\357\353\377\204\353\356\352" "\377\1\355\357\353\377\202\353\356\352\377\202\355\357\353\377\211\353" "\356\352\377\1\355\357\353\377\203\353\356\352\377\16\373\372\361\377" "\226\255\313\377\35Y\240\377.e\247\377+c\244\377'V\227\377%U\226\377" "'V\227\377&W\222\377%U\226\377'V\227\377&W\222\377%U\226\377'V\227\377" "\203&W\222\377\203'V\227\377\1%U\226\377\202&W\222\377\202'V\227\377" "\2&W\222\377%U\226\377\203&W\222\377\3'V\227\377%U\226\377'V\227\377" "\202&W\222\377\1%U\226\377\202&W\222\377\2'V\227\377&W\222\377\202%U" "\226\377\202&W\222\377\1'V\227\377\205&W\222\377\4'V\227\377%U\226\377" "&W\222\377%U\226\377\202&W\222\377\202%U\226\377\202&W\222\377\202%U" "\226\377\203&W\222\377\205%U\226\377\203&W\222\377\10'V\227\377%U\226" "\377'V\227\377&W\222\377'V\227\377%U\226\377&W\222\377'V\227\377\204" "&W\222\377\202%U\226\377\202&W\222\377\5%U\226\377'V\227\3771U\222\377" "&W\222\377'V\227\377\202&W\222\377\202%U\226\377\5'V\227\377&W\222\377" "%U\226\3771U\222\377'V\227\377\203&W\222\377\1%U\226\377\202&W\222\377" "\202'V\227\377\16""1U\222\377%U\226\377$T\225\377+X\232\377}\201\204" "\377\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377" "\301\310\275\377\242\242\231\377u}\205\377\36P\227\377'V\227\377\202" "%U\226\377\3'V\227\377%U\226\377'V\227\377\205%U\226\377\1'V\227\377" "\203%U\226\377\2'V\227\377%U\226\377\202'V\227\377\202%U\226\377\203" "'V\227\377\1%U\226\377\205'V\227\377\204%U\226\377\1'V\227\377\202%U" "\226\377\1'V\227\377\202%U\226\377\1'V\227\377\202%U\226\377\1'V\227" "\377\203%U\226\377\202'V\227\377\2%U\226\377'V\227\377\202%U\226\377" "\202'V\227\377\203%U\226\377\202'V\227\377\203%U\226\377\1'V\227\377" "\202%U\226\377\202'V\227\377\206%U\226\377\2'V\227\377%U\226\377\202" "'V\227\377\1%U\226\377\203'V\227\377\202%U\226\377\1'V\227\377\203%U" "\226\377\1'V\227\377\202%U\226\377\1'V\227\377\202%U\226\377\5'V\227" "\377%U\226\377\37Q\222\377o\217\267\377\373\372\361\377\202\353\356\352" "\377\206\355\357\353\377\1\353\356\352\377\207\355\357\353\377\202\353" "\356\352\377\203\355\357\353\377\202\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\203\353\356\352\377\10\355\357\353\377\372\371\357\377\205\241\304" "\377\35Y\240\3771g\251\377)a\242\377%U\226\377'V\227\377\203%U\226\377" "\2'V\227\377%U\226\377\202'V\227\377\202%U\226\377\203'V\227\377\1%U" "\226\377\205'V\227\377\204%U\226\377\1'V\227\377\202%U\226\377\1'V\227" "\377\202%U\226\377\1'V\227\377\202%U\226\377\1'V\227\377\203%U\226\377" "\202'V\227\377\2%U\226\377'V\227\377\202%U\226\377\202'V\227\377\203" "%U\226\377\202'V\227\377\203%U\226\377\1'V\227\377\202%U\226\377\202" "'V\227\377\206%U\226\377\2'V\227\377%U\226\377\202'V\227\377\1%U\226" "\377\203'V\227\377\202%U\226\377\1'V\227\377\203%U\226\377\1'V\227\377" "\202%U\226\377\1'V\227\377\202%U\226\377\202'V\227\377\202%U\226\377" "\202'V\227\377\202%U\226\377\202'V\227\377\1%U\226\377\202'V\227\377" "\2%U\226\377'V\227\377\202%U\226\377\205'V\227\377\15%U\226\377$T\225" "\377+X\232\377z\202\211\377\254\253\242\377\306\314\302\377\330\327\316" "\377\323\332\317\377\301\310\275\377\242\242\231\377u}\205\377\36P\227" "\377'V\227\377\202&W\222\377\4'V\227\377%U\226\377&W\222\3771U\222\377" "\202%U\226\377\202&W\222\377\5'V\227\377&W\222\377%U\226\377'V\227\377" "&W\222\377\202'V\227\377\1&W\222\377\2021U\222\377\204'V\227\377\2""1" "U\222\377&W\222\377\202'V\227\377\2&W\222\377%U\226\377\2021U\222\377" "\1&W\222\377\203'V\227\377\202&W\222\377\1%U\226\377\202&W\222\377\7" "'V\227\377&W\222\377%U\226\377'V\227\377&W\222\3771U\222\377'V\227\377" "\205&W\222\377\3'V\227\377%U\226\377&W\222\377\203'V\227\377\202%U\226" "\377\202&W\222\377\3%U\226\377'V\227\377&W\222\377\2021U\222\377\1'V" "\227\377\204%U\226\377\202&W\222\377\207'V\227\377\2&W\222\377'V\227" "\377\204&W\222\377\202%U\226\377\202&W\222\377\1%U\226\377\202'V\227" "\377\4!R\223\377Fs\252\377\362\364\361\377\356\360\355\377\204\353\356" "\352\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\204" "\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353" "\377\211\353\356\352\377\1\355\357\353\377\204\353\356\352\377\7\351" "\353\347\377\367\366\355\377c\212\267\377\40[\241\377.e\247\377$_\237" "\377$T\225\377\202%U\226\377\2'V\227\377&W\222\377\202'V\227\377\1&W" "\222\377\2021U\222\377\204'V\227\377\2""1U\222\377&W\222\377\202'V\227" "\377\2&W\222\377%U\226\377\2021U\222\377\1&W\222\377\203'V\227\377\202" "&W\222\377\1%U\226\377\202&W\222\377\7'V\227\377&W\222\377%U\226\377" "'V\227\377&W\222\3771U\222\377'V\227\377\205&W\222\377\3'V\227\377%U" "\226\377&W\222\377\203'V\227\377\202%U\226\377\202&W\222\377\3%U\226" "\377'V\227\377&W\222\377\2021U\222\377\1'V\227\377\204%U\226\377\202" "&W\222\377\207'V\227\377\2&W\222\377'V\227\377\204&W\222\377\202%U\226" "\377\202&W\222\377\1%U\226\377\202'V\227\377\2&W\222\377'V\227\377\202" "&W\222\377\202%U\226\377\2'V\227\377&W\222\377\203'V\227\377\6""1U\222" "\377&W\222\3771U\222\377%U\226\3771U\222\377&W\222\377\203'V\227\377" "\16%U\226\377$T\225\377,Y\233\377z\202\211\377\254\253\242\377\306\314" "\302\377\330\327\316\377\323\332\317\377\301\310\275\377\242\242\231" "\377u}\205\377\36P\227\377%U\226\377'V\227\377\203%U\226\377\202'V\227" "\377\202%U\226\377\3'V\227\377%U\226\377'V\227\377\204%U\226\377\10'" "V\227\377%U\226\377'V\227\377%U\226\377'V\227\377%U\226\377'V\227\377" "%U\226\377\202'V\227\377\1%U\226\377\202'V\227\377\206%U\226\377\202" "'V\227\377\204%U\226\377\3'V\227\377%U\226\377'V\227\377\211%U\226\377" "\1'V\227\377\203%U\226\377\203'V\227\377\207%U\226\377\202'V\227\377" "\205%U\226\377\3'V\227\377%U\226\377'V\227\377\203%U\226\377\1'V\227" "\377\212%U\226\377\1'V\227\377\202%U\226\377\202'V\227\377\5!R\223\377" "4a\235\377\325\336\346\377\360\362\357\377\355\357\353\377\203\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\202" "\353\356\352\377\2\355\357\353\377\353\356\352\377\203\355\357\353\377" "\203\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353\377" "\202\353\356\352\377\202\355\357\353\377\205\353\356\352\377\7\360\362" "\357\377\355\357\353\377[\177\262\3770\\\236\377.e\247\377-Z\234\377" "$T\225\377\202'V\227\377\11%U\226\377'V\227\377%U\226\377'V\227\377%" "U\226\377'V\227\377%U\226\377'V\227\377%U\226\377\202'V\227\377\1%U\226" "\377\202'V\227\377\206%U\226\377\202'V\227\377\204%U\226\377\3'V\227" "\377%U\226\377'V\227\377\211%U\226\377\1'V\227\377\203%U\226\377\203" "'V\227\377\207%U\226\377\202'V\227\377\205%U\226\377\3'V\227\377%U\226" "\377'V\227\377\203%U\226\377\1'V\227\377\212%U\226\377\1'V\227\377\202" "%U\226\377\202'V\227\377\202%U\226\377\1'V\227\377\207%U\226\377\1'V" "\227\377\205%U\226\377\1'V\227\377\202%U\226\377\15'V\227\377%U\226\377" "$T\225\377,Y\233\377}\201\204\377\254\253\242\377\306\314\302\377\330" "\327\316\377\323\332\317\377\301\310\275\377\242\242\231\377u}\205\377" "\36P\227\377\202&W\222\377\1%U\226\377\207&W\222\377\5%U\226\377&W\222" "\377%U\226\377&W\222\377%U\226\377\204&W\222\377\1%U\226\377\212&W\222" "\377\204%U\226\377\204&W\222\377\1%U\226\377\203&W\222\377\1%U\226\377" "\203&W\222\377\1%U\226\377\202&W\222\377\2%U\226\377&W\222\377\202%U" "\226\377\202&W\222\377\202%U\226\377\203&W\222\377\5%U\226\377&W\222" "\377%U\226\377&W\222\377%U\226\377\206&W\222\377\202%U\226\377\202&W" "\222\377\1%U\226\377\207&W\222\377\2%U\226\377&W\222\377\203%U\226\377" "\204&W\222\377\1%U\226\377\203&W\222\377\4%U\226\377!R\223\377\267\306" "\332\377\367\366\355\377\202\355\357\353\377\202\353\356\352\377\203" "\355\357\353\377\202\353\356\352\377\203\355\357\353\377\1\353\356\352" "\377\202\355\357\353\377\202\353\356\352\377\203\355\357\353\377\202" "\353\356\352\377\1\355\357\353\377\203\353\356\352\377\3\355\357\353" "\377\353\356\352\377\355\357\353\377\202\353\356\352\377\1\355\357\353" "\377\203\353\356\352\377\7\356\360\355\377\340\345\350\377=h\245\377" "0\\\236\377.e\247\377+X\232\377%U\226\377\205&W\222\377\1%U\226\377\212" "&W\222\377\204%U\226\377\204&W\222\377\1%U\226\377\203&W\222\377\1%U" "\226\377\203&W\222\377\1%U\226\377\202&W\222\377\2%U\226\377&W\222\377" "\202%U\226\377\202&W\222\377\202%U\226\377\203&W\222\377\5%U\226\377" "&W\222\377%U\226\377&W\222\377%U\226\377\206&W\222\377\202%U\226\377" "\202&W\222\377\1%U\226\377\207&W\222\377\2%U\226\377&W\222\377\203%U" "\226\377\204&W\222\377\1%U\226\377\203&W\222\377\202%U\226\377\202&W" "\222\377\1%U\226\377\206&W\222\377\3%U\226\377&W\222\377%U\226\377\206" "&W\222\377\14%U\226\377$T\225\377,Y\233\377z\202\211\377\254\253\242" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\242\242\231\377u}\205\377\13R\227\377\340&W\222\377\6""0T\221\377\32" "N\217\377\205\241\304\377\367\366\355\377\353\356\352\377\355\357\353" "\377\213\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\217\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357\353" "\377\202\353\356\352\377\3\365\367\363\377\321\331\342\3770\\\236\377" "\202.e\247\377\2&W\222\3770T\221\377\346&W\222\377\13/S\220\377,Y\233" "\377\200\204\207\377\254\253\242\377\306\314\302\377\330\327\316\377" "\323\332\317\377\306\306\275\377\242\242\231\377u}\205\377\36P\227\377" "\204%U\226\377\1""0T\221\377\202%U\226\377\3""0T\221\377%U\226\3770T" "\221\377\204%U\226\377\3""0T\221\377%U\226\3770T\221\377\205%U\226\377" "\3""0T\221\377%U\226\3770T\221\377\202%U\226\377\2""0T\221\377%U\226" "\377\2020T\221\377\212%U\226\377\1""0T\221\377\203%U\226\377\1""0T\221" "\377\217%U\226\377\2020T\221\377\202%U\226\377\1""0T\221\377\203%U\226" "\377\4""0T\221\377%U\226\3770T\221\377%U\226\377\2020T\221\377\202%U" "\226\377\2020T\221\377\2%U\226\3770T\221\377\206%U\226\377\1""0T\221" "\377\202%U\226\377\2030T\221\377\203%U\226\377\5$T\225\377!R\223\377" "Mx\260\377\362\364\361\377\351\353\347\377\243\355\357\353\377\6\353" "\356\352\377\375\365\355\377\262\302\325\3770\\\236\377.e\247\3774a\235" "\377\202$T\225\377\1""0T\221\377\205%U\226\377\3""0T\221\377%U\226\377" "0T\221\377\202%U\226\377\2""0T\221\377%U\226\377\2020T\221\377\212%U" "\226\377\1""0T\221\377\203%U\226\377\1""0T\221\377\217%U\226\377\202" "0T\221\377\202%U\226\377\1""0T\221\377\203%U\226\377\4""0T\221\377%U" "\226\3770T\221\377%U\226\377\2020T\221\377\202%U\226\377\2020T\221\377" "\2%U\226\3770T\221\377\206%U\226\377\1""0T\221\377\202%U\226\377\203" "0T\221\377\210%U\226\377\2020T\221\377\2%U\226\3770T\221\377\205%U\226" "\377\1""0T\221\377\206%U\226\377\13!R\223\377+X\232\377\200\204\207\377" "\254\253\242\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\242\242\231\377u}\205\377\36P\227\377\204%U\226\377\1""0" "T\221\377\202%U\226\377\3""0T\221\377%U\226\3770T\221\377\204%U\226\377" "\1""0T\221\377\216%U\226\377\2020T\221\377\212%U\226\377\1""0T\221\377" "\203%U\226\377\1""0T\221\377\217%U\226\377\1""0T\221\377\203%U\226\377" "\1""0T\221\377\203%U\226\377\4""0T\221\377%U\226\3770T\221\377%U\226" "\377\2020T\221\377\202%U\226\377\2020T\221\377\2%U\226\3770T\221\377" "\206%U\226\377\1""0T\221\377\202%U\226\377\2030T\221\377\203%U\226\377" "\6""0T\221\3771U\222\377'V\227\377\351\353\347\377\353\356\352\377\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\202\353\356\352" "\377\1\355\357\353\377\203\353\356\352\377\203\355\357\353\377\1\353" "\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\206\353\356\352\377\202\355\357\353\377\5\353\356\352\377\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\203\355\357\353" "\377\6\365\367\363\377\205\241\304\377\35Y\240\3771g\251\377#^\236\377" "!R\223\377\215%U\226\377\2020T\221\377\212%U\226\377\1""0T\221\377\203" "%U\226\377\1""0T\221\377\217%U\226\377\1""0T\221\377\203%U\226\377\1" "0T\221\377\203%U\226\377\4""0T\221\377%U\226\3770T\221\377%U\226\377" "\2020T\221\377\202%U\226\377\2020T\221\377\2%U\226\3770T\221\377\206" "%U\226\377\1""0T\221\377\202%U\226\377\2030T\221\377\210%U\226\377\202" "0T\221\377\2%U\226\3770T\221\377\205%U\226\377\1""0T\221\377\206%U\226" "\377\22!R\223\377+X\232\377\200\204\207\377\254\253\242\377\306\314\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377" "u}\205\377\36P\227\377%U\226\377$T\225\3770T\221\377%U\226\377$T\225" "\377%U\226\377$T\225\377\202%U\226\377\202$T\225\377\5%U\226\377$T\225" "\377%U\226\377$T\225\377%U\226\377\202$T\225\377\5%U\226\377$T\225\377" "0T\221\377%U\226\377$T\225\377\202%U\226\377\202$T\225\377\202%U\226" "\377\203$T\225\377\2""0T\221\377$T\225\377\202%U\226\377\2$T\225\377" "%U\226\377\202$T\225\377\1%U\226\377\204$T\225\377\1%U\226\377\202$T" "\225\377\3%U\226\377$T\225\377%U\226\377\202$T\225\377\202%U\226\377" "\203$T\225\377\204%U\226\377\3$T\225\377%U\226\377$T\225\377\203%U\226" "\377\1""0T\221\377\202%U\226\377\204$T\225\377\1""0T\221\377\202%U\226" "\377\3$T\225\377%U\226\377$T\225\377\202%U\226\377\202$T\225\377\1""0" "T\221\377\203$T\225\377\203%U\226\377\1$T\225\377\204%U\226\377\5""1" "U\222\377\34O\220\377\262\302\325\377\360\362\357\377\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\202\353\356\352\377\203\355" "\357\353\377\5\353\356\352\377\355\357\353\377\353\356\352\377\355\357" "\353\377\353\356\352\377\202\355\357\353\377\203\353\356\352\377\1\355" "\357\353\377\205\353\356\352\377\1\355\357\353\377\202\353\356\352\377" "\4\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\6\367\366\355\377[\177\262\3770" "\\\236\377.e\247\377\32Y\231\377$T\225\377\202%U\226\377\4$T\225\377" "0T\221\377%U\226\377$T\225\377\202%U\226\377\202$T\225\377\202%U\226" "\377\203$T\225\377\2""0T\221\377$T\225\377\202%U\226\377\2$T\225\377" "%U\226\377\202$T\225\377\1%U\226\377\204$T\225\377\1%U\226\377\202$T" "\225\377\3%U\226\377$T\225\377%U\226\377\202$T\225\377\202%U\226\377" "\203$T\225\377\204%U\226\377\3$T\225\377%U\226\377$T\225\377\203%U\226" "\377\1""0T\221\377\202%U\226\377\204$T\225\377\1""0T\221\377\202%U\226" "\377\3$T\225\377%U\226\377$T\225\377\202%U\226\377\202$T\225\377\1""0" "T\221\377\203$T\225\377\203%U\226\377\1$T\225\377\203%U\226\377\2$T\225" "\3770T\221\377\202%U\226\377\202$T\225\377\203%U\226\377\4$T\225\377" "%U\226\377$T\225\377%U\226\377\202$T\225\377\203%U\226\377\16$T\225\377" "%U\226\377$T\225\377!R\223\377,Y\233\377\200\204\207\377\255\254\243" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\242\242\231\377u}\205\377\36P\227\377\204%U\226\377\1$T\225\377\205" "%U\226\377\5$T\225\377%U\226\377$T\225\377%U\226\377$T\225\377\202%U" "\226\377\1$T\225\377\207%U\226\377\202$T\225\377\202%U\226\377\1$T\225" "\377\211%U\226\377\1$T\225\377\203%U\226\377\202$T\225\377\202%U\226" "\377\1$T\225\377\210%U\226\377\1$T\225\377\205%U\226\377\3$T\225\377" "%U\226\377$T\225\377\206%U\226\377\2""0T\221\377%U\226\377\202$T\225" "\377\203%U\226\377\3$T\225\377%U\226\377$T\225\377\203%U\226\377\5$T" "\225\377%U\226\377$T\225\377%U\226\377$T\225\377\203%U\226\377\1$T\225" "\377\205%U\226\377\3\32N\217\377v\227\277\377\373\372\361\377\210\353" "\356\352\377\1\355\357\353\377\203\353\356\352\377\11\355\357\353\377" "\353\356\352\377\360\362\357\377\372\371\357\377\356\360\355\377\353" "\356\352\377\355\357\353\377\353\356\352\377\355\357\353\377\207\353" "\356\352\377\5\355\357\353\377\353\356\352\377\355\357\353\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\203\355\357\353\377\7\356" "\360\355\377\333\341\343\377=h\245\377)a\242\3779e\242\377&W\222\377" "$T\225\377\207%U\226\377\202$T\225\377\202%U\226\377\1$T\225\377\211" "%U\226\377\1$T\225\377\203%U\226\377\202$T\225\377\202%U\226\377\1$T" "\225\377\210%U\226\377\1$T\225\377\205%U\226\377\3$T\225\377%U\226\377" "$T\225\377\206%U\226\377\2""0T\221\377%U\226\377\202$T\225\377\203%U" "\226\377\3$T\225\377%U\226\377$T\225\377\203%U\226\377\5$T\225\377%U" "\226\377$T\225\377%U\226\377$T\225\377\203%U\226\377\1$T\225\377\210" "%U\226\377\1$T\225\377\203%U\226\377\3$T\225\377%U\226\377$T\225\377" "\202%U\226\377\1$T\225\377\203%U\226\377\1$T\225\377\202%U\226\377\16" "!R\223\377,Y\233\377\200\204\207\377\255\254\243\377\306\314\302\377" "\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377p\177" "\205\377\36P\227\377%U\226\377$T\225\3770T\221\377\202$T\225\377\3""0" "T\221\377$T\225\377%U\226\377\203$T\225\377\1%U\226\377\210$T\225\377" "\3""0T\221\377%U\226\377$T\225\377\202%U\226\377\202$T\225\377\202%U" "\226\377\203$T\225\377\1""0T\221\377\202$T\225\377\1%U\226\377\211$T" "\225\377\1%U\226\377\202$T\225\377\3%U\226\377$T\225\3770T\221\377\203" "$T\225\377\1%U\226\377\203$T\225\377\202%U\226\377\2$T\225\377%U\226" "\377\203$T\225\377\2%U\226\377$T\225\377\2020T\221\377\1%U\226\377\205" "$T\225\377\1""0T\221\377\202%U\226\377\5$T\225\3770T\221\377$T\225\377" "0T\221\377%U\226\377\202$T\225\377\1""0T\221\377\204$T\225\377\1""0T" "\221\377\203$T\225\377\202%U\226\377\10$T\225\377%U\226\377\34O\220\377" "Uy\253\377\355\357\353\377\356\360\355\377\355\357\353\377\353\356\352" "\377\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\202\353" "\356\352\377\6\360\362\357\377\340\345\350\377\235\261\311\377\360\362" "\357\377\365\367\363\377\356\360\355\377\202\353\356\352\377\7\355\357" "\353\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357\353" "\377\353\356\352\377\355\357\353\377\204\353\356\352\377\3\355\357\353" "\377\353\356\352\377\355\357\353\377\202\353\356\352\377\10\355\357\353" "\377\353\356\352\377\365\367\363\377\301\314\332\3770\\\236\377.e\247" "\377)a\242\377!R\223\377\202%U\226\377\3""0T\221\377%U\226\377$T\225" "\377\202%U\226\377\202$T\225\377\202%U\226\377\203$T\225\377\1""0T\221" "\377\202$T\225\377\1%U\226\377\211$T\225\377\1%U\226\377\202$T\225\377" "\3%U\226\377$T\225\3770T\221\377\203$T\225\377\1%U\226\377\203$T\225" "\377\202%U\226\377\2$T\225\377%U\226\377\203$T\225\377\2%U\226\377$T" "\225\377\2020T\221\377\1%U\226\377\205$T\225\377\1""0T\221\377\202%U" "\226\377\5$T\225\3770T\221\377$T\225\3770T\221\377%U\226\377\202$T\225" "\377\1""0T\221\377\204$T\225\377\1""0T\221\377\203$T\225\377\202%U\226" "\377\2$T\225\3770T\221\377\206$T\225\377\5%U\226\377$T\225\377%U\226" "\377$T\225\3770T\221\377\203$T\225\377\1""0T\221\377\202$T\225\377\16" "%U\226\377$T\225\377!R\223\377,Y\233\377\200\204\207\377\254\253\242" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\242\242\231\377p\177\205\377\36P\227\377%U\226\377\206$T\225\377\1%" "U\226\377\203$T\225\377\1%U\226\377\204$T\225\377\1%U\226\377\204$T\225" "\377\204%U\226\377\202$T\225\377\202%U\226\377\206$T\225\377\1%U\226" "\377\211$T\225\377\1%U\226\377\202$T\225\377\1%U\226\377\205$T\225\377" "\1%U\226\377\202$T\225\377\203%U\226\377\2$T\225\377%U\226\377\203$T" "\225\377\1%U\226\377\202$T\225\377\2""0T\221\377%U\226\377\206$T\225" "\377\203%U\226\377\6$T\225\377%U\226\377$T\225\377%U\226\377$T\225\377" "%U\226\377\211$T\225\377\202%U\226\377\10$T\225\377%U\226\377!R\223\377" "\40\\\234\377\321\331\342\377\360\362\357\377\355\357\353\377\353\356" "\352\377\203\355\357\353\377\202\353\356\352\377\1\355\357\353\377\203" "\353\356\352\377\13\355\357\353\377\351\353\347\377[\177\262\377#R\231" "\3779e\242\377\246\265\311\377\351\353\347\377\365\367\363\377\351\353" "\347\377\353\356\352\377\355\357\353\377\204\353\356\352\377\1\355\357" "\353\377\204\353\356\352\377\3\355\357\353\377\353\356\352\377\355\357" "\353\377\203\353\356\352\377\12\355\357\353\377\351\353\347\377\373\372" "\361\377\226\255\313\377\35Y\240\377.e\247\377#^\236\377!R\223\3770T" "\221\377$T\225\377\204%U\226\377\202$T\225\377\202%U\226\377\206$T\225" "\377\1%U\226\377\211$T\225\377\1%U\226\377\202$T\225\377\1%U\226\377" "\205$T\225\377\1%U\226\377\202$T\225\377\203%U\226\377\2$T\225\377%U" "\226\377\203$T\225\377\1%U\226\377\202$T\225\377\2""0T\221\377%U\226" "\377\206$T\225\377\203%U\226\377\6$T\225\377%U\226\377$T\225\377%U\226" "\377$T\225\377%U\226\377\211$T\225\377\202%U\226\377\210$T\225\377\203" "%U\226\377\207$T\225\377\202%U\226\377\14$T\225\377!R\223\377-Z\234\377" "\200\204\207\377\255\254\243\377\306\314\302\377\330\327\316\377\323" "\332\317\377\306\306\275\377\242\242\231\377p\177\205\377\36P\227\377" "\206%U\226\377\1$T\225\377\203%U\226\377\5$T\225\377%U\226\377$T\225" "\377%U\226\377$T\225\377\251%U\226\377\1$T\225\377\205%U\226\377\3$T" "\225\377%U\226\377$T\225\377\206%U\226\377\1$T\225\377\216%U\226\377" "\1$T\225\377\205%U\226\377\1$T\225\377\205%U\226\377\5$T\225\377\30L" "\223\377\255\274\320\377\362\364\361\377\353\356\352\377\210\355\357" "\353\377\14\353\356\352\377\356\360\355\377\362\364\361\377[\177\262" "\377\35Y\240\377Mx\260\377%U\226\377\22I\220\377\77l\243\377\262\302" "\325\377\373\372\361\377\362\364\361\377\204\355\357\353\377\1\353\356" "\352\377\202\355\357\353\377\1\353\356\352\377\203\355\357\353\377\1" "\353\356\352\377\207\355\357\353\377\6\365\367\363\377V\204\265\3770" "\\\236\377.e\247\377+X\232\377/S\220\377\244%U\226\377\1$T\225\377\205" "%U\226\377\3$T\225\377%U\226\377$T\225\377\206%U\226\377\1$T\225\377" "\216%U\226\377\1$T\225\377\205%U\226\377\1$T\225\377\216%U\226\377\1" "$T\225\377\211%U\226\377\13!R\223\377-Z\234\377\200\204\207\377\255\254" "\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275" "\377\242\242\231\377p\177\205\377\36P\227\377\3420T\221\377\5$T\225\377" "\36P\221\377o\217\267\377\367\366\355\377\351\353\347\377\206\353\356" "\352\377\4\355\357\353\377\353\356\352\377\355\357\353\377\360\362\357" "\377\202[\177\262\377\11\351\353\347\377o\217\267\377!R\223\377$T\225" "\377\34O\220\377#I\213\377Ns\245\377\305\316\326\377\373\372\361\377" "\202\353\356\352\377\1\355\357\353\377\204\353\356\352\377\3\355\357" "\353\377\353\356\352\377\355\357\353\377\202\353\356\352\377\1\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377\7" "\356\360\355\377\351\353\347\377@k\250\377)a\242\377.e\247\377&W\222" "\377$T\225\377\3400T\221\377\13!R\223\377-Z\234\377\200\204\207\377\255" "\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306" "\275\377\242\242\231\377u}\205\377\30L\223\377\343/S\220\377\5.R\217" "\377=h\245\377\367\366\355\377\351\353\347\377\353\356\352\377\203\355" "\357\353\377\202\353\356\352\377\203\355\357\353\377\21\242\266\316\377" "\267\306\332\377\362\364\361\377\372\371\357\377Mx\260\377$T\225\377" "!R\223\377/S\220\3770T\221\377\36P\221\377\32N\217\377o\217\267\377\343" "\351\353\377\373\372\361\377\355\357\353\377\353\356\352\377\355\357" "\353\377\202\353\356\352\377\4\355\357\353\377\353\356\352\377\355\357" "\353\377\353\356\352\377\202\355\357\353\377\202\353\356\352\377\2\355" "\357\353\377\353\356\352\377\202\355\357\353\377\6\360\362\357\377\301" "\314\332\377\35Y\240\377.e\247\377)a\242\377!R\223\377\340/S\220\377" "\13!R\223\377,Y\233\377\200\204\207\377\255\254\243\377\306\314\302\377" "\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377u}\205" "\377\30L\223\377\344!R\223\377\4+X\232\377\325\336\346\377\355\357\353" "\377\353\356\352\377\203\355\357\353\377\202\353\356\352\377\202\355" "\357\353\377\7\343\351\353\377\353\356\352\377\360\362\357\377\351\353" "\347\377\367\366\355\3779e\242\377%U\226\377\203!R\223\377\11$T\225\377" "!R\223\377\25L\214\377*Z\225\377\246\265\311\377\373\372\361\377\356" "\360\355\377\353\356\352\377\355\357\353\377\205\353\356\352\377\4\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\202\355" "\357\353\377\202\353\356\352\377\10\351\353\347\377\375\365\355\377\214" "\244\302\377-Z\234\377.e\247\377!]\235\377!R\223\377$T\225\377\337!R" "\223\377\12-Z\234\377\200\204\207\377\255\254\243\377\306\314\302\377" "\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377s~\213" "\377\30L\223\377\204/S\220\377\4!R\223\377/S\220\377$T\225\377!R\223" "\377\203/S\220\377\1$T\225\377\202/S\220\377\3!R\223\377/S\220\377$T" "\225\377\202/S\220\377\1$T\225\377\202/S\220\377\3$T\225\377!R\223\377" "$T\225\377\202/S\220\377\202$T\225\377\202/S\220\377\2$T\225\377!R\223" "\377\202/S\220\377\1$T\225\377\204/S\220\377\1$T\225\377\203/S\220\377" "\202!R\223\377\202/S\220\377\1!R\223\377\202/S\220\377\3!R\223\377/S" "\220\377$T\225\377\203/S\220\377\204$T\225\377\4/S\220\377$T\225\377" "/S\220\377$T\225\377\202/S\220\377\1$T\225\377\204/S\220\377\1!R\223" "\377\203/S\220\377\202!R\223\377\206/S\220\377\3$T\225\377!R\223\377" "$T\225\377\203/S\220\377\202!R\223\377\202/S\220\377\202$T\225\377\3" "!R\223\377$T\225\377/S\220\377\202!R\223\377\3\247\272\323\377\365\367" "\363\377\353\356\352\377\204\355\357\353\377\3\353\356\352\377\355\357" "\353\377\353\356\352\377\202\355\357\353\377\202\353\356\352\377\4\340" "\345\350\3770\\\236\377/S\220\377!R\223\377\204/S\220\377\10$T\225\377" "\34O\220\377\0C\210\377Uv\242\377\325\336\346\377\367\366\355\377\351" "\353\347\377\355\357\353\377\202\353\356\352\377\2\355\357\353\377\353" "\356\352\377\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\3\353\356\352\377\355\357\353\377\353\356\352\377\202\355\357\353\377" "\6\367\366\355\377c\212\267\3770\\\236\377.e\247\377+X\232\377.R\217" "\377\202$T\225\377\202/S\220\377\202$T\225\377\202/S\220\377\2$T\225" "\377!R\223\377\202/S\220\377\1$T\225\377\204/S\220\377\1$T\225\377\203" "/S\220\377\202!R\223\377\202/S\220\377\1!R\223\377\202/S\220\377\3!R" "\223\377/S\220\377$T\225\377\203/S\220\377\204$T\225\377\4/S\220\377" "$T\225\377/S\220\377$T\225\377\202/S\220\377\1$T\225\377\204/S\220\377" "\1!R\223\377\203/S\220\377\202!R\223\377\206/S\220\377\3$T\225\377!R" "\223\377$T\225\377\203/S\220\377\202!R\223\377\202/S\220\377\202$T\225" "\377\11!R\223\377$T\225\377/S\220\377!R\223\377/S\220\377!R\223\377/" "S\220\377!R\223\377$T\225\377\205/S\220\377\1!R\223\377\202/S\220\377" "\20!R\223\377/S\220\377$T\225\377/S\220\377!R\223\377-Z\234\377\200\204" "\207\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317" "\377\306\306\275\377\242\242\231\377s~\213\377\30L\223\377$T\225\377" "\202!R\223\377\3$T\225\377!R\223\377$T\225\377\202!R\223\377\1$T\225" "\377\202!R\223\377\6$T\225\377!R\223\377$T\225\377!R\223\377$T\225\377" "!R\223\377\202$T\225\377\202!R\223\377\1$T\225\377\202!R\223\377\206" "$T\225\377\204!R\223\377\202$T\225\377\3!R\223\377$T\225\377!R\223\377" "\202$T\225\377\202!R\223\377\1$T\225\377\203!R\223\377\1$T\225\377\202" "!R\223\377\1$T\225\377\202!R\223\377\202$T\225\377\203!R\223\377\204" "$T\225\377\3!R\223\377$T\225\377!R\223\377\203$T\225\377\1!R\223\377" "\202$T\225\377\202!R\223\377\202$T\225\377\203!R\223\377\205$T\225\377" "\2!R\223\377$T\225\377\203!R\223\377\202$T\225\377\203!R\223\377\203" "$T\225\377\202!R\223\377\5$T\225\377/S\220\377\30L\223\377\205\241\304" "\377\367\366\355\377\204\355\357\353\377\1\353\356\352\377\206\355\357" "\353\377\5\356\360\355\377\313\324\334\377!]\235\377.R\217\377!R\223" "\377\202$T\225\377\3!R\223\377$T\225\377!R\223\377\202$T\225\377\5\32" "N\217\377\37Q\222\377\246\265\311\377\367\366\355\377\360\362\357\377" "\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355\357\353" "\377\202\353\356\352\377\15\355\357\353\377\353\356\352\377\355\357\353" "\377\353\356\352\377\355\357\353\377\353\356\352\377\356\360\355\377" "\351\353\347\377=h\245\377.e\247\3779e\242\377$T\225\377!R\223\377\206" "$T\225\377\204!R\223\377\202$T\225\377\3!R\223\377$T\225\377!R\223\377" "\202$T\225\377\202!R\223\377\1$T\225\377\203!R\223\377\1$T\225\377\202" "!R\223\377\1$T\225\377\202!R\223\377\202$T\225\377\203!R\223\377\204" "$T\225\377\3!R\223\377$T\225\377!R\223\377\203$T\225\377\1!R\223\377" "\202$T\225\377\202!R\223\377\202$T\225\377\203!R\223\377\205$T\225\377" "\2!R\223\377$T\225\377\203!R\223\377\202$T\225\377\203!R\223\377\203" "$T\225\377\202!R\223\377\1$T\225\377\203!R\223\377\2$T\225\377!R\223" "\377\203$T\225\377\2!R\223\377$T\225\377\202!R\223\377\202$T\225\377" "\1!R\223\377\202$T\225\377\202!R\223\377\13-Z\234\377\200\204\207\377" "\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\242\242\231\377s~\213\377\30L\223\377$T\225\377\205/S\220" "\377\202$T\225\377\203/S\220\377\1$T\225\377\202/S\220\377\3!R\223\377" "/S\220\377$T\225\377\202/S\220\377\2$T\225\377/S\220\377\204$T\225\377" "\202/S\220\377\202$T\225\377\202/S\220\377\202$T\225\377\202/S\220\377" "\1$T\225\377\204/S\220\377\1$T\225\377\204/S\220\377\1$T\225\377\202" "/S\220\377\1$T\225\377\204/S\220\377\202$T\225\377\202/S\220\377\206" "$T\225\377\1/S\220\377\202$T\225\377\4/S\220\377$T\225\377/S\220\377" "$T\225\377\206/S\220\377\203$T\225\377\5/S\220\377$T\225\377/S\220\377" "$T\225\377/S\220\377\203$T\225\377\207/S\220\377\202$T\225\377\6/S\220" "\377$T\225\377/S\220\377$T\225\377#I\213\377V\204\265\377\214\355\357" "\353\377\4\360\362\357\377\267\306\332\377(W\230\377.R\217\377\203$T" "\225\377\205/S\220\377\11$T\225\377\36P\221\377\0C\210\377b\200\256\377" "\351\353\347\377\360\362\357\377\351\353\347\377\355\357\353\377\353" "\356\352\377\207\355\357\353\377\1\353\356\352\377\202\355\357\353\377" "\10\353\356\352\377\375\365\355\377\301\314\332\377&`\240\377.e\247\377" ",Y\233\377!R\223\377$T\225\377\202/S\220\377\202$T\225\377\202/S\220" "\377\202$T\225\377\202/S\220\377\1$T\225\377\204/S\220\377\1$T\225\377" "\204/S\220\377\1$T\225\377\202/S\220\377\1$T\225\377\204/S\220\377\202" "$T\225\377\202/S\220\377\206$T\225\377\1/S\220\377\202$T\225\377\4/S" "\220\377$T\225\377/S\220\377$T\225\377\206/S\220\377\203$T\225\377\5" "/S\220\377$T\225\377/S\220\377$T\225\377/S\220\377\203$T\225\377\207" "/S\220\377\202$T\225\377\4/S\220\377$T\225\377/S\220\377$T\225\377\204" "/S\220\377\203$T\225\377\207/S\220\377\202$T\225\377\14/S\220\377!R\223" "\377/[\235\377\200\204\207\377\255\254\243\377\306\314\302\377\330\327" "\316\377\323\332\317\377\306\306\275\377\242\242\231\377s~\213\377\30" "L\223\377\204$T\225\377\3!R\223\377$T\225\377!R\223\377\203$T\225\377" "\5/S\220\377$T\225\377/S\220\377$T\225\377!R\223\377\202$T\225\377\1" "/S\220\377\216$T\225\377\1!R\223\377\210$T\225\377\203/S\220\377\1!R" "\223\377\206$T\225\377\2!R\223\377/S\220\377\202$T\225\377\1/S\220\377" "\206$T\225\377\2!R\223\377/S\220\377\204$T\225\377\1/S\220\377\202$T" "\225\377\202!R\223\377\202/S\220\377\206$T\225\377\4/S\220\377$T\225" "\377/S\220\377$T\225\377\202!R\223\377\203$T\225\377\202!R\223\377\204" "$T\225\377\1!R\223\377\203$T\225\377\4\36P\221\3777n\251\377\340\345" "\350\377\356\360\355\377\204\355\357\353\377\1\353\356\352\377\203\355" "\357\353\377\202\353\356\352\377\2\365\364\353\377\242\266\316\377\202" "!R\223\377\205$T\225\377\14/S\220\377!R\223\377/S\220\377$T\225\377!" "R\223\3770T\221\377#I\213\3771_\233\377\274\310\325\377\373\372\361\377" "\356\360\355\377\353\356\352\377\207\355\357\353\377\1\353\356\352\377" "\202\355\357\353\377\202\353\356\352\377\5\367\366\355\377\222\251\307" "\377\40[\241\377$_\237\377!R\223\377\210$T\225\377\1!R\223\377\210$T" "\225\377\203/S\220\377\1!R\223\377\206$T\225\377\2!R\223\377/S\220\377" "\202$T\225\377\1/S\220\377\206$T\225\377\2!R\223\377/S\220\377\204$T" "\225\377\1/S\220\377\202$T\225\377\202!R\223\377\202/S\220\377\206$T" "\225\377\4/S\220\377$T\225\377/S\220\377$T\225\377\202!R\223\377\203" "$T\225\377\202!R\223\377\204$T\225\377\1!R\223\377\202$T\225\377\5!R" "\223\377$T\225\377!R\223\377$T\225\377!R\223\377\206$T\225\377\4!R\223" "\377$T\225\377/S\220\377!R\223\377\203$T\225\377\13!R\223\377/[\235\377" "\200\204\207\377\255\254\243\377\306\314\302\377\330\327\316\377\323" "\332\317\377\306\306\275\377\242\242\231\377s~\213\377\30L\223\377\202" "!R\223\377\1$T\225\377\202!R\223\377\1$T\225\377\205!R\223\377\202$T" "\225\377\203!R\223\377\202$T\225\377\204!R\223\377\3$T\225\377!R\223" "\377$T\225\377\202!R\223\377\202$T\225\377\202!R\223\377\5$T\225\377" "!R\223\377$T\225\377!R\223\377$T\225\377\202!R\223\377\1$T\225\377\203" "!R\223\377\1$T\225\377\207!R\223\377\1$T\225\377\206!R\223\377\203$T" "\225\377\204!R\223\377\2$T\225\377!R\223\377\203$T\225\377\217!R\223" "\377\1$T\225\377\211!R\223\377\202$T\225\377\1!R\223\377\203$T\225\377" "\4!R\223\377\32U\233\377\325\336\346\377\356\360\355\377\205\353\356" "\352\377\1\355\357\353\377\204\353\356\352\377\3\372\371\357\377\205" "\241\304\377\30L\223\377\206!R\223\377\1$T\225\377\205!R\223\377\7$T" "\225\377\34O\220\377\22I\220\377\214\244\302\377\373\372\361\377\356" "\360\355\377\353\356\352\377\202\355\357\353\377\1\353\356\352\377\202" "\355\357\353\377\202\353\356\352\377\202\355\357\353\377\202\353\356" "\352\377\4\355\357\353\377\367\366\355\377V\204\265\377,Y\233\377\204" "!R\223\377\202$T\225\377\202!R\223\377\5$T\225\377!R\223\377$T\225\377" "!R\223\377$T\225\377\202!R\223\377\1$T\225\377\203!R\223\377\1$T\225" "\377\207!R\223\377\1$T\225\377\206!R\223\377\203$T\225\377\204!R\223" "\377\2$T\225\377!R\223\377\203$T\225\377\217!R\223\377\1$T\225\377\211" "!R\223\377\202$T\225\377\1!R\223\377\202$T\225\377\2!R\223\377$T\225" "\377\207!R\223\377\1$T\225\377\203!R\223\377\2$T\225\377!R\223\377\203" "$T\225\377\14\37Q\222\377/[\235\377\200\204\207\377\255\254\243\377\306" "\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\242\242" "\231\377u}\205\377\30L\223\377/S\220\377\206!R\223\377\1/S\220\377\203" "!R\223\377\1/S\220\377\204!R\223\377\1/S\220\377\204!R\223\377\204/S" "\220\377\202!R\223\377\202/S\220\377\206!R\223\377\1/S\220\377\211!R" "\223\377\1/S\220\377\202!R\223\377\1/S\220\377\205!R\223\377\1/S\220" "\377\202!R\223\377\203/S\220\377\2!R\223\377/S\220\377\203!R\223\377" "\1/S\220\377\203!R\223\377\1/S\220\377\206!R\223\377\203/S\220\377\6" "!R\223\377/S\220\377!R\223\377/S\220\377!R\223\377/S\220\377\211!R\223" "\377\202/S\220\377\203!R\223\377\5/S\220\377+Q\214\377\13R\227\377\262" "\302\325\377\360\362\357\377\204\355\357\353\377\1\353\356\352\377\203" "\355\357\353\377\6\353\356\352\377\355\357\353\377\365\364\353\377v\227" "\277\377\32N\217\377.R\217\377\203/S\220\377\205!R\223\377\3/S\220\377" "!R\223\377/S\220\377\202!R\223\377\5&W\222\377#I\213\377Uv\242\377\340" "\345\350\377\373\372\361\377\202\353\356\352\377\204\355\357\353\377" "\1\353\356\352\377\203\355\357\353\377\5\353\356\352\377\355\357\353" "\377\373\372\361\377\226\255\313\377\30W\235\377\202.R\217\377\202!R" "\223\377\202/S\220\377\206!R\223\377\1/S\220\377\211!R\223\377\1/S\220" "\377\202!R\223\377\1/S\220\377\205!R\223\377\1/S\220\377\202!R\223\377" "\203/S\220\377\2!R\223\377/S\220\377\203!R\223\377\1/S\220\377\203!R" "\223\377\1/S\220\377\206!R\223\377\203/S\220\377\6!R\223\377/S\220\377" "!R\223\377/S\220\377!R\223\377/S\220\377\211!R\223\377\202/S\220\377" "\210!R\223\377\203/S\220\377\205!R\223\377\2/S\220\377!R\223\377\202" "/S\220\377\14!R\223\377\37Q\222\377!]\235\377\200\204\207\377\255\254" "\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275" "\377\242\242\231\377u}\205\377\30L\223\377\344\"U\217\377\4+Q\214\377" "!R\223\377\205\241\304\377\365\367\363\377\203\355\357\353\377\3\353" "\356\352\377\355\357\353\377\353\356\352\377\204\355\357\353\377\4\356" "\360\355\377c\212\267\377\27M\215\377/S\220\377\215\"U\217\377\202/S" "\220\377\12\32N\217\377&W\222\377\274\310\325\377\372\371\357\377\356" "\360\355\377\353\356\352\377\355\357\353\377\353\356\352\377\355\357" "\353\377\353\356\352\377\204\355\357\353\377\6\353\356\352\377\372\371" "\357\377\247\272\323\377-Z\234\3770T\221\377.R\217\377\334\"U\217\377" "\14\37Q\222\377#^\236\377\200\204\207\377\255\254\243\377\306\314\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\242\242\231\377" "u}\205\377\30L\223\377!R\223\377\202.R\217\377\203!R\223\377\1.R\217" "\377\202!R\223\377\1.R\217\377\204!R\223\377\1.R\217\377\204!R\223\377" "\1.R\217\377\212!R\223\377\204.R\217\377\202!R\223\377\3.R\217\377!R" "\223\377.R\217\377\202!R\223\377\1.R\217\377\204!R\223\377\1.R\217\377" "\202!R\223\377\1.R\217\377\202!R\223\377\1.R\217\377\203!R\223\377\1" ".R\217\377\202!R\223\377\202.R\217\377\4!R\223\377.R\217\377!R\223\377" ".R\217\377\206!R\223\377\202.R\217\377\212!R\223\377\2.R\217\377!R\223" "\377\203.R\217\377\204!R\223\377\1.R\217\377\203!R\223\377\1.R\217\377" "\203!R\223\377\4+Q\214\377!R\223\377g\216\273\377\372\371\357\377\212" "\355\357\353\377\3\351\353\347\377Mx\260\377\32N\217\377\204!R\223\377" "\1.R\217\377\204!R\223\377\202.R\217\377\1!R\223\377\202.R\217\377\202" "!R\223\377\7/S\220\377\34O\220\377\35F\207\377~\232\275\377\360\362\357" "\377\356\360\355\377\353\356\352\377\202\355\357\353\377\1\353\356\352" "\377\205\355\357\353\377\5\365\364\353\377\301\314\332\377)a\242\377" "&W\222\377.R\217\377\205!R\223\377\204.R\217\377\202!R\223\377\3.R\217" "\377!R\223\377.R\217\377\202!R\223\377\1.R\217\377\204!R\223\377\1.R" "\217\377\202!R\223\377\1.R\217\377\202!R\223\377\1.R\217\377\203!R\223" "\377\1.R\217\377\202!R\223\377\202.R\217\377\4!R\223\377.R\217\377!R" "\223\377.R\217\377\206!R\223\377\202.R\217\377\212!R\223\377\2.R\217" "\377!R\223\377\203.R\217\377\204!R\223\377\1.R\217\377\203!R\223\377" "\1.R\217\377\203!R\223\377\1.R\217\377\206!R\223\377\1.R\217\377\210" "!R\223\377\14.R\217\377\37Q\222\377/[\235\377\200\204\207\377\255\254" "\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275" "\377\242\242\231\377u}\205\377\30L\223\377\345!R\223\377\4\37Q\222\377" "[\177\262\377\373\372\361\377\353\356\352\377\202\355\357\353\377\1\353" "\356\352\377\205\355\357\353\377\4\356\360\355\377\340\345\350\377=h" "\245\377\34O\220\377\223!R\223\377\3\0C\210\377V\204\265\377\353\356" "\352\377\203\355\357\353\377\1\353\356\352\377\204\355\357\353\377\5" "\353\356\352\377\360\362\357\377\321\331\342\377+c\244\377(W\230\377" "\335!R\223\377\13\36P\221\377/[\235\377\200\204\207\377\255\254\243\377" "\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\242" "\242\231\377u}\205\377\30L\223\377\274!R\223\377\1.R\217\377\251!R\223" "\377\2Fs\252\377\377\371\361\377\211\355\357\353\377\4\356\360\355\377" "\333\341\343\377,Y\233\377\37Q\222\377\224!R\223\377\2\36P\227\377\325" "\336\346\377\203\355\357\353\377\1\353\356\352\377\205\355\357\353\377" "\5\356\360\355\377\351\353\347\377=h\245\377+X\232\377\37Q\222\377\243" "!R\223\377\1.R\217\377\270!R\223\377\15\36P\221\377/[\235\377\200\204" "\207\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317" "\377\306\306\275\377\242\242\231\377s~\213\377\30L\223\377!R\223\377" ".R\217\377\202!R\223\377\3.R\217\377!R\223\377.R\217\377\222!R\223\377" "\202.R\217\377\204!R\223\377\203.R\217\377\202!R\223\377\1.R\217\377" "\204!R\223\377\1.R\217\377\204!R\223\377\1.R\217\377\202!R\223\377\1" ".R\217\377\202!R\223\377\202.R\217\377\202!R\223\377\1.R\217\377\202" "!R\223\377\202.R\217\377\4!R\223\377.R\217\377!R\223\377.R\217\377\206" "!R\223\377\202.R\217\377\212!R\223\377\1.R\217\377\202!R\223\377\7.R" "\217\377!R\223\377.R\217\377!R\223\377.R\217\377!R\223\377.R\217\377" "\207!R\223\377\4\37Q\222\377(W\230\377Fs\252\377\373\372\361\377\203" "\355\357\353\377\1\353\356\352\377\205\355\357\353\377\4\356\360\355" "\377\313\324\334\377\36P\227\377+Q\214\377\210!R\223\377\203.R\217\377" "\2!R\223\377.R\217\377\202!R\223\377\3.R\217\377!R\223\377.R\217\377" "\202!R\223\377\2\35Y\240\377\333\341\343\377\203\355\357\353\377\1\353" "\356\352\377\204\355\357\353\377\10\353\356\352\377\355\357\353\377\375" "\365\355\377@k\250\377.\\\230\377\37Q\222\377!R\223\377.R\217\377\204" "!R\223\377\203.R\217\377\202!R\223\377\1.R\217\377\204!R\223\377\1.R" "\217\377\204!R\223\377\1.R\217\377\202!R\223\377\1.R\217\377\202!R\223" "\377\202.R\217\377\202!R\223\377\1.R\217\377\202!R\223\377\202.R\217" "\377\4!R\223\377.R\217\377!R\223\377.R\217\377\206!R\223\377\202.R\217" "\377\212!R\223\377\1.R\217\377\202!R\223\377\7.R\217\377!R\223\377.R" "\217\377!R\223\377.R\217\377!R\223\377.R\217\377\207!R\223\377\202.R" "\217\377\205!R\223\377\202.R\217\377\204!R\223\377\1.R\217\377\202!R" "\223\377\14.R\217\377\36P\221\377/[\235\377\200\204\207\377\255\254\243" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\242\242\231\377s~\213\377\30L\223\377\202!R\223\377\1.R\217\377\206" "!R\223\377\1.R\217\377\205!R\223\377\1.R\217\377\203!R\223\377\1.R\217" "\377\205!R\223\377\1.R\217\377\214!R\223\377\3.R\217\377!R\223\377.R" "\217\377\211!R\223\377\1.R\217\377\202!R\223\377\1.R\217\377\205!R\223" "\377\1.R\217\377\251!R\223\377\3)a\242\377Fs\252\377\373\372\361\377" "\204\355\357\353\377\1\353\356\352\377\203\355\357\353\377\3\353\356" "\352\377\360\362\357\377\262\302\325\377\202\37Q\222\377\206!R\223\377" "\1.R\217\377\202!R\223\377\1.R\217\377\203!R\223\377\1.R\217\377\206" "!R\223\377\2\30W\235\377\333\341\343\377\203\355\357\353\377\1\353\356" "\352\377\203\355\357\353\377\6\353\356\352\377\355\357\353\377\353\356" "\352\377\372\371\357\377[\177\262\377-Z\234\377\216!R\223\377\3.R\217" "\377!R\223\377.R\217\377\211!R\223\377\1.R\217\377\202!R\223\377\1.R" "\217\377\205!R\223\377\1.R\217\377\246!R\223\377\1.R\217\377\203!R\223" "\377\1.R\217\377\210!R\223\377\202.R\217\377\204!R\223\377\13\36P\221" "\377#^\236\377\200\204\207\377\255\254\243\377\306\314\302\377\330\327" "\316\377\323\332\317\377\306\306\275\377\242\242\231\377s~\213\377\30" "L\223\377\342!R\223\377\6\37Q\222\377%U\226\377)a\242\377.e\247\377F" "s\252\377\373\372\361\377\203\355\357\353\377\1\353\356\352\377\205\355" "\357\353\377\2\365\364\353\377\226\255\313\377\202\37Q\222\377\224!R" "\223\377\6\35Y\240\377\333\341\343\377\355\357\353\377\353\356\352\377" "\355\357\353\377\353\356\352\377\204\355\357\353\377\202\353\356\352" "\377\3\367\366\355\377o\217\267\377-Z\234\377\335!R\223\377\13\36P\221" "\377#^\236\377\200\204\207\377\255\254\243\377\306\314\302\377\330\327" "\316\377\323\332\317\377\306\306\275\377\245\244\233\377s~\213\377\30" "L\223\377\236.R\217\377\1!R\223\377\245.R\217\377\1!R\223\377\220.R\217" "\377\3!R\223\377.R\217\377!R\223\377\204.R\217\377\7!R\223\377.R\217" "\377!R\223\377+Q\214\377!R\223\377$T\225\377!]\235\377\202.e\247\377" "\3)a\242\377@k\250\377\377\371\361\377\203\355\357\353\377\1\353\356" "\352\377\205\355\357\353\377\5\367\366\355\377v\227\277\377!R\223\377" "+Q\214\377!R\223\377\203.R\217\377\1!R\223\377\217.R\217\377\2\30W\235" "\377\333\341\343\377\203\355\357\353\377\1\353\356\352\377\204\355\357" "\353\377\202\353\356\352\377\4\365\364\353\377\205\241\304\377,Y\233" "\377+Q\214\377\205.R\217\377\1!R\223\377\245.R\217\377\1!R\223\377\220" ".R\217\377\3!R\223\377.R\217\377!R\223\377\210.R\217\377\1!R\223\377" "\224.R\217\377\13\36P\221\377#^\236\377\200\204\207\377\255\254\243\377" "\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245" "\244\233\377s~\213\377\30L\223\377\202+Q\214\377\2\"U\217\377.R\217\377" "\203+Q\214\377\203.R\217\377\5+Q\214\377.R\217\377+Q\214\377.R\217\377" "+Q\214\377\204.R\217\377\1\"U\217\377\202+Q\214\377\204.R\217\377\1+" "Q\214\377\203.R\217\377\204+Q\214\377\202.R\217\377\202+Q\214\377\3\"" "U\217\377+Q\214\377.R\217\377\202+Q\214\377\202\"U\217\377\1.R\217\377" "\202+Q\214\377\2.R\217\377+Q\214\377\202.R\217\377\1+Q\214\377\202.R" "\217\377\202+Q\214\377\203.R\217\377\5+Q\214\377.R\217\377+Q\214\377" ".R\217\377+Q\214\377\203.R\217\377\1+Q\214\377\202.R\217\377\202+Q\214" "\377\1.R\217\377\202\"U\217\377\1+Q\214\377\206.R\217\377\2+Q\214\377" ".R\217\377\203+Q\214\377\202.R\217\377\10+Q\214\377\"U\217\377.R\217" "\377+Q\214\377.R\217\377/S\220\377+Q\214\377+X\232\377\202.e\247\377" "\4/[\235\377@k\250\377\242\266\316\377\362\364\361\377\203\355\357\353" "\377\202\353\356\352\377\203\355\357\353\377\4\353\356\352\377\373\372" "\361\377V\204\265\377!R\223\377\203+Q\214\377\1.R\217\377\202+Q\214\377" "\202.R\217\377\202+Q\214\377\1.R\217\377\203+Q\214\377\2\"U\217\377." "R\217\377\203+Q\214\377\202.R\217\377\6\30W\235\377\333\341\343\377\355" "\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377\203\355" "\357\353\377\203\353\356\352\377\6\370\363\361\377\242\266\316\377\35" "Y\240\377+Q\214\377.R\217\377+Q\214\377\203.R\217\377\204+Q\214\377\202" ".R\217\377\202+Q\214\377\3\"U\217\377+Q\214\377.R\217\377\202+Q\214\377" "\202\"U\217\377\1.R\217\377\202+Q\214\377\2.R\217\377+Q\214\377\202." "R\217\377\1+Q\214\377\202.R\217\377\202+Q\214\377\203.R\217\377\5+Q\214" "\377.R\217\377+Q\214\377.R\217\377+Q\214\377\203.R\217\377\1+Q\214\377" "\202.R\217\377\202+Q\214\377\1.R\217\377\202\"U\217\377\1+Q\214\377\206" ".R\217\377\2+Q\214\377.R\217\377\203+Q\214\377\202.R\217\377\2+Q\214" "\377\"U\217\377\202+Q\214\377\202.R\217\377\202+Q\214\377\202.R\217\377" "\202+Q\214\377\202.R\217\377\202+Q\214\377\1.R\217\377\202+Q\214\377" "\2\"U\217\377+Q\214\377\205.R\217\377\15+Q\214\377\36P\221\3770^\232" "\377\200\204\207\377\255\254\243\377\306\314\302\377\330\327\316\377" "\323\332\317\377\306\306\275\377\245\244\233\377s~\213\377\30L\223\377" ".R\217\377\202\"U\217\377\1.R\217\377\202\"U\217\377\204.R\217\377\2" "\"U\217\377.R\217\377\203\"U\217\377\202.R\217\377\204\"U\217\377\204" ".R\217\377\202\"U\217\377\202.R\217\377\203\"U\217\377\1.R\217\377\202" "\"U\217\377\1.R\217\377\211\"U\217\377\1.R\217\377\202\"U\217\377\2." "R\217\377\"U\217\377\202.R\217\377\202\"U\217\377\1.R\217\377\202\"U" "\217\377\203.R\217\377\2\"U\217\377.R\217\377\203\"U\217\377\1.R\217" "\377\202\"U\217\377\203.R\217\377\205\"U\217\377\203.R\217\377\6\"U\217" "\377.R\217\377\"U\217\377.R\217\377\"U\217\377.R\217\377\207\"U\217\377" "\2+Q\214\377$T\225\377\2024a\235\377\7)a\242\377#^\236\377+c\244\377" "0\\\236\377v\227\277\377\343\351\353\377\365\364\353\377\202\353\356" "\352\377\202\355\357\353\377\202\353\356\352\377\1\355\357\353\377\202" "\353\356\352\377\5\355\357\353\377\377\371\361\377Fs\252\377\37Q\222" "\377+Q\214\377\205.R\217\377\204\"U\217\377\3.R\217\377\"U\217\377.R" "\217\377\202\"U\217\377\1.R\217\377\202\"U\217\377\202.R\217\377\4+Q" "\214\377\32U\233\377\333\341\343\377\355\357\353\377\204\353\356\352" "\377\1\355\357\353\377\204\353\356\352\377\3\360\362\357\377\274\310" "\325\377\35Y\240\377\202.R\217\377\1\"U\217\377\202.R\217\377\203\"U" "\217\377\1.R\217\377\202\"U\217\377\1.R\217\377\211\"U\217\377\1.R\217" "\377\202\"U\217\377\2.R\217\377\"U\217\377\202.R\217\377\202\"U\217\377" "\1.R\217\377\202\"U\217\377\203.R\217\377\2\"U\217\377.R\217\377\203" "\"U\217\377\1.R\217\377\202\"U\217\377\203.R\217\377\205\"U\217\377\203" ".R\217\377\6\"U\217\377.R\217\377\"U\217\377.R\217\377\"U\217\377.R\217" "\377\211\"U\217\377\202.R\217\377\2\"U\217\377.R\217\377\203\"U\217\377" "\202.R\217\377\1\"U\217\377\203.R\217\377\204\"U\217\377\202.R\217\377" "\1\"U\217\377\202.R\217\377\15\"U\217\377\36P\221\3770^\232\377\200\204" "\207\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317" "\377\306\306\275\377\245\244\233\377s~\213\377\30L\223\377!R\223\377" "\206+Q\214\377\1!R\223\377\203+Q\214\377\1!R\223\377\204+Q\214\377\1" "!R\223\377\204+Q\214\377\204!R\223\377\202+Q\214\377\202!R\223\377\206" "+Q\214\377\1!R\223\377\211+Q\214\377\1!R\223\377\202+Q\214\377\1!R\223" "\377\205+Q\214\377\1!R\223\377\202+Q\214\377\203!R\223\377\2+Q\214\377" "!R\223\377\203+Q\214\377\1!R\223\377\203+Q\214\377\1!R\223\377\206+Q" "\214\377\203!R\223\377\6+Q\214\377!R\223\377+Q\214\377!R\223\377+Q\214" "\377!R\223\377\206+Q\214\377\3!R\223\377+Q\214\377-Z\234\377\204.e\247" "\377\4+c\244\377\313\324\334\377\367\366\355\377\356\360\355\377\202" "\353\356\352\377\203\355\357\353\377\202\353\356\352\377\3\355\357\353" "\377\353\356\352\377\355\357\353\377\202\356\360\355\377\2,[\227\377" "\37Q\222\377\205!R\223\377\205+Q\214\377\3!R\223\377+Q\214\377!R\223" "\377\206+Q\214\377\4!R\223\377\37Q\222\377\32U\233\377\333\341\343\377" "\202\355\357\353\377\202\353\356\352\377\202\355\357\353\377\204\353" "\356\352\377\4\360\362\357\377\321\331\342\3770\\\236\377$T\225\377\202" "+Q\214\377\202!R\223\377\206+Q\214\377\1!R\223\377\211+Q\214\377\1!R" "\223\377\202+Q\214\377\1!R\223\377\205+Q\214\377\1!R\223\377\202+Q\214" "\377\203!R\223\377\2+Q\214\377!R\223\377\203+Q\214\377\1!R\223\377\203" "+Q\214\377\1!R\223\377\206+Q\214\377\203!R\223\377\6+Q\214\377!R\223" "\377+Q\214\377!R\223\377+Q\214\377!R\223\377\211+Q\214\377\202!R\223" "\377\210+Q\214\377\203!R\223\377\207+Q\214\377\202!R\223\377\14+Q\214" "\377\36P\221\3770^\232\377\200\204\207\377\255\254\243\377\306\314\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377" "s~\213\377\30L\223\377\334\37Q\222\377\5\36P\221\377#^\236\377.e\247" "\377)a\242\377\35Y\240\377\202)a\242\377\2\267\306\332\377\360\362\357" "\377\203\353\356\352\377\203\355\357\353\377\204\353\356\352\377\4\351" "\353\347\377\376\375\364\377\274\310\325\377\32N\217\377\225\37Q\222" "\377\4\36P\221\377\13R\227\377\333\341\343\377\355\357\353\377\203\353" "\356\352\377\202\355\357\353\377\204\353\356\352\377\4\356\360\355\377" "\325\336\346\377=h\245\377$T\225\377\334\37Q\222\377\14\34O\220\377/" "]\231\377\200\204\207\377\255\254\243\377\306\314\302\377\330\327\316" "\377\323\332\317\377\306\306\275\377\245\244\233\377s~\213\377\30L\223" "\377!R\223\377\206\37Q\222\377\1+Q\214\377\203\37Q\222\377\1!R\223\377" "\204\37Q\222\377\3!R\223\377+Q\214\377\37Q\222\377\202+Q\214\377\204" "!R\223\377\2+Q\214\377\37Q\222\377\202!R\223\377\202\37Q\222\377\202" "+Q\214\377\202\37Q\222\377\1!R\223\377\211\37Q\222\377\4!R\223\377\37" "Q\222\377+Q\214\377!R\223\377\205\37Q\222\377\1!R\223\377\202\37Q\222" "\377\202+Q\214\377\3!R\223\377\37Q\222\377+Q\214\377\203\37Q\222\377" "\2+Q\214\377\37Q\222\377\202+Q\214\377\2!R\223\377+Q\214\377\205\37Q" "\222\377\203!R\223\377\6\37Q\222\377!R\223\377\37Q\222\377!R\223\377" "\37Q\222\377+Q\214\377\205\37Q\222\377\16!R\223\377\37Q\222\377!R\223" "\377.e\247\3770\\\236\377\255\274\320\377\222\251\307\377Fs\252\377\30" "W\235\377=h\245\377\343\351\353\377\356\360\355\377\355\357\353\377\353" "\356\352\377\203\355\357\353\377\202\353\356\352\377\10\355\357\353\377" "\353\356\352\377\375\365\355\377\274\310\325\377\32N\217\377\34O\220" "\377!R\223\377\37Q\222\377\202!R\223\377\2+Q\214\377!R\223\377\205\37" "Q\222\377\3!R\223\377\37Q\222\377!R\223\377\210\37Q\222\377\3\30L\223" "\377\325\336\346\377\356\360\355\377\203\353\356\352\377\202\355\357" "\353\377\204\353\356\352\377\4\356\360\355\377\340\345\350\377Fs\252" "\377$T\225\377\202\37Q\222\377\202!R\223\377\202\37Q\222\377\202+Q\214" "\377\202\37Q\222\377\1!R\223\377\211\37Q\222\377\4!R\223\377\37Q\222" "\377+Q\214\377!R\223\377\205\37Q\222\377\1!R\223\377\202\37Q\222\377" "\202+Q\214\377\3!R\223\377\37Q\222\377+Q\214\377\203\37Q\222\377\2+Q" "\214\377\37Q\222\377\202+Q\214\377\2!R\223\377+Q\214\377\205\37Q\222" "\377\203!R\223\377\6\37Q\222\377!R\223\377\37Q\222\377!R\223\377\37Q" "\222\377+Q\214\377\211\37Q\222\377\2!R\223\377+Q\214\377\206\37Q\222" "\377\2+Q\214\377\37Q\222\377\203!R\223\377\5+Q\214\377\37Q\222\377+Q" "\214\377\37Q\222\377+Q\214\377\202\37Q\222\377\20!R\223\377+Q\214\377" "\37Q\222\377\34O\220\3770\\\236\377\200\204\207\377\255\254\243\377\306" "\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377s~\213\377\30L\223\377!R\223\377\37Q\222\377\202!R\223\377\1" "\37Q\222\377\210!R\223\377\202\37Q\222\377\204!R\223\377\1+Q\214\377" "\211!R\223\377\2\37Q\222\377+Q\214\377\205!R\223\377\202\37Q\222\377" "\203!R\223\377\4\37Q\222\377+Q\214\377\37Q\222\377+Q\214\377\207!R\223" "\377\202+Q\214\377\202!R\223\377\1\37Q\222\377\203!R\223\377\3\37Q\222" "\377!R\223\377\37Q\222\377\210!R\223\377\1\37Q\222\377\213!R\223\377" "\1+Q\214\377\202!R\223\377\22\37Q\222\377!R\223\377+Q\214\377\37Q\222" "\377!R\223\377\36P\221\377/[\235\377)a\242\377V\204\265\377\375\365\355" "\377\372\371\357\377\356\360\355\377\301\314\332\377V\204\265\377\205" "\241\304\377\362\364\361\377\351\353\347\377\353\356\352\377\205\355" "\357\353\377\5\351\353\347\377\373\372\361\377\255\274\320\377\27M\215" "\377\32N\217\377\212!R\223\377\1\37Q\222\377\202!R\223\377\3\37Q\222" "\377!R\223\377\37Q\222\377\202!R\223\377\1\37Q\222\377\203!R\223\377" "\4\37Q\222\377#I\213\377~\232\275\377\372\371\357\377\203\353\356\352" "\377\203\355\357\353\377\1\353\356\352\377\202\355\357\353\377\6\356" "\360\355\377\353\356\352\377[\177\262\377%U\226\377\36P\221\377\37Q\222" "\377\202!R\223\377\2\37Q\222\377+Q\214\377\205!R\223\377\202\37Q\222" "\377\203!R\223\377\4\37Q\222\377+Q\214\377\37Q\222\377+Q\214\377\207" "!R\223\377\202+Q\214\377\202!R\223\377\1\37Q\222\377\203!R\223\377\3" "\37Q\222\377!R\223\377\37Q\222\377\210!R\223\377\1\37Q\222\377\213!R" "\223\377\1+Q\214\377\202!R\223\377\3\37Q\222\377!R\223\377+Q\214\377" "\207!R\223\377\3\37Q\222\377!R\223\377+Q\214\377\202!R\223\377\1\37Q" "\222\377\206!R\223\377\3\37Q\222\377!R\223\377+Q\214\377\202!R\223\377" "\1\37Q\222\377\203!R\223\377\15\34O\220\3770^\232\377\202\207\212\377" "\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\245\244\233\377s~\213\377\30L\223\377!R\223\377\37Q\222" "\377\202!R\223\377\1+Q\214\377\202!R\223\377\1+Q\214\377\206!R\223\377" "\1\37Q\222\377\204!R\223\377\1+Q\214\377\211!R\223\377\202+Q\214\377" "\205!R\223\377\1\37Q\222\377\204!R\223\377\4\37Q\222\377+Q\214\377!R" "\223\377+Q\214\377\207!R\223\377\202+Q\214\377\202!R\223\377\1\37Q\222" "\377\202+Q\214\377\202!R\223\377\202+Q\214\377\202!R\223\377\1+Q\214" "\377\221!R\223\377\202+Q\214\377\13!R\223\377+Q\214\377!R\223\377+Q\214" "\377!R\223\377\37Q\222\377!R\223\377=h\245\377\35Y\240\377\274\310\325" "\377\360\362\357\377\202\353\356\352\377\3\360\362\357\377\373\372\361" "\377\325\336\346\377\202\353\356\352\377\204\355\357\353\377\202\353" "\356\352\377\4\375\365\355\377\255\274\320\377#I\213\377\37Q\222\377" "\202!R\223\377\1+Q\214\377\203!R\223\377\1+Q\214\377\204!R\223\377\1" "\37Q\222\377\202!R\223\377\3+Q\214\377!R\223\377\37Q\222\377\202!R\223" "\377\1+Q\214\377\202!R\223\377\10+Q\214\377!R\223\377\34O\220\377.\\" "\230\377\340\345\350\377\360\362\357\377\355\357\353\377\353\356\352" "\377\207\355\357\353\377\4\365\367\363\377c\212\267\377%U\226\377\36" "P\221\377\203!R\223\377\202+Q\214\377\205!R\223\377\1\37Q\222\377\204" "!R\223\377\4\37Q\222\377+Q\214\377!R\223\377+Q\214\377\207!R\223\377" "\202+Q\214\377\202!R\223\377\1\37Q\222\377\202+Q\214\377\202!R\223\377" "\202+Q\214\377\202!R\223\377\1+Q\214\377\221!R\223\377\202+Q\214\377" "\4!R\223\377+Q\214\377!R\223\377+Q\214\377\206!R\223\377\4+Q\214\377" "\37Q\222\377!R\223\377+Q\214\377\202!R\223\377\1\37Q\222\377\210!R\223" "\377\1+Q\214\377\202!R\223\377\20+Q\214\377!R\223\377+Q\214\377!R\223" "\377\34O\220\3770^\232\377\202\207\212\377\255\254\243\377\306\314\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377" "s~\213\377\30L\223\377!R\223\377\206\37Q\222\377\1!R\223\377\203\37Q" "\222\377\1!R\223\377\204\37Q\222\377\202!R\223\377\1\37Q\222\377\207" "!R\223\377\1\37Q\222\377\202!R\223\377\202\37Q\222\377\202!R\223\377" "\202\37Q\222\377\1!R\223\377\211\37Q\222\377\2!R\223\377\37Q\222\377" "\202!R\223\377\205\37Q\222\377\1!R\223\377\202\37Q\222\377\203!R\223" "\377\2\37Q\222\377!R\223\377\203\37Q\222\377\2!R\223\377\37Q\222\377" "\204!R\223\377\205\37Q\222\377\203!R\223\377\6\37Q\222\377!R\223\377" "\37Q\222\377!R\223\377\37Q\222\377!R\223\377\205\37Q\222\377\6\36P\221" "\377!]\235\377+c\244\377[\177\262\377\372\371\357\377\351\353\347\377" "\203\353\356\352\377\5\355\357\353\377\360\362\357\377\353\356\352\377" "\355\357\353\377\353\356\352\377\203\355\357\353\377\7\353\356\352\377" "\373\372\361\377\235\261\311\377\35F\207\377\32N\217\377!R\223\377\37" "Q\222\377\202!R\223\377\1\37Q\222\377\204!R\223\377\205\37Q\222\377\3" "!R\223\377\37Q\222\377!R\223\377\206\37Q\222\377\6!R\223\377\37Q\222" "\377!R\223\377\0C\210\377\214\244\302\377\367\366\355\377\202\353\356" "\352\377\202\355\357\353\377\205\353\356\352\377\3\373\372\361\377v\227" "\277\377+X\232\377\202\37Q\222\377\202!R\223\377\202\37Q\222\377\202" "!R\223\377\202\37Q\222\377\1!R\223\377\211\37Q\222\377\2!R\223\377\37" "Q\222\377\202!R\223\377\205\37Q\222\377\1!R\223\377\202\37Q\222\377\203" "!R\223\377\2\37Q\222\377!R\223\377\203\37Q\222\377\2!R\223\377\37Q\222" "\377\204!R\223\377\205\37Q\222\377\203!R\223\377\6\37Q\222\377!R\223" "\377\37Q\222\377!R\223\377\37Q\222\377!R\223\377\211\37Q\222\377\202" "!R\223\377\206\37Q\222\377\2!R\223\377\37Q\222\377\204!R\223\377\4\37" "Q\222\377!R\223\377\37Q\222\377!R\223\377\202\37Q\222\377\202!R\223\377" "\15\37Q\222\377\34O\220\3770^\232\377\202\207\212\377\255\254\243\377" "\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245" "\244\233\377s~\213\377\30L\223\377+Q\214\377\205\37Q\222\377\202+Q\214" "\377\203\37Q\222\377\1+Q\214\377\204\37Q\222\377\202+Q\214\377\1\37Q" "\222\377\207+Q\214\377\1\37Q\222\377\202+Q\214\377\202\37Q\222\377\202" "+Q\214\377\202\37Q\222\377\1+Q\214\377\211\37Q\222\377\2+Q\214\377\37" "Q\222\377\202+Q\214\377\205\37Q\222\377\1+Q\214\377\202\37Q\222\377\203" "+Q\214\377\2\37Q\222\377+Q\214\377\203\37Q\222\377\2+Q\214\377\37Q\222" "\377\204+Q\214\377\205\37Q\222\377\203+Q\214\377\6\37Q\222\377+Q\214" "\377\37Q\222\377+Q\214\377\37Q\222\377+Q\214\377\205\37Q\222\377\5+Q" "\214\377+c\244\377/[\235\377\262\302\325\377\362\364\361\377\205\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\3\376\375\364\377\246\265\311\377\35F\207\377\203" "+Q\214\377\1\37Q\222\377\202+Q\214\377\1\37Q\222\377\204+Q\214\377\205" "\37Q\222\377\3+Q\214\377\37Q\222\377+Q\214\377\205\37Q\222\377\202+Q" "\214\377\202\37Q\222\377\5+Q\214\377.\\\230\377\360\362\357\377\351\353" "\347\377\353\356\352\377\202\355\357\353\377\204\353\356\352\377\5\355" "\357\353\377\367\366\355\377\222\251\307\377,Y\233\377.R\217\377\203" "+Q\214\377\202\37Q\222\377\202+Q\214\377\202\37Q\222\377\1+Q\214\377" "\211\37Q\222\377\2+Q\214\377\37Q\222\377\202+Q\214\377\205\37Q\222\377" "\1+Q\214\377\202\37Q\222\377\203+Q\214\377\2\37Q\222\377+Q\214\377\203" "\37Q\222\377\2+Q\214\377\37Q\222\377\204+Q\214\377\205\37Q\222\377\203" "+Q\214\377\6\37Q\222\377+Q\214\377\37Q\222\377+Q\214\377\37Q\222\377" "+Q\214\377\211\37Q\222\377\202+Q\214\377\206\37Q\222\377\2+Q\214\377" "\37Q\222\377\204+Q\214\377\4\37Q\222\377+Q\214\377\37Q\222\377+Q\214" "\377\202\37Q\222\377\202+Q\214\377\14\37Q\222\377\34O\220\3770^\232\377" "\202\207\212\377\255\254\243\377\306\314\302\377\330\327\316\377\323" "\332\317\377\306\306\275\377\245\244\233\377s~\213\377\30L\223\377\331" "+Q\214\377\7*P\213\377\36[\233\377)a\242\377[\177\262\377\360\362\357" "\377\356\360\355\377\355\357\353\377\204\353\356\352\377\202\355\357" "\353\377\202\353\356\352\377\202\355\357\353\377\4\373\372\361\377\235" "\261\311\377\35F\207\377\36P\221\377\234+Q\214\377\5.R\217\377\35F\207" "\377\235\261\311\377\367\366\355\377\353\356\352\377\202\355\357\353" "\377\204\353\356\352\377\5\355\357\353\377\362\364\361\377\247\272\323" "\377&`\240\377&W\222\377\333+Q\214\377\13\34O\220\3770^\232\377\202\207" "\212\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317" "\377\306\306\275\377\245\244\233\377s~\213\377\30L\223\377\332+Q\214" "\377\6+c\244\377\35Y\240\377\267\306\332\377\362\364\361\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\2\355\357\353\377\353\356" "\352\377\202\355\357\353\377\7\353\356\352\377\355\357\353\377\351\353" "\347\377\373\372\361\377\226\251\302\377\35F\207\377\36P\221\377\236" "+Q\214\377\4\27M\215\377\77l\243\377\355\357\353\377\356\360\355\377" "\203\355\357\353\377\204\353\356\352\377\4\360\362\357\377\301\314\332" "\377)a\242\377\40\\\234\377\333+Q\214\377\15\34O\220\3770^\232\377\202" "\207\212\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332" "\317\377\306\306\275\377\245\244\233\377s~\213\377\30L\223\377\37Q\222" "\377+Q\214\377\202\37Q\222\377\2+Q\214\377\37Q\222\377\202+Q\214\377" "\206\37Q\222\377\1+Q\214\377\206\37Q\222\377\1+Q\214\377\203\37Q\222" "\377\1+Q\214\377\204\37Q\222\377\3+Q\214\377\37Q\222\377+Q\214\377\216" "\37Q\222\377\1+Q\214\377\210\37Q\222\377\1+Q\214\377\205\37Q\222\377" "\1+Q\214\377\207\37Q\222\377\202+Q\214\377\205\37Q\222\377\202+Q\214" "\377\205\37Q\222\377\11+Q\214\377\37Q\222\377+Q\214\377\37Q\222\377\34" "O\220\377+X\232\377)a\242\377Mx\260\377\360\362\357\377\202\353\356\352" "\377\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377\6\353" "\356\352\377\355\357\353\377\373\372\361\377\226\251\302\377\35F\207" "\377+Q\214\377\202\37Q\222\377\1+Q\214\377\207\37Q\222\377\1+Q\214\377" "\210\37Q\222\377\3+Q\214\377\37Q\222\377+Q\214\377\202\37Q\222\377\2" "+Q\214\377\37Q\222\377\202+Q\214\377\202\37Q\222\377\6+Q\214\377\36P" "\221\377\35F\207\377\262\302\325\377\362\364\361\377\353\356\352\377" "\202\355\357\353\377\1\353\356\352\377\202\355\357\353\377\6\353\356" "\352\377\355\357\353\377\325\336\346\3770\\\236\3774a\235\377\34O\220" "\377\203\37Q\222\377\3+Q\214\377\37Q\222\377+Q\214\377\216\37Q\222\377" "\1+Q\214\377\210\37Q\222\377\1+Q\214\377\205\37Q\222\377\1+Q\214\377" "\207\37Q\222\377\202+Q\214\377\205\37Q\222\377\202+Q\214\377\205\37Q" "\222\377\3+Q\214\377\37Q\222\377+Q\214\377\202\37Q\222\377\202+Q\214" "\377\212\37Q\222\377\202+Q\214\377\207\37Q\222\377\1+Q\214\377\206\37" "Q\222\377\13\32N\217\3770^\232\377\202\207\212\377\255\254\243\377\306" "\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377s~\213\377\30L\223\377\327\36P\221\377\7\37Q\222\377\36P\221" "\377)a\242\377\40[\241\377\247\272\323\377\372\371\357\377\353\356\352" "\377\202\355\357\353\377\205\353\356\352\377\6\355\357\353\377\353\356" "\352\377\373\372\361\377\214\244\302\377\0C\210\377\34O\220\377\240\36" "P\221\377\6\37Q\222\377\27M\215\377Ns\245\377\372\371\357\377\353\356" "\352\377\355\357\353\377\204\353\356\352\377\6\355\357\353\377\351\353" "\347\377\360\362\357\377=h\245\3779e\242\377!R\223\377\332\36P\221\377" "\15\32N\217\3770^\232\377\202\207\212\377\255\254\243\377\306\314\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377" "s~\213\377\30L\223\377\37Q\222\377+Q\214\377\205\36P\221\377\202\37Q" "\222\377\202\36P\221\377\1\37Q\222\377\204\36P\221\377\1\37Q\222\377" "\204\36P\221\377\204\37Q\222\377\202\36P\221\377\202\37Q\222\377\202" "\36P\221\377\1\37Q\222\377\203\36P\221\377\1\37Q\222\377\202\36P\221" "\377\1\37Q\222\377\204\36P\221\377\2\37Q\222\377\36P\221\377\202\37Q" "\222\377\1\36P\221\377\202\37Q\222\377\204\36P\221\377\202\37Q\222\377" "\1\36P\221\377\203\37Q\222\377\2\36P\221\377\37Q\222\377\203\36P\221" "\377\202\37Q\222\377\202\36P\221\377\1\37Q\222\377\204\36P\221\377\2" "\37Q\222\377\36P\221\377\205\37Q\222\377\15\36P\221\377\37Q\222\377\36" "P\221\377\37Q\222\377\36P\221\377\37Q\222\377*P\213\377(W\230\377.e\247" "\3777n\251\377\360\362\357\377\356\360\355\377\353\356\352\377\202\355" "\357\353\377\205\353\356\352\377\6\355\357\353\377\373\372\361\377\214" "\244\302\377\0C\210\377+Q\214\377\36P\221\377\203\37Q\222\377\204\36" "P\221\377\207\37Q\222\377\2\36P\221\377\37Q\222\377\203\36P\221\377\4" "\37Q\222\377\36P\221\377\37Q\222\377+Q\214\377\205\36P\221\377\202\37" "Q\222\377\203\36P\221\377\4+Q\214\377#I\213\377\301\314\332\377\367\366" "\355\377\205\353\356\352\377\10\355\357\353\377\353\356\352\377\365\367" "\363\377\214\244\302\377\"\\\243\377\36[\233\377\34O\220\377+Q\214\377" "\202\36P\221\377\1\37Q\222\377\203\36P\221\377\1\37Q\222\377\202\36P" "\221\377\1\37Q\222\377\204\36P\221\377\2\37Q\222\377\36P\221\377\202" "\37Q\222\377\1\36P\221\377\202\37Q\222\377\204\36P\221\377\202\37Q\222" "\377\1\36P\221\377\203\37Q\222\377\2\36P\221\377\37Q\222\377\203\36P" "\221\377\202\37Q\222\377\202\36P\221\377\1\37Q\222\377\205\36P\221\377" "\211\34O\220\377\2\36P\221\377\37Q\222\377\202\36P\221\377\2\37Q\222" "\377+Q\214\377\202\36P\221\377\2\37Q\222\377\36P\221\377\202\37Q\222" "\377\210\36P\221\377\203\37Q\222\377\1\36P\221\377\202\37Q\222\377\204" "\36P\221\377\203\37Q\222\377\13\32N\217\3770^\232\377\202\207\212\377" "\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\306" "\306\275\377\245\244\233\377s~\213\377\30L\223\377\204\37Q\222\377\1" "\36P\221\377\207\37Q\222\377\3\36P\221\377\37Q\222\377\36P\221\377\213" "\37Q\222\377\1\36P\221\377\206\37Q\222\377\1\36P\221\377\205\37Q\222" "\377\1\36P\221\377\212\37Q\222\377\3\36P\221\377\37Q\222\377\36P\221" "\377\207\37Q\222\377\1\36P\221\377\202\37Q\222\377\1\36P\221\377\225" "\37Q\222\377\203\36P\221\377\5)a\242\377\35Y\240\377\247\272\323\377" "\365\367\363\377\353\356\352\377\206\355\357\353\377\6\353\356\352\377" "\356\360\355\377\372\371\357\377\202\231\266\377\0C\210\377\36P\221\377" "\210\37Q\222\377\1\36P\221\377\212\37Q\222\377\202\36P\221\377\2\37Q" "\222\377\36P\221\377\204\37Q\222\377\1\36P\221\377\210\37Q\222\377\3" "\35F\207\377b\200\256\377\372\371\357\377\202\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\6\360\362\357\377\321\331\342\377.e\247" "\377&`\240\377\36P\221\377+Q\214\377\204\37Q\222\377\1\36P\221\377\205" "\37Q\222\377\1\36P\221\377\212\37Q\222\377\3\36P\221\377\37Q\222\377" "\36P\221\377\207\37Q\222\377\207\36P\221\377\202\34O\220\377\4\32N\217" "\377\36P\221\377\37Q\222\377!R\223\377\202$T\225\377\2%U\226\377'V\227" "\377\207%U\226\377\2\37Q\222\377\36P\221\377\204\37Q\222\377\202\36P" "\221\377\211\37Q\222\377\1\36P\221\377\213\37Q\222\377\1\36P\221\377" "\203\37Q\222\377\13\32N\217\3770\\\236\377\202\207\212\377\255\254\243" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377s~\213\377\30L\223\377\202\37Q\222\377\3\36P\221\377" "\37Q\222\377\36P\221\377\204\37Q\222\377\202\36P\221\377\4\37Q\222\377" "\36P\221\377\37Q\222\377\36P\221\377\204\37Q\222\377\202\36P\221\377" "\205\37Q\222\377\1\36P\221\377\203\37Q\222\377\2\36P\221\377\37Q\222" "\377\202\36P\221\377\202\37Q\222\377\1\36P\221\377\202\37Q\222\377\2" "\36P\221\377\37Q\222\377\202\36P\221\377\207\37Q\222\377\203\36P\221" "\377\203\37Q\222\377\1\36P\221\377\203\37Q\222\377\2\36P\221\377\37Q" "\222\377\203\36P\221\377\203\37Q\222\377\1\36P\221\377\203\37Q\222\377" "\1\36P\221\377\202\37Q\222\377\1\36P\221\377\207\37Q\222\377\1\36P\221" "\377\202\37Q\222\377\12\36P\221\377(W\230\377)a\242\377Fs\252\377\351" "\353\347\377\355\357\353\377\353\356\352\377\355\357\353\377\353\356" "\352\377\355\357\353\377\203\353\356\352\377\4\351\353\347\377\372\371" "\357\377~\232\275\377\0C\210\377\204\37Q\222\377\1\36P\221\377\205\37" "Q\222\377\1\36P\221\377\207\37Q\222\377\1\36P\221\377\202\37Q\222\377" "\202\36P\221\377\2\37Q\222\377\36P\221\377\202\37Q\222\377\3\36P\221" "\377\37Q\222\377\36P\221\377\204\37Q\222\377\202\36P\221\377\7\37Q\222" "\377\36P\221\377\34O\220\377\25L\214\377\333\341\343\377\356\360\355" "\377\355\357\353\377\203\353\356\352\377\203\355\357\353\377\10\373\372" "\361\377b\200\256\377)a\242\377%U\226\377\36P\221\377\37Q\222\377\36" "P\221\377\37Q\222\377\202\36P\221\377\202\37Q\222\377\1\36P\221\377\202" "\37Q\222\377\2\36P\221\377\37Q\222\377\202\36P\221\377\207\37Q\222\377" "\203\36P\221\377\2\37Q\222\377\36P\221\377\203\37Q\222\377\202\36P\221" "\377\3\34O\220\377\36P\221\377\37Q\222\377\202!R\223\377\3'V\227\377" ",[\227\377#^\236\377\202)a\242\377\202+c\244\377\214.e\247\377\2(W\230" "\377\34O\220\377\202\36P\221\377\202\37Q\222\377\202\36P\221\377\204" "\37Q\222\377\202\36P\221\377\202\37Q\222\377\202\36P\221\377\205\37Q" "\222\377\1\36P\221\377\205\37Q\222\377\1\36P\221\377\203\37Q\222\377" "\13\32N\217\3770\\\236\377\202\207\212\377\255\254\243\377\306\314\302" "\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244\233\377" "u}\205\377\30L\223\377\202+Q\214\377\1\36P\221\377\206+Q\214\377\202" "\36P\221\377\4+Q\214\377\36P\221\377+Q\214\377\36P\221\377\204+Q\214" "\377\202\36P\221\377\211+Q\214\377\2\36P\221\377+Q\214\377\202\36P\221" "\377\202+Q\214\377\1\36P\221\377\204+Q\214\377\202\36P\221\377\210+Q" "\214\377\202\36P\221\377\203+Q\214\377\1\36P\221\377\205+Q\214\377\3" "\36P\221\377+Q\214\377\36P\221\377\203+Q\214\377\1\36P\221\377\203+Q" "\214\377\1\36P\221\377\202+Q\214\377\1\36P\221\377\207+Q\214\377\1\36" "P\221\377\202+Q\214\377\6\34O\220\3774a\235\377\40[\241\377\235\261\311" "\377\367\366\355\377\353\356\352\377\202\355\357\353\377\2\353\356\352" "\377\355\357\353\377\202\353\356\352\377\4\356\360\355\377\365\367\363" "\377v\221\264\377\0C\210\377\205+Q\214\377\1\36P\221\377\215+Q\214\377" "\1\36P\221\377\202+Q\214\377\1\36P\221\377\202+Q\214\377\1\36P\221\377" "\202+Q\214\377\1\36P\221\377\206+Q\214\377\202\36P\221\377\10+Q\214\377" "\36P\221\377+Q\214\377\21J\211\377o\217\267\377\373\372\361\377\353\356" "\352\377\355\357\353\377\202\353\356\352\377\202\355\357\353\377\6\353" "\356\352\377\360\362\357\377\274\310\325\377\35Y\240\377&`\240\377*P" "\213\377\202\36P\221\377\1+Q\214\377\202\36P\221\377\202+Q\214\377\1" "\36P\221\377\204+Q\214\377\202\36P\221\377\210+Q\214\377\202\36P\221" "\377\202+Q\214\377\10\36P\221\377\34O\220\377*P\213\377.R\217\377(W\230" "\377\40\\\234\377$_\237\377)a\242\377\212.e\247\377\204+c\244\377\206" ")a\242\377\3.e\247\377&W\222\377\34O\220\377\202\36P\221\377\202+Q\214" "\377\1\36P\221\377\205+Q\214\377\202\36P\221\377\202+Q\214\377\1\36P" "\221\377\206+Q\214\377\1\36P\221\377\211+Q\214\377\13\32N\217\3770^\232" "\377\202\207\212\377\255\254\243\377\306\314\302\377\330\327\316\377" "\323\332\317\377\306\306\275\377\245\244\233\377u}\205\377\30L\223\377" "\202+Q\214\377\204*P\213\377\203+Q\214\377\202*P\213\377\1+Q\214\377" "\204*P\213\377\1+Q\214\377\204*P\213\377\204+Q\214\377\202*P\213\377" "\202+Q\214\377\202*P\213\377\1+Q\214\377\203*P\213\377\1+Q\214\377\202" "*P\213\377\1+Q\214\377\204*P\213\377\2+Q\214\377*P\213\377\202+Q\214" "\377\1*P\213\377\202+Q\214\377\204*P\213\377\202+Q\214\377\1*P\213\377" "\203+Q\214\377\2*P\213\377+Q\214\377\203*P\213\377\202+Q\214\377\202" "*P\213\377\3+Q\214\377*P\213\377+Q\214\377\202*P\213\377\2+Q\214\377" "*P\213\377\205+Q\214\377\2*P\213\377+Q\214\377\203*P\213\377\6+X\232" "\3771g\251\377=h\245\377\360\362\357\377\351\353\347\377\353\356\352" "\377\204\355\357\353\377\5\353\356\352\377\351\353\347\377\367\366\355" "\377o\217\267\377\33D\205\377\203*P\213\377\203+Q\214\377\1*P\213\377" "\202+Q\214\377\204*P\213\377\207+Q\214\377\2*P\213\377+Q\214\377\203" "*P\213\377\2+Q\214\377*P\213\377\202+Q\214\377\204*P\213\377\203+Q\214" "\377\202*P\213\377\7+Q\214\377*P\213\377+Q\214\377\34O\220\377*Z\225" "\377\340\345\350\377\360\362\357\377\206\355\357\353\377\5\351\353\347" "\377\360\362\357\377>s\257\377)a\242\377\"U\217\377\202*P\213\377\1+" "Q\214\377\203*P\213\377\1+Q\214\377\202*P\213\377\1+Q\214\377\204*P\213" "\377\2+Q\214\377*P\213\377\202+Q\214\377\202*P\213\377\1+Q\214\377\205" "*P\213\377\3!R\223\377&`\240\3779e\242\377\204.e\247\377\2049e\242\377" "\3+c\244\377)a\242\3770\\\236\377\203\35Y\240\377\2""0\\\236\377+c\244" "\377\202.e\247\377\206=h\245\377\2@k\250\3779e\242\377\204*P\213\377" "\202+Q\214\377\202*P\213\377\2+Q\214\377*P\213\377\202+Q\214\377\210" "*P\213\377\203+Q\214\377\1*P\213\377\202+Q\214\377\204*P\213\377\203" "+Q\214\377\13\32N\217\3770^\232\377\202\207\212\377\255\254\243\377\306" "\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377\245\244" "\233\377u}\205\377\30L\223\377\202+Q\214\377\3*P\213\377+Q\214\377*P" "\213\377\204+Q\214\377\202*P\213\377\4+Q\214\377*P\213\377+Q\214\377" "*P\213\377\204+Q\214\377\202*P\213\377\205+Q\214\377\1\36P\221\377\203" "+Q\214\377\2*P\213\377+Q\214\377\202*P\213\377\202+Q\214\377\1*P\213" "\377\202+Q\214\377\2\36P\221\377+Q\214\377\202*P\213\377\207+Q\214\377" "\202\36P\221\377\1*P\213\377\203+Q\214\377\1*P\213\377\203+Q\214\377" "\2\36P\221\377+Q\214\377\202\36P\221\377\1*P\213\377\203+Q\214\377\1" "*P\213\377\203+Q\214\377\1*P\213\377\202+Q\214\377\1\36P\221\377\210" "+Q\214\377\6*P\213\377+Q\214\377+c\244\377\35Y\240\377\226\255\313\377" "\365\364\353\377\203\353\356\352\377\1\355\357\353\377\202\353\356\352" "\377\6\355\357\353\377\365\367\363\377v\221\264\377\33D\205\377+Q\214" "\377*P\213\377\205+Q\214\377\1\36P\221\377\205+Q\214\377\1\36P\221\377" "\207+Q\214\377\1*P\213\377\202+Q\214\377\202*P\213\377\2+Q\214\377*P" "\213\377\202+Q\214\377\3*P\213\377+Q\214\377*P\213\377\204+Q\214\377" "\202*P\213\377\7+Q\214\377*P\213\377+Q\214\377*P\213\377\35F\207\377" "\235\261\311\377\372\371\357\377\203\353\356\352\377\203\355\357\353" "\377\6\353\356\352\377\375\365\355\377\214\244\302\377\35Y\240\377\36" "[\233\377*P\213\377\202+Q\214\377\202*P\213\377\202+Q\214\377\1*P\213" "\377\202+Q\214\377\2\36P\221\377+Q\214\377\202*P\213\377\205+Q\214\377" "\202*P\213\377\7+Q\214\377\36[\233\377,Y\233\377+X\232\377.R\217\377" "*P\213\377)a\242\377\202.e\247\377\4+c\244\377)a\242\3770\\\236\377/" "[\235\377\2020\\\236\377\10.e\247\377Mx\260\377g\216\273\377\205\241" "\304\377\235\261\311\377\255\274\320\377\274\310\325\377\301\314\332" "\377\202\313\324\334\377\202\321\331\342\377\204\325\336\346\377\5\333" "\341\343\377\313\324\334\3774a\235\377\32N\217\377+Q\214\377\202*P\213" "\377\202+Q\214\377\2*P\213\377\36P\221\377\204+Q\214\377\202*P\213\377" "\202+Q\214\377\2*P\213\377\36P\221\377\205+Q\214\377\1\36P\221\377\205" "+Q\214\377\1\36P\221\377\203+Q\214\377\13\32N\217\3770^\232\377\202\207" "\212\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317" "\377\306\306\275\377\245\244\233\377u}\205\377\30L\223\377\324+Q\214" "\377\10*P\213\377/]\231\377+c\244\3777n\251\377\343\351\353\377\356\360" "\355\377\355\357\353\377\353\356\352\377\203\355\357\353\377\4\353\356" "\352\377\373\372\361\377~\232\275\377\33D\205\377\254+Q\214\377\4'N\211" "\377Bf\235\377\362\364\361\377\351\353\347\377\203\353\356\352\377\203" "\355\357\353\377\5\362\364\361\377\321\331\342\377)a\242\377+c\244\377" "*P\213\377\221+Q\214\377\4*P\213\377\34O\220\377%U\226\377+c\244\377" "\204.e\247\377\14""9e\242\377.e\247\377)a\242\377\30W\235\377)a\242\377" "Mx\260\377c\212\267\377\205\241\304\377\262\302\325\377\325\336\346\377" "\362\364\361\377\365\367\363\377\203\365\364\353\377\1\365\367\363\377" "\202\362\364\361\377\210\360\362\357\377\4\373\372\361\377\274\310\325" "\377\23K\212\377*P\213\377\240+Q\214\377\14\32N\217\3770^\232\377\202" "\207\212\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332" "\317\377\306\306\275\377\245\244\233\377u}\205\377\30L\223\377\36P\221" "\377\204*P\213\377\204\36P\221\377\202*P\213\377\2\36P\221\377*P\213" "\377\206\36P\221\377\202*P\213\377\211\36P\221\377\204*P\213\377\202" "\36P\221\377\203*P\213\377\202\36P\221\377\202*P\213\377\211\36P\221" "\377\202*P\213\377\202\36P\221\377\1*P\213\377\207\36P\221\377\1*P\213" "\377\203\36P\221\377\1*P\213\377\203\36P\221\377\1*P\213\377\212\36P" "\221\377\6'N\211\377%U\226\377=h\245\377\40[\241\377\214\244\302\377" "\367\366\355\377\204\353\356\352\377\202\355\357\353\377\5\365\367\363" "\377\321\331\342\377\25L\214\377+Q\214\377*P\213\377\203\36P\221\377" "\1*P\213\377\205\36P\221\377\202*P\213\377\212\36P\221\377\1*P\213\377" "\202\36P\221\377\202*P\213\377\203\36P\221\377\204*P\213\377\204\36P" "\221\377\202*P\213\377\10\36P\221\377*P\213\377\36P\221\377*P\213\377" "+Q\214\377\35F\207\377\301\314\332\377\360\362\357\377\202\353\356\352" "\377\203\355\357\353\377\10\353\356\352\377\355\357\353\377\372\371\357" "\377[\177\262\377+c\244\377'V\227\377*P\213\377\36P\221\377\202*P\213" "\377\202\36P\221\377\203*P\213\377\202\36P\221\377\3*P\213\377\36P\221" "\377*P\213\377\202\32N\217\377\3\37Q\222\377+X\232\377)a\242\377\203" ".e\247\377\15)a\242\377-Z\234\377)a\242\377.e\247\3770\\\236\377g\216" "\273\377\301\314\332\377\325\336\346\377\343\351\353\377\362\364\361" "\377\372\371\357\377\360\362\357\377\356\360\355\377\204\351\353\347" "\377\203\353\356\352\377\202\355\357\353\377\202\353\356\352\377\204" "\355\357\353\377\4\351\353\347\377\367\366\355\377o\217\267\377\35F\207" "\377\202*P\213\377\2\36P\221\377*P\213\377\202\36P\221\377\3*P\213\377" "\36P\221\377*P\213\377\203\36P\221\377\202*P\213\377\1\36P\221\377\202" "*P\213\377\202\36P\221\377\1*P\213\377\205\36P\221\377\202*P\213\377" "\206\36P\221\377\13\32N\217\377/]\231\377\202\207\212\377\255\254\243" "\377\306\314\302\377\330\327\316\377\323\332\317\377\306\306\275\377" "\245\244\233\377u}\205\377\30L\223\377\321\34O\220\377\6\36P\221\377" "\32N\217\377%U\226\377.e\247\3779e\242\377+c\244\377\203\353\356\352" "\377\203\355\357\353\377\202\353\356\352\377\4\373\372\361\377Uv\242" "\377\33D\205\377\36P\221\377\254\34O\220\377\4\36P\221\377#I\213\377" "^\205\262\377\375\365\355\377\206\355\357\353\377\6\353\356\352\377\360" "\362\357\377\267\306\332\377\35Y\240\377)a\242\377\32N\217\377\213\34" "O\220\377\202\32N\217\377\2'V\227\377#^\236\377\203.e\247\377\12+c\244" "\377)a\242\377\35Y\240\377Fs\252\377v\227\277\377.e\247\377-Z\234\377" ")a\242\377Fs\252\377\370\363\361\377\202\356\360\355\377\1\355\357\353" "\377\202\353\356\352\377\207\355\357\353\377\1\353\356\352\377\207\355" "\357\353\377\5\353\356\352\377\351\353\347\377\360\362\357\377%U\226" "\377*P\213\377\241\34O\220\377\20\32N\217\3779\\\231\377\202\207\212" "\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377" "\310\307\276\377\245\244\233\377u}\205\377\30L\223\377\34O\220\377*P" "\213\377\34O\220\377*P\213\377\34O\220\377\207\36P\221\377\3\34O\220" "\377\36P\221\377\34O\220\377\217\36P\221\377\1*P\213\377\202\36P\221" "\377\1\34O\220\377\203\36P\221\377\1*P\213\377\203\36P\221\377\3*P\213" "\377\36P\221\377\34O\220\377\210\36P\221\377\202*P\213\377\4\36P\221" "\377\34O\220\377\36P\221\377*P\213\377\202\36P\221\377\1\34O\220\377" "\203\36P\221\377\1\34O\220\377\216\36P\221\377\4\34O\220\377\36P\221" "\377\32N\217\377'V\227\377\202.e\247\377\4-Z\234\377\235\261\311\377" "\367\366\355\377\353\356\352\377\202\355\357\353\377\203\353\356\352" "\377\3\362\364\361\377\255\274\320\377\0C\210\377\202\36P\221\377\1\34" "O\220\377\203\36P\221\377\1*P\213\377\206\36P\221\377\1*P\213\377\202" "\36P\221\377\1\34O\220\377\202\36P\221\377\1\34O\220\377\205\36P\221" "\377\1\34O\220\377\202\36P\221\377\1*P\213\377\203\36P\221\377\4*P\213" "\377\34O\220\377*P\213\377\34O\220\377\207\36P\221\377\2\34O\220\377" "\36P\221\377\202\34O\220\377\4\32N\217\377%U\226\377\325\336\346\377" "\360\362\357\377\207\355\357\353\377\5\351\353\347\377Fs\252\3771]\237" "\377!R\223\377\34O\220\377\206\36P\221\377\6\34O\220\377\32N\217\377" "\34O\220\377!R\223\377,Y\233\377+c\244\377\204.e\247\377\14-Z\234\377" ".e\247\377[\177\262\377\274\310\325\377\356\360\355\377\365\364\353\377" "\351\353\347\377\242\266\316\377[\177\262\377\35Y\240\377v\227\277\377" "\375\365\355\377\213\355\357\353\377\1\353\356\352\377\204\355\357\353" "\377\10\353\356\352\377\351\353\347\377\353\356\352\377\365\367\363\377" "\376\375\364\377\246\265\311\377\35F\207\377+Q\214\377\203\36P\221\377" "\1*P\213\377\202\36P\221\377\4*P\213\377\34O\220\377\36P\221\377\34O" "\220\377\202\36P\221\377\202*P\213\377\202\34O\220\377\203\36P\221\377" "\1*P\213\377\206\36P\221\377\1*P\213\377\202\36P\221\377\1\34O\220\377" "\202\36P\221\377\14\34O\220\377\32N\217\377/]\231\377\202\207\212\377" "\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\301" "\310\275\377\245\244\233\377u}\205\377\30L\223\377\207\34O\220\377\1" "\36P\221\377\203\34O\220\377\1\36P\221\377\204\34O\220\377\1\36P\221" "\377\204\34O\220\377\204\36P\221\377\202\34O\220\377\202\36P\221\377" "\206\34O\220\377\1\36P\221\377\211\34O\220\377\1\36P\221\377\202\34O" "\220\377\1\36P\221\377\205\34O\220\377\1\36P\221\377\202\34O\220\377" "\203\36P\221\377\2\34O\220\377\36P\221\377\203\34O\220\377\1\36P\221" "\377\203\34O\220\377\1\36P\221\377\206\34O\220\377\2\36P\221\377\34O" "\220\377\202\36P\221\377\2\32N\217\377%U\226\377\202.e\247\377\3\35Y" "\240\377\222\251\307\377\365\367\363\377\202\355\357\353\377\203\353" "\356\352\377\1\355\357\353\377\202\356\360\355\377\2s\257\377\202F" "s\252\377\11Mx\260\377^\205\262\377\214\244\302\377\301\314\332\377\343" "\351\353\377\360\362\357\377\373\372\361\377\360\362\357\377\355\357" "\353\377\202\353\356\352\377\1\355\357\353\377\202\353\356\352\377\1" "\355\357\353\377\205\353\356\352\377\1\355\357\353\377\202\353\356\352" "\377\202\355\357\353\377\15\353\356\352\377\351\353\347\377\353\356\352" "\377\367\366\355\377\365\367\363\377\340\345\350\377\274\310\325\377" "v\221\264\3776[\222\377\27M\215\377\33D\205\377\35F\207\377'N\211\377" "\216*P\213\377\1\34O\220\377\203*P\213\377\1\34O\220\377\211*P\213\377" "\1\34O\220\377\220*P\213\377\13\32N\217\3770^\232\377\202\207\212\377" "\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377\310" "\307\276\377\250\247\236\377u}\205\377\30L\223\377\313*P\213\377\2'N" "\211\377%U\226\377\202.e\247\377\3\35Y\240\377\222\251\307\377\367\366" "\355\377\204\355\357\353\377\1\353\356\352\377\202\355\357\353\377\5" "\353\356\352\377\355\357\353\377\365\367\363\377\77l\243\377\32N\217" "\377\265*P\213\377\4\0C\210\377\262\302\325\377\360\362\357\377\353\356" "\352\377\205\355\357\353\377\2\353\356\352\377\355\357\353\377\204\360" "\362\357\377\4\372\371\357\377\377\371\361\377\367\366\355\377\360\362" "\357\377\203\355\357\353\377\1\353\356\352\377\215\355\357\353\377\202" "\353\356\352\377\13\356\360\355\377\362\364\361\377\367\366\355\377\373" "\372\361\377\340\345\350\377\235\261\311\377e\202\252\3776[\222\377\24" "A\201\377\35F\207\377\32N\217\377\261*P\213\377\13\32N\217\3770^\232" "\377\202\207\212\377\255\254\243\377\306\314\302\377\330\327\316\377" "\323\332\317\377\310\307\276\377\250\247\236\377u}\205\377\30L\223\377" "\202*P\213\377\205\34O\220\377\2*P\213\377\34O\220\377\202*P\213\377" "\4\34O\220\377*P\213\377\34O\220\377*P\213\377\204\34O\220\377\202*P" "\213\377\211\34O\220\377\204*P\213\377\202\34O\220\377\3*P\213\377\34" "O\220\377*P\213\377\202\34O\220\377\202*P\213\377\203\34O\220\377\1*" "P\213\377\204\34O\220\377\202*P\213\377\202\34O\220\377\202*P\213\377" "\205\34O\220\377\1*P\213\377\210\34O\220\377\202*P\213\377\3\34O\220" "\377'N\211\3770T\221\377\202.e\247\377\5\35Y\240\377\226\255\313\377" "\373\372\361\377\355\357\353\377\353\356\352\377\202\355\357\353\377" "\202\353\356\352\377\203\355\357\353\377\4\373\372\361\377\226\251\302" "\377\0C\210\377*P\213\377\202\34O\220\377\202*P\213\377\211\34O\220\377" "\3*P\213\377\34O\220\377*P\213\377\206\34O\220\377\1*P\213\377\204\34" "O\220\377\1*P\213\377\202\34O\220\377\1*P\213\377\202\34O\220\377\3*" "P\213\377\34O\220\377*P\213\377\205\34O\220\377\2*P\213\377\34O\220\377" "\202*P\213\377\4\34O\220\377*P\213\377\34O\220\377*P\213\377\203\34O" "\220\377\5*P\213\377\21J\211\377c\212\267\377\373\372\361\377\353\356" "\352\377\205\355\357\353\377\202\353\356\352\377\204\356\360\355\377" "\1\355\357\353\377\202\353\356\352\377\204\355\357\353\377\1\353\356" "\352\377\211\355\357\353\377\20\353\356\352\377\355\357\353\377\353\356" "\352\377\351\353\347\377\356\360\355\377\373\372\361\377\353\356\352" "\377\305\316\326\377\214\244\302\377Bf\235\377\27M\215\377\35F\207\377" "\33D\205\377\25L\214\377\34O\220\377*P\213\377\204\34O\220\377\1*P\213" "\377\203\34O\220\377\1*P\213\377\207\34O\220\377\5*P\213\377\34O\220" "\377*P\213\377\34O\220\377*P\213\377\204\34O\220\377\1*P\213\377\203" "\34O\220\377\202*P\213\377\211\34O\220\377\3*P\213\377\34O\220\377*P" "\213\377\206\34O\220\377\14*P\213\377\27M\215\377/]\231\377\202\207\212" "\377\255\254\243\377\306\314\302\377\330\327\316\377\323\332\317\377" "\301\310\275\377\250\247\236\377u}\205\377\30L\223\377\311\32N\217\377" "\2\27M\215\377$T\225\377\202.e\247\377\4\35Y\240\377\222\251\307\377" "\367\366\355\377\353\356\352\377\204\355\357\353\377\202\353\356\352" "\377\6\355\357\353\377\353\356\352\377\355\357\353\377\353\356\352\377" "1U\222\377#I\213\377\267\32N\217\377\1""3`\234\377\202\356\360\355\377" "\207\355\357\353\377\204\353\356\352\377\202\355\357\353\377\1\353\356" "\352\377\204\355\357\353\377\1\353\356\352\377\210\355\357\353\377\2" "\353\356\352\377\356\360\355\377\202\367\366\355\377\11\362\364\361\377" "\313\324\334\377v\221\264\377Bf\235\377\35F\207\377\33D\205\377\32N\217" "\377\36P\221\377\34O\220\377\266\32N\217\377\14#I\213\377.\\\230\377" "\202\207\212\377\255\254\243\377\306\314\302\377\330\327\316\377\323" "\332\317\377\301\310\275\377\250\247\236\377u}\205\377\30L\223\377\32" "N\217\377\203\34O\220\377\13\32N\217\377\34O\220\377\32N\217\377*P\213" "\377\34O\220\377*P\213\377\32N\217\377\34O\220\377\32N\217\377*P\213" "\377\32N\217\377\204\34O\220\377\1*P\213\377\221\34O\220\377\4\32N\217" "\377\34O\220\377\32N\217\377\34O\220\377\202*P\213\377\204\34O\220\377" "\3\32N\217\377\34O\220\377\32N\217\377\202\34O\220\377\1*P\213\377\203" "\34O\220\377\3\32N\217\377\34O\220\377*P\213\377\203\34O\220\377\1\32" "N\217\377\210\34O\220\377\202\32N\217\377\1%U\226\377\202.e\247\377\4" "\35Y\240\377\226\255\313\377\367\366\355\377\355\357\353\377\203\353" "\356\352\377\202\355\357\353\377\202\353\356\352\377\7\355\357\353\377" "\353\356\352\377\373\372\361\377o\217\267\377\33D\205\377\34O\220\377" "\32N\217\377\202\34O\220\377\1\32N\217\377\202\34O\220\377\5\32N\217" "\377\34O\220\377*P\213\377\34O\220\377*P\213\377\206\34O\220\377\1*P" "\213\377\202\34O\220\377\1\32N\217\377\202\34O\220\377\5\32N\217\377" "\34O\220\377*P\213\377\34O\220\377*P\213\377\204\34O\220\377\3\32N\217" "\377\34O\220\377\32N\217\377\204\34O\220\377\13\32N\217\377\34O\220\377" "\32N\217\377*P\213\377\34O\220\377*P\213\377\32N\217\377\34O\220\377" "\32N\217\377*P\213\377\32N\217\377\204\34O\220\377\4\32N\217\377\27M" "\215\377\301\314\332\377\367\366\355\377\202\355\357\353\377\203\353" "\356\352\377\1\355\357\353\377\206\353\356\352\377\1\355\357\353\377" "\202\353\356\352\377\1\355\357\353\377\203\353\356\352\377\1\355\357" "\353\377\202\353\356\352\377\2\355\357\353\377\353\356\352\377\202\355" "\357\353\377\12\356\360\355\377\373\372\361\377\351\353\347\377\274\310" "\325\377~\232\275\377s\257\377\365\364\353\377\351\353\347\377\355" "\357\353\377\203\353\356\352\377\1\355\357\353\377\204\353\356\352\377" "\3\362\364\361\377o\217\267\3770\\\236\377\203\"J\205\377\202%L\207\377" "\2\25L\214\377%L\207\377\202\25L\214\377\1\"J\205\377\202%L\207\377\2" "\25L\214\377%L\207\377\206\25L\214\377\202%L\207\377\202\25L\214\377" "\1%L\207\377\203\25L\214\377\203%L\207\377\203\25L\214\377\6%L\207\377" "\25L\214\377\"J\205\377\25L\214\377\"J\205\377\25L\214\377\202%L\207" "\377\202\25L\214\377\205%L\207\377\1\25L\214\377\202\"J\205\377\202%" "L\207\377\204\25L\214\377\202%L\207\377\2\"J\205\377%L\207\377\202\25" "L\214\377\202%L\207\377\203\25L\214\377\202%L\207\377\1\"J\205\377\202" "%L\207\377\2\25L\214\377\"J\205\377\202\25L\214\377\202\"J\205\377\203" "%L\207\377\1\"J\205\377\203\25L\214\377\203%L\207\377\1\25L\214\377\202" "%L\207\377\1\25L\214\377\203%L\207\377\3\"J\205\377%L\207\377\"J\205" "\377\202\25L\214\377\1%L\207\377\202\25L\214\377\4%L\207\377\25L\214" "\377%L\207\377\"J\205\377\202\25L\214\377\1%L\207\377\202\25L\214\377" "\202%L\207\377\203\25L\214\377\1%L\207\377\204\25L\214\377\1%L\207\377" "\203\25L\214\377\205%L\207\377\2\25L\214\377%L\207\377\202\25L\214\377" "\1\"J\205\377\202%L\207\377\2\25L\214\377%L\207\377\206\25L\214\377\202" "%L\207\377\202\25L\214\377\16%L\207\377\"J\205\377\35F\207\377Jd\212" "\377\215\214\204\377\250\247\236\377\307\316\303\377\330\327\316\377" "\323\332\317\377\310\307\276\377\255\254\243\377\212\214\211\377 image/svg+xml Subsurface-4.0.2/subsurface-install.pri000066400000000000000000000140301226345450700201470ustar00rootroot00000000000000marbledir.files = $$MARBLEDIR doc.files = $$DOC_FILES translation.files = $$replace(TRANSLATIONS, .ts, .qm) exists($$[QT_INSTALL_TRANSLATIONS]) { qt_translation_dir = $$[QT_INSTALL_TRANSLATIONS]/ } else: exists(/usr/share/qt4/translations) { # On some cross-compilation environments, the translations are either missing or not # where they're expected to be. In such cases, try copying from the system. qt_translation_dir = /usr/share/qt4/translations } qttranslation.files = $$join(QTTRANSLATIONS," "$$qt_translation_dir/,$$qt_translation_dir/) nltab = $$escape_expand(\\n\\t) mac { # OS X bundling rules # "make mac-deploy" deploys the external libs (Qt, libdivecomputer, libusb, etc.) into the bundle # "make install" installs the bundle to /Applications # "make mac-create-dmg" creates Subsurface.dmg mac_bundle.path = /Applications mac_bundle.files = Subsurface.app mac_bundle.CONFIG += no_check_exist directory INSTALLS += mac_bundle install.depends += mac-deploy datadir = Contents/Resources/share marbledir.path = Contents/Resources/data doc.path = $$datadir/Documentation translation.path = Contents/Resources/translations qttranslation.path = Contents/Resources/translations QMAKE_BUNDLE_DATA += marbledir doc translation qttranslation mac_deploy.target = mac-deploy mac_deploy.commands += $$[QT_INSTALL_BINS]/macdeployqt $${TARGET}.app !isEmpty(V):mac_deploy.commands += -verbose=1 mac_dmg.target = mac-create-dmg mac_dmg.commands = $$mac_deploy.commands -dmg mac_dmg.commands += $${nltab}$(MOVE) $${TARGET}.dmg $${TARGET}-$${FULL_VERSION}.dmg QMAKE_EXTRA_TARGETS += mac_deploy mac_dmg } else: win32 { # Windows bundling rules # We don't have a helpful tool like macdeployqt for Windows, so we hardcode # which libs we need. # The only target is "make install", which copies everything into packaging/windows WINDOWSSTAGING = packaging/windows NSIFILE = $$PWD/$$WINDOWSSTAGING/subsurface.nsi NSIINPUTFILE = $$PWD/$$WINDOWSSTAGING/subsurface.nsi.in MAKENSIS = /usr/bin/makensis doc.path = $$WINDOWSSTAGING/Documentation CONFIG -= copy_dir_files deploy.path = $$WINDOWSSTAGING deploy.CONFIG += no_check_exist target.path = $$WINDOWSSTAGING marbledir.path = $$WINDOWSSTAGING/data INSTALLS += deploy marbledir target doc translation.path = $$WINDOWSSTAGING/translations qttranslation.path = $$WINDOWSSTAGING/translations INSTALLS += translation qttranslation qt_conf.commands = echo \'[Paths]\' > $@ qt_conf.commands += $${nltab}echo \'Prefix=.\' >> $@ qt_conf.target = $$PWD/packaging/windows/qt.conf install.depends += qt_conf # Plugin code defineTest(deployPlugin) { plugin = $$1 plugintype = $$dirname(1) CONFIG(debug, debug|release): plugin = $${plugin}d4.dll else: plugin = $${plugin}4.dll abs_plugin = $$[QT_INSTALL_PLUGINS]/$$plugin ABS_DEPLOYMENT_PLUGIN += $$abs_plugin export(ABS_DEPLOYMENT_PLUGIN) safe_name = $$replace(1, /, _) INSTALLS += $$safe_name # Work around qmake bug in Qt4 that it can't handle $${xx}.yy properly eval(safe_name_files = $${safe_name}.files) eval(safe_name_path = $${safe_name}.path) $$safe_name_files = $$abs_plugin $$safe_name_path = $$WINDOWSSTAGING/plugins/$$plugintype export($$safe_name_files) export($$safe_name_path) export(INSTALLS) } # Convert plugin names to the relative DLL path for(plugin, $$list($$DEPLOYMENT_PLUGIN)) { deployPlugin($$plugin) } !win32-msvc* { #!equals($$QMAKE_HOST.os, "Windows"): dlls.commands += OBJDUMP=`$$QMAKE_CC -dumpmachine`-objdump dlls.commands += PATH=\$\$PATH:`$$QMAKE_CC -print-search-dirs | sed -nE \'/^libraries: =/{s///;s,/lib/?(:|\$\$),/bin\\1,g;p;q;}\'` dlls.commands += perl $$PWD/scripts/win-ldd.pl # equals(QMAKE_HOST.os, "Windows"): EXE_SUFFIX = .exe EXE_SUFFIX = .exe CONFIG(debug, debug|release): dlls.commands += $$OUT_PWD/debug/subsurface$$EXE_SUFFIX else: dlls.commands += $$OUT_PWD/release/$$TARGET$$EXE_SUFFIX dlls.commands += $$ABS_DEPLOYMENT_PLUGIN $$LIBS dlls.commands += | while read name; do $(INSTALL_FILE) \$\$name $$PWD/$$WINDOWSSTAGING; done dlls.depends += $(DESTDIR_TARGET) nsis.commands += cat $$NSIINPUTFILE | sed -e \'s/VERSIONTOKEN/$$VERSION_STRING/;s/PRODVTOKEN/$${PRODVERSION_STRING}/\' > $$NSIFILE nsis.depends += $$NSIINPUTFILE nsis.target = $$NSISFILE installer.commands += $$MAKENSIS $$NSIFILE installer.target = installer installer.depends = nsis install QMAKE_EXTRA_TARGETS = installer nsis install.depends += dlls } } else { # Linux install rules # On Linux, we can count on packagers doing the right thing # We just need to drop a few files here and there # This is a fake rule just to create some rules in the target file nl = $$escape_expand(\\n) dummy.target = dummy-only-for-var-expansion dummy.commands = $${nl}prefix = /usr$${nl}\ BINDIR = $(prefix)/bin$${nl}\ DATADIR = $(prefix)/share$${nl}\ DOCDIR = $(DATADIR)/subsurface/Documentation$${nl}\ DESKTOPDIR = $(DATADIR)/applications$${nl}\ ICONPATH = $(DATADIR)/icons/hicolor$${nl}\ ICONDIR = $(ICONPATH)/scalable/apps$${nl}\ MANDIR = $(DATADIR)/man/man1$${nl} QMAKE_EXTRA_TARGETS += dummy WINDOWSSTAGING = ./packaging/windows target.path = /$(BINDIR) target.files = $$TARGET desktop.path = /$(DESKTOPDIR) desktop.files = $$DESKTOP_FILE manpage.path = /$(MANDIR) manpage.files = $$MANPAGE icon.path = /$(ICONDIR) icon.files = $$ICON marbledir.path = /$(DATADIR)/subsurface/data doc.path = /$(DOCDIR) doc.CONFIG += no_check_exist translation.path = /$(DATADIR)/subsurface/translations translation.CONFIG += no_check_exist INSTALLS += target desktop manpage doc marbledir translation icon install.target = install } !isEmpty(TRANSLATIONS) { isEmpty(QMAKE_LRELEASE) { win32: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe else: QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease } isEmpty(TS_DIR):TS_DIR = translations TSQM.input = TRANSLATIONS TSQM.output = $$TS_DIR/${QMAKE_FILE_BASE}.qm TSQM.CONFIG += no_link target_predeps TSQM.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$TS_DIR/${QMAKE_FILE_BASE}.qm QMAKE_EXTRA_COMPILERS += TSQM } QMAKE_EXTRA_TARGETS += install $$install.depends Subsurface-4.0.2/subsurface.1000066400000000000000000000017371226345450700160630ustar00rootroot00000000000000.TH subsurface 1 "Dec 15, 2013" .SH NAME subsurface \- a logbook program for scuba divers .SH SYNOPSIS .B subsurface [options] [FILE...] [\-import] [FILE...] .SH DESCRIPTION .B subsurface allows you to manage your dive logs that you can download from your dive computer or import from existing XML files. .PP You can click on the column headings to sort the dives based on this column. .PP Additional dives that get imported will be assigned numbers if they don't already have numbers, are after all currently stored dives and the last of those dives is numbered. .PP For full usage information see Subsurface User Manual, available on-line at http://subsurface.hohndel.org/ and locally under Help menu. .SH OPTIONS .B \-v show more output during processing .PP .B \-\-import all further files should be processed as import, not open .PP .B \-\-help command line usage help .PP .B \-\-version print Subsurface version information .SH BUGS If you find bugs, report at http://trac.hohndel.org Subsurface-4.0.2/subsurface.desktop000066400000000000000000000003051226345450700173620ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=subsurface GenericName=dive log program Comment=manage and display dive computer data Icon=subsurface-icon Exec=subsurface Terminal=false Categories=Utility; Subsurface-4.0.2/subsurface.pro000066400000000000000000000115721226345450700165210ustar00rootroot00000000000000include(subsurface-configure.pri) QT = core gui network webkit svg INCLUDEPATH += qt-ui $$PWD mac: TARGET = Subsurface else: TARGET = subsurface VERSION = 4.0.2 HEADERS = \ color.h \ deco.h \ device.h \ display.h \ dive.h \ divelist.h \ file.h \ flag.h \ gettextfromc.h \ gettext.h \ helpers.h \ libdivecomputer.h \ planner.h \ pref.h \ profile.h \ qt-gui.h \ qthelper.h \ qt-ui/about.h \ qt-ui/completionmodels.h \ qt-ui/divecomputermanagementdialog.h \ qt-ui/divelistview.h \ qt-ui/diveplanner.h \ qt-ui/downloadfromdivecomputer.h \ qt-ui/globe.h \ qt-ui/graphicsview-common.h \ qt-ui/kmessagewidget.h \ qt-ui/maintab.h \ qt-ui/mainwindow.h \ qt-ui/modeldelegates.h \ qt-ui/models.h \ qt-ui/preferences.h \ qt-ui/printdialog.h \ qt-ui/printlayout.h \ qt-ui/printoptions.h \ qt-ui/profilegraphics.h \ qt-ui/simplewidgets.h \ qt-ui/starwidget.h \ qt-ui/subsurfacewebservices.h \ qt-ui/tableview.h \ sha1.h \ statistics.h \ subsurface-icon.h \ subsurfacestartup.h \ uemis.h \ webservice.h \ qt-ui/csvimportdialog.h \ qt-ui/tagwidget.h \ qt-ui/groupedlineedit.h SOURCES = \ deco.c \ device.c \ dive.c \ divelist.c \ equipment.c \ file.c \ gettextfromc.cpp \ libdivecomputer.c \ main.cpp \ parse-xml.c \ planner.c \ profile.c \ qt-gui.cpp \ qthelper.cpp \ qt-ui/about.cpp \ qt-ui/completionmodels.cpp \ qt-ui/divecomputermanagementdialog.cpp \ qt-ui/divelistview.cpp \ qt-ui/diveplanner.cpp \ qt-ui/downloadfromdivecomputer.cpp \ qt-ui/globe.cpp \ qt-ui/graphicsview-common.cpp \ qt-ui/kmessagewidget.cpp \ qt-ui/maintab.cpp \ qt-ui/mainwindow.cpp \ qt-ui/modeldelegates.cpp \ qt-ui/models.cpp \ qt-ui/preferences.cpp \ qt-ui/printdialog.cpp \ qt-ui/printlayout.cpp \ qt-ui/printoptions.cpp \ qt-ui/profilegraphics.cpp \ qt-ui/simplewidgets.cpp \ qt-ui/starwidget.cpp \ qt-ui/subsurfacewebservices.cpp \ qt-ui/tableview.cpp \ save-xml.c \ sha1.c \ statistics.c \ strtod.c \ subsurfacestartup.c \ time.c \ uemis.c \ uemis-downloader.c \ qt-ui/csvimportdialog.cpp \ qt-ui/tagwidget.cpp \ qt-ui/groupedlineedit.cpp linux*: SOURCES += linux.c mac: SOURCES += macos.c win32: SOURCES += windows.c FORMS = \ qt-ui/about.ui \ qt-ui/divecomputermanagementdialog.ui \ qt-ui/diveplanner.ui \ qt-ui/downloadfromdivecomputer.ui \ qt-ui/maintab.ui \ qt-ui/mainwindow.ui \ qt-ui/preferences.ui \ qt-ui/printoptions.ui \ qt-ui/renumber.ui \ qt-ui/shifttimes.ui \ qt-ui/webservices.ui \ qt-ui/tableview.ui \ qt-ui/csvimportdialog.ui RESOURCES = subsurface.qrc TRANSLATIONS = \ translations/subsurface_source.ts \ translations/subsurface_bg_BG.ts \ translations/subsurface_da_DK.ts \ translations/subsurface_de_CH.ts \ translations/subsurface_de_DE.ts \ translations/subsurface_es_ES.ts \ translations/subsurface_et_EE.ts \ translations/subsurface_fi_FI.ts \ translations/subsurface_fr_FR.ts \ translations/subsurface_it_IT.ts \ translations/subsurface_nb_NO.ts \ translations/subsurface_nl_NL.ts \ translations/subsurface_pl_PL.ts \ translations/subsurface_pt_BR.ts \ translations/subsurface_pt_PT.ts \ translations/subsurface_ru_RU.ts \ translations/subsurface_sk_SK.ts \ translations/subsurface_sv_SE.ts \ translations/subsurface_zh_TW.ts \ translations/subsurface_he.ts QTTRANSLATIONS = \ qt_da.qm \ qt_de.qm \ qt_es.qm \ qt_fr.qm \ qt_pl.qm \ qt_pt.qm \ qt_ru.qm \ qt_sk.qm \ qt_sv.qm doc.commands += $$escape_expand(\\n\\t)$(MAKE) -C $$PWD/Documentation OUT=$$OUT_PWD/Documentation/ doc all.depends += doc QMAKE_EXTRA_TARGETS += doc all DESKTOP_FILE = subsurface.desktop mac: ICON = packaging/macosx/Subsurface.icns else: ICON = subsurface-icon.svg MANPAGE = subsurface.1 XSLT_FILES = xslt ICONS_FILES = icons DOC_FILES = $$OUT_PWD/Documentation/user-manual.html Documentation/images MARBLEDIR = marbledata/maps marbledata/bitmaps #DEPLOYMENT_PLUGIN += bearer/qnativewifibearer DEPLOYMENT_PLUGIN += codecs/qcncodecs codecs/qjpcodecs codecs/qkrcodecs codecs/qtwcodecs DEPLOYMENT_PLUGIN += imageformats/qgif imageformats/qjpeg imageformats/qsvg DEPLOYMENT_PLUGIN += iconengines/qsvgicon #DEPLOYMENT_PLUGIN += sqldrivers/qsqlite # This information will go into the Windows .rc file and linked into the .exe QMAKE_TARGET_COMPANY = subsurface team QMAKE_TARGET_DESCRIPTION = subsurface dive log QMAKE_TARGET_COPYRIGHT = Linus Torvalds, Dirk Hohndel and others # And this is the Mac Info.plist file # qmake automatically generates sed rules to replace: # token qmake expansion # @ICON@ $$ICON # @TYPEINFO@ first 4 chars of $$QMAKE_PKGINFO_TYPEINFO # @EXECUTABLE@ $$QMAKE_ORIG_TARGET # @LIBRARY@ $$QMAKE_ORIG_TARGET # @SHORT_VERSION@ $$VER_MAJ.$$VER_MIN QMAKE_INFO_PLIST = packaging/macosx/Info.plist.in OTHER_FILES += $$DESKTOPFILE $$ICON $$MANPAGE $$XSLT_FILES $$DOC_FILES $$MARBLEDIR \ $$QMAKE_INFO_PLIST include(subsurface-gen-version.pri) include(subsurface-install.pri) Subsurface-4.0.2/subsurface.qrc000066400000000000000000000040361226345450700165030ustar00rootroot00000000000000 icons/star.svg icons/subsurface-icon.png icons/plus.png icons/trash.png icons/units.png icons/advanced.png icons/advanced.png icons/graph.png icons/minimum.png icons/maximum.png icons/average.png icons/warning.png icons/scale.png icons/ruler.png icons/flag.png icons/planner/arrow_up.png icons/planner/arrow_down.png icons/planner/icon_time.png icons/planner/icon_depth.png icons/planner/round_base.png icons/planner/right_wing.png icons/planner/left_wing.png icons/planner/minus.png icons/planner/plus.png xslt/commonTemplates.xsl xslt/csv2xml.xslt xslt/divelogs-export.xslt xslt/divelogs.xslt xslt/DivingLog.xslt xslt/jdivelog2subsurface.xslt xslt/MacDive.xslt xslt/SuuntoDM4.xslt xslt/SuuntoSDM.xslt xslt/udcf.xslt xslt/uddf-export.xslt xslt/uddf.xslt Subsurface-4.0.2/subsurfacestartup.c000066400000000000000000000115341226345450700175640ustar00rootroot00000000000000#include "subsurfacestartup.h" #include "ssrf-version.h" #include #include #include "gettext.h" struct preferences prefs; struct preferences default_prefs = { .units = SI_UNITS, .unit_system = METRIC, .pp_graphs = { .po2 = FALSE, .pn2 = FALSE, .phe = FALSE, .po2_threshold = 1.6, .pn2_threshold = 4.0, .phe_threshold = 13.0, }, .mod = FALSE, .mod_ppO2 = 1.6, .ead = FALSE, .profile_dc_ceiling = TRUE, .profile_red_ceiling = FALSE, .profile_calc_ceiling = FALSE, .calc_ceiling_3m_incr = FALSE, .calc_ndl_tts = FALSE, .gflow = 30, .gfhigh = 75, .gf_low_at_maxdepth = FALSE, .font_size = 14.0, .display_invalid_dives = FALSE, .show_sac = FALSE, }; struct units *get_units() { return &prefs.units; } /* random helper functions, used here or elsewhere */ static int sortfn(const void *_a, const void *_b) { const struct dive *a = (const struct dive*) *(void **)_a; const struct dive *b = (const struct dive*) *(void **)_b; if (a->when < b->when) return -1; if (a->when > b->when) return 1; return 0; } void sort_table(struct dive_table *table) { qsort(table->dives, table->nr, sizeof(struct dive *), sortfn); } const char *weekday(int wday) { static const char wday_array[7][7] = { /*++GETTEXT: these are three letter days - we allow up to six code bytes */ QT_TRANSLATE_NOOP("gettextFromC","Sun"), QT_TRANSLATE_NOOP("gettextFromC","Mon"), QT_TRANSLATE_NOOP("gettextFromC","Tue"), QT_TRANSLATE_NOOP("gettextFromC","Wed"), QT_TRANSLATE_NOOP("gettextFromC","Thu"), QT_TRANSLATE_NOOP("gettextFromC","Fri"), QT_TRANSLATE_NOOP("gettextFromC","Sat") }; return translate("gettextFromC",wday_array[wday]); } const char *monthname(int mon) { static const char month_array[12][7] = { /*++GETTEXT: these are three letter months - we allow up to six code bytes*/ QT_TRANSLATE_NOOP("gettextFromC","Jan"), QT_TRANSLATE_NOOP("gettextFromC","Feb"), QT_TRANSLATE_NOOP("gettextFromC","Mar"), QT_TRANSLATE_NOOP("gettextFromC","Apr"), QT_TRANSLATE_NOOP("gettextFromC","May"), QT_TRANSLATE_NOOP("gettextFromC","Jun"), QT_TRANSLATE_NOOP("gettextFromC","Jul"), QT_TRANSLATE_NOOP("gettextFromC","Aug"), QT_TRANSLATE_NOOP("gettextFromC","Sep"), QT_TRANSLATE_NOOP("gettextFromC","Oct"), QT_TRANSLATE_NOOP("gettextFromC","Nov"), QT_TRANSLATE_NOOP("gettextFromC","Dec"), }; return translate("gettextFromC",month_array[mon]); } /* * track whether we switched to importing dives */ bool imported = FALSE; static void print_version() { printf("Subsurface v%s, ", VERSION_STRING); printf("built with libdivecomputer v%s\n", dc_version(NULL)); } static void print_help() { print_version(); printf("\nUsage: subsurface [options] [logfile ...] [--import logfile ...]"); printf("\n\noptions include:"); printf("\n --help|-h This help text"); printf("\n --import logfile ... Logs before this option is treated as base, everything after is imported"); printf("\n --verbose|-v Verbose debug (repeat to increase verbosity)"); printf("\n --version Prints current version\n\n"); } void parse_argument(const char *arg) { const char *p = arg+1; do { switch (*p) { case 'h': print_help(); exit(0); case 'v': verbose++; continue; case 'q': quit++; continue; case '-': /* long options with -- */ if (strcmp(arg, "--help") == 0) { print_help(); exit(0); } if (strcmp(arg, "--import") == 0) { imported = TRUE; /* mark the dives so far as the base, * everything after is imported */ return; } if (strcmp(arg, "--verbose") == 0) { verbose++; return; } if (strcmp(arg, "--version") == 0) { print_version(); exit(0); } /* fallthrough */ case 'p': /* ignore process serial number argument when run as native macosx app */ if (strncmp(arg, "-psQT_TR_NOOP(", 5) == 0) { return; } /* fallthrough */ default: fprintf(stderr, "Bad argument '%s'\n", arg); exit(1); } } while (*++p); } void renumber_dives(int nr) { int i; for (i = 0; i < dive_table.nr; i++) { struct dive *dive = dive_table.dives[i]; dive->number = nr + i; } mark_divelist_changed(TRUE); } /* * Under a POSIX setup, the locale string should have a format * like [language[_territory][.codeset][@modifier]]. * * So search for the underscore, and see if the "territory" is * US, and turn on imperial units by default. * * I guess Burma and Liberia should trigger this too. I'm too * lazy to look up the territory names, though. */ void setup_system_prefs(void) { const char *env; default_prefs.divelist_font = strdup(system_divelist_default_font); default_prefs.default_filename = system_default_filename(); env = getenv("LC_MEASUREMENT"); if (!env) env = getenv("LC_ALL"); if (!env) env = getenv("LANG"); if (!env) return; env = strchr(env, '_'); if (!env) return; env++; if (strncmp(env, "US", 2)) return; default_prefs.units = IMPERIAL_units; } Subsurface-4.0.2/subsurfacestartup.h000066400000000000000000000004751226345450700175730ustar00rootroot00000000000000#ifndef SUBSURFACESTARTUP_H #define SUBSURFACESTARTUP_H #include "dive.h" #include "divelist.h" #include "libdivecomputer.h" #include #ifdef __cplusplus extern "C" { #endif extern bool imported; void setup_system_prefs(void); void parse_argument(const char *arg); #ifdef __cplusplus } #endif #endif Subsurface-4.0.2/terms000066400000000000000000000074511226345450700147130ustar00rootroot00000000000000Do not translate this file. This just tries to collect some of the terms you will run into when translating Subsurface SAC Surface equivalent air consumption The air consumed during a dive at different depth is adjusted for depth/pressure to give an easy to understand air consumption number OTU Oxygen Toxicity Unit - a measurement how O₂ negatively impacts the lung tissue. This number has no unit, the values are rather abstract CNS Central Nervous System Oxygen Toxicity - a measurement how O₂ negatively impacts the central nervous system - this is a percentage or a number <= 1 maxCNS the highest CNS value during a dive PO2, PN2, PHe These are all partial pressures of the three PO₂, PN₂ gases Oxygen (O2 or O₂), Nitrogen (N2 or N₂) and Helium (He). O₂%, He% The fraction of Oxygen and Helium in a gas. The partial pressure is therefore the pressure of the gas times the fraction of the specific component. E.g. a gas with O₂% = 30 (also called 30% Nitrox or EAN30) at 30m depth (where the pressure is 4atm) therefore has a PO₂ of 4 * 0.30 = 1.2 CSV Comma separated values - a common file format TSV Tab separated values - a common file format Stopdepth The depth at which the diver needs to wait for some time in order to "off-gas". Also deco stop. WorkPress Working Pressure of a tank - the pressure it should be filled to StartPress Starting Pressure - at the beginning of a dive EndPress Ending Pressure - at the end of a dive Switch at the depth at which the diver wants to switch to a certain gas Device ID Unique ID for a specific dive computer trip dives are grouped into "trips" based on their individual start time. As soon as there are more than 48h between dives the automated algorithm will start a new trip UDDF standardized file format GFHigh, GFLow Gradient Factors of the Buehlman algorithm. These impact the way the deco obligations are calculated in Subsurface. Typically these are between 20 and 100. Lower is more conservative (i.e., more deco). It's possible to use values below 20 and above 100 in certain circumstances, but 70/30 is much more common. CC Closed circuit - short for "rebreather diving" OC Open circuit - traditional scuba CC Set Point Rebreathers often are run with a fixed PO₂ - the "set point" Bailing out to OC in a rebreather dive the dive switches to their emergency OC equipment Auto Group automatically arrange dives into trips Ceiling when the diver is "in deco", i.e., when the diver cannot directly ascend to the surface but has to put in "stops" to give their body time to "off gas" (reduce the amount of N₂ and potentially He in the body), there is a minimum depth they should not climb above - that's the ceiling. Often a diver will do a deco stop well below the ceiling Viz short for visibility belt, ankle weight system types - a backplate is used mostly by tech backplate, divers to mount the tanks on (recreational divers have a BC, integrated, tech divers usually a backplate and a wing) clip-on rbt remaining bottom time rgt remainint gas time workload is this a strenous dive? deepstop stop well below the ceiling safety stop stop at the end of a recreational dive, typically 3 minutes at 5 meters below floor event showing dive is below the depth where the dive is acruing additional deco time OLF Oxygen Limit Fraction; Suunto specific term for CNS rgbm reduced gradient bubble method - alternative deco algorithm non stop time amount of time the diver can stay at the current depth NDL without going into deco EAD equivalent air depth END effective equivalent Nitrogen depth EADD equivalent air density depth TTS time to surface (including deco stop and reasonable ascent speed) Subsurface-4.0.2/time.c000066400000000000000000000043321226345450700147330ustar00rootroot00000000000000#include #include "dive.h" /* * Convert 64-bit timestamp to 'struct tm' in UTC. * * On 32-bit machines, only do 64-bit arithmetic for the seconds * part, after that we do everything in 'long'. 64-bit divides * are unnecessary once you're counting minutes (32-bit minutes: * 8000+ years). */ void utc_mkdate(timestamp_t timestamp, struct tm *tm) { static const int mdays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; static const int mdays_leap[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, }; unsigned long val; unsigned int leapyears; int m; const int *mp; memset(tm, 0, sizeof(*tm)); /* seconds since 1970 -> minutes since 1970 */ tm->tm_sec = timestamp % 60; val = timestamp /= 60; /* Do the simple stuff */ tm->tm_min = val % 60; val /= 60; tm->tm_hour = val % 24; val /= 24; /* Jan 1, 1970 was a Thursday (tm_wday=4) */ tm->tm_wday = (val+4) % 7; /* * Now we're in "days since Jan 1, 1970". To make things easier, * let's make it "days since Jan 1, 1968", since that's a leap-year */ val += 365+366; /* This only works up until 2099 (2100 isn't a leap-year) */ leapyears = val / (365*4+1); val %= (365*4+1); tm->tm_year = 68 + leapyears * 4; /* Handle the leap-year itself */ mp = mdays_leap; if (val > 365) { tm->tm_year++; val -= 366; tm->tm_year += val / 365; val %= 365; mp = mdays; } for (m = 0; m < 12; m++) { if (val < *mp) break; val -= *mp++; } tm->tm_mday = val+1; tm->tm_mon = m; } timestamp_t utc_mktime(struct tm *tm) { static const int mdays[] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; int year = tm->tm_year; int month = tm->tm_mon; int day = tm->tm_mday; /* First normalize relative to 1900 */ if (year < 70) year += 100; else if (year > 1900) year -= 1900; /* Normalized to Jan 1, 1970: unix time */ year -= 70; if (year < 0 || year > 129) /* algo only works for 1970-2099 */ return -1; if (month < 0 || month > 11) /* array bounds */ return -1; if (month < 2 || (year + 2) % 4) day--; if (tm->tm_hour < 0 || tm->tm_min < 0 || tm->tm_sec < 0) return -1; return (year * 365 + (year + 1) / 4 + mdays[month] + day) * 24*60*60UL + tm->tm_hour * 60*60 + tm->tm_min * 60 + tm->tm_sec; } Subsurface-4.0.2/translations/000077500000000000000000000000001226345450700163505ustar00rootroot00000000000000Subsurface-4.0.2/translations/subsurface_bg_BG.ts000066400000000000000000004143701226345450700221130ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Вмъкни файл (CSV) ... ... PO2 PO2 Field Separator Разделител на полета Field Configuration Настройка на полета Import CSV file Вмъкни CSV файл Time Време Depth Дълбочина Temp Температура Cns Cns Stopdepth Дълбоч. стоп Pre-configured imports Пре-настроено вмъкване Open CSV Log File Отвори CSV регистър файл CSV Files (*.csv);;All Files(*) CSV файлове (*.csv);;Всички файлове(*) CylindersModel Type Тип Size Големина WorkPress Раб.Налягане StartPress Старт.Налягане EndPress Стоп.Налягане Switch at Превключи при He% He% O O Clicking here will remove this cylinder. Кликнете тук за да изтриете бутилка Cylinder cannot be removed Бутилката не може да бъде премахната This gas in use. Only cylinders that are not used in the dive can be removed. Този газ се използвза. Само бутилки, които не се използват в гмуркане могат да бъдат премахнати. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Редактирай прякори на леководолазен комютри Remove the selected Dive Computer? Изтриване на леководолазен компютър? Are you sure that you want to remove the selected dive computer? Сигурни ли се, че искате да изтриете избрания леководолазен компютър? DiveComputerModel Model Модел Device ID Име на устройство Nickname Прякор Clicking here will remove this divecomputer. Кликнете тук за да изтриете гмуркачески компютър. DiveItem l/min л/мин cuft/min кб.фута/мин DiveListView Show Search Box Покажи Търсене expand all Разшири всички collapse all Свиване на всички collapse others Свиване на други remove dive(s) from trip Изтрий гмуркане (гмуркания) от пътуване create new trip above Създай ново пътуване отгоре add dive(s) to trip immediately above Добави гмуркане (гмуркания) веднага над пътуване merge trip with trip above Слей пътуване с горно пътуване merge trip with trip below Слей пътуване с долно пътуване delete dive(s) Изтрий гмуркане (гмуркания) mark dive(s) invalid Маркирай гмуркания (гмуркане) като невалидни save As Запиши като export As UDDF Експорт като UDDF файл shift times времена на изместване upload dive(s) to divelogs.de Качи гмуркане (гмуркания) към Divelogs.de Save Dives As... Запиши гмуркания като... Save File as Запиши файла като UDDF files (*.uddf *.UDDF) UDDF файлове (*.uddf *.UDDF) merge selected dives Слей избраните гмуркания DivePlanner Bottom SAC Долен SAC SAC on DECO Stop SAC и DECO стоп GFHigh GFHigh GFLow GFLow Last Stop at 6m Последен стоп на 6 метра Start Time Стартово време ATM Pressure АТМ налягане DivePlannerGraphics 10m 10м 30ft 30фута Handler Position Error Грешка при позицията на държача One or more of your stops will be lost with this operations, Please, remove them first. Един или повече от вашите стопове ще бъдат загубени при тази операция. Моля, първо ги премахнете. DivePlannerPointsModel AIR Въздух Final Depth Финална дълбочина Duration Продълж. (мин.) Used Gas Използван газ CC Set Point CC Set Point Discard the Plan? Изтрий плана? You are about to discard your plan. Вие ще изтриете плана. DivePlannerWidget Dive Planner Points Точки в гмуркачески плановик Available Gases Достъпни газове add dive data point Добави точка в гмуркането DiveTripModel # date дата m м ft фута min мин kg кг lbs паунда suit водолазен костюм cyl бут. location местонахождение SAC SAC OTU OTU maxCNS макс CNS DivelogsDeWebServices Invalid response from server Грешен отговор от сървъра Expected XML tag 'DiveDateReader', got instead '%1 Очакван XML таг 'DiveDateReader', вместо това получен '%1 Expected XML tag 'DiveDates' not found Очакван XML таг 'DiveDates' не беше намерен Malformed XML response. Line %1: %2 Грешен XML отговор. Ред %1: %2 no dives were selected няма избрани гмуркания failed to create zip file for upload: %1 не може да бъде създаден ZIP файл: %1 cannot create temporary file: %1 не може да бъде създаден файл: %1 internal error: %1 вътрешна грешка: %1 internal error вътрешна грешка Done Готово Uploading dive list... Обновяване на списъка от гмуркания... Downloading dive list... Изтегляне на списък от гмуркания... Downloading %1 dives... Изтегляне на %1 гмуркания... Download finished - %1 Изтеглянето приключи - %1 Corrupted download Неправилно изтегляне The archive could not be opened: %1 Архива не може да бъде отворен: %1 Upload failed Грешка при качването Upload successful Успешно качване Login failed Грешка при логин Cannot parse response Не може да бъде направен разбор на отговора Error: %1 Грешка: %1 Upload finished Качването приключи DownloadFromDCWidget OK ОК Error Грешка Retry Опитай пак Choose file for divecomputer download logfile Изберете регистър файл при изтегляне Log files (*.log) Регистър файлове (*.log) Warning Предупреждение Saving the libdivecomputer dump will NOT download dives to the dive list. Записването на libdivecomputer дъмп НЕ обновява списъка на гмуркания Choose file for divecomputer binary dump file Изберете файл за libdivecomputer дъмп Dump files (*.bin) Дъмп файлове (*.bin) DownloadFromDiveComputer Download From Dive Computer Изтегли от леководолазен компютър Vendor Производител Dive Computer Леководолазен компютър Device or Mount Point Устройсто или входна точка ... ... Force download of all dives Изтегли всички гмуркания Always prefer downloaded dives Винаги предпочитай изтегленото гмуркане OK ОК Cancel Отмяна Save libdivecomputer logfile Запиши libdivecomputer регистър файл Save libdivecomputer dumpfile Запиши libdivecomputer дъмп файл GlobeGPS Edit Selected Dive Locations Редактирай избраните местонахождения MainTab Dive Notes Бележки Location Местонахождение Coordinates Координати Divemaster Водач Buddy Партньор Start time Стартово време Air temp Темп. на въздух Water temp Темп. на водата Tags Тагове Rating Оценка Visibility Видимост Suit Водолазен костюм Notes Бележки Equipment Екипировка Dive Info Информация Date Дата Interval Интервал Gases Used Използвани газове Gas Consumed Консумиран газ SAC SAC Max. Depth Макс. дълбочина Ave. Depth Средна дълбочина OTU OTU Air Pressure Атмосф. налягане Air Temperature Темп. на въздуха Water Temperature Темп. на водата Dive Time Време Salinity Соленост Stats Статистики Depth Дълбочина Temperature Температура: Duration Продълж. (мин.) Total Time Общо време Dives Гмуркания Cylinders Бутилки Add Cylinder Добави бутилка Weights Тежести Add Weight System Добави система за тежест Trip Location Местонахождение на пътуване Trip Notes Бележки за пътуване Save Запиши Cancel Отмяна This trip is being edited. Това пътуване се редактира. Multiple dives are being edited. Редактира се повече от едно гмуркане. This dive is being edited. Това гмуркане се редактира. /min unknown неизвестно N С S Ю E И W З MainWindow Filter Филтър &File &Файл &Log &Регистър &View &Изглед &Help &Помощ &Import &Вмъкване &New logbook &Нов регистър New Нов Ctrl+N Ctrl+N &Open logbook &Отвори регистър Open Отвори Ctrl+O Ctrl+O &Save &Запиши Save Запиши Ctrl+S Ctrl+S Save as Запиши като... Ctrl+Shift+S Ctrl+Shift+S Close Затвори Ctrl+W Ctrl+W Import Files Вмъкни файлове Ctrl+I Ctrl+I Export &UDDF Експорт на &UDDF... Ctrl+U Ctrl+U &Print &Напечатай Ctrl+, Ctrl+, &Quit &Изход Import from &dive computer Изтегли от леководолазен &компютър Import &GPS data from Subsurface Service Вмъкни &GPS данни от Subsurface Service Ctrl+G Ctrl+G &Edit Device Names &Редактирай имена на устройства Ctrl++ Ctrl++ &Renumber &Преномерирай Ctrl+R Ctrl+R Toggle &Zoom Превключване на &зуум &Yearly Statistics Годишни &статистики Ctrl+Y Ctrl+Y Dive List Списък на гмуркания Profile Профил Info Информация All Всички User &Manual Ръководство за &потребителя Globe Глобус P&lan Dive &Планирай гмуркане Ctrl+L Ctrl+L Import CSV Вмъкни CSV файл Import CS&V Вмъкни CS&V файл Import from Divelogs.de Вмъкни от Divelogs.de Ctrl+P Ctrl+P Preferences Настройки Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Добави гмуркане Auto Group Автоматично групиране Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Предишен ГК Left Ляво Next DC Следващ ГК Right Дясно Select Events Избери събития Input Plan Въведи план About Subsurface За Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Отвори файл Please save or cancel the current dive edit before closing the file. Моля затворете текущата редакция на гмуркане преди да затворите файла. Please save or cancel the current dive edit before trying to plan a dive. Моля запишете или отменете текущата редакция на гмуркане преди да отворите плановика. Please save or cancel the current dive edit before trying to add a dive. Моля запишете или отменете текущата редакция на гмуркане преди да добавите гмуркане. User Manual Ръководство за потребителя Cannot find the Subsurface manual Начъчника на Subsurface не може да бъде намерен Do you want to save the changes you made in the file %1? Желаете ли да запишете промените във файла %1? Do you want to save the changes you made in the datafile? Желаете ли да запишете промените във файла с данни? Save Changes? Запиши промените? Changes will be lost if you don't save them. Промените ще бъдат изгубени ако не ги запишете. First finish the current edition before trying to do another. Моля, първо приключете с текущата редакция на гмуркане. Save File as Запиши файла като Warning Предупреждение Please save or cancel the current dive edit before opening a new file. Моля запишете или отменете текущата редакция на гмуркане преди да отворите нов файл. UDDF files (*.uddf *.UDDF) UDDF файлове (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML файлове (*.ssrf *.xml *.XML) PreferencesDialog Defaults По подразбиране Units Единици Graph Диаграма Language Език Lists and Tables Списъци и таблици Font Шрифт Font size Големина на шрифта Dives Гмуркания Default Dive file Файл по подразбиране ... ... Display Invalid Невалиден дисплей Default Cylinder Бутилка по подразбиране Use Default Cylinder Използвай бутилка по подразбиране System Състема Metric Метрична Imperial Империална Personalize Настройки Depth Дълбочина meter метър feet фута bar бара psi psi liter литра cu ft кб. фут celsius целзии fahrenheit фаренхайт kg кг pO₂ pO₂ pN₂ pN₂ System Default По подразбиране на системата Filter Филтър Pressure Налягане Volume Обем Temperature Температура: Weight Тежест lbs паунда Time units Единици за време Ascent/Descent speed denominator Знаменател за скорост на изкачване/спускане Minutes Минути Seconds Секунди Show Покажи threshold праг pHe pHe MOD MOD max ppO₂ макс. ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Отчетен таван на гмуркачески компютър draw ceiling red рисувай червен таван Calculated ceiling Калкулиран таван show all tissues покажи всички тъкани 3m increments увеличение през 3м Calculate NDL/TTS Калкулирай NDL/TTS GFLow at max depth GFLow на макс. дълбочина Misc Общи Preferences Настройки SAC SAC GFLow GFLow GFHigh GFHigh Restart required Нужен рестарт To correctly load a new language you must restart Subsurface. За да смените успешно език е необходим рестарт на Subsurface. Open Default Log File Отвори файла по подразбиране Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML файлове (*.ssrf *.xml *.XML) PrintDialog &Preview &Преглед P&rint Пе&чатане &Close &Затвори Print Напечатай PrintLayout Dive# Гмуркане № Date Дата Depth Дълбочина Duration Продълж. (мин.) Master Водач Buddy Партньор Location Местонахождение PrintOptions Print options Настройки на принтиране Print only selected dives Напечатай само избраните гмуркания Print in color Печатай в цвят Print type Тип на печата 6 dives per page 6 гмуркания на стр. 2 dives per page 2 гмуркания на стр. Table print Печат на таблица Ordering Подредба Profile on top Профил от горе Notes on top Бележки от горе Sizing heights (% of layout) Размер по височина (% от оформлението) Profile height (43% - 85%) Височина на профила (43% - 85%) Other data height (8% - 17%) Височина на други данни (8% - 17%) Notes height (0% - 52%) Височина на бележките (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Добави промяна на газа Add Bookmark Добави бележка Remove Event Премахни събитие Hide similar events Премахни малки събития Unhide all events Покажи всички събития Hide events Скрий събития Hide all %1 events? Скрий всички %1 събития? Remove the selected event? Премахни избраните събития? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer непознат гмуркачески компютър Set Duration: 10 minutes Задай времетраене: 10 минути Scale Скала Ruler Линия Measure properties of dive segments Измери свойства на гмуркачески сегменти Scale your dive to screen size Мащабиране на гмуркането по големината на екрана Edit Редактирай pN pN pHe pHe pO pO air въздух EAN%1 EAN%1 Bailing out to OC Връщане към OC begin Starts with space! начало end Starts with space! край ProfilePrintModel unknown неизвестно Dive #%1 - %2 Гмуркане №%1 - %2 Max depth: %1 %2 Макс. дълбочина: %1 %2 Duration: %1 min Времетраене: %1 мин Gas Used: Използван газ: SAC: SAC: Max. CNS: Макс. CNS Weights: Тежести: Notes: Бележки: Divemaster: Водач: Buddy: Партньор: Suit: Водолазен костюм: Viz: Видимост: Rating: Оценка: QObject AIR Въздух Remove this Point Изтрий тази точка Close Затвори Average Средно Minimum Минимум Maximum Максимум Move the map and double-click to set the dive location Кликнете два пъти на глобус картата за да дефинирате местонахождение на гмуркането. RenumberDialog Renumber Преномерирай New starting number Нов стартов номер ShiftTimesDialog Shift selected times Измести избраните времена Shift times of selected dives by Измести времената в избраните гмуркания с h:mm ч:мм earlier по-рано later по-късно SubsurfaceAbout About Subsurface За Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Мутли-платформен гмуркачески регистър софтуер<br><span style='font-size: 8pt'>Линус Торвалдс, Дирк Хондел, и други, 2011, 2012, 2013</span> &License &Лиценз &Website &Уебсайт SubsurfaceWebServices Webservice Уеб услуга Connecting... Свръзване... Download finished Изтеглянето приключи Download error: %1 Грешка при изтеглянето: %1 Connection Error: Грешка при връзка: Invalid user identifier! Грешен потребителски ключ Cannot parse response! Не може да бъде напревен разряд! Download Success! Успешно изтегляне! TableView Add Cylinder Добави бутилка TankInfoModel Description Описание ml мл. bar бара ToolTipItem Information Информация WSInfoModel Description Описание kg кг WebServices Webservice Connection Връзка към уеб услуга Status: Статус: Enter your ID here Въведете вашия ID тук Download Изтегли User ID Потребителски ID Password Парола Upload Качи Operation timed out Времето за операцията изтече Transfering data... Трансфер на данни... WeightModel Type Тип Weight Тежест Clicking here will remove this weigthsystem. Кликнете тук за да изтриете система за тежест. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Година > Месец / Пътуване # Duration Total Продължителност Общо Average Средно Shortest Най-късо Longest Най-дълго Depth (%1) Average Дълбочина (%1) Средно Minimum Минимум Maximum Максимум SAC (%1) Average SAC (%1) Средно Temp. (%1) Average Темп. (%1) Средно gettextFromC pascal паскала bar бара psi psi l л cuft кб.фута m м ft фута lbs паунда kg кг (%s) or (%s) (%s) или (%s) air въздух integrated вградена belt колан ankle глезен backplate weight нагръбна clip-on щипка Failed to read '%s' Не може да бъде прочетен '%s' Failed to read '%s'. Use import for CSV files. Не може да се прочете '%s'. Използвайте вмъкване на CSV файлове. Maximum number of supported columns on CSV import is %d Максималният потдържан брой на CSV колони е %d none няма deco stop деко. стоп rbt rbt ascent покачване ceiling таван workload натовареност transmitter предавател violation нарушение bookmark бележка surface повърхност safety stop безопасен стоп gaschange смяна на газ safety stop (voluntary) безопасен стоп (свободен) safety stop (mandatory) безопасен стоп (задължителен) deepstop дълбочина на спиране ceiling (safety stop) таван (безопасен стоп) divetime време за гмуркане below floor event showing dive is below deco floor and adding deco time под maxdepth макс. дълбочина OLF OLF PO2 PO2 airtime време за въздух rgbm rgbm heading посока tissue level warning внимание: ниво на тъканта non stop time нон стоп време invalid event number грешен номер на събитие Unable to create parser for %s %s Не може да бъде създаден разряд за %s %s Error registering the data Грешка при регистриране на данни Error parsing the datetime Грешка при разряд на дата и час Dive %d: %s %d %04d Гмуркане №%d: %s %d %04d Error parsing the divetime Грешка при рaзряд на време за гмуркане Error parsing the maxdepth Грешка при рaзряд на максимална дълбочина Error parsing the gas mix count Грешка при рaзряд на газ микс брой Error obtaining water salinity Грешка при прием на водна соленост Error obtaining surface pressure Грешка при прием на повърхностно налягане Error parsing the gas mix Грешка при рaзряд на газ микс Error parsing the samples Грешка при рaзряд на стойности Event: waiting for user action Събитие: изчаквание на действие от потребителя model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Грешка при регистриране на направление за събития Error registering the cancellation handler. Грешка при регистриране на направление за отменяне Dive data import error Грешка при вход на данни Unable to create libdivecomputer context Не може да бъде създаден libdivecomputer контекст Unable to open %s %s (%s) Не може да бъдe отворен %s %s (%s) Strange percentage reading %s Неразпозната стойност за проценти %s Failed to parse '%s'. Не може да бъде напревен разбор на '%s'. Failed to parse '%s' Не може да бъде напревен разбор на '%s' Database query get_events failed. Базата данни не може да изпълни get_events. Database connection failed '%s'. Няма връзка към базата данни '%s'. Database query failed '%s'. Грешка при заява към база данни '%s'. Can't open stylesheet %s Не може да бъде отворен стилов файл %s EAN%d EAN%d Can't find gas %d/%d Не може да бъде намерен газ %d/%d Too many gas mixes Твърде много газови смеси %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface планиране базирано на GFlow = %.0f и GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Преход към %.*f %s за %d:%02d мин - времетраене %d:%02u на %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Остани на %.*f %s за %d:%02d мин - времетраене %d:%02u на %s Switch gas to %s Превключи газ на %s Gas consumption: Консумация на газ: %.0f%s of %s %.0f%s от %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s таван %.0f %s %s Tissue %.0fmin: %.0f %s %s Тъкан %.0fмин: %.0f %s %s Safetystop:%umin @ %.0f %s %s Стоп:%uмин @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Стоп:неопр. време @ %.0f %s %s Deco:%umin @ %.0f %s %s Деко:%uмин @ %.0f %s %s Deco:unkn time @ %.0f %s %s Деко:неопр. време @ %.0f %s %s In deco %s В деко %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fбара %s pN%s:%.2fbar %s pN%s:%.2fбара %s pHe:%.2fbar %s pHe:%.2fбара %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%uмин @ %.0f %s (калк.) %s In deco (calc) В deco (калк.) %s NDL:%umin (calc) %s NDL:%uмин (калк.) %s TTS:%umin (calc) %s TTS:%uмин (калк,) %sT: %d:%02d min %sT: %d:%02d мин %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 гмуркания) %1 %2 (1 dive) %1 %2 (1 гмуркане) boat кораб shore бряг drift дрейф deep дълбоко cavern каверна ice лед wreck останки cave пещера altitude височина pool басейн lake езеро river река night вечер fresh нов student студент photo снимка video видео instructor инструктор deco деко more than %d days повече от %d дни %dd %dh %dmin %dд %dч %dмин %dh %dmin %dч %dмин for dives # за гмуркания № for selected dives за избраните гмуркания for dive #%d за гмуркане №%d for selected dive за избраните гмуркане for all dives за вички гмуркания (no dives) (няма гмуркания) Sun Нед Mon Пон Tue Вт Wed Ср Thu Чет Fri Пет Sat Съб Jan Ян Feb Фев Mar Март Apr Апр May Май Jun Юни Jul Юли Aug Авг Sep Сеп Oct Окт Nov Нов Dec Дек Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: файловата система е почти пълна Излючете и свържете на ново леководолазния компютър и опитайте пак Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Файловата система е пълна Излючете/Свържете на ново леководолазния компютър и опитайте пак Short write to req.txt file Is the Uemis Zurich plugged in correctly? Кратък запис в req.txt файл Uemis Zurich включен ли е правилно? unknown неизвестно Reading %s %s Четене на гмуркане %s %s data данни divelog entry id идент. за вписване в регистъра divespot data id идент. за вписване на местонахождение more data dive id повече данни за гмуркане wetsuit мокър костюм semidry полусух drysuit сух костюм shorty къс vest жилетка long john лонг джон jacket яке full suit пълен косюм 2 pcs full suit 2 за цял костюм membrane мембрана Init Communication Започни връзка Uemis init failed Uemis не може да бъде зареден Start download Започни теглене Safety Stop Violation Нарушение на безопасно спиране Speed Alarm Тревога: скорост Speed Warning Внимание: скорост PO2 Green Warning Внимание: парциално О2 налягане в зелената зона PO2 Ascend Warning Внимание: покачване на парциално О2 налягане PO2 Ascend Alarm Тревога: покачване на парциално О2 налягане Tank Pressure Info Информация: налагане на резервоар RGT Warning Внимание: оставащо газ-време RGT Alert Тревога: оставащо газ-време Tank Change Suggested Предложение за смяна на резервоар Depth Limit Exceeded Надминат лимит на дълбочина Max Deco Time Warning Внимание: Максимално време на сигнал за декомпресия Dive Time Info Времева Информация за гмуркане Dive Time Alert Тревога: Време за гмуркане Marker Маркер No Tank Data Няма информация за резервоар Low Battery Warning Внимание: слаба батерия Low Battery Alert Тревога: слаба батерия Subsurface-4.0.2/translations/subsurface_ca_ES.ts000066400000000000000000003437611226345450700221320ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) ... PO2 Field Separator Field Configuration Import CSV file Time Depth Temp Cns Stopdepth Pre-configured imports Open CSV Log File CSV Files (*.csv) CylindersModel Type Size WorkPress StartPress EndPress Switch at He% O Clicking here will remove this cylinder. Cylinder cannot be removed This gas in use. Only cylinders that are not used in the dive can be removed. DiveComputerManagementDialog Edit Dive Computer Nicknames Remove the selected Dive Computer? Are you sure that you want to remove the selected dive computer? DiveComputerModel Model Device ID Nickname Clicking here will remove this divecomputer. DiveItem l/min cuft/min DiveListView Show Search Box expand all collapse all collapse others remove dive(s) from trip create new trip above add dive(s) to trip immediately above merge trip with trip above merge trip with trip below delete dive(s) mark dive(s) invalid save As export As UDDF shift times upload dive(s) to divelogs.de Save Dives As... Save File as UDDF files (*.uddf *.UDDF) merge selected dives DivePlanner Bottom SAC SAC on DECO Stop GFHigh GFLow Last Stop at 6m Start Time ATM Pressure DivePlannerGraphics 10m 30ft Handler Position Error One or more of your stops will be lost with this operations, Please, remove them first. DivePlannerPointsModel AIR Final Depth Duration Used Gas CC Set Point Discard the Plan? You are about to discard your plan. DivePlannerWidget Dive Planner Points Available Gases add dive data point DiveTripModel # date m ft min kg lbs suit cyl location SAC OTU maxCNS DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 Cannot create DLD file Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK Error Retry DownloadFromDiveComputer Download From Dive Computer Vendor Dive Computer Device or Mount Point ... Force download of all dives Always prefer downloaded dives OK Cancel GlobeGPS Edit Selected Dive Locations MainTab Dive Notes Location Coordinates Divemaster Buddy Start time Air temp Water temp Tags Rating Visibility Suit Notes Equipment Dive Info Date Interval Gases Used Gas Consumed SAC Max. Depth Ave. Depth OTU Air Pressure Air Temperature Water Temperature Dive Time Salinity Stats Depth Temperature Duration Total Time Dives Cylinders Add Cylinder Weights Add Weight System Trip Location Trip Notes Save Cancel This trip is being edited. Multiple dives are being edited. This dive is being edited. /min unknown N S E W MainWindow Filter &File &Log &View &Help &Import &New logbook New Ctrl+N &Open logbook Open Ctrl+O &Save Save Ctrl+S Save as Ctrl+Shift+S Close Ctrl+W Import Files Ctrl+I Export &UDDF Ctrl+U &Print Ctrl+, &Quit Import from &dive computer Import &GPS data from Subsurface Service Ctrl+G &Edit Device Names Ctrl++ &Renumber Ctrl+R Toggle &Zoom &Yearly Statistics Ctrl+Y Dive List Profile Info All User &Manual Globe P&lan Dive Ctrl+L Import CSV Import CS&V Import from Divelogs.de Ctrl+P Preferences Ctrl+Q Ctrl+D Add Dive Auto Group Ctrl+2 Ctrl+3 Ctrl+4 Ctrl+1 Prev DC Left Next DC Right Select Events Input Plan About Subsurface F1 Ctrl+5 Open File Please save or cancel the current dive edit before closing the file. Please save or cancel the current dive edit before trying to plan a dive. Please save or cancel the current dive edit before trying to add a dive. User Manual Cannot find the Subsurface manual Do you want to save the changes you made in the file %1? Do you want to save the changes you made in the datafile? Save Changes? Changes will be lost if you don't save them. First finish the current edition before trying to do another. Save File as Warning Please save or cancel the current dive edit before opening a new file. UDDF files (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) PreferencesDialog Defaults Units Graph Language Lists and Tables Font Font size Dives Default Dive file ... Display Invalid Default Cylinder Use Default Cylinder System Metric Imperial Personalize Depth meter feet bar psi liter cu ft celsius fahrenheit kg pO₂ pN₂ System Default Filter Pressure Volume Temperature Weight lbs Time units Ascent/Descent speed denominator Minutes Seconds Show threshold pHe MOD max ppO₂ EAD END EADD Dive computer reported ceiling draw ceiling red Calculated ceiling show all tissues 3m increments Calculate NDL/TTS GFLow at max depth Misc Preferences SAC GFLow GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Subsurface XML files (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print PrintLayout Dive# Date Depth Duration Master Buddy Location PrintOptions Print options Print only selected dives Print in color Print type 6 dives per page 2 dives per page Table print Ordering Profile on top Notes on top Sizing heights (% of layout) Profile height (43% - 85%) Other data height (8% - 17%) Notes height (0% - 52%) 0 ProfileGraphicsView Add Gas Change Add Bookmark Remove Event Hide similar events Hide events Hide all %1 events? Remove the selected event? %1 @ %2:%3 unknown divecomputer Set Duration: 10 minutes Scale Ruler Measure properties of dive segments Scale your dive to screen size Edit pN pHe pO air EAN%1 Bailing out to OC begin Starts with space! end Starts with space! ProfilePrintModel unknown Dive #%1 - %2 Max depth: %1 %2 Duration: %1 min Gas Used: SAC: Max. CNS: Weights: Notes: Divemaster: Buddy: Suit: Viz: Rating: QObject AIR Remove this Point Close Average Minimum Maximum Move the map and double-click to set the dive location RenumberDialog Renumber New starting number ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm earlier later SubsurfaceAbout About Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Website SubsurfaceWebServices Webservice Connecting... Download finished Download error: %1 Connection Error: Invalid user identifier! Cannot parse response! Download Success! TableView Add Cylinder TankInfoModel Description ml bar ToolTipItem Information WSInfoModel Description kg WebServices Webservice Connection Status: Enter your ID here Download User ID Password Upload Operation timed out Transfering data... WeightModel Type Weight Clicking here will remove this weigthsystem. YearlyStatisticsModel Year > Month / Trip # Duration Total Average Shortest Longest Depth (%1) Average Minimum Maximum SAC (%1) Average Temp. (%1) Average gettextFromC pascal bar psi l cuft m ft lbs kg (%s) or (%s) air integrated belt ankle backplate weight clip-on Failed to read '%s' Failed to read '%s'. Use import for CSV files. Maximum number of supported columns on CSV import is %d none deco stop rbt ascent ceiling workload transmitter violation bookmark surface safety stop gaschange safety stop (voluntary) safety stop (mandatory) deepstop ceiling (safety stop) divetime below floor event showing dive is below deco floor and adding deco time maxdepth OLF PO2 airtime rgbm heading tissue level warning non stop time invalid event number Unable to create parser for %s %s Error registering the data Error parsing the datetime Dive %d: %s %d %04d Error parsing the divetime Error parsing the maxdepth Error parsing the gas mix count Error obtaining water salinity Error obtaining surface pressure Error parsing the gas mix Error parsing the samples Event: waiting for user action model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Error registering the cancellation handler. Dive data import error Unable to create libdivecomputer context Unable to open %s %s (%s) Strange percentage reading %s Failed to parse '%s'. Failed to parse '%s' Database query get_events failed. Database connection failed '%s'. Database query failed '%s'. Can't open stylesheet (%s)/%s EAN%d Can't find gas %d/%d Too many gas mixes %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Switch gas to %s Gas consumption: %.0f%s of %s ean %s P:%d %s %s T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s In deco %s NDL:%umin %s CNS:%u%% %s pO%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C F %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (1 dive) boat shore drift deep cavern ice wreck cave altitude pool lake river night fresh student photo video instructor deco more than %d days %dd %dh %dmin %dh %dmin for dives # for selected dives for dive #%d for selected dive for all dives (no dives) Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Short write to req.txt file Is the Uemis Zurich plugged in correctly? unknown Reading %s %s data divelog entry id divespot data id more data dive id wetsuit semidry drysuit shorty vest long john jacket full suit 2 pcs full suit membrane Init Communication Uemis init failed Start download Safety Stop Violation Speed Alarm Speed Warning PO2 Green Warning PO2 Ascend Warning PO2 Ascend Alarm Tank Pressure Info RGT Warning RGT Alert Tank Change Suggested Depth Limit Exceeded Max Deco Time Warning Dive Time Info Dive Time Alert Marker No Tank Data Low Battery Warning Low Battery Alert Subsurface-4.0.2/translations/subsurface_da_DK.ts000066400000000000000000003704651226345450700221230ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importer fil (CSV) ... ... PO2 PO2 Field Separator Felt separator Field Configuration Felt konfiguration Import CSV file Importer CSV fil Time Tid Depth Dybde Temp Temp Cns Cns Stopdepth Stop dybde Pre-configured imports For-konfigurerede imports Open CSV Log File Åben CSV log fil CSV Files (*.csv);;All Files(*) CSV Filer (*.csv);;Alle Filer(*) CylindersModel Type Type Size Størrelse WorkPress ArbejdsTryk StartPress StartTryk EndPress SlutTryk Switch at Skift på He% He% O O Clicking here will remove this cylinder. Klik her vil fjerne flasken Cylinder cannot be removed Flasken kan ikke fjernes This gas in use. Only cylinders that are not used in the dive can be removed. Denne flaske er i brug. Kun flasker som ikke er i brug kan slettes psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Rediger dykkercomputer navne Remove the selected Dive Computer? Fjern den valgte dykkercomputer Are you sure that you want to remove the selected dive computer? Er du sikker på at du vil fjerne den valgte dykkercomputer? DiveComputerModel Model Model Device ID Enheds ID Nickname Kaldenavn Clicking here will remove this divecomputer. Klik her, vil fjerne denne dykkercomputer DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Vis søgebox expand all Vis alt collapse all Skjul alt collapse others Saml andre remove dive(s) from trip Fjern dyk fra tur create new trip above Opret ny tur over add dive(s) to trip immediately above Tilføj dyk til tur umiddelbart over merge trip with trip above Flet tur med ovenstående merge trip with trip below Flet tur med efterstående delete dive(s) Slet dyk mark dive(s) invalid Marker dyk som ugyldig(e) save As Gem som export As UDDF Exporter som UDDF shift times Skift tider upload dive(s) to divelogs.de Upload dyk til divelogs.de Save Dives As... Gem dyk som... Save File as Gem fil som UDDF files (*.uddf *.UDDF) UDDF filer (*.uddf *.UDDF) merge selected dives Flet valgte dyk DivePlanner Bottom SAC Bund SAC SAC on DECO Stop SAC på Deco stop GFHigh GFHigh GFLow GFlow Last Stop at 6m Sidste stop på 6m Start Time Start tid ATM Pressure ATM Tryk DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Handler Position Error One or more of your stops will be lost with this operations, Please, remove them first. Et eller flere af dine stop vil gå tabt ved denne handling, slet dem venligst først. DivePlannerPointsModel AIR LUFT Final Depth Slut Dybde Duration Varighed Used Gas Brugt Gas CC Set Point CC Set Punkt Discard the Plan? Kassér Planen? You are about to discard your plan. Du er ved kassére din plan. DivePlannerWidget Dive Planner Points Dive Planner Point Available Gases Gasser tilrådighed add dive data point Tilføj dykker data point DiveTripModel # # date Dato m m ft fod min min. kg kg lbs lbs suit Dragt cyl Flaske location Sted SAC SAC OTU OTU maxCNS MaxCNS DivelogsDeWebServices Invalid response from server Ugyldigt svar fra serveren Expected XML tag 'DiveDateReader', got instead '%1 Forventet XML tag 'DiveDateReader', fik istedet '%1 Expected XML tag 'DiveDates' not found Forventet XML tag 'DiveDates' ikke fundet Malformed XML response. Line %1: %2 Ugyldig XML svar. Linje %1: %2 no dives were selected ingen dyk var valgt failed to create zip file for upload: %1 Kunne ikke danne en zip fil til upload: %1 cannot create temporary file: %1 Kan ikke danne midlertidig fil: %1 internal error: %1 Intern fejl: %1 internal error Intern fejl Done Færdig Uploading dive list... Uploader dyk liste... Downloading dive list... Downloader dyk liste... Downloading %1 dives... Downloader %1 dyk... Download finished - %1 Download færdig - %1 Corrupted download Fejl i download The archive could not be opened: %1 Arkivet kunne i åbnes: %1 Upload failed Upload fejlede Upload successful Uploadet med succes Login failed Login fejlede Cannot parse response Kan ikke fortolke svar Error: %1 Fejl: %1 Upload finished Upload færdig DownloadFromDCWidget OK OK Error Fejl Retry Prøv igen Choose file for divecomputer download logfile Vælg logfil for computer download Log files (*.log) Logfiler (*.log) Warning Advarsel Saving the libdivecomputer dump will NOT download dives to the dive list. Gem af libdivecomputer dump vil IKKE downloade dyk til listen Choose file for divecomputer binary dump file Vælg fil for dykkercomputerens binære dump fil Dump files (*.bin) Dump filer (*.bin) DownloadFromDiveComputer Download From Dive Computer Download fra dykkercomputer Vendor Leverandør Dive Computer Dykker Computer Device or Mount Point Enhedsnavn eller mount point ... ... Force download of all dives Tving download af alle dyk Always prefer downloaded dives Foretræk altid downloadede dyk OK OK Cancel Fortryd Save libdivecomputer logfile Gem libdivecomputer logfil Save libdivecomputer dumpfile Gem dumpfil fra libdivecomputer GlobeGPS Edit Selected Dive Locations Rediger valgte dykker steder MainTab Dive Notes Dyk Noter Location Position Coordinates Koordinater Divemaster Divemaster Buddy Makker Start time Start tid Air temp Luft temp Water temp Vand temp Tags Tags Rating Bedømmelse Visibility Sigtbarhed Suit Dragt Notes Noter Equipment Udstyr Dive Info Dyk info Date Dato Interval Interval Gases Used Anvendte gasser Gas Consumed Forbrugt Gas SAC SAC Max. Depth Max dybde Ave. Depth Gns. dybde OTU OTU Air Pressure Lufttryk Air Temperature Luft temp Water Temperature Vand temp Dive Time Dykker Tid Salinity Saltindhold Stats Statistik Depth Dybde Temperature Temperatur Duration Varighed Total Time Total tid Dives Dyk Cylinders Flasker Add Cylinder Tilføj flaske Weights Vægt Add Weight System Tilføj vægt system Trip Location Tur position Trip Notes Tur noter Save Gem Cancel Fortryd This trip is being edited. Turen er ved at blive rettet. Multiple dives are being edited. Flere dyk bliver rettet. This dive is being edited. Dette dyk bliver rettet. /min /min unknown Ukendt N N S S E Ø W V MainWindow Filter Filter &File &Fil &Log &Log &View &Vis &Help &Hjælp &Import &Importer &New logbook &Ny logbog New Ny Ctrl+N Crtl-N &Open logbook &Åben logbog Open Åben Ctrl+O Crtl-O &Save &Gem Save Gem Ctrl+S Crtl+S Save as Gem som Ctrl+Shift+S Ctrl+Shift+S Close Luk Ctrl+W Ctrl+W Import Files Importer filer Ctrl+I Ctrl+l Export &UDDF Export &UDDF Ctrl+U Ctrl+U &Print &Print Ctrl+, Ctrl+, &Quit &Afslut Import from &dive computer Importer fra &dive computer Import &GPS data from Subsurface Service Importer GPS data fra Subsurface WeBServices Ctrl+G Ctrl+G &Edit Device Names &Edit Enheds navne Ctrl++ Ctrl++ &Renumber &Re-Nummerer Ctrl+R Ctrl+R Toggle &Zoom Vælg &Zoom &Yearly Statistics &Årlig Statistik Ctrl+Y Ctrl+Y Dive List Liste Profile Profil Info Info All Alt User &Manual Bruger &Manual Globe Globus P&lan Dive Plan Dive Ctrl+L Ctrl+L Import CSV Importer CSV Import CS&V Importer CSV Import from Divelogs.de Importer fra Divelog.de Ctrl+P Ctrl+P Preferences Indstillinger Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Tilføj Dyk Auto Group Auto Gruppering Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Forrige DC Left Venstre Next DC Næste DC Right Højre Select Events Vælg hændelser Input Plan Input Plan About Subsurface Om Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Åben fil Please save or cancel the current dive edit before closing the file. Gem eller fortryd venligst denne rettelse før du lukker filen Please save or cancel the current dive edit before trying to plan a dive. Gem eller fortryd venligst dette dyk før du laver en dykkerplan Please save or cancel the current dive edit before trying to add a dive. Gem eller fortryd venligst dette dyk før du tilføjer et dyk User Manual Brugermanual Cannot find the Subsurface manual Kan ikke finde Subsurface manualen Do you want to save the changes you made in the file %1? Vil du gemme ændringerne du lavede i filen %1? Do you want to save the changes you made in the datafile? Vil du gemme ændringerne du lavede i filen? Save Changes? Gem ændringer? Changes will be lost if you don't save them. Ændringer vil blive tabt hvis du ikke gemmer dem. First finish the current edition before trying to do another. Færdiggør først dette dyk før du laver/retter et nyt Save File as Gem fil som Warning Advarsel Please save or cancel the current dive edit before opening a new file. Gem eller fortryd venligst det aktuelle dyk før du åbner en ny fil UDDF files (*.uddf *.UDDF) UDDF filer (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML filer (*.ssrf *.xml *.XML) PreferencesDialog Defaults Standard Units Enheder Graph Graf Language Sprog Lists and Tables Lister og tabeller Font Font Font size Font størrelse Dives Dyk Default Dive file Standard dyk fil ... ... Display Invalid Ugyldig visning Default Cylinder Standard flaske Use Default Cylinder Brug standard flaske System System Metric Metrisk Imperial Imperial Personalize Personliggør Depth Dybde meter meter feet fod bar bar psi psi liter liter cu ft cu ft celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default System Standard Filter Filter Pressure Tryk Volume Volumen Temperature Temperatur Weight Vægt lbs lbs Time units Tids enheder Ascent/Descent speed denominator Vis op- og nedstignings hastighed i Minutes Minutter Seconds Sekunder Show Vis threshold Tærskel pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Dykkercomputer rapporteret loft draw ceiling red Tegn loft rødt Calculated ceiling Beregnet loft show all tissues Vis alle væv 3m increments 3m step Calculate NDL/TTS Beregn NDL/TTS GFLow at max depth GFLow på max dybde Misc Blandet Preferences Indstillinger SAC SAC GFLow GFlow GFHigh GFHøj Restart required Genstart nødvendigt To correctly load a new language you must restart Subsurface. Valg af nyt sprog vil kræve en genstart af Subsurface Open Default Log File Åben standard log fil Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML filer (*.ssrf *.xml *.XML) PrintDialog &Preview &Vis Udskrift P&rint U&dskriv &Close &Luk Print Udskriv: PrintLayout Dive# Dyk# Date Dato Depth Dybde Duration Varighed Master Master Buddy Makker Location Sted PrintOptions Print options Print valg Print only selected dives Print kun valgte dyk Print in color Skriv i farver Print type Print type 6 dives per page 6 dyk pr side 2 dives per page 2 dyk pr side Table print Print tabel Ordering Sortering Profile on top Profil øverst Notes on top Noter øverst Sizing heights (% of layout) Zoom i højde (% af layout) Profile height (43% - 85%) Profil højde (45% - 85%) Other data height (8% - 17%) Anden data højde (8% - 17%) Notes height (0% - 52%) Noters højde (05 - 52%) 0 0 ProfileGraphicsView Add Gas Change Tilføj gas skift Add Bookmark Tilføj bogmærke Remove Event Fjern hændelse Hide similar events Skjul tilsvarende hændelser Unhide all events Vis alle hændelser Hide events Skjul hændelser Hide all %1 events? Skjul alle %1 hændelser? Remove the selected event? Fjern den valgte hændelse? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer Ukendt dykkercomputer Set Duration: 10 minutes Sæt varighed: 10 minutter Scale Skaler Ruler Målestok Measure properties of dive segments Præferencer for segmentet Scale your dive to screen size Skaler dykket til skærmstørrelsen Edit Rediger pN pN pHe pHe pO pO air luft EAN%1 EAN%1 Bailing out to OC BailOut til OC begin Starts with space! start end Starts with space! slut ProfilePrintModel unknown Ukendt Dive #%1 - %2 Dyk #%1 - %2 Max depth: %1 %2 Max dybde: %1 %2 Duration: %1 min Varighed: %1 min Gas Used: Gas brugt: SAC: SAC: Max. CNS: Max. CNS: Weights: Vægt: Notes: Noter: Divemaster: Divemaster: Buddy: Makker: Suit: Dragt: Viz: Sigt: Rating: Vurdering: QObject AIR LUFT Remove this Point Fjern dette punkt Close Luk Average Gennemsnit Minimum Minimum Maximum Maksimal Move the map and double-click to set the dive location Dobbelt klik for at sætte positionen RenumberDialog Renumber Re-nummerer New starting number Nyt start nummer ShiftTimesDialog Shift selected times Skift valgte tider Shift times of selected dives by Skift tider på valgte dyk h:mm h:mm earlier Tidligere later Senere SubsurfaceAbout About Subsurface Om Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License %Licens &Website %Hjemmeside SubsurfaceWebServices Webservice Webservice Connecting... Forbinder... Download finished Download færdig Download error: %1 Download fejl; %1 Connection Error: Forbindelses fejl: Invalid user identifier! Ugyldig bruger id Cannot parse response! Kan ikke fortolke svar! Download Success! Download succes! TableView Add Cylinder Tilføj flaske TankInfoModel Description Beskrivelse ml ml bar bar ToolTipItem Information Information WSInfoModel Description Beskrivelse kg kg WebServices Webservice Connection Webservice forbindelse Status: Status: Enter your ID here Tast dit ID her: Download Download User ID Bruger ID Password Password Upload Upload Operation timed out Tiden er udløbet Transfering data... Overfører data... WeightModel Type Type Weight Vægt Clicking here will remove this weigthsystem. Klik her, vil fjerne dette vægtsystem kg lbs ft m YearlyStatisticsModel Year > Month / Trip År >Måned / Tur # # Duration Total Varighed Ialt Average Gennemsnit Shortest Kortest Longest Længst Depth (%1) Average Dybde (%1) Gennemsnit Minimum Minimum Maximum Maximum SAC (%1) Average SAC (%1) Gennemsnit Temp. (%1) Average Temp. (%1) Gennemsnit gettextFromC pascal pascal bar bar psi psi l l cuft cuft m m ft fod lbs pund (lbs) kg kg (%s) or (%s) (%s) eller (%s) air luft integrated integreret belt bælte ankle ankel backplate weight bagpladevægt clip-on Clip-On Failed to read '%s' Fejl i læsning af '%s' Failed to read '%s'. Use import for CSV files. Kunne ikke læse '%s'. Brug import for CSV filer. Maximum number of supported columns on CSV import is %d Maksimum antal kolonner i CSV import er %d none Ingen deco stop deco stop rbt rbt ascent opstigning ceiling Loft workload Arbejdsbyrde transmitter Sender violation Overtrædelse bookmark bogmærke surface overflade safety stop sikkerhedsstop gaschange gasskifte safety stop (voluntary) Sikkerhedsstop (frivillig) safety stop (mandatory) Sikkerhedsstop (Krævet) deepstop dybe stop ceiling (safety stop) Loft (sikkerhedsstop) divetime dykketid below floor event showing dive is below deco floor and adding deco time Under gulv maxdepth Maks. dybde OLF OLF PO2 PO2 airtime Lufttid rgbm rgbm heading Overskrift tissue level warning Vævs advarsel non stop time non stop tid invalid event number Ugyldigt hændelses nummer Unable to create parser for %s %s Kan ikke oprette parser for %s %s Error registering the data Fejl i registrering af data Error parsing the datetime Fejl ved fortolkning af dato/tid Dive %d: %s %d %04d Dyk %d: %s %d %04d Error parsing the divetime Fejl i fortolkning af dykkertid Error parsing the maxdepth Fejl i fortolkning af max dybde Error parsing the gas mix count Fejl i fortolkning af antallet af gasser Error obtaining water salinity Fejl i læsning af saltindhold i vandet Error obtaining surface pressure Fejl ved at opnå overflade tryk Error parsing the gas mix Fejl i fortolkning af gas blanding Error parsing the samples Fejl i fortolkning af prøver Event: waiting for user action Event: waiting for user action model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Fejl: registering the event handler. Error registering the cancellation handler. Fejl: registering the cancellation handler. Dive data import error Import fejl i dykker data Unable to create libdivecomputer context Kan ikke danne libdivecomputer context Unable to open %s %s (%s) Kan ikke åbne %s %s (%s) Strange percentage reading %s Mærkelig procent læsning %s Failed to parse '%s'. Kunne ikke fortolke '%s'. Failed to parse '%s' Fejl i fortolkning af '%s' Database query get_events failed. Database forespørgsel get_events fejlede Database connection failed '%s'. Database forbindelse fejlede '%s'. Database query failed '%s'. Database forespørgsel fejlede '%s'. Can't open stylesheet %s Kan ikke åbne stylesheet %s EAN%d EAN%d Can't find gas %d/%d Kan ikke finde gas %d/%d Too many gas mixes For mange gas blandinger %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s⏎ Subsurface dykkerplan⏎ baseret på GFlow = %.0f og GFhigh = %.0f⏎ Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Skift til %.*f %s om %d:%02d min - runtime %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Stop på %.*f %s i %d:%02d min - runtime %d:%02u i %s Switch gas to %s Skift gas til %s⏎ Gas consumption: Gasforbrug: %.0f%s of %s %.0f%s of %s⏎ ean ean %s P:%d %s %s⏎ P:%d %s %s T:%.1f %s %s⏎ T:%.1f %s %s V:%.2f %s %s V:%2f %s %s Calculated ceiling %.0f %s %s⏎ Beregnet loft %.0f %s %s Tissue %.0fmin: %.0f %s %s Væv %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s⏎ Sikkerhedsstop:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s⏎ Sikkerhedsstop:Ukendt tid @ %.0f %s %s Deco:%umin @ %.0f %s %s⏎ Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s⏎ Deko:unkn time @ %.0f %s %s In deco %s I deko %s NDL:%umin %s⏎ NDL:%umin %s CNS:%u%% %s⏎ CNS:%u%% %s pO%s:%.2fbar %s⏎ pO%s:%.2fbar %s pN%s:%.2fbar %s⏎ pN%s:%.2fbar %s pHe:%.2fbar %s⏎ pHe:%.2fbar %s MOD:%d%s %s⏎ MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s⏎ EAD:%d%s⏎ END:%d%s⏎ EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deko:%umin @ %.0f %s (calc) %s In deco (calc) %s I Deko (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (beregn) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 dyk) %1 %2 (1 dive) %1 %2 (1 dyk) boat Båd shore Kyst drift Strøm deep dybde cavern hule ice is wreck vrag cave grotte altitude Højde pool svømmehal lake river flod night nat fresh Fersk student Elev photo foto video video instructor Instruktør deco deco more than %d days mere end %d dage %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # for dyk # for selected dives for de valgte dyk for dive #%d for dyk #%d for selected dive for valgt dyk for all dives for alle dyk (no dives) (ingen dyk) Sun Søn Mon Man Tue Tir Wed Ons Thu Tor Fri Fre Sat Lør Jan Jan Feb Feb Mar Mar Apr Apr May Maj Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Filsystemet er næsten fuldt Afmonter / monter dykkercomputeren og klik 'Prøv igen' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Filsystemet er næsten fuldt Afmonter / monter dykkercomputeren og klik 'Prøv igen' Short write to req.txt file Is the Uemis Zurich plugged in correctly? Skrivefejl til reg.txt fil Er Uemis Zurich tilsluttet korrekt? unknown Ukendt Reading %s %s Læser %s %s data data divelog entry id Dykkerlog indgang id divespot data id Dykkersted data id more data dive id Flere dykker data id wetsuit våddragt semidry semidry drysuit tørdragt shorty shorty vest vest long john Long John jacket Jakke full suit heldragt 2 pcs full suit 2-delt heldragt membrane membran Init Communication Init Communication Uemis init failed Uemis start op fejlede Start download Begynd download Safety Stop Violation Sikkerhedsstop overtrædelse Speed Alarm Hastighedsalam Speed Warning Hastighedsalarm PO2 Green Warning PO2 Grøn advarsel PO2 Ascend Warning PO2 opstignings alarm PO2 Ascend Alarm PO2 opstignings alarm Tank Pressure Info Flaske tryk info RGT Warning RGT Advarsel RGT Alert RGT Alarm Tank Change Suggested Flaske skift anbefalet Depth Limit Exceeded Dybde grænse overskredet Max Deco Time Warning Max deko tid advarsel Dive Time Info Dykker Tid info Dive Time Alert Dykker Tid Alarm Marker Marker No Tank Data Ingen flaske data Low Battery Warning Lav batteri alarm Low Battery Alert Lav batteri alarm Subsurface-4.0.2/translations/subsurface_de_CH.ts000066400000000000000000003750731226345450700221230ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Datei importieren (CSV) ... ... PO2 PO₂ Field Separator Feld Trenner Field Configuration Feldkonfiguration Import CSV file CSV Datei importieren Time Zeit Depth Tiefe Temp Temperatur Cns CNS Stopdepth Stopptiefe Pre-configured imports Vorkonfigurierte Importe Open CSV Log File CSV Log Datei öffnen CSV Files (*.csv);;All Files(*) CSV Dateien (*.csv);;Alle Dateien(*) CylindersModel Type Typ Size Größe WorkPress max. Fülldruck StartPress Druck vorh. EndPress Druck nachh. Switch at Wechsel bei He% He% O O Clicking here will remove this cylinder. Hier klicken entfernt diese Flasche. Cylinder cannot be removed Flasche kann nicht entfernt werden This gas in use. Only cylinders that are not used in the dive can be removed. Dieses Gas wird verwendet. Nur Flaschen die nicht im Tauchgang verwendet werden können entfernt werden. psi psi bar bar l l cuft cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Tauchcomputer Bezeichnung bearbeiten Remove the selected Dive Computer? Den ausgewählten Tauchcomputer entfernen? Are you sure that you want to remove the selected dive computer? Tauchcomputer wirklich entfernen? DiveComputerModel Model Modell Device ID Gerätebezeichnung Nickname Gerätename Clicking here will remove this divecomputer. Hier klicken entfernt diesen Tauchcomputer. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Suchfeld anzeigen expand all Alle ausklappen collapse all Alle einklappen collapse others Andere einklappen remove dive(s) from trip Entferne Tauchgang aus Reise create new trip above Neue Reise darüber einfügen add dive(s) to trip immediately above Tauchgäng(e) zur Reise darüber hinzufügen merge trip with trip above Reise mit Reise darüber verbinden merge trip with trip below Reise mit Reise darunter verbinden delete dive(s) Tauchgang löschen mark dive(s) invalid Tauchgang(gänge) als ungültig kennzeichnen save As Speichern unter export As UDDF Als UDDF exportieren shift times Zeiten verschieben upload dive(s) to divelogs.de Tauchgang(gänge) auf divelogs.de hochladen Save Dives As... Speichere Tauchgänge als... Save File as Datei speichern als UDDF files (*.uddf *.UDDF) UDDF Dateien (*.uddf *.UDDF) merge selected dives Ausgewählte Tauchgänge zusammenführen DivePlanner Bottom SAC SAC SAC on DECO Stop Deko-SAC GFHigh GF high GFLow GF low Last Stop at 6m Letzter Stopp auf 6m Start Time Startzeit ATM Pressure Oberflächendruck DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Problematische Position des Knotens One or more of your stops will be lost with this operations, Please, remove them first. Einer oder mehrere Deiner Stopps werden hierdurch verloren gehen. Bitte entferne diese zuerst. DivePlannerPointsModel AIR Luft Final Depth Endtiefe Duration Dauer Used Gas Gasverbrauch CC Set Point CC Set Point Discard the Plan? Plan verwerfen? You are about to discard your plan. Du bist dabei Deinen Plan zu verwerfen. DivePlannerWidget Dive Planner Points Planerpunkte Available Gases Verfügbare Gase add dive data point Datenpunkt hinzufügen DiveTripModel # Nr. date Datum m m ft ft min min kg kg lbs US Pfund suit Anzug cyl Flasche location Tauchplatz SAC SAC OTU OTU maxCNS max. CNS DivelogsDeWebServices Invalid response from server Ungültige Serverantwort Expected XML tag 'DiveDateReader', got instead '%1 %1 anstelle des erwarteten XML Tags 'DiveDateReader'. Expected XML tag 'DiveDates' not found XML Tag 'DiveDates' nicht gefunden. Malformed XML response. Line %1: %2 Ungültige XML Antwort. Zeile %1: %2 no dives were selected keine Tauchgänge ausgewählt failed to create zip file for upload: %1 konnte keine zip Datei für die Übertragung erstellen: %1 cannot create temporary file: %1 kann keine temporäre Datei erstellen: %1 internal error: %1 Interner Fehler: %1 internal error Interner Fehler Done Fertig Uploading dive list... Übertrage Liste der Tauchgänge Downloading dive list... Liste der Tauchgänge herunterladen... Downloading %1 dives... Lade %1 Tauchgänge vom Server... Download finished - %1 Herunterladen beendet - %1 Corrupted download Heruntergeladene Daten sind beschädigt. The archive could not be opened: %1 Das Archiv konnte nicht geöffnet werden %1 Upload failed Übertragung fehlgeschlagen Upload successful Übertragung erfolgreich Login failed Login fehlgeschlagen Cannot parse response Verstehe die Antwort nicht Error: %1 Fehler: %1 Upload finished Übertragung beendet DownloadFromDCWidget OK OK Error Fehler Retry Wiederholen Choose file for divecomputer download logfile Datei auswählen, in die das libdivecomputer Log gespeichert wird Log files (*.log) Log Dateien (*.log) Warning Warnung Saving the libdivecomputer dump will NOT download dives to the dive list. Wenn der libdivecomputer Dump gespeichert wird, werden keine Tauchgänge zur Liste der Tauchgänge hinzugefügt. Choose file for divecomputer binary dump file Datei auswählen, in die der libdivecomputer Dump gespeichert wird Dump files (*.bin) Dump Dateien (*.bin) DownloadFromDiveComputer Download From Dive Computer Von Tauchcomputer laden Vendor Hersteller Dive Computer Tauchcomputer Device or Mount Point Gerät oder Einhängepunkt ... ... Force download of all dives Erneutes Laden aller Tauchgänge erzwingen Always prefer downloaded dives Heruntergeladene Tauchgänge immer bevorzugen OK OK Cancel Abbrechen Save libdivecomputer logfile Log Datei der libdivecomputer Übertragung speichern Save libdivecomputer dumpfile Dump Datei der libdivecomputer Übertragung speichern GlobeGPS Edit Selected Dive Locations Ausgewählte Tauchplätze bearbeiten MainTab Dive Notes Notizen Location Ort Coordinates Koordinaten Divemaster Tauchgruppenleiter Buddy Partner Start time Startzeit Air temp Lufttemperatur Water temp Wassertemperatur Tags Stichworte Rating Bewertung Visibility Sicht Suit Anzug Notes Notizen Equipment Ausrüstung Dive Info Informationen Date Datum Interval Oberflächenpause Gases Used Verw. Gase Gas Consumed Verbrauchtes Gas SAC SAC Max. Depth Max. Tiefe Ave. Depth Ø Tiefe OTU OTU Air Pressure Luftdruck Air Temperature Lufttemperatur Water Temperature Wassertemperatur Dive Time Dauer Salinity Salzgehalt Stats Statistiken Depth Tiefe Temperature Temperatur Duration Dauer Total Time Gesamtzeit Dives Tauchgänge Cylinders Flaschen Add Cylinder Flasche hinzufügen Weights Blei Add Weight System Gewichtsystem hinzufügen Trip Location Ziel der Reise Trip Notes Reisenotizen Save Speichern Cancel Abbrechen This trip is being edited. Diese Reise wird bearbeitet. Multiple dives are being edited. Mehrere Tauchgänge werden bearbeitet. This dive is being edited. Dieser Tauchgang wird bearbeitet. /min /min unknown unbekannt N N S S E O W W MainWindow Filter Filter &File &Datei &Log &Log &View &Ansicht &Help &Hilfe &Import &Importieren &New logbook &Neues Logbuch New Neu Ctrl+N Ctrl+N &Open logbook Logbuch &öffnen Open Öffnen Ctrl+O Ctrl+O &Save &Speichern Save Speichern Ctrl+S Ctrl+S Save as Speichern unter Ctrl+Shift+S Ctrl+Shift+S Close Schliessen Ctrl+W Ctrl+W Import Files Dateien importieren Ctrl+I Ctrl+I Export &UDDF Exportiere &UDDF Ctrl+U Ctrl+U &Print &Drucken Ctrl+, Ctrl+, &Quit &Beenden Import from &dive computer Von &Tauchcomputer importieren Import &GPS data from Subsurface Service &GPS Daten vom Subsurface Service importieren Ctrl+G Ctrl+G &Edit Device Names Gerätenamen &bearbeiten Ctrl++ Ctrl++ &Renumber &Neu nummerieren Ctrl+R Ctrl+R Toggle &Zoom &Zoom ein-/ausschalten &Yearly Statistics &Jahresstatistiken Ctrl+Y Ctrl+Y Dive List Tauchgangliste Profile Profil Info Informationen All Alle User &Manual &Bedienungsanleitung Globe Globus P&lan Dive Tauchgang p&lanen Ctrl+L Ctrl+L Import CSV CSV importieren Import CS&V CS&V importieren Import from Divelogs.de von Divelogs.de importieren Ctrl+P Ctrl+P Preferences Einstellungen Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Tauchgang hinzufügen Auto Group Automatisch gruppieren Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Vorh. TC Left Links Next DC Nächster TC Right Rechts Select Events Ereignisse auswählen Input Plan Plan eingeben About Subsurface Über Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Datei öffnen Please save or cancel the current dive edit before closing the file. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor das Logbuch geschlossen werden kann. Please save or cancel the current dive edit before trying to plan a dive. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein neuer Tauchplan bearbeitet werden kann. Please save or cancel the current dive edit before trying to add a dive. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein neuer Tauchgang hinzugefügt werden kann. User Manual Benutzerhandbuch Cannot find the Subsurface manual Kann das Subsurface Handbuch nicht finden Do you want to save the changes you made in the file %1? Möchtest Du die Änderungen in der Datei %1 speichern? Do you want to save the changes you made in the datafile? Möchtest Du die Änderungen in der Daten-Datei speichern? Save Changes? Änderungen speichern? Changes will be lost if you don't save them. Änderungen gehen verloren wenn Du sie nicht speicherst. First finish the current edition before trying to do another. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein anderer Tauchgang bearbeitet werden kann. Save File as Datei speichern unter Warning Warnung Please save or cancel the current dive edit before opening a new file. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein neues Logbuch geöffnet werden kann. UDDF files (*.uddf *.UDDF) UDDF Dateien (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML Dateien (*.ssrf *.xml *.XML) PreferencesDialog Defaults Standardeinstellungen Units Einheiten Graph Diagramm Language Sprache Lists and Tables Listen und Tabellen Font Schriftart Font size Schriftgrösse Dives Tauchgänge Default Dive file Standard Tauch Datei ... ... Display Invalid Zeige auch ungültige? Default Cylinder Standardflasche Use Default Cylinder Wähle Deine Standardflasche(n) System System Metric Metrisch Imperial Zöllig Personalize Personalisiert Depth Tiefe meter Meter feet Fuss bar bar psi psi liter Liter cu ft cu ft celsius Celsius fahrenheit Fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Systemeinstellung Filter Filter Pressure Druck Volume Volumen Temperature Temperatur Weight Gewicht lbs US Pfund Time units Zeiteinheiten Ascent/Descent speed denominator Zeiteinheit für Geschwindigkeit bei Aufstieg/Abstieg Minutes Minuten Seconds Sekunden Show Anzeigen threshold Schwelle pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Auftauchgrenze Tauchcomputer draw ceiling red tiefster Deko-Stopp rot markieren Calculated ceiling Berechnete Auftauchgrenze show all tissues alle Gewebe anzeigen 3m increments 3m Stufen Calculate NDL/TTS Null-/Auftauchzeit berechnen GFLow at max depth GF low bei maximaler Tiefe anwenden Misc Sonstiges Preferences Einstellungen SAC SAC GFLow GF low GFHigh GF high Restart required Bitte Programm neu starten To correctly load a new language you must restart Subsurface. Um die neue Sprache laden zu können, muss Subsurface neu gestartet werden. Open Default Log File Standard Logfile öffnen Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML Dateien (*.ssrf *.xml *.XML) PrintDialog &Preview Vorschau P&rint Drucken &Close Schliessen Print Drucken PrintLayout Dive# Tauchgang Nr. Date Datum Depth Tiefe Duration Dauer Master Guide Buddy Partner Location Ort PrintOptions Print options Druckoptionen Print only selected dives Nur ausgewählte Tauchgänge drucken Print in color Farbdruck Print type Art des Ausdrucks 6 dives per page 6 Tauchgänge pro Seite 2 dives per page 2 Tauchgänge pro Seite Table print Tabellendruck Ordering Reihenfolge Profile on top Profil oben Notes on top Notizen oben Sizing heights (% of layout) Höhe (% des Layouts) Profile height (43% - 85%) Höhe des Profils (43% - 85%) Other data height (8% - 17%) Höhe der anderen Daten (8% - 17%) Notes height (0% - 52%) Höhe der Notizen (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Gaswechsel setzen Add Bookmark Markierung setzen Remove Event Entferne Ereigniss Hide similar events Ähnliche Ereignisse ausblenden Unhide all events Alle Ereignisse einblenden Hide events Ereignisse ausblenden Hide all %1 events? Alle %1 Ereignisse ausblenden? Remove the selected event? Ausgewähltes Ereignis entfernen? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer Unbekannter Tauchcomputer Set Duration: 10 minutes Setze Dauer: 10 Minuten Scale Massstab Ruler Lineal Measure properties of dive segments Eigenschaften der Tauchgangssegmente messen Scale your dive to screen size Tauchgang auf Bildschirmgrösse skalieren Edit Bearbeiten pN pN pHe pHe pO pO air Luft EAN%1 EAN%1 Bailing out to OC Notausstieg mit offenem System begin Starts with space! Anfang end Starts with space! Ende ProfilePrintModel unknown unbekannt Dive #%1 - %2 Tauchgang Nr %1 - %2 Max depth: %1 %2 max Tiefe: %1 %2 Duration: %1 min Dauer: %1 Minuten Gas Used: Verw. Gas: SAC: SAC: Max. CNS: Max. CNS: Weights: Blei: Notes: Notizen: Divemaster: Divemaster: Buddy: Buddy: Suit: Anzug: Viz: Sicht: Rating: Bewertung: QObject AIR Luft Remove this Point Diesen Punkt entfernen Close Schliessen Average Ø Minimum Min. Maximum Max. Move the map and double-click to set the dive location Karte verschieben und mit Doppelklick Tauchplatz markieren RenumberDialog Renumber Neu nummerieren New starting number Neue erste Nummer ShiftTimesDialog Shift selected times Ausgewählte Zeiten verschieben Shift times of selected dives by Ausgewählte Zeiten verschieben um... h:mm h:mm earlier früher later später SubsurfaceAbout About Subsurface Info zu Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-Plattform Programm zur Verwaltung von Taucher-Logbucheinträgen<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, und andere, 2011, 2012, 2013</span> &License &Lizenz &Website &Webseite SubsurfaceWebServices Webservice Webservice Connecting... Verbinde... Download finished Herunterladen beendet Download error: %1 Fehler beim Herunterladen: %1 Connection Error: Verbindungsfehler: Invalid user identifier! Ungültige Benutzerkennung Cannot parse response! Verstehe die Antwort nicht! Download Success! Erfolgreich geladen! TableView Add Cylinder Flasche hinzufügen TankInfoModel Description Beschreibung ml ml bar bar ToolTipItem Information Information WSInfoModel Description Beschreibung kg kg WebServices Webservice Connection Verbindung mit Webservice Status: Status: Enter your ID here ID eingeben Download Herunterladen User ID Benutzer-Kennung Password Passwort Upload Hochladen Operation timed out Die Aktion hat zu lange gedauert Transfering data... Übertrage Daten... WeightModel Type Typ Weight Gewicht Clicking here will remove this weigthsystem. Hier klicken entfernt dieses Gewichtssystem. kg kg lbs US Pfund ft ft m m YearlyStatisticsModel Year > Month / Trip Jahr > Monat / Reise # Nr. Duration Total Dauer Gesamt Average Ø Shortest Kürzester Longest Längster Depth (%1) Average Tiefe (%1) Durchschnitt Minimum Minimum Maximum Maximum SAC (%1) Average SAC (%1) Durchschnitt Temp. (%1) Average Temp. (%1) Mittel gettextFromC pascal Pa bar bar psi psi l l cuft cuft m m ft ft lbs US Pfund kg kg (%s) or (%s) (%s) oder (%s) air Luft integrated integriert belt Gürtel ankle Fussblei backplate weight Backplate-Gewicht clip-on clip-on Failed to read '%s' Fehler beim Lesen von '%s' Failed to read '%s'. Use import for CSV files. '%s' lesen fehlgeschlagen. Benutze Importieren für CSV Dateien. Maximum number of supported columns on CSV import is %d maximale Anzahl der unterstützten Spalten beim CSV-Import sind %d none keine deco stop Deko-Stopp rbt rbt ascent Aufstieg ceiling tiefster Deko-Stopp workload Arbeit transmitter Sender violation Verletzung bookmark Markierung surface Oberfläche safety stop Sicherheitsstopp gaschange Gaswechsel safety stop (voluntary) Sicherheitsstopp (freiwillig) safety stop (mandatory) Sicherheitsstopp (obligatorisch) deepstop Tiefen-Stopp ceiling (safety stop) Sicherheits-Stopp divetime Tauchgangsdauer below floor event showing dive is below deco floor and adding deco time unterhalb Dekotiefe maxdepth Max. Tiefe OLF OLF PO2 PO₂ airtime verbleibende Atemzeit rgbm rgbm heading Richtung tissue level warning Gewebewarnung non stop time Nullzeit invalid event number ungültige Ereignisnummer Unable to create parser for %s %s Nicht in der Lage, einen Parser für %s %s zu erstellen Error registering the data Fehler beim Registrieren der Daten Error parsing the datetime Fehler beim Lesen des Datums Dive %d: %s %d %04d Tauchgang Nr. %d: %s %d %04d Error parsing the divetime Fehler beim Lesen der Dauer Error parsing the maxdepth Fehler beim Lesen der maximalen Tiefe Error parsing the gas mix count Fehler beim Lesen der Gasgemischszahl Error obtaining water salinity Fehler beim Lesen des Salzgehalts Error obtaining surface pressure Kein Oberflächendruck erhalten Error parsing the gas mix Fehler beim Lesen der Gasgemischs Error parsing the samples Fehler beim Lesen der Samples Event: waiting for user action Ereignis: warte auf Benutzeraktion model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Fehler beim Registrieren der Ereignisbehandlung Error registering the cancellation handler. Fehler bei der Registrierung der Abbruchbehandlung Dive data import error Fehler beim Importieren der Tauchgangsdaten Unable to create libdivecomputer context Fehler beim Erzeugen des libdivecomputer Contexts Unable to open %s %s (%s) Fehler beim Öffnen von %s %s (%s) Strange percentage reading %s Unverständliche Prozentangabe %s Failed to parse '%s'. Fehler beim Lesen von '%s'. Failed to parse '%s' Fehler beim Lesen von '%s' Database query get_events failed. Datenbank Anfrage 'get_events' fehlgeschlagen. Database connection failed '%s'. Datenbank Verbindung fehlgeschlagen '%s'. Database query failed '%s'. Datenbank Anfrage fehlgeschlagen '%s'. Can't open stylesheet %s Kann Stylesheet %s nicht öffnen EAN%d EAN%d Can't find gas %d/%d Kann Gasgemisch %d/%d nicht finden Too many gas mixes Zu viele Gasgemische %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface Tauchplan basierend auf GFlow = %.0f und GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Tauchen auf %.*f %s in %d:%02d min - Gesamtzeit %d:%02u mit %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Verbleibe auf %.*f %s für %d:%02d min - Gesamtzeit %d:%02u mit %s Switch gas to %s Gaswechsel zu %s Gas consumption: Gasverbrauch: %.0f%s of %s %.0f%s %s ean ean %s P:%d %s %s D:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Berechneter tiefster Deko-Stopp %.0f %s %s Tissue %.0fmin: %.0f %s %s Gewebe %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Sicherheitsstopp:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d Tiefe:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Sicherheitsstopp:unbk Zeit @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko:unbk Zeit @ %.0f %s %s In deco %s In Deko %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deko:%umin @ %.0f %s (berechnet) %s In deco (calc) %s Deko (berechnet) %s NDL:%umin (calc) %s Nullzeit:%umin (berechnet) %s TTS:%umin (calc) %s Auftauchzeit:%umin (berechnet) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sTiefe:%.1f%s %s %sD:%.1f%s %s %sTiefe:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sDruck:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 Tauchgänge) %1 %2 (1 dive) %1 %2 (1 Tauchgang) boat Boot shore Ufer drift Strömung deep tief cavern Kaverne ice Eis wreck Wrack cave Höhle altitude Berg pool Pool lake See river Fluss night Nacht fresh süss student Schüler photo Foto video Video instructor Instruktor deco deko more than %d days mehr als %d Tage %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # für Tauchgänge Nr. for selected dives für die ausgewählten Tauchgänge for dive #%d für Tauchgang Nr. %d for selected dive für den ausgewählten Tauchgang for all dives für alle Tauchgänge (no dives) (keine Tauchgänge) Sun So Mon Mo Tue Di Wed Mi Thu Do Fri Fr Sat Sa Jan Jan Feb Feb Mar Mär Apr Apr May Mai Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dez Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zürich: Dateisystem beinahe voll Bitte den Tauchcomputer ausstecken, wieder einstecken und erneut versuchen Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zürich: Dateisystem voll. Bitte den Tauchcomputer ausstecken, wieder einstecken und erneut versuchen Short write to req.txt file Is the Uemis Zurich plugged in correctly? Unvollständiger Schreibvorgang der req.txt Datei Ist der Uemis Zürich korrekt verbunden? unknown unbekannt Reading %s %s Lese %s %s data Daten divelog entry id Logbucheintrag mit ID divespot data id Tauchplatz Daten ID more data dive id mehr Daten für Tauchgang ID wetsuit Nass-Tauchanzug semidry halbtrocken drysuit Trockentauchanzug shorty Shorty vest Weste long john Latzhose jacket Jacke full suit vollständiger Tauchanzug 2 pcs full suit Zweiteiler membrane Membran Init Communication Verbindung aufbauen Uemis init failed Uemis-Initialisierung fehlgeschlagen Start download Beginne zu Laden Safety Stop Violation Verletzung des Sicherheitsstopps Speed Alarm Alarm: Geschwindigkeit Speed Warning Warnung: Geschwindigkeit PO2 Green Warning Warnung: PO₂ Grün PO2 Ascend Warning Warnung: Aufstieg / PO₂ PO2 Ascend Alarm Alarm: Aufstieg / PO₂ Tank Pressure Info Info: Flaschendruck RGT Warning Warnung: verbleibende Gas-Zeit RGT Alert Alarm: verbleibende Gas-Zeit Tank Change Suggested Gaswechsel-Vorschlag Depth Limit Exceeded Tiefenlimit überschritten Max Deco Time Warning Warnung: Maximale Deko Zeit Dive Time Info Info: Tauchgangsdauer Dive Time Alert Alarm: Tauchgangsdauer Marker Markierung No Tank Data Keine Flaschen Informationen Low Battery Warning Warnung: Batterie schwach Low Battery Alert Alarm: Batterie schwach Subsurface-4.0.2/translations/subsurface_de_DE.ts000066400000000000000000003751661226345450700221240ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Datei importieren (CSV) ... ... PO2 PO₂ Field Separator Feld Trenner Field Configuration Feldkonfiguration Import CSV file CSV Datei importieren Time Zeit Depth Tiefe Temp Temperatur Cns CNS Stopdepth Stopptiefe Pre-configured imports Vorkonfigurierte Importe Open CSV Log File CSV Log Datei öffnen CSV Files (*.csv);;All Files(*) CSV Dateien (*.csv);;Alle Dateien(*) CylindersModel Type Typ Size Größe WorkPress max. Fülldruck StartPress Druck vorh. EndPress Druck nachh. Switch at Wechsel bei He% He% O O Clicking here will remove this cylinder. Hier klicken entfernt diese Flasche. Cylinder cannot be removed Flasche kann nicht entfernt werden This gas in use. Only cylinders that are not used in the dive can be removed. Dieses Gas wird verwendet. Nur Flaschen die nicht im Tauchgang verwendet werden können entfernt werden. psi psi bar bar l l cuft cu.ft. DiveComputerManagementDialog Edit Dive Computer Nicknames Tauchcomputer Bezeichnung bearbeiten Remove the selected Dive Computer? Ausgewählten Tauchcomputer entfernen? Are you sure that you want to remove the selected dive computer? Tauchcomputer wirklich entfernen? DiveComputerModel Model Modell Device ID Gerätebezeichnung Nickname Gerätename Clicking here will remove this divecomputer. Hier klicken entfernt diesen Tauchcomputer. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Suchfeld anzeigen expand all Alle ausklappen collapse all Alle einklappen collapse others Andere einklappen remove dive(s) from trip Entferne Tauchgang aus Reise create new trip above Neue Reise darüber einfügen add dive(s) to trip immediately above Tauchgäng(e) zur Reise darüber hinzufügen merge trip with trip above Reise mit Reise darüber verbinden merge trip with trip below Reise mit Reise darunter verbinden delete dive(s) Tauchgang löschen mark dive(s) invalid Tauchgang(gänge) als ungültig kennzeichnen save As Speichern unter export As UDDF Als UDDF exportieren shift times Zeiten verschieben upload dive(s) to divelogs.de Tauchgang(gänge) auf divelogs.de hochladen Save Dives As... Speichere Tauchgänge als... Save File as Datei speichern als UDDF files (*.uddf *.UDDF) UDDF Dateien (*.uddf *.UDDF) merge selected dives Ausgewählte Tauchgänge zusammenführen DivePlanner Bottom SAC AMV SAC on DECO Stop Deko-AMV GFHigh GF high GFLow GF low Last Stop at 6m Letzter Stopp auf 6m Start Time Startzeit ATM Pressure Oberflächendruck DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Problematische Position des Knotens One or more of your stops will be lost with this operations, Please, remove them first. Einer oder mehrere Deiner Stopps werden hierdurch verloren gehen. Bitte entferne diese zuerst. DivePlannerPointsModel AIR Luft Final Depth Endtiefe Duration Dauer Used Gas Gasverbrauch CC Set Point CC Set Point Discard the Plan? Plan verwerfen? You are about to discard your plan. Du bist dabei Deinen Plan zu verwerfen. DivePlannerWidget Dive Planner Points Planerpunkte Available Gases Verfügbare Gase add dive data point Datenpunkt hinzufügen DiveTripModel # Nr. date Datum m m ft ft min min kg kg lbs US Pfund suit Anzug cyl Flasche location Tauchplatz SAC AMV OTU OTU maxCNS max. CNS DivelogsDeWebServices Invalid response from server Ungültige Serverantwort Expected XML tag 'DiveDateReader', got instead '%1 %1 anstelle des erwarteten XML Tags 'DiveDateReader'. Expected XML tag 'DiveDates' not found XML Tag 'DiveDates' nicht gefunden. Malformed XML response. Line %1: %2 Ungültige XML Antwort. Zeile %1: %2 no dives were selected keine Tauchgänge ausgewählt failed to create zip file for upload: %1 konnte keine zip Datei für die Übertragung erstellen: %1 cannot create temporary file: %1 kann keine temporäre Datei erstellen: %1 internal error: %1 ein interner Fehler ist aufgetreten: %1 internal error ein interner Fehler ist aufgetreten Done Fertig Uploading dive list... Übertrage Liste der Tauchgänge Downloading dive list... Liste der Tauchgänge herunterladen... Downloading %1 dives... Lade %1 Tauchgänge vom Server... Download finished - %1 Herunterladen beendet - %1 Corrupted download Heruntergeladene Daten sind beschädigt. The archive could not be opened: %1 Das Archiv konnte nicht geöffnet werden %1 Upload failed Übertragung fehlgeschlagen Upload successful Übertragung erfolgreich Login failed Login fehlgeschlagen Cannot parse response Verstehe die Antwort nicht Error: %1 Fehler: %1 Upload finished Übertragung beendet DownloadFromDCWidget OK OK Error Fehler Retry Wiederholen Choose file for divecomputer download logfile Datei auswählen, in die das libdivecomputer Log gespeichert wird Log files (*.log) Log Dateien (*.log) Warning Warnung Saving the libdivecomputer dump will NOT download dives to the dive list. Wenn der libdivecomputer Dump gespeichert wird, werden keine Tauchgänge zur Liste der Tauchgänge hinzugefügt. Choose file for divecomputer binary dump file Datei auswählen, in die der libdivecomputer Dump gespeichert wird Dump files (*.bin) Dump Dateien (*.bin) DownloadFromDiveComputer Download From Dive Computer Von Tauchcomputer laden Vendor Hersteller Dive Computer Tauchcomputer Device or Mount Point Gerät oder Mount-Point ... ... Force download of all dives Erneutes Laden aller Tauchgänge erzwingen Always prefer downloaded dives Heruntergeladene Tauchgänge immer bevorzugen OK OK Cancel Abbrechen Save libdivecomputer logfile Log Datei der libdivecomputer Übertragung speichern Save libdivecomputer dumpfile Dump Datei der libdivecomputer Übertragung speichern GlobeGPS Edit Selected Dive Locations Ausgewählte Tauchplätze bearbeiten MainTab Dive Notes Notizen Location Ort Coordinates Koordinaten Divemaster Tauchgruppenleiter Buddy Partner Start time Startzeit Air temp Lufttemperatur Water temp Wassertemperatur Tags Stichworte Rating Bewertung Visibility Sicht Suit Anzug Notes Notizen Equipment Ausrüstung Dive Info Informationen Date Datum Interval Oberflächenpause Gases Used Verw. Gase Gas Consumed Verbrauchtes Gas SAC AMV Max. Depth Max. Tiefe Ave. Depth Ø Tiefe OTU OTU Air Pressure Luftdruck Air Temperature Lufttemperatur Water Temperature Wassertemperatur Dive Time Dauer Salinity Salzgehalt Stats Statistiken Depth Tiefe Temperature Temperatur Duration Dauer Total Time Gesamtzeit Dives Tauchgänge Cylinders Flaschen Add Cylinder Flasche hinzufügen Weights Blei Add Weight System Gewichtsystem hinzufügen Trip Location Ziel der Reise Trip Notes Reisenotizen Save Speichern Cancel Abbrechen This trip is being edited. Diese Reise wird bearbeitet. Multiple dives are being edited. Mehrere Tauchgänge werden bearbeitet. This dive is being edited. Dieser Tauchgang wird bearbeitet. /min /min unknown unbekannt N N S S E O W W MainWindow Filter Filter &File &Datei &Log &Log &View &Ansicht &Help &Hilfe &Import &Importieren &New logbook &Neues Logbuch New Neu Ctrl+N Strg+N &Open logbook Logbuch &öffnen Open Öffnen Ctrl+O Strg+O &Save &Speichern Save Speichern Ctrl+S Strg+S Save as Speichern unter Ctrl+Shift+S Strg+Shift+S Close Schließen Ctrl+W Strg+W Import Files Dateien importieren Ctrl+I Strg+I Export &UDDF Exportiere &UDDF Ctrl+U Strg+U &Print &Drucken Ctrl+, Strg+, &Quit &Beenden Import from &dive computer Von &Tauchcomputer importieren Import &GPS data from Subsurface Service &GPS Daten vom Subsurface Service importieren Ctrl+G Strg+G &Edit Device Names Gerätenamen &bearbeiten Ctrl++ Strg++ &Renumber &Neu nummerieren Ctrl+R Strg+R Toggle &Zoom &Zoom ein-/ausschalten &Yearly Statistics &Jahresstatistiken Ctrl+Y Strg+Y Dive List Tauchgangliste Profile Profil Info Informationen All Alle User &Manual &Bedienungsanleitung Globe Globus P&lan Dive Tauchgang p&lanen Ctrl+L Strg+L Import CSV CSV importieren Import CS&V CS&V importieren Import from Divelogs.de von Divelogs.de importieren Ctrl+P Strg+P Preferences Einstellungen Ctrl+Q Strg+Q Ctrl+D Strg+D Add Dive Tauchgang hinzufügen Auto Group Automatisch gruppieren Ctrl+2 Strg+2 Ctrl+3 Strg+3 Ctrl+4 Strg+4 Ctrl+1 Strg+1 Prev DC Vorh. TC Left Links Next DC Nächster TC Right Rechts Select Events Ereignisse auswählen Input Plan Plan eingeben About Subsurface Über Subsurface F1 F1 Ctrl+5 Strg+5 Open File Datei öffnen Please save or cancel the current dive edit before closing the file. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor das Logbuch geschlossen werden kann. Please save or cancel the current dive edit before trying to plan a dive. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein neuer Tauchplan bearbeitet werden kann. Please save or cancel the current dive edit before trying to add a dive. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein neuer Tauchgang hinzugefügt werden kann. User Manual Benutzerhandbuch Cannot find the Subsurface manual Kann das Subsurface Handbuch nicht finden Do you want to save the changes you made in the file %1? Möchtest Du die Änderungen in der Datei %1 speichern? Do you want to save the changes you made in the datafile? Möchtest Du die Änderungen in der Daten-Datei speichern? Save Changes? Änderungen speichern? Changes will be lost if you don't save them. Änderungen gehen verloren wenn Du sie nicht speicherst. First finish the current edition before trying to do another. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein anderer Tauchgang bearbeitet werden kann. Save File as Datei speichern unter Warning Warnung Please save or cancel the current dive edit before opening a new file. Bitte den aktuell bearbeiteten Tauchgang speichern oder den Vorgang abbrechen, bevor ein neues Logbuch geöffnet werden kann. UDDF files (*.uddf *.UDDF) UDDF Dateien (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML Dateien (*.ssrf *.xml *.XML) PreferencesDialog Defaults Standardeinstellungen Units Einheiten Graph Diagramm Language Sprache Lists and Tables Listen und Tabellen Font Schriftart Font size Schriftgröße Dives Tauchgänge Default Dive file Standard Tauch Datei ... ... Display Invalid Zeige auch ungültige? Default Cylinder Standardflasche Use Default Cylinder Wähle Deine Standardflasche(n) System System Metric Metrisch Imperial Zöllig Personalize Personalisieren Depth Tiefe meter Meter feet Fuß bar bar psi psi liter Liter cu ft cu ft celsius Celsius fahrenheit Fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Standardeinstellungen Filter Filter Pressure Druck Volume Volumen Temperature Temperatur Weight Gewicht lbs US Pfund Time units Zeiteinheiten Ascent/Descent speed denominator Zeiteinheit für Geschwindigkeit bei Aufstieg/Abstieg Minutes Minuten Seconds Sekunden Show Anzeigen threshold Schwelle pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Auftauchgrenze Tauchcomputer draw ceiling red tiefster Deko-Stopp rot markieren Calculated ceiling Berechnete Auftauchgrenze show all tissues alle Gewebe anzeigen 3m increments 3m Stufen Calculate NDL/TTS Null-/Auftauchzeit berechnen GFLow at max depth GF low bei maximaler Tiefe anwenden Misc Sonstiges Preferences Einstellungen SAC AMV GFLow GF low GFHigh GF high Restart required Bitte Programm neu starten To correctly load a new language you must restart Subsurface. Um die neue Sprache laden zu können, muss Subsurface neu gestartet werden. Open Default Log File Standard Logfile öffnen Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML Dateien (*.ssrf *.xml *.XML) PrintDialog &Preview Vorschau P&rint Drucken &Close Schließen Print Drucken PrintLayout Dive# Tauchgang Nr. Date Datum Depth Tiefe Duration Dauer Master Leiter Buddy Partner Location Ort PrintOptions Print options Druckoptionen Print only selected dives Nur ausgewählte Tauchgänge drucken Print in color Farbdruck Print type Art des Ausdrucks 6 dives per page 6 Tauchgänge pro Seite 2 dives per page 2 Tauchgänge pro Seite Table print Tabellendruck Ordering Reihenfolge Profile on top Profil oben Notes on top Notizen oben Sizing heights (% of layout) Höhe (% des Layouts) Profile height (43% - 85%) Höhe des Profils (43% - 85%) Other data height (8% - 17%) Höhe der anderen Daten (8% - 17%) Notes height (0% - 52%) Höhe der Notizen (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Gaswechsel setzen Add Bookmark Markierung setzen Remove Event Entferne Ereigniss Hide similar events Ähnliche Ereignisse ausblenden Unhide all events Alle Ereignisse einblenden Hide events Ereignisse ausblenden Hide all %1 events? Alle %1 Ereignisse ausblenden? Remove the selected event? Ausgewähltes Ereignis entfernen? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer Unbekannter Tauchcomputer Set Duration: 10 minutes Setze Dauer: 10 Minuten Scale Maßstab Ruler Lineal Measure properties of dive segments Eigenschaften der Tauchgangssegmente messen Scale your dive to screen size Tauchgang auf Bildschirmgrößem skalieren Edit Bearbeiten pN pN pHe pHe pO pO air Luft EAN%1 EAN%1 Bailing out to OC Notausstieg mit offenem System begin Starts with space! Anfang end Starts with space! Ende ProfilePrintModel unknown unbekannt Dive #%1 - %2 Tauchgang Nr %1 - %2 Max depth: %1 %2 max Tiefe: %1 %2 Duration: %1 min Dauer: %1 Minuten Gas Used: Verw. Gas: SAC: AMV: Max. CNS: Max. CNS: Weights: Blei: Notes: Notizen: Divemaster: Tauchgruppenleiter: Buddy: Partner: Suit: Anzug: Viz: Sicht: Rating: Bewertung: QObject AIR Luft Remove this Point Diesen Punkt entfernen Close Schließen Average Ø Minimum Min. Maximum Max. Move the map and double-click to set the dive location Karte verschieben und mit Doppelklick Tauchplatz markieren RenumberDialog Renumber Neu nummerieren New starting number Neue erste Nummer ShiftTimesDialog Shift selected times Ausgewählte Zeiten verschieben Shift times of selected dives by Ausgewählte Zeiten verschieben um... h:mm h:mm earlier früher later später SubsurfaceAbout About Subsurface Info zu Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-Plattform Programm zur Verwaltung von Taucher-Logbucheinträgen<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, und andere, 2011, 2012, 2013</span> &License &Lizenz &Website &Webseite SubsurfaceWebServices Webservice Webservice Connecting... Verbinde... Download finished Herunterladen beendet Download error: %1 Fehler beim Herunterladen: %1 Connection Error: Verbindungsfehler: Invalid user identifier! Ungültige Benutzerkennung Cannot parse response! Verstehe die Antwort nicht! Download Success! Erfolgreich geladen! TableView Add Cylinder Flasche hinzufügen TankInfoModel Description Beschreibung ml ml bar bar ToolTipItem Information Information WSInfoModel Description Beschreibung kg kg WebServices Webservice Connection Verbindung mit Webservice Status: Status: Enter your ID here Hier ID eingeben Download Herunterladen User ID Benutzer-Kennung Password Passwort Upload Hochladen Operation timed out Die Aktion hat zu lange gedauert Transfering data... Übertrage Daten... WeightModel Type Typ Weight Gewicht Clicking here will remove this weigthsystem. Hier klicken entfernt dieses Gewichtssystem. kg kg lbs US Pfund ft ft m m YearlyStatisticsModel Year > Month / Trip Jahr > Monat / Reise # Nr. Duration Total Dauer Gesamt Average Ø Shortest Kürzester Longest Längster Depth (%1) Average Tiefe (%1) Durchschnitt Minimum Minimum Maximum Maximum SAC (%1) Average AMV (%1) Durchschnitt Temp. (%1) Average Temp. (%1) Mittel gettextFromC pascal Pa bar bar psi psi l l cuft cu.ft. m m ft ft lbs US Pfund kg kg (%s) or (%s) (%s) oder (%s) air Luft integrated integriert belt Gürtel ankle Fußblei backplate weight Backplate-Gewicht clip-on clip-on Failed to read '%s' Fehler beim Lesen von '%s' Failed to read '%s'. Use import for CSV files. '%s' lesen fehlgeschlagen. Benutze Importieren für CSV Dateien. Maximum number of supported columns on CSV import is %d maximale Anzahl der unterstützten Spalten beim CSV-Import sind %d none keine deco stop Deko-Stopp rbt rbt ascent Aufstieg ceiling tiefster Deko-Stopp workload Arbeit transmitter Sender violation Verletzung bookmark Markierung surface Oberfläche safety stop Sicherheitsstopp gaschange Gaswechsel safety stop (voluntary) Sicherheitsstopp (freiwillig) safety stop (mandatory) Sicherheitsstopp (verpflichtend) deepstop Tiefen-Stopp ceiling (safety stop) Sicherheits-Stopp divetime Tauchgangsdauer below floor event showing dive is below deco floor and adding deco time unterhalb Dekotiefe maxdepth Max. Tiefe OLF OLF PO2 PO₂ airtime verbleibende Atemzeit rgbm rgbm heading Richtung tissue level warning Gewebewarnung non stop time Nullzeit invalid event number ungültige Ereignisnummer Unable to create parser for %s %s Nicht in der Lage, einen Parser für %s %s zu erstellen Error registering the data Fehler beim Registrieren der Daten Error parsing the datetime Fehler beim Lesen des Datums Dive %d: %s %d %04d Tauchgang Nr. %d: %s %d %04d Error parsing the divetime Fehler beim Lesen der Dauer Error parsing the maxdepth Fehler beim Lesen der maximalen Tiefe Error parsing the gas mix count Fehler beim Lesen der Gasgemischszahl Error obtaining water salinity Fehler beim Lesen des Salzgehalts Error obtaining surface pressure Kein Oberflächendruck erhalten Error parsing the gas mix Fehler beim Lesen der Gasgemischs Error parsing the samples Fehler beim Lesen der Samples Event: waiting for user action Ereignis: warte auf Benutzeraktion model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Fehler beim Registrieren der Ereignisbehandlung Error registering the cancellation handler. Fehler bei der Registrierung der Abbruchbehandlung Dive data import error Fehler beim Importieren der Tauchgangsdaten Unable to create libdivecomputer context Fehler beim Erzeugen des libdivecomputer Contexts Unable to open %s %s (%s) Fehler beim Öffnen von %s %s (%s) Strange percentage reading %s Unverständliche Prozentangabe %s Failed to parse '%s'. Fehler beim Lesen von '%s'. Failed to parse '%s' Fehler beim Lesen von '%s' Database query get_events failed. Datenbank Anfrage 'get_events' fehlgeschlagen. Database connection failed '%s'. Datenbank Verbindung fehlgeschlagen '%s'. Database query failed '%s'. Datenbank Anfrage fehlgeschlagen '%s'. Can't open stylesheet %s Kann Stylesheet %s nicht öffnen EAN%d EAN%d Can't find gas %d/%d Kann Gasgemisch %d/%d nicht finden Too many gas mixes Zu viele Gasgemische %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface Tauchplan basierend auf GFlow = %.0f und GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Tauchen auf %.*f %s in %d:%02d min - Gesamtzeit %d:%02u mit %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Verbleibe auf %.*f %s für %d:%02d min - Gesamtzeit %d:%02u mit %s Switch gas to %s Gaswechsel zu %s Gas consumption: Gasverbrauch: %.0f%s of %s %.0f%s %s ean ean %s P:%d %s %s D:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Berechneter tiefster Deko-Stopp %.0f %s %s Tissue %.0fmin: %.0f %s %s Gewebe %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Sicherheitsstopp:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d Tiefe:%.1f %s %s SAC:%2.1fl/min %s AMV:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Sicherheitsstopp:unbk Zeit @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko:unbk Zeit @ %.0f %s %s In deco %s In Deko %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deko:%umin @ %.0f %s (berechnet) %s In deco (calc) %s Deko (berechnet) %s NDL:%umin (calc) %s Nullzeit:%umin (berechnet) %s TTS:%umin (calc) %s Auftauchzeit:%umin (berechnet) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sTiefe:%.1f%s %s %sD:%.1f%s %s %sTiefe:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sDruck:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 Tauchgänge) %1 %2 (1 dive) %1 %2 (1 Tauchgang) boat Boot shore Ufer drift Strömung deep tief cavern Kaverne ice Eis wreck Wrack cave Höhle altitude Berg pool Pool lake See river Fluss night Nacht fresh süß student Schüler photo Foto video Video instructor Ausbilder deco deko more than %d days mehr als %d Tage %dd %dh %dmin %dt %dh %dmin %dh %dmin %dh %dmin for dives # für Tauchgänge Nr. for selected dives für die ausgewählten Tauchgänge for dive #%d für Tauchgang Nr. %d for selected dive für den ausgewählten Tauchgang for all dives für alle Tauchgänge (no dives) (keine Tauchgänge) Sun So Mon Mo Tue Di Wed Mi Thu Do Fri Fr Sat Sa Jan Jan Feb Feb Mar Mär Apr Apr May Mai Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dez Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zürich: Dateisystem beinahe voll Bitte den Tauchcomputer ausstecken, wieder einstecken und erneut versuchen Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zürich: Dateisystem voll. Bitte den Tauchcomputer ausstecken, wieder einstecken und erneut versuchen Short write to req.txt file Is the Uemis Zurich plugged in correctly? Unvollständiger Schreibvorgang der req.txt Datei Ist der Uemis Zürich korrekt verbunden? unknown unbekannt Reading %s %s Lese %s %s data Daten divelog entry id Logbucheintrag mit ID divespot data id Tauchplatz Daten ID more data dive id mehr Daten für Tauchgang ID wetsuit Nass-Tauchanzug semidry halbtrocken drysuit Trockentauchanzug shorty Shorty vest Weste long john Latzhose jacket Jacke full suit vollständiger Tauchanzug 2 pcs full suit Zweiteiler membrane Membran Init Communication Verbindung aufbauen Uemis init failed Uemis-Initialisierung fehlgeschlagen Start download Beginne zu Laden Safety Stop Violation Verletzung des Sicherheitsstopps Speed Alarm Alarm: Geschwindigkeit Speed Warning Warnung: Geschwindigkeit PO2 Green Warning Warnung: PO₂ Grün PO2 Ascend Warning Warnung: Aufstieg / PO₂ PO2 Ascend Alarm Alarm: Aufstieg / PO₂ Tank Pressure Info Info: Flaschendruck RGT Warning Warnung: verbleibende Gas-Zeit RGT Alert Alarm: verbleibende Gas-Zeit Tank Change Suggested Gaswechsel-Vorschlag Depth Limit Exceeded Tiefenbegrenzung überschritten Max Deco Time Warning Warnung: Maximale Deko Zeit Dive Time Info Info: Tauchgangsdauer Dive Time Alert Alarm: Tauchgangsdauer Marker Markierung No Tank Data Keine Flaschen Informationen Low Battery Warning Warnung: Batterie schwach Low Battery Alert Alarm: Batterie schwach Subsurface-4.0.2/translations/subsurface_es_ES.ts000066400000000000000000003754641226345450700221630ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importar archivo (CSV) ... PO2 PO2 Field Separator Separador de campos Field Configuration Configuración de campos Import CSV file Importar archivo CSV Time Hora de entrada Depth Profundidad Temp Temp Cns Cns Stopdepth Profundidad de parada Pre-configured imports Importaciones pre-configuradas Open CSV Log File Abrir archivo CSV CSV Files (*.csv);;All Files(*) Archivos CSV (*.csv);;Todos los Archivos(*) CylindersModel Type Tipo Size Tamaño WorkPress Pres. trabajo StartPress Pres. inicial EndPress Pres. final Switch at Cambiar a He% He% O O Clicking here will remove this cylinder. Pulsar aquí borrará esta botella Cylinder cannot be removed La botella no puede borrarse This gas in use. Only cylinders that are not used in the dive can be removed. Gas en uso. Solo pueden borrarse botellas que no se usan en la inmersión. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Editar nombres de ordenador de buceo Remove the selected Dive Computer? ¿Quiere eliminar el ordenador seleccionado? Are you sure that you want to remove the selected dive computer? ¿Está seguro de que quiere eliminar el ordenador de buceo seleccionado? DiveComputerModel Model Modelo Device ID ID del dispositivo Nickname Nombre Clicking here will remove this divecomputer. Pulsar aquí borrará este ordenador de buceo. DiveItem l/min l/min cuft/min Pie³/min DiveListView Show Search Box Mostrar ventana de busqueda expand all Expandir todo collapse all Encoger todo collapse others Encoger otros remove dive(s) from trip Borrar inmersión(es) del viaje create new trip above Crear nuevo viaje arriba add dive(s) to trip immediately above Añadir inmersión(es) al viaje de arriba merge trip with trip above mezclar viaje con el viaje de arriba merge trip with trip below mezclar viaje con el viaje de abajo delete dive(s) Borrar inmersión(es) mark dive(s) invalid Marcar inmersión(es) como inválida save As Guardar como export As UDDF Exportar como UDDF shift times Desplazar horas upload dive(s) to divelogs.de Subir inmersión(es) a divelogs.de Save Dives As... Guardar las inmersiones como… Save File as Guardar archivo como UDDF files (*.uddf *.UDDF) Archivos UDDF (*.uddf *.UDDF) merge selected dives Mezclar las inmersiones seleccionadas DivePlanner Bottom SAC CAS en fondo SAC on DECO Stop CAS en parada DECO GFHigh GF alto GFLow GF bajo Last Stop at 6m Última parada a 6m Start Time Hora de inicio ATM Pressure Presión atmosférica DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Error en la posición del punto One or more of your stops will be lost with this operations, Please, remove them first. Una o más de tus paradas se perderán con estas operaciones. Por favor, bórralas antes. DivePlannerPointsModel AIR AIRE Final Depth Profundidad final Duration Duración Used Gas Gas usado CC Set Point CC Set Point Discard the Plan? ¿Quiere descartar el plan? You are about to discard your plan. Está a punto de descartar su plan. DivePlannerWidget Dive Planner Points Puntos del planificador de inmersiones Available Gases Gases disponibles add dive data point Añadir punto de datos de inmersión. DiveTripModel # N.º date Fecha m m ft ft min min kg kg lbs lbs suit traje cyl bot location Ubicación SAC SAC OTU OTU maxCNS maxCNS DivelogsDeWebServices Invalid response from server Respuesta del servidor no válida. Expected XML tag 'DiveDateReader', got instead '%1 No se encontró la etiqueta XML esperada «DiveDateReader», se obtuvo en su lugar «%1» Expected XML tag 'DiveDates' not found No se encontró la etiqueta XML esperada «DiveDates» Malformed XML response. Line %1: %2 Respuesta XML mal formada. Línea no dives were selected No se seleccionó ninguna inmersión failed to create zip file for upload: %1 Fallo al crear archivo zip para subir: %1 cannot create temporary file: %1 No se puede crear archivo temporal: %1 internal error: %1 Error interno: %1 internal error Error interno Done Hecho Uploading dive list... Subiendo lista de inmersiones… Downloading dive list... Descargando lista de inmersiones… Downloading %1 dives... Descargando %1 inmersiones… Download finished - %1 Descarga finalizada - Corrupted download Descarga corrompida The archive could not be opened: %1 El archivo no pudo abrirse %1 Upload failed La subida ha fallado Upload successful Subida correcta Login failed El acceso ha fallado Cannot parse response No se puede leer la respuesta Error: %1 Error: %1 Upload finished Subida finalizada DownloadFromDCWidget OK OK Error Error Retry Intentar de nuevo Choose file for divecomputer download logfile Selecciona archivo para registro de descarga de libdivecomputer Log files (*.log) Archivos Log (*.log) Warning Advertencia Saving the libdivecomputer dump will NOT download dives to the dive list. Guardar el volcado de libdivecomputer NO descargará buceos a la lista de inmersiones. Choose file for divecomputer binary dump file Selecciona archivo para el volcado binario del ordenador de buceo Dump files (*.bin) Archivos de volcado (*.bin) DownloadFromDiveComputer Download From Dive Computer Descargar desde el ordenador de Buceo Vendor Proveedor Dive Computer Ordenador de buceo Device or Mount Point Dispositivo o Punto de montaje ... Force download of all dives Forzar descarga de todas las inmersiones Always prefer downloaded dives Preferir siempre las inmersiones descargadas OK Aceptar Cancel Cancelar Save libdivecomputer logfile Guardar registro de libdivecomputer Save libdivecomputer dumpfile Guardar volcado de libdivecomputer GlobeGPS Edit Selected Dive Locations Editar los puntos de buceo seleccionados. MainTab Dive Notes Notas de la inmersión Location Ubicación Coordinates Coordenadas Divemaster Divemaster Buddy Compañero Start time Hora de inicio Air temp Temperatura del aire Water temp Temperatura del agua Tags Etiquetas Rating Valoración Visibility Visibilidad Suit Traje Notes Notas Equipment Equipo Dive Info Información de la inmersión Date Fecha Interval Intervalo Gases Used Gases usados Gas Consumed Gas consumido SAC CAS Max. Depth Profundidad máxima Ave. Depth Profundidad media OTU OTU Air Pressure Presión atmosférica Air Temperature Temperatura del aire Water Temperature Temperatura del agua Dive Time Duración de la inmersión Salinity Salinidad Stats Estadísticas Depth Profundidad Temperature Temperatura Duration Duración Total Time Tiempo total Dives Inmersiones Cylinders Botellas Add Cylinder Añadir botella Weights Lastre Add Weight System Añadir sistema de lastre Trip Location Ubicación del viaje Trip Notes Notas del viaje Save Guardar Cancel Cancelar This trip is being edited. Este viaje está siendo editado. Multiple dives are being edited. Se están editando varias inmersiones. This dive is being edited. Esta inmersión esta siendo editada. /min /min unknown desconocido N N S S E E W O MainWindow Filter Filtros &File Archivo &Log Registro &View &Vista &Help Ayuda &Import &Importar &New logbook &Nuevo registro New Nuevo Ctrl+N Ctrl+N &Open logbook Abrir registr&o Open Abrir Ctrl+O Ctrl+O &Save Guardar Save Guardar Ctrl+S Ctrl+S Save as Guardar como Ctrl+Shift+S Ctrl+Shift+S Close Cerrar Ctrl+W Ctrl+W Import Files Importar Archivos Ctrl+I Ctrl+I Export &UDDF Exportar &UDDF Ctrl+U Ctrl+U &Print Im&primir Ctrl+, Ctrl+, &Quit Salir Import from &dive computer Importar del or&denador de buceo Import &GPS data from Subsurface Service Importar datos &GPS del Servicio Subsurface Ctrl+G Ctrl+G &Edit Device Names &Editar nombres de dispositivos Ctrl++ Ctrl++ &Renumber &Renumerar Ctrl+R Ctrl+R Toggle &Zoom Activar &Zoom &Yearly Statistics Estadísticas anuales Ctrl+Y Ctrl+Y Dive List Lista de inmersiones Profile Perfil Info Info All Todo User &Manual &Manual de usuario Globe Globo P&lan Dive P&lanificar Inmersión Ctrl+L Ctrl+L Import CSV Importar CSV Import CS&V Importar CS&V Import from Divelogs.de Importar desde Divelogs.de Ctrl+P Ctrl+P Preferences Preferencias Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Añadir inmersión Auto Group Auto agrupar Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Anterior ordenador Left Izquierda Next DC Siguiente ordenador Right Derecha Select Events Seleccionar eventos Input Plan Introducir Plan About Subsurface Acerca de Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Abrir archivo Please save or cancel the current dive edit before closing the file. Por favor, guarda o cancela la edición de la inmersión actual antes de cerrar el archivo Please save or cancel the current dive edit before trying to plan a dive. Por favor, guarda o cancela la edición de la inmersión actual antes de intentar planificar otra. Please save or cancel the current dive edit before trying to add a dive. Por favor, guarda o cancela la edición de la inmersión actual antes de intentar añadir otra. User Manual Manual de usuario Cannot find the Subsurface manual No puedo encontrar el manual de Subsurface Do you want to save the changes you made in the file %1? ¿Quiere guardar los cambios realizados en el archivo %1? Do you want to save the changes you made in the datafile? ¿Quiere guardar los cambios realizados en el archivo de datos? Save Changes? ¿Guardar los cambios? Changes will be lost if you don't save them. Se perderán los cambios si no los guarda. First finish the current edition before trying to do another. Termina primero la edición actual antes de intentar editar otra. Save File as Guardar archivo como Warning Advertencia Please save or cancel the current dive edit before opening a new file. Por favor, guarda o cancela la edición de la inmersión actual antes de abrir otro archivo. UDDF files (*.uddf *.UDDF) Archivos UDDF (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Archivos XML de Subsurface (*.ssrf *.xml *.XML) PreferencesDialog Defaults Predeterminadas Units Unidades Graph Gráfico Language Lenguaje Lists and Tables Listas y tablas Font Tipo de letra Font size Tamaño de letra Dives Inmersiones Default Dive file Archivo de inmersiones por defecto ... Display Invalid Mostrar no validas Default Cylinder Botella por defecto Use Default Cylinder Usar botella por defecto System Sistema Metric Métrico Imperial Imperial Personalize Personalizar Depth Profundidad meter metro feet pie bar bar psi psi liter litro cu ft pie³ celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Predeterminado del sistema Filter Filtros Pressure Presión Volume Volumen Temperature Temperatura Weight Peso lbs lbs Time units Unidades de tiempo Ascent/Descent speed denominator Denominador de la velocidad de ascenso/descenso Minutes Minutos Seconds Segundos Show Mostrar threshold umbral pHe pHe MOD PMO max ppO₂ max ppO₂ EAD END EADD PEA PNE EADD Dive computer reported ceiling Techo informado por el ordenador draw ceiling red Dibujar el techo en rojo Calculated ceiling Techo calculado show all tissues Mostrar todos los tejidos 3m increments Incrementos de 3m Calculate NDL/TTS Calcular NDL/TTS GFLow at max depth GF bajo a la máxima profundidad Misc Varios Preferences Preferencias SAC SAC GFLow GF bajo GFHigh GF alto Restart required Reinicio requerido To correctly load a new language you must restart Subsurface. Para cargar correctamente un nuevo lenguaje debes reiniciar Subsurface. Open Default Log File Abrir archivo de registro por defecto Subsurface XML files (*.ssrf *.xml *.XML) Archivos XML de Subsurface (*.ssrf *.xml *.XML) PrintDialog &Preview &Previsualizar P&rint Imp&rimir &Close &Cerrar Print Imprimir PrintLayout Dive# Inmersión n.º Date Fecha Depth Profundidad Duration Duración Master Guía Buddy Compañero Location Ubicación PrintOptions Print options Opciones de impresión Print only selected dives Imprimir sólo inmersiones seleccionadas Print in color Impresión en color Print type Tipo de impresión 6 dives per page 6 inmersiones por página 2 dives per page 2 inmersiones por página Table print Impresión de tabla Ordering Ordenar Profile on top Perfil arriba Notes on top Notas arriba Sizing heights (% of layout) Ajustar alturas (% de la distribución) Profile height (43% - 85%) Altura del perfil (43 % - 85 %) Other data height (8% - 17%) Altura de otros datos (8 % - 17 %) Notes height (0% - 52%) Altura de las notas (0 % - 52 %) 0 0 ProfileGraphicsView Add Gas Change Añadir cambio de gas Add Bookmark Añadir marcador Remove Event Borrar evento Hide similar events Ocultar eventos similares Unhide all events Revelar todos los eventos Hide events Ocultar eventos Hide all %1 events? ¿ Ocultar todos los eventos %1 ? Remove the selected event? ¿Quiere eliminar el evento seleccionado? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer Ordenador desconocido Set Duration: 10 minutes Fijar duración: 10 minutos Scale Escala Ruler Regla Measure properties of dive segments Medir propiedades de segmentos de la inmersión Scale your dive to screen size escalar la inmersión al tamaño de pantalla Edit Editar pN pN pHe pHe pO pO air aire EAN%1 EAN%1 Bailing out to OC Cambio de emergencia a OC begin Starts with space! comienzo end Starts with space! fin ProfilePrintModel unknown desconocido Dive #%1 - %2 Inmersión n.º %1 - %2 Max depth: %1 %2 Profundidad máxima: %1 %2 Duration: %1 min Duración: %1 min Gas Used: Gas usado: SAC: CAS: Max. CNS: Max. CNS: Weights: Lastre: Notes: Notas: Divemaster: Divemaster: Buddy: Compañero: Suit: Traje: Viz: Visibilidad: Rating: Calificación: QObject AIR AIRE Remove this Point Borrar este punto Close Cerrar Average Promedio Minimum Mínima Maximum Máxima Move the map and double-click to set the dive location Mueve el mapa y haz doble click para fijar la posición del buceo RenumberDialog Renumber Renumerar New starting number Número de partida nuevo ShiftTimesDialog Shift selected times Desplazar las horas seleccionadas Shift times of selected dives by Desplazar las horas de las inmersiones seleccionadas en h:mm h:mm earlier más pronto later más tarde SubsurfaceAbout About Subsurface Acerca de Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Software de registro de inmersiones multiplataforma<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel y otros, 2011, 2012, 2013</span> &License &Licencia &Website Sitio &web SubsurfaceWebServices Webservice Servicio web Connecting... Conectando… Download finished Descarga finalizada Download error: %1 Error de descarga: %1 Connection Error: Error de conexión: Invalid user identifier! El identificador de usuario no es válido. Cannot parse response! No se puede analizar la respuesta. Download Success! Se ha completado la descarga correctamente. TableView Add Cylinder Añadir botella TankInfoModel Description Descripción ml ml bar bar ToolTipItem Information Información WSInfoModel Description Descripción kg kg WebServices Webservice Connection Conexión al servicio web Status: Status: Enter your ID here Introduce aquí tu ID Download Descargar User ID ID del usuario Password Contraseña Upload Subir Operation timed out Tiempo de espera sobrepasado Transfering data... Transfiriendo datos… WeightModel Type Tipo Weight Peso Clicking here will remove this weigthsystem. Pulsar aquí borrará este sistema de lastre. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Año > Mes / Viaje # N.º Duration Total Duración Total Average Media Shortest Más corta Longest Más larga Depth (%1) Average Profundidad (%1) Media Minimum Mínimo Maximum Máximo SAC (%1) Average CAS (%1) Medio Temp. (%1) Average Temp. (%1) Media gettextFromC pascal pascal bar bar psi psi l l cuft pie³ m m ft ft lbs lbs kg kg (%s) or (%s) (%s) o (%s) air aire integrated integrado belt cinturón ankle tobillo backplate weight lastre en el arnes clip-on clip-on Failed to read '%s' No se pudo leer «%s» Failed to read '%s'. Use import for CSV files. Falló al leer «%s». Use la importación para los archivos CSV. Maximum number of supported columns on CSV import is %d El máximo número de columnas que soporta importar CSV es %d none ninguno deco stop parada deco rbt rbt ascent ascenso ceiling techo workload carga transmitter transmisor violation violación bookmark marcador surface superficie safety stop parada de seguridad gaschange cambio de mezcla safety stop (voluntary) parada de seguridad (voluntaria) safety stop (mandatory) parada de seguridad (obligatoria) deepstop parada de profundidad ceiling (safety stop) techo (parada de seguridad) divetime duración de inmersión below floor event showing dive is below deco floor and adding deco time por debajo del techo maxdepth Profundidad Max OLF OLF PO2 PO2 airtime tiempo de aire rgbm rgbm heading encabezado tissue level warning Alarma de nivel de tejidos non stop time tiempo sin parada invalid event number el número de evento no es válido Unable to create parser for %s %s No es posible crear el analizador para %s %s Error registering the data Error al registrar los datos Error parsing the datetime Error al analizar la fecha Dive %d: %s %d %04d Inmersión n.º %d: %s %d %04d Error parsing the divetime Error al analizar el tiempo de buceo Error parsing the maxdepth Error al analizar la máxima profundidad Error parsing the gas mix count Error al analizar el conteo de mezcla de gas Error obtaining water salinity Error al obtener salinidad del agua Error obtaining surface pressure Error al obtener la presión en superficie Error parsing the gas mix Error al analizar la mezcla de gas Error parsing the samples Error al analizar las muestras Event: waiting for user action Evento: esperando acción del usuario model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) modelo=%u (0x%08x), firmware=%u (0x%08x), n.º de serie=%u (0x%08x) Error registering the event handler. Error al registrar el manejador de eventos Error registering the cancellation handler. Error al registrar el manejador de cancelación Dive data import error Error al importar datos de inmersiones Unable to create libdivecomputer context No es posible crear el contexto de libdivecomputer Unable to open %s %s (%s) No se pudo abrir %s %s (%s) Strange percentage reading %s Porcentaje extraño al leer %s Failed to parse '%s'. No se pudo analizar «%s». Failed to parse '%s' No se pudo analizar «%s» Database query get_events failed. Falló la petición get_events a la base de datos. Database connection failed '%s'. Falló la conexión a la base de datos «%s». Database query failed '%s'. Falló la petición a la base de datos «%s». Can't open stylesheet %s No se puede abrir la hoja de estilo %s EAN%d EAN%d Can't find gas %d/%d No encuentro el gas %d/%d Too many gas mixes Demasiadas mezclas de gas %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Plan de buceo de Subsurface basado en GFbajo = %.0f y GFalto = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Cambio de cota a %.*f %s en %d:%02d min - runtime %d:%02u con %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Permanecer a %.*f %s durante %d:%02d min - runtime %d:%02u en %s Switch gas to %s Cambio de gas a %s Gas consumption: Consumo de gas: %.0f%s of %s %.0f%s de %s ean ean %s P:%d %s %s Pres:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Techo calculado %.0f %s %s Tissue %.0fmin: %.0f %s %s Tejido %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Parada de seguridad:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d Prof:%.1f %s %s SAC:%2.1fl/min %s CAS:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Parada de seguridad:tiempo desconocido @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:Tiempo desconocido @ %.0f %s %s In deco %s En deco %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s PEA:%d%s PNE:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s En deco (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sPres:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 inmersiones) %1 %2 (1 dive) %1 %2 (1 inmersión) boat barco shore orilla drift a la deriva deep profunda cavern caverna ice hielo wreck pecio cave cueva altitude altura pool piscina lake lago river río night noche fresh agua dulce student estudiante photo foto video vídeo instructor instructor deco deco more than %d days más de %d días %dd %dh %dmin %dd, %dh %dmin %dh %dmin %dh %dmin for dives # para las inmersiones n.º for selected dives para las inmersiones seleccionadas for dive #%d para la inmersión n.º %d for selected dive para la inmersión seleccionada for all dives Todas las inmersiones (no dives) (ninguna inmersión) Sun Do Mon Lu Tue Ma Wed Mi Thu Ju Fri Vi Sat Sa Jan Ene Feb Feb Mar Mar Apr Abr May Mayo Jun Jun Jul Jul Aug Ago Sep Sep Oct Oct Nov Nov Dec Dic Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: El sistema de archivos esta casi lleno Desconecte / conecte el ordenador de buceo e inténtelo de nuevo Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: sistema de archivos está lleno Desconectar / conectar el ordenador de buceo e inténtelo de nuevo Short write to req.txt file Is the Uemis Zurich plugged in correctly? Escritura al archivo req.txt muy corta. ¿Está el Uemis Zúrich correctamente conectado? unknown desconocido Reading %s %s Leyendo %s %s data datos divelog entry id identificador de entrada del diario divespot data id identificador del punto de buceo more data dive id más datos para el identificador de inmersión wetsuit traje húmedo semidry semiseco drysuit traje seco shorty shorty vest chaleco long john long john jacket chaleco full suit traje completo 2 pcs full suit traje completo 2 piezas membrane membrana Init Communication Iniciar comunicación Uemis init failed Fallo al intentar iniciar Uemis Start download Iniciar la descarga Safety Stop Violation Violación de parada de seguridad Speed Alarm Alarma de velocidad Speed Warning Aviso de velocidad PO2 Green Warning Aviso verde de PO2 PO2 Ascend Warning Aviso de ascenso de PO2 PO2 Ascend Alarm Alarma de ascenso de PO2 Tank Pressure Info Información sobre presión de botella RGT Warning Aviso tiempo de gas restante RGT Alert Alerta tiempo de gas restante Tank Change Suggested Sugerencia de cambio de botella Depth Limit Exceeded Se superó el límite de profundidad Max Deco Time Warning Advertencia de tiempo max deco Dive Time Info Información sobre la ruración de lainmersión Dive Time Alert Alerta de duración de inmersión Marker Marcador No Tank Data No se degistran datos de botella Low Battery Warning Aviso de batería baja Low Battery Alert Alerta de batería baja Subsurface-4.0.2/translations/subsurface_et_EE.ts000066400000000000000000003722251226345450700221360ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Impordi fail (CSV) ... ... PO2 PO2 Field Separator Välja eraldaja Field Configuration Välja konfiguratsioon Import CSV file Impordi CSV fail Time Aeg Depth Sügavus Temp Temp Cns Cns Stopdepth Peatuse sügavus Pre-configured imports Eelseadistatud impordid Open CSV Log File Ava CSV logifail CSV Files (*.csv);;All Files(*) CylindersModel Type Tüüp Size Suurus WorkPress Töörõhk StartPress Algusrõhk EndPress Lõpurõhk Switch at Vaheta He% He% O O Clicking here will remove this cylinder. Siin klikkamine eemaldab selle ballooni Cylinder cannot be removed Ballooni ei saa eemaldada This gas in use. Only cylinders that are not used in the dive can be removed. See gaas on kasutusel. Eemaldada saab ainult neid balloone mida ei kasutata sellel sukeldumisel. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Toimeta kompuutrite hüüdnimesid Remove the selected Dive Computer? Eemalda valitud kompuuter? Are you sure that you want to remove the selected dive computer? Oled kindel et soovid eemaldada valitud kompuutri? DiveComputerModel Model Mudel Device ID Seadme ID Nickname Hüüdnimi Clicking here will remove this divecomputer. Siin klikkamine eemaldab selle kompuutri. DiveItem l/min l/min cuft/min kuupjalga/min DiveListView Show Search Box Näita otsinguakent expand all laienda kõik collapse all ahenda kõik collapse others ahenda muud remove dive(s) from trip kõrvalda sukeldumine/sukeldumised väljasõidust create new trip above loo uus väljasõit ülal add dive(s) to trip immediately above lisa sukeldumine/sukeldumised väljasõitu kohe eespool merge trip with trip above ühenda väljasõit väljasõiduga ülal merge trip with trip below ühenda väljasõit väljasõiduga all delete dive(s) kustuta sukeldumine/sukeldumised mark dive(s) invalid Märgista sukeldumine/sukeldumised ebaõnnestunuks save As salvesta nimega export As UDDF ekspordi UDDF kujul shift times nihuta ajad upload dive(s) to divelogs.de lae sukeldumised divelogs.de keskkonda Save Dives As... Salvesta sukeldumised nimega... Save File as Salvesta fail nimega UDDF files (*.uddf *.UDDF) UDDF failid (*.uddf *.UDDF) merge selected dives ühenda valitud sukeldumised DivePlanner Bottom SAC SAC põhjas SAC on DECO Stop SAC dekopeatusel GFHigh GFHigh GFLow GFLow Last Stop at 6m Viimane peatus 6m peal Start Time Algusaeg ATM Pressure ATM rõhk DivePlannerGraphics 10m 10m 30ft 30 jalga Handler Position Error Draiveri asukoha viga One or more of your stops will be lost with this operations, Please, remove them first. Üks või enam peatust läheb selle operatsiooniga kaotsi, palun eemalda need esmalt. DivePlannerPointsModel AIR ÕHK Final Depth Lõppsügavus Duration Kestus Used Gas Kasutatud gaas CC Set Point CC seadepunkt Discard the Plan? Loobu plaanist? You are about to discard your plan. Oled plaanist loobumas. DivePlannerWidget Dive Planner Points Sukeldumise planeerija punktid Available Gases Saadavad gaasid add dive data point lisa sukeldumise andmete punkt DiveTripModel # # date kuupäev m m ft jalg min min kg kg lbs nael suit ülikond cyl ball location asukoht SAC SAC OTU Hapnikumürgistuse ühik (OTU) maxCNS maxCNS DivelogsDeWebServices Invalid response from server Vigane vastus serverilt Expected XML tag 'DiveDateReader', got instead '%1 Oodatava XML märgendi 'DiveDateReader' asemel on '%1' Expected XML tag 'DiveDates' not found Oodatud XML märgendit 'DiveDates' ei leitud Malformed XML response. Line %1: %2 Vigane XML vastus. Rida %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Valmis Uploading dive list... Sukeldumiste listi üleslaadimine... Downloading dive list... Sukeldumiste listi allalaadimine... Downloading %1 dives... Laen alla %1 sukeldumist... Download finished - %1 Allalaadimine lõppenud - %1 Corrupted download Vigane allalaadimine The archive could not be opened: %1 Arhiivi ei saa avada: %1 Upload failed Üleslaadimine ebaõnnestus Upload successful Üleslaadimine edukas Login failed Sisselogimine ebaõnnestus Cannot parse response Ei suuda vastust tuvastada Error: %1 Viga: %1 Upload finished Üleslaadimine lõppenud DownloadFromDCWidget OK OK Error Viga Retry Korda Choose file for divecomputer download logfile Log files (*.log) Warning Hoiatus Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Lae sukeldumiskompuutrist Vendor Tootja Dive Computer Sukeldumiskompuuter Device or Mount Point Seade või ühenduspunkt ... ... Force download of all dives Kõikide sukeldumiste jõuga allalaadimine Always prefer downloaded dives Eelista alati allalaetud sukeldumisi OK OK Cancel Loobu Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations Toimeta valitud sukeldumiskohad MainTab Dive Notes Sukeldumise märkmed Location Asukoht Coordinates Koordinaadid Divemaster Divemaster Buddy Semu Start time Algusaeg Air temp Õhu temp Water temp Vee temp Tags Märgendid Rating Hinne Visibility Nähtavus Suit Ülikond Notes Märkmed Equipment Varustus Dive Info Sukeldumise info Date Kuupäev Interval Pinnaintervall Gases Used Kasutatud gaas(id) Gas Consumed Tarbitud gaas SAC SAC Max. Depth Max sügavus Ave. Depth Keskm sügavus OTU OTU Air Pressure Õhurõhk Air Temperature Õhu temp Water Temperature Vee temp Dive Time Põhjaaeg Salinity Soolsus Stats Statistika Depth Sügavus Temperature Temperatuur Duration Kestus Total Time Aeg kokku Dives Sukeldumisi kokku Cylinders Balloonid Add Cylinder Lisa balloon Weights Raskused Add Weight System Lisa raskuste süsteem Trip Location Väljasõidu koht Trip Notes Väljasõidu märkmed Save Salvesta Cancel Loobu This trip is being edited. Seda väljasõitu toimetatakse Multiple dives are being edited. Mitut sukeldumist toimetatakse This dive is being edited. Seda sukeldumist toimetatakse. /min /min unknown tundmatu N N S S E E W W MainWindow Filter Filter &File &Fail &Log &Logi &View &Vaade &Help &Abi &Import &Import &New logbook &Uus logiraamat New Uus Ctrl+N Ctrl+N &Open logbook &Ava logiraamat Open Ava Ctrl+O Ctrl+O &Save &Salvesta Save Salvesta Ctrl+S Ctrl+S Save as Salvesta nimega Ctrl+Shift+S Ctrl+Shift+S Close Sulge Ctrl+W Ctrl+W Import Files Impordi failid Ctrl+I Ctrl+I Export &UDDF Eksport &UDDF Ctrl+U Ctrl+U &Print &Väljastus Ctrl+, Ctrl+, &Quit &Välju Import from &dive computer Impordi &sukeldumiskompuutrist Import &GPS data from Subsurface Service Impordi &GPS andmed Subsurface teenusest Ctrl+G Ctrl+G &Edit Device Names &Toimeta seadmete nimesid Ctrl++ Ctrl++ &Renumber &Nummerda ümber Ctrl+R Ctrl+R Toggle &Zoom &Suum sisse/välja &Yearly Statistics Statistika &aastate kaupa Ctrl+Y Ctrl+Y Dive List Sukeldumiste list Profile Profiil Info Info All Kõik User &Manual &Kasutusjuhend Globe Maakera P&lan Dive P&laneeri sukeldumine Ctrl+L Ctrl+L Import CSV Import CSV Import CS&V Import CS&V Import from Divelogs.de Import Divelogs.de-st Ctrl+P Ctrl+P Preferences Eelistused Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Lisa sukeldumine Auto Group Autogrupeerimine Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 CTRL+4 Ctrl+1 CTRL+1 Prev DC Eelmine kompuuter Left Vasak Next DC Uus kompuuter Right Parem Select Events Vali sündmused Input Plan Sisesta plaan About Subsurface Subsurface kohta F1 F1 Ctrl+5 Ctrl+5 Open File Ava fail Please save or cancel the current dive edit before closing the file. Enne faili sulgemist salvesta või katkesta käesoleva sukeldumise toimetamine. Please save or cancel the current dive edit before trying to plan a dive. Enne sukeldumise planeerimist salvesta või katkesta käesoleva sukeldumise toimetamine. Please save or cancel the current dive edit before trying to add a dive. Enne sukeldumise lisamist salvesta või katkesta käesoleva sukeldumise toimetamine. User Manual Kasutusjuhend Cannot find the Subsurface manual Ei leia Subsurface juhendit Do you want to save the changes you made in the file %1? Soovid tehtud muudatused salvestada faili %1? Do you want to save the changes you made in the datafile? Soovid tehtud muudatused salvestada andmefaili? Save Changes? Salvesta muudatused? Changes will be lost if you don't save them. Muudatusi lähevad kaotsi kui neid ei salvestata. First finish the current edition before trying to do another. Sulge käesolev toimetamine ja alles siis alusta järgmist. Save File as Salvesta nimega Warning Hoiatus Please save or cancel the current dive edit before opening a new file. Enne uue faili avamist salvesta või katkesta käesoleva sukeldumise toimetamine. UDDF files (*.uddf *.UDDF) UDDF failid (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML files (*.ssrf *.xml *.XML) PreferencesDialog Defaults Vaikeväärtused Units Ühikud Graph Graaf Language Keel Lists and Tables Listid ja tabelid Font Font Font size Fondi suurus Dives Sukeldumised Default Dive file Sukeldumiste vaikefail ... ... Display Invalid Kuva ebaõnnestunud Default Cylinder Vaikimisi balloon Use Default Cylinder Kasuta vaikimisi ballooni System Süsteem Metric SI Imperial Briti/Ameerika Personalize Isikupärasta Depth Sügavus meter meeter feet jalg bar bar psi psi liter liiter cu ft kuupjalg celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Süsteemi vaikeväärtus Filter Filter Pressure Rõhk Volume Maht Temperature Temperatuur Weight Raskus lbs nael Time units Ajaühikud Ascent/Descent speed denominator Laskumise/Tõusu kiiruse kordaja Minutes Minutid Seconds Sekundid Show Näita threshold lävi pHe pHE MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Kompuutri teatatud lagi draw ceiling red joonista lagi punasena Calculated ceiling Arvutatud lagi show all tissues näita kõiki kudesid 3m increments 3m samm Calculate NDL/TTS Arvuta NDL/TTS GFLow at max depth GFlow max sügavusel Misc Muu Preferences Eelistused SAC SAC GFLow GFLow GFHigh GFHigh Restart required Nõutav taaskäivitus To correctly load a new language you must restart Subsurface. Uue keele kasutuselevõtuks tuleb Subsurface taaskäivitada. Open Default Log File Ava vaike logifail Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML failid (*.ssrf *.xml *.XML) PrintDialog &Preview &Eelvaade P&rint P&rindi &Close &Sulge Print Väljastus PrintLayout Dive# Sukeldumise nr Date Kuupäev Depth Sügavus Duration Kestus Master Master Buddy Semu Location Asukoht PrintOptions Print options Väljundi valikud Print only selected dives Väljasta ainult valitud sukeldumised Print in color Väljasta värvilisena Print type Väljundi tüüp 6 dives per page 6 sukeldumist lehel 2 dives per page 2 sukeldumist lehel Table print Tabeli trükk Ordering Järjestus Profile on top Profiil ülal Notes on top Märkmed ülal Sizing heights (% of layout) Kõrguste sättimine (% - paigutusest) Profile height (43% - 85%) Profiili osa kõrgus (43% - 85%) Other data height (8% - 17%) Muude andmete osa kõrgus (8% - 17%) Notes height (0% - 52%) Märkmete osa suurus (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Lisa gaasivahetus Add Bookmark Lisa järjehoidja Remove Event Eemalda sündmus Hide similar events Peida sarnased sündmused Unhide all events Hide events Peida sündmused Hide all %1 events? Peida kõik %1 sündmust? Remove the selected event? Eemalda valitud sündmus? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer tundmatu kompuuter Set Duration: 10 minutes Sea kestus: 10 minutit Scale Mõõtkava Ruler Joonlaud Measure properties of dive segments Mõõda sukeldumise segmentide atribuute Scale your dive to screen size Skaleeri sukeldumine ekraani mõõtu Edit Toimeta pN pN pHe pHE pO pO air õhk EAN%1 EAN%1 Bailing out to OC Üleminek avatud süsteemile begin Starts with space! algus end Starts with space! lõpp ProfilePrintModel unknown tundmatu Dive #%1 - %2 Sukeldumine #%1 - %2 Max depth: %1 %2 Max sügavus: %1 %2 Duration: %1 min Kestus: %1 min Gas Used: Kasutatud gaas: SAC: SAC: Max. CNS: Max CNS: Weights: Raskused: Notes: Märkmed: Divemaster: Divemaster: Buddy: Semu: Suit: Ülikond: Viz: Nähtavus: Rating: Hinne: QObject AIR ÕHK Remove this Point Eemalda see punkt Close Sulge Average Keskmine Minimum Miinimum Maximum Maksimum Move the map and double-click to set the dive location Liigu kaardil soovitud kohta ja märgi topeltklikiga sukeldumiskoht RenumberDialog Renumber Nummerda ümber New starting number Uus algusnumber ShiftTimesDialog Shift selected times Nihuta valitud sukeldumised Shift times of selected dives by Nihuta valitud sukeldumiste aega h:mm t:mm earlier varasem later hilisem SubsurfaceAbout About Subsurface Programmist <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Sukeldumislogi tarkvara paljudele op-süsteemidele<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, jt, 2011, 2012, 2013</span> &License &Litsents &Website &Veebileht SubsurfaceWebServices Webservice Veebiteenus Connecting... Ühendab... Download finished Allalaadimine lõppenud Download error: %1 Allalaadimise viga: %1 Connection Error: Viga ühendamisel: Invalid user identifier! Vale kasutaja ID! Cannot parse response! Ei suuda vastust tuvastada Download Success! Allalaadimine õnnestus! TableView Add Cylinder Lisa balloon TankInfoModel Description Kirjeldus ml ml bar bar ToolTipItem Information Info WSInfoModel Description Kirjeldus kg kg WebServices Webservice Connection Veebiteenuse ühendus Status: Staatus: Enter your ID here Sisesta oma ID Download Allalaadimine User ID Kasutaja ID Password Salasõna Upload Üleslaadimine Operation timed out Toiming aegus Transfering data... Andmete ülekanne... WeightModel Type Tüüp Weight Raskus Clicking here will remove this weigthsystem. Siin klikkamine kõrvaldab selle raskuste süsteemi kg lbs ft m YearlyStatisticsModel Year > Month / Trip Aasta > Kuu / väljasõit # # Duration Total Kestus kokku Average Keskmine Shortest Lühim Longest Pikim Depth (%1) Average Sügavus (%1) keskmine Minimum Miinimum Maximum Maksimum SAC (%1) Average SAC (%1) keskmine Temp. (%1) Average Temp. (%1) keskmine gettextFromC pascal paskal bar bar psi psi l l cuft kuupjalg m m ft jalg lbs nael kg kg (%s) or (%s) (%s) või (%s) air õhk integrated integreeritud belt vöö ankle pahkluu backplate weight seljaplaadi kaal clip-on külgeriputatav Failed to read '%s' '%s' lugemine ebaõnnestus Failed to read '%s'. Use import for CSV files. '%s' lugemine ebaõnnestus. Kasuta CSV failide importi. Maximum number of supported columns on CSV import is %d CSV impordil on max toetatud veergude arv %d none mitte ükski deco stop dekopeatus rbt rbt ascent tõus ceiling lagi workload töökoormus transmitter saatja violation rikkumine bookmark järjehoidja surface pind safety stop ohutuspeatus gaschange gaasivahetus safety stop (voluntary) ohutuspeatus (vabatahtlik) safety stop (mandatory) ohutuspeatus (kohustuslik) deepstop sügavpeatus ceiling (safety stop) lagi (ohutuspeatus) divetime põhjaaeg below floor event showing dive is below deco floor and adding deco time allpool taset maxdepth max sügavus OLF Hapnikulimiidi osa (OLF) PO2 PO2 airtime aeg õhuga rgbm rgbm heading suund tissue level warning koe taseme hoiatus non stop time mittepeatuste aeg invalid event number vale sündmuse nr Unable to create parser for %s %s Ei saa luua parserit %s %s jaoks Error registering the data Viga andmete registreerimisel Error parsing the datetime Viga kuupäeva ja aja tuvastamisel Dive %d: %s %d %04d Sukeldumine %d: %s %d %04d Error parsing the divetime Viga põhjaaja tuvastamisel Error parsing the maxdepth Viga max sügavuse tuvastamisel Error parsing the gas mix count Viga gaasisegude arvu tuvastamisel Error obtaining water salinity Viga vee soolsuse saamisel Error obtaining surface pressure Viga pinnarõhu saamisel Error parsing the gas mix Viga gaasisegu tuvastamisel Error parsing the samples Viga proovide tuvastamisel Event: waiting for user action Sündmus: ootan kasutaja sekkumist model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) mudel=%u (0x%08x), püsivara=%u (0x%08x), seerianr=%u (0x%08x) Error registering the event handler. Viga sündmuste draiveri registreerimisel. Error registering the cancellation handler. Viga tühistamise draiveri registreerimisel Dive data import error Viga sukeldumise andmete impordil Unable to create libdivecomputer context Ei saa luua libdivecomputer konteksti Unable to open %s %s (%s) Ei saa avada %s %s (%s) Strange percentage reading %s Imelik protsendilugem %s Failed to parse '%s'. '%s' tuvastamine ebaõnnestus. Failed to parse '%s' '%s' tuvastamine ebaõnnestus Database query get_events failed. Andmebaasi päring get_events ebaõnnestus. Database connection failed '%s'. Andmebaasi ühendus ebaõnnestus '%s'. Database query failed '%s'. Andmebaasi päring ebaõnnestus '%s'. Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d Ei leia gaasi %d/%d Too many gas mixes Liiga palju gaasisegusid %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface poolt arvutatud sukeldumisplaan põhineb väärtustel GFlow = %.0f ja GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Üleminek %.*f %s %d:%02d min jooksul - käitusaeg %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Püsi %.*f %s peal %d:%02d min - jooksev aeg %d:%02u on %s Switch gas to %s Mine üle %s gaasile Gas consumption: Gaasi tarbimine: %.0f%s of %s %.0f%s of %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Arvutatud lagi %.0f %s %s Tissue %.0fmin: %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Ohutuspeatus:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Ohutuspeatus:teadmata aeg @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko:teadmata aeg @ %.0f %s %s In deco %s Dekos %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s⏎ pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s Dekos (arvutatud) %s NDL:%umin (calc) %s NDL:%umin (arvutatud) %s TTS:%umin (calc) %s TTS:%umin (arvutatud) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 sukeldumist) %1 %2 (1 dive) %1 %2 (1 sukeldumine) boat paat shore kallas drift hoovus deep sügav cavern õõs ice jää wreck vrakk cave koobas altitude kõrgus pool bassein lake järv river jõgi night öö fresh magevesi student õpilane photo foto video video instructor instruktor deco deko more than %d days enam kui %d päeva %dd %dh %dmin %dd %dh %dmin %dh %dmin %dt %dmin for dives # sukeldumiste nr for selected dives valitud sukeldumiste for dive #%d sukeldumise nr %d for selected dive valitud sukeldumise for all dives kõikide sukeldumiste (no dives) (pole sukeldumisi) Sun Pühap Mon Esmasp Tue Teisip Wed Kolmap Thu Neljap Fri Reede Sat Laup Jan Jaan Feb Veebr Mar Märts Apr Apr May Mai Jun Juuni Jul Juuli Aug Aug Sep Sept Oct Okt Nov Nov Dec Dets Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Surich: failisüsteem on peaaegu täis Ühenda lahti/taasühenda kompuuter ja kliki 'Uuesti' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Surich: failisüsteem on täis Ühenda lahti/taasühenda kompuuter ja proovi uuesti' Short write to req.txt file Is the Uemis Zurich plugged in correctly? Lühike märge req.txt faili Kas Uemis Zurich on ühendatud korrektselt? unknown tundmatu Reading %s %s Loen %s %s data andmed divelog entry id logi kirje ID divespot data id sukeldumiskoha andmete ID more data dive id rohkem sukeldumisandmete ID wetsuit märgülikond semidry poolkuiv drysuit kuivülikond shorty lühike ülikond vest vest long john pikk john jacket vest full suit täisülikond 2 pcs full suit 2-osaline täisülikond membrane membraan Init Communication Algata ülekanne Uemis init failed Uemis alglaadimine ebaõnnestus Start download Alusta allalaadimist Safety Stop Violation Ohutuspeatuse rikkumine Speed Alarm Kiiruse alarm Speed Warning Kiiruse hoiatus PO2 Green Warning PO2 roheline hoiatus PO2 Ascend Warning PO2 tõusu hoiatus PO2 Ascend Alarm PO2 tõusu alarm Tank Pressure Info Balloonirõhu info RGT Warning RGT hoiatus RGT Alert RGT häire Tank Change Suggested Soovitus balloonivahetuseks Depth Limit Exceeded Sügavuse limiit ületatud Max Deco Time Warning Max dekoaja hoiatus Dive Time Info Põhjaaja info Dive Time Alert Põhjaaja hoiatus Marker Tähis No Tank Data Pole ballooni andmeid Low Battery Warning Patarei tühjenemise hoiatus Low Battery Alert Patarei tühjenemise häire Subsurface-4.0.2/translations/subsurface_fi_FI.ts000066400000000000000000003743041226345450700221310ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Liitä tiedot CSV-tiedostosta ... ... PO2 PO2 Field Separator Kentän erotin Field Configuration Kentän määritys Import CSV file Liitä CSV -tiedosto Time Kello Depth Syvyys Temp Lämpötila Cns Cns Stopdepth Pysähdyssyvyys Pre-configured imports Esiasetetut tuonnit Open CSV Log File Avaa CSV-tiedosto CSV Files (*.csv);;All Files(*) CSV -tiedostot (*.csv);;Kaikki tiedostot(*) CylindersModel Type Tyyppi Size Tilavuus WorkPress Paineluokka StartPress Alkupaine EndPress Loppupaine Switch at Vaihda syvyydessä He% He% O O Clicking here will remove this cylinder. Poista säiliö. Cylinder cannot be removed Säiliötä ei voida poistaa This gas in use. Only cylinders that are not used in the dive can be removed. Tämä kaasu on käytössä. Vain säiliöt, joita ei käytetä sukelluksella, voidaan poistaa. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Muokkaa sukellustietokoneiden lempinimiä Remove the selected Dive Computer? Poistetaanko valittu sukellustietokone? Are you sure that you want to remove the selected dive computer? Oletko varma, että haluat poistaa valitun sukellustietokoneen? DiveComputerModel Model Malli Device ID Laite ID Nickname Lempinimi Clicking here will remove this divecomputer. Poista sukellustietokone. DiveItem l/min l/min cuft/min jalkaa/min DiveListView Show Search Box Näytä hakukenttä expand all laajenna kaikki collapse all supista kaikki collapse others supista muut remove dive(s) from trip erota sukellukset retkestä create new trip above luo uusi retki yläpuolelle add dive(s) to trip immediately above lisää sukellukset yläpuoliseen retkeen merge trip with trip above liitä retki yllä olevaan retkeen merge trip with trip below liitä retki alla olevaan retkeen delete dive(s) poista sukellukset mark dive(s) invalid Merkitse sukellukset epäkelvoiksi save As tallenna nimellä export As UDDF vie UDDF shift times muuta aikoja upload dive(s) to divelogs.de lähetä sukellukset divelogs.de -sivustolle Save Dives As... Tallenna sukellukset nimellä... Save File as Tallenna nimellä UDDF files (*.uddf *.UDDF) UDDF -tiedostot (*.uddf *.UDDF) merge selected dives yhdistä valitut sukellukset DivePlanner Bottom SAC Ilmankulutus pohjalla SAC on DECO Stop Ilmankulutus deco-pysähdyksessä GFHigh GFHigh GFLow GFLow Last Stop at 6m Viimeinen pysähdys kuudessa metrissä Start Time Alkuaika ATM Pressure Ilmanpaine DivePlannerGraphics 10m 10m 30ft 30 jalkaa Handler Position Error Virhe One or more of your stops will be lost with this operations, Please, remove them first. Tämä toimenpide hävittää yhden tai useamman pysähdyksistäsi, poista ensin pysähdykset. DivePlannerPointsModel AIR Ilma Final Depth Lopullinen syvyys Duration Kesto Used Gas Käytetty kaasuseos CC Set Point CCR-asetuspiste Discard the Plan? Hylätäänkö suunnitelma? You are about to discard your plan. Olet hylkäämässä suunnitelmasi. DivePlannerWidget Dive Planner Points Sukellussuunnitelman etappipisteet Available Gases Mahdolliset kaasut add dive data point lisää sukellusetappi DiveTripModel # # date päiväys m m ft ft min min kg kg lbs pauna suit puku cyl säiliöt location kohde SAC Pintakulutus OTU Happikertymä maxCNS maxCNS DivelogsDeWebServices Invalid response from server Virheellinen vastaus palvelimelta Expected XML tag 'DiveDateReader', got instead '%1 Odotettu XML tägi on 'DiveDateReader', mutta saatiin '%1' Expected XML tag 'DiveDates' not found Odotettua XML -tägiä 'DiveDates' ei löydy Malformed XML response. Line %1: %2 Virheellinen XML vastasu. Rivi %1: %2 no dives were selected sukelluksia ei ole valittu failed to create zip file for upload: %1 zip -tiedoston luonti vientiä varten epäonnistui: %1 cannot create temporary file: %1 väliaikaistiedoston luominen ei onnistu: %1 internal error: %1 sisäinen virhe: %1 internal error sisäinen virhe Done Valmis Uploading dive list... Lähetetään sukelluslokia... Downloading dive list... Ladataan sukelluslokia... Downloading %1 dives... Ladataan %1 sukellusta... Download finished - %1 Lataus päättynyt - %1 Corrupted download Lataus on korruptoitunut The archive could not be opened: %1 Pakattua tiedostoa ei voitu avata: %1 Upload failed Lähetys epäonnistui Upload successful Lähetys onnistui Login failed Kirjautuminen epäonnistui Cannot parse response Vastauksen jäsentäminen ei onnistu! Error: %1 Virhe: %1 Upload finished Lähetys valmistui DownloadFromDCWidget OK OK Error Virhe Retry Yritä uudestaan Choose file for divecomputer download logfile Valitse lokitiedosto sukellustietokoneen purun tietojen tallennukseen Log files (*.log) Lokitiedostot (*.log) Warning Varoitus Saving the libdivecomputer dump will NOT download dives to the dive list. Kun sukellustietokoneen latauksesta tallennetaan raakatiedosto, sukelluksia EI tallenneta sukelluslistaan. Choose file for divecomputer binary dump file Valitse tiedosto sukellustietokoneen latauksen raakatiedostolle Dump files (*.bin) Raakatiedostot (*.bin) DownloadFromDiveComputer Download From Dive Computer Hae sukellustietokoneelta Vendor Valmistaja Dive Computer Sukellustietokone Device or Mount Point Laite- tai hakemistopolku ... ... Force download of all dives Lataa kaikki sukellukset Always prefer downloaded dives Suosi aina ladattuja sukelluksia OK OK Cancel Peruuta Save libdivecomputer logfile Tallenna sukellustietokoneen lokitiedosto Save libdivecomputer dumpfile Tallenna sukellustietokoneen raakatiedosto GlobeGPS Edit Selected Dive Locations Muokkaa valittuja sukelluskohteita MainTab Dive Notes Muistiinpanot Location Kohde Coordinates Koordinaatit Divemaster Sukellusvanhin Buddy Sukelluspari Start time Alkuaika Air temp Ilman lämpötila Water temp Veden lämpötila Tags Avainsanat Rating Yleisarvio Visibility Näkyvyys Suit Puku Notes Muistiinpanot Equipment Varusteet Dive Info Tiedot Date Ajankohta Interval Pinta-aika Gases Used Käytetyt kaasut Gas Consumed Kaasun kulutus SAC Pintakulutus Max. Depth Maksimisyvyys Ave. Depth Keskisyvyys OTU Happikertymä Air Pressure Ilmanpaine Air Temperature Ilman lämpötila Water Temperature Veden lämpötila Dive Time Kesto Salinity Suolapitoisuus Stats Tilastot Depth Syvyys Temperature Lämpötila Duration Kesto Total Time Kokonaiskesto Dives Sukelluksia Cylinders Säiliöt Add Cylinder Lisää säiliö Weights Painot Add Weight System Lisää painojärjestelmä Trip Location Matkakohde Trip Notes Matkan muistiinpanot Save Tallenna Cancel Peruuta This trip is being edited. Tätä sukellusretkeä muokataan. Multiple dives are being edited. Muokataan useita sukelluksia. This dive is being edited. Tätä sukellusta muokataan. /min /min unknown tuntematon N N S S E E W W MainWindow Filter Suodattimet &File Tiedosto &Log Loki &View Näkymä &Help Apua &Import Liitä &New logbook Uusi loki New Uusi Ctrl+N Ctrl+N &Open logbook Avaa loki Open Avaa Ctrl+O Ctrl+O &Save Tallenna Save Tallenna Ctrl+S Ctrl+S Save as Tallenna nimellä... Ctrl+Shift+S Ctrl+Shift+S Close Sulje Ctrl+W Ctrl+W Import Files Liitä tiedosto Ctrl+I Ctrl+I Export &UDDF Vie UDDF Ctrl+U Ctrl+U &Print Tulosta Ctrl+, Ctrl+, &Quit Lopeta Import from &dive computer Hae sukellustietokoneelta Import &GPS data from Subsurface Service Liitä GPS-tiedot Subsurfacen on-line -palvelusta Ctrl+G Ctrl+G &Edit Device Names Muokkaa laitenimiä Ctrl++ Ctrl++ &Renumber Uudellennumeroi Ctrl+R Ctrl+R Toggle &Zoom Venytä sukellusprofiilikuvaajaa &Yearly Statistics Vuositilastot Ctrl+Y Ctrl+Y Dive List Sukelluslista Profile Profiilikuvaaja Info Tiedot All Kaikki User &Manual Käyttöohje Globe Maapallo P&lan Dive Sukelluksen suunnittelu Ctrl+L Ctrl+L Import CSV Liitä CSV-tiedosto Import CS&V Liitä CSV-tiedosto Import from Divelogs.de Tuo Divelogs.de -sivustolta Ctrl+P Ctrl+P Preferences Asetukset Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Lisää sukellus Auto Group Ryhmittele automaattisesti Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Edellinen tietokone Left Vasen Next DC Seuraava tietokone Right Oikea Select Events Valitse tapahtumat Input Plan Suunnittele About Subsurface Tietoja Subsurfacesta F1 F1 Ctrl+5 Ctrl+5 Open File Avaa tiedosto Please save or cancel the current dive edit before closing the file. Ole hyvä ja tallenna tai peruuta sukelluksen muokkaus ennen lokitiedoston sulkemista. Please save or cancel the current dive edit before trying to plan a dive. Ole hyvä ja tallenna tai peruuta sukelluksen muokkaus, ennen sukelluksen suunnittelua. Please save or cancel the current dive edit before trying to add a dive. Ole hyvä ja tallenna tai peruuta sukelluksen muokkaus ennen sukelluksen lisäystä. User Manual Käyttöohje Cannot find the Subsurface manual Subsurfacen käyttöohje ei löydy Do you want to save the changes you made in the file %1? Haluatko tallentaa muutoksesi tiedostoon %1? Do you want to save the changes you made in the datafile? Haluatko tallentaa muutoksesi tiedostoon? Save Changes? Tallenna muutokset? Changes will be lost if you don't save them. Muutokset hylätään, jos et tallenna niitä. First finish the current edition before trying to do another. Viimeistele tämänhetkinen muokkaus, ennen kuin aloitat uuden. Save File as Tallenna nimellä Warning Varoitus Please save or cancel the current dive edit before opening a new file. Ole hyvä ja tallenna tai peruuta sukelluksen muokkaus ennen kuin avaat uuden lokin. UDDF files (*.uddf *.UDDF) UDDF -tiedostot (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurfacen XML tiedostot (*.ssrf *.xml *.XML) PreferencesDialog Defaults Oletukset Units Yksiköt Graph Kuvaaja Language Kieli Lists and Tables Listat ja taulukot Font Fontti Font size Fontin koko Dives Sukelluksia Default Dive file Oletus lokitiedosto ... ... Display Invalid Näytä epäkelvot Default Cylinder Oletussäiliö Use Default Cylinder Käytä oletussäiliötä System Järjestelmä Metric Metrinen Imperial Brittiläinen Personalize Mukauta Depth Syvyys meter metri feet jalka bar bar psi psi liter litra cu ft kuutiojalka celsius Celsius fahrenheit Fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Järjestelmän oletus Filter Suodattimet Pressure Paine Volume Tilavuus Temperature Lämpötila Weight Painot lbs pauna Time units Aikayksiköt Ascent/Descent speed denominator Nousu/laskunopeuden yksikkö Minutes Minuuttia Seconds Sekuntia Show Näytä threshold kynnys pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Sukellustietokoneen raportoima kattosyvyys draw ceiling red piirrä kattosyvyys punaisella Calculated ceiling Laskettu kattosyvyys show all tissues näytä kaikki kudokset 3m increments 3m portaat Calculate NDL/TTS Laske NDL/TTS GFLow at max depth GFLow maksimisyvyydessä Misc Sekalaiset Preferences Asetukset SAC Pintakulutus GFLow GFlow GFHigh GFhigh Restart required Vaaditaan uudelleenkäynnistys To correctly load a new language you must restart Subsurface. Uuden kielen lataaminen vaatii Subsurfacen uudelleenkäynnistyksen Open Default Log File Avaa oletustiedosto Subsurface XML files (*.ssrf *.xml *.XML) Subsurfacen XML tiedostot (*.ssrf *.xml *.XML) PrintDialog &Preview Esikatselu P&rint Tulosta &Close Sulje Print Tulosta PrintLayout Dive# Sukellus Date Ajankohta Depth Syvyys Duration Kesto Master Sukellusvanhin Buddy Sukelluspari Location Kohde PrintOptions Print options Tulostusasetukset Print only selected dives Tulosta valitut sukellukset Print in color Väritulostus Print type Tulosteen tyyppi 6 dives per page Kuusi sukellusta sivulle 2 dives per page Kaksi sukellusta sivulle Table print Taulukkotuloste Ordering Järjestys Profile on top Profiili yllä Notes on top Muistiinpanot yllä Sizing heights (% of layout) Korkeuksien määritys (% tilasta) Profile height (43% - 85%) Profiilin korkeus (43% - 85%) Other data height (8% - 17%) Muun tiedon korkeus (8% - 17%) Notes height (0% - 52%) Muistiinpanojen korkeus (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Lisää kaasun vaihto Add Bookmark Lisää kirjanmerkki Remove Event Poista tapahtuma Hide similar events Piilota samankaltaiset tapahtumat Unhide all events Näytä kaikki tapahtumat Hide events Piilota tapahtumat Hide all %1 events? Piilota kaikki %1 tapahtumat Remove the selected event? Poistetaanko valitut tapahtumat? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer tuntematon sukellustietokone Set Duration: 10 minutes Aseta kesto: 10 minuuttia Scale Mittakaava Ruler Viivain Measure properties of dive segments Mittaa sukellusetappien ominaisuuksia Scale your dive to screen size Laajenna profiili tilan mukaan Edit Muuta pN pN pHe pHe pO pO air ilma EAN%1 EAN%1 Bailing out to OC Vaihto avoimeen ilman kiertoon begin Starts with space! alku end Starts with space! loppu ProfilePrintModel unknown tuntematon Dive #%1 - %2 Sukellus #%1 - %2 Max depth: %1 %2 Suurin syvyys: %1 %2 Duration: %1 min Kesto: %1 min Gas Used: Kaasu: SAC: Pintakulutus: Max. CNS: Max CNS: Weights: Painot: Notes: Muistiinpanot: Divemaster: Sukellusvanhin: Buddy: Sukelluspari: Suit: Puku: Viz: Näkyvyys: Rating: Yleisarvio: QObject AIR Ilma Remove this Point Poista tämä etappi Close Sulje Average Keskim. Minimum Alin Maximum Korkein Move the map and double-click to set the dive location Kaksoisnäpäytä karttaa valitaksesi sukelluskohteen RenumberDialog Renumber Uudellennumeroi New starting number Uusi aloitusnumero ShiftTimesDialog Shift selected times Muuta valittujen aikaa Shift times of selected dives by Muuta valittujen sukellusten aikaa h:mm h:mm earlier aiemmin later myöhemmin SubsurfaceAbout About Subsurface Tietoja Subsurfacesta <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Sukelluslokiohjelmisto useille käyttöjärjestelmäalustoille<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License Lisenssi &Website Websivu SubsurfaceWebServices Webservice Verkkopalvelu Connecting... Yhdistetään... Download finished Lataus valmistui Download error: %1 Virhe latauksessa: %1 Connection Error: Yhteysvirhe: Invalid user identifier! Tuntematon käyttäjä! Cannot parse response! Vastauksen jäsentäminen ei onnistu! Download Success! Lataus onnistui! TableView Add Cylinder Lisää säiliö TankInfoModel Description Kuvaus ml ml bar bar ToolTipItem Information Tiedot WSInfoModel Description Kuvaus kg kg WebServices Webservice Connection Yhteys verkkopalveluun Status: Status: Enter your ID here Syötä käyttäjätunnus Download Lataa User ID Käyttäjätunnus Password Salasana Upload Lähetä Operation timed out Toimenpide ei valmistunut ajoissa Transfering data... Tietoa siirretään... WeightModel Type Tyyppi Weight Painot Clicking here will remove this weigthsystem. Poista painojärjestelmä näpäyttämällä ikonia. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Vuosi > Kuukausi / Retki # # Duration Total Kesto Kokonais Average Keskim. Shortest Lyhin Longest Pisin Depth (%1) Average Dyvyys (%1) Keski Minimum Alin Maximum Suurin SAC (%1) Average SAC (%1) Keski Temp. (%1) Average Lämpö (%1) Keski gettextFromC pascal Pa bar bar psi psi l l cuft ft³ m m ft ft lbs pauna kg kg (%s) or (%s) (%s) tai (%s) air ilma integrated integroitu belt vyöpaino ankle nilkkapaino backplate weight selkäpaino clip-on clip-on Failed to read '%s' Tiedoston '%s' avaaminen epäonnistui Failed to read '%s'. Use import for CSV files. Tiedoston '%s' lukeminen epäonnistui. Käytä Liitä -toimintoa CSV -tiedostoille Maximum number of supported columns on CSV import is %d Maksimimäärä sarakkeita CSV -tuonnissa on %d none ei mitään deco stop deko-pysähdys rbt pohja-aika ascent nousu ceiling katto workload työmäärä transmitter lähetin violation rike bookmark kirjanmerkki surface pinta safety stop turvapysähdys gaschange Kaasun vaihto safety stop (voluntary) turvapysähdys (vapaaehtoinen) safety stop (mandatory) turvapysähdys (pakollinen) deepstop syväpysähdys ceiling (safety stop) katto (turvapysähdys) divetime sukellusaika below floor event showing dive is below deco floor and adding deco time liian syvällä maxdepth Suurin syvyys OLF Happikertymä PO2 PO2 airtime Ilma-aika rgbm rgbm heading suunta tissue level warning kudoskertymän varoitus non stop time keskeytyksetön aika invalid event number tuntematon tapahtumanumero Unable to create parser for %s %s Jäsentäjän luominen %s %s epäonnistui Error registering the data Virhe tiedon rekisteröinnissä Error parsing the datetime Virhe ajan jäsentämisessä Dive %d: %s %d %04d Sukellus %1$d: %3$d. %2$skuuta %4$04d Error parsing the divetime Virhe sukelluksen keston jäsentämisessä Error parsing the maxdepth Virhe maksimisyvyyden jäsentämisessä Error parsing the gas mix count Virhe kaasuseosten määrän jäsentämisessä Error obtaining water salinity Virhe veden suolapitoisuuden määrityksessä Error obtaining surface pressure Virhe ilmanpaineen määrityksessä Error parsing the gas mix Virhe kaasuseoksen jäsentämisessä Error parsing the samples Virhe näytteiden tulkinnassa Event: waiting for user action Tapahtuma: odotetaan käyttäjän toimia model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) malli=%u (0x%08x), firmware=%u (0x%08x), sarjanumero=%u (0x%08x) Error registering the event handler. Virhe tapahtumakäsittelijän rekisteröinnissä. Error registering the cancellation handler. Virhe perumiskäsittelijän rekisteröinnissä. Dive data import error Virhe sukellusten jäsentämisessä Unable to create libdivecomputer context libdivecomputer-kontekstin luominen epäonnistui Unable to open %s %s (%s) Avaaminen epäonnistui: %s %s (%s) Strange percentage reading %s Outo prosenttiosuus: %s Failed to parse '%s'. Tiedoston '%s' lukeminen epäonnistui. Failed to parse '%s' Tiedoston '%s' lukeminen epäonnistui. Database query get_events failed. Tietokantakysely 'get_events' (nouda tapahtumat) epäonnistui. Database connection failed '%s'. Tietokantayhteys epäonnistui '%s'. Database query failed '%s'. Tietokantakysely epäonnistui '%s'. Can't open stylesheet %s Tyylitiedoston %1 avaus ei onnistu EAN%d EAN%d Can't find gas %d/%d Seosta %d/%d ei löydy Too many gas mixes Liian monta kaasuseosta %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurfacen laskema sukellussuunnitelma perustuu arvoihin GFlow = %.0f ja GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Siirtymä %.*f %s:n syvyyteen ajassa %d:%02d - aika %d:%02u kaasulla %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Pysy %.*f %s:n syvyydessä %d:%02d min - aika %d:%02u kaasulla %s Switch gas to %s Vaihda kaasu seuraavaan: %s Gas consumption: Kaasun kulutus: %.0f%s of %s %.0f %s (%s) ean ean %s P:%d %s %s P: %d %s %s T:%.1f %s %s T: %.1f %s %s V:%.2f %s %s N:%.2f %s %s Calculated ceiling %.0f %s %s Laskettu katto %.0f %s %s Tissue %.0fmin: %.0f %s %s Kudos %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Turvapysähdys: %u min @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d S:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Turvapysähdys: tuntemat. aika @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko: %u min @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko: tuntem. aika @ %.0f %s %s In deco %s dekossa %s NDL:%umin %s NDL: %u min %s CNS:%u%% %s CNS: %u %% %s pO%s:%.2fbar %s pO%s: %.2f bar %s pN%s:%.2fbar %s pN%s: %.2f bar %s pHe:%.2fbar %s pHe: %.2f bar %s MOD:%d%s %s MOD: %d %s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD: %d %s END: %d %s EADD: %d %s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (lask.) %s In deco (calc) %s Dekossa (lask.) %s NDL:%umin (calc) %s NDL:%umin (lask.) %s TTS:%umin (calc) %s TTS:%umin (lask.) %sT: %d:%02d min %sA: %d:%02d min %s %sD:%.1f%s %s %sS:%.1f%s %s %sD:%.1f%s %s %sS:%.1f%s %s%sV:%.2f%s %s%sN:%.2f%s %s %sV:%.2f%s %s %sN:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %3.%2.%4 %5:%6 %1 %2, %3 %4:%5 %2.%1.%3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 dives) %1 %2 (1 dive) %1 %2 (1 dive) boat vene shore ranta drift virta deep syvä cavern luola (cavern) ice jää wreck hylky cave luola altitude korkeus pool uima-allas lake järvi river joki night fresh makea student oppilas photo valokuva video video instructor kouluttaja deco deko more than %d days yli %d päivää %dd %dh %dmin %d pv %d t %d min %dh %dmin %d t %d min for dives # sukellukselle numero for selected dives valitut sukellukset for dive #%d Sukellus #%d for selected dive valittu sukellus for all dives kaikille sukelluksille (no dives) (ei sukelluksia) Sun su Mon ma Tue ti Wed ke Thu to Fri pe Sat la Jan tammi Feb helmi Mar maalis Apr huhti May touko Jun kesä Jul heinä Aug elo Sep syys Oct loka Nov marras Dec joulu Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: tiedostojärjestelmä on lähes täynnä. Liitä sukellustietokone uudestaan ja yritä uudestaan. Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Tiedostojärjestelmä on täynnä. Liitä sukellustietokone uudestaan ja yritä uudestaan. Short write to req.txt file Is the Uemis Zurich plugged in correctly? Tiedoston req.txt kirjoittaminen epäonnistui. Onko Uemis Zurich kytketty oikein? unknown tuntematon Reading %s %s Luetaan sukellusta %s %s data tieto divelog entry id id: sukelluslokimerkintä divespot data id id: lisää sijaintitietoa more data dive id id: lisää sukellusdataa wetsuit märkäpuku semidry puolikuiva drysuit kuivapuku shorty lyhyt vest liivi long john haalari jacket takki full suit kokopuku 2 pcs full suit Kaksiosainen kokopuku membrane laminaatti Init Communication Muodosta yhteys Uemis init failed Uemiksen lukeminen epäonnistui Start download Aloita lataus Safety Stop Violation Turvapysähdyksen laiminlyönti Speed Alarm Hälytys: nousunopeus Speed Warning Varoitus: nousunopeus PO2 Green Warning Varoitus: hapen osapaine (green) PO2 Ascend Warning Varoitus: hapen osapaine PO2 Ascend Alarm Hälytys: hapen osapaine Tank Pressure Info Tiedotus: säiliöpaine RGT Warning Varoitus: kaasumäärä RGT Alert Hälytys: kaasumäärä Tank Change Suggested Säiliönvaihtoehdotus Depth Limit Exceeded Syvyysraja ylitetty Max Deco Time Warning Varoitus: etappipysähdysaika Dive Time Info Tiedotus: sukellusaika Dive Time Alert Hälytys: sukellusaika Marker merkki No Tank Data Ei tietoja säiliöistä Low Battery Warning Varoitus: heikko paristo Low Battery Alert Hälytys: heikko paristo Subsurface-4.0.2/translations/subsurface_fr_FR.ts000066400000000000000000004000511226345450700221400ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importer un fichier (CSV) ... ... PO2 PO2 Field Separator Séparateur de champs Field Configuration Configurations des champs Import CSV file Importer un fichier CSV Time Temps Depth Profondeur Temp Temp. Cns SNC Stopdepth Profondeur d’arrêt Pre-configured imports Importations préconfigurées Open CSV Log File Ouvrir un fichier CSV CSV Files (*.csv);;All Files(*) Fichiers CSV (*.csv);;Tous les fichiers (*) CylindersModel Type Type Size Taille WorkPress Press. Service StartPress Press. Début EndPress Press. Fin Switch at Changement à He% He% O O Clicking here will remove this cylinder. Cliquer ici retirera ce bloc. Cylinder cannot be removed Le bloc ne peut être retiré. This gas in use. Only cylinders that are not used in the dive can be removed. Ce gaz est utilisé. Seuls les blocs qui ne sont pas utilisés dans la plongée peuvent être retirés. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Modifier le nom de l'ordinateur de plongée Remove the selected Dive Computer? Retirer l'ordinateur de plongée sélectionné ? Are you sure that you want to remove the selected dive computer? Êtes-vous sûr de vouloir retirer l'ordinateur de plongée sélectionné ? DiveComputerModel Model Modèle Device ID Identifiant du périphérique Nickname Nom Clicking here will remove this divecomputer. Cliquer ici retirera cet ordinateur de plongée. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Montrer la barre de recherche expand all tout déplier collapse all tout replier collapse others replier les autres remove dive(s) from trip retirer plongée(s) du groupe create new trip above créer un nouveau groupe au-dessus add dive(s) to trip immediately above ajouter plongée(s) au groupe immédiatement au-dessus merge trip with trip above fusionner le groupe avec le groupe au-dessus merge trip with trip below fusionner le groupe avec le groupe au dessous delete dive(s) supprimer plongée(s) mark dive(s) invalid marquer la/les plongée(s) comme invalides save As Enregistrer sous export As UDDF Exporter comme un fichier UDDF shift times décaler l'heure upload dive(s) to divelogs.de Télécharger la/les plongée(s) vers divelogs.de Save Dives As... Enregistrer les plongées sous... Save File as Enregistrer le fichier sous UDDF files (*.uddf *.UDDF) Fichiers UDDF (*.uddf *.UDDF) merge selected dives fusionner les plongées sélectionnées DivePlanner Bottom SAC SAC au fond SAC on DECO Stop SAC au palier GFHigh GFHigh GFLow GFLow Last Stop at 6m Dernier palier à 6m Start Time Heure de début ATM Pressure Pression atmosphérique DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Gestion des positions problématiques One or more of your stops will be lost with this operations, Please, remove them first. Un ou plusieurs paliers seront perdus avec ces opérations, Veuillez d'abord les supprimer. DivePlannerPointsModel AIR AIR Final Depth Profondeur Finale Duration Durée Used Gas Gaz Utilisé CC Set Point Recycleur Discard the Plan? Annuler la planification ? You are about to discard your plan. Vous allez annuler la planification. DivePlannerWidget Dive Planner Points Point planifiés Available Gases Gaz disponibles add dive data point Ajouter un point de donnée DiveTripModel # date date m m ft pied min min kg kg lbs livre US suit combinaison cyl blk location lieu SAC Consommation d'air OTU OTU maxCNS SNCmax DivelogsDeWebServices Invalid response from server Réponse invalide du serveur Expected XML tag 'DiveDateReader', got instead '%1 Le tag XML 'DiveDateReader' est attendu, '%1' a été lu Expected XML tag 'DiveDates' not found Le tag XML 'DiveDates' n'a pas été trouvé Malformed XML response. Line %1: %2 Réponse XML mal formée. Ligne %1: %2 no dives were selected Aucune plongée sélectionnée failed to create zip file for upload: %1 Erreur de création du fichier zip pour téléchargement : %1 cannot create temporary file: %1 Impossible de créer le fichier temporaire : %1 internal error: %1 Erreur interne : %1 internal error Erreur interne Done Terminé Uploading dive list... Téléchargement de la liste des plongées Downloading dive list... Téléchargement de la liste des plongées Downloading %1 dives... %1 plongées en cours de téléchargement Download finished - %1 Téléchargement terminé - %1 Corrupted download Téléchargement corrompu The archive could not be opened: %1 L'archive ne peut pas être ouverte: %1 Upload failed Echec du téléchargement Upload successful Téléchargement terminé avec succès Login failed Echec de connexion Cannot parse response Impossible d'analyser la réponse Error: %1 Erreur: %1 Upload finished Téléchargement terminé DownloadFromDCWidget OK OK Error Erreur Retry Essayer à nouveau Choose file for divecomputer download logfile Choisir le fichier pour le téléchargement du fichier log de l'ordinateur Log files (*.log) Fichier de log (*.log) Warning Avertissement Saving the libdivecomputer dump will NOT download dives to the dive list. Sauvegarder le déchargement de libdivecomputer ne téléchargera pas les plongées dans la liste des plongées Choose file for divecomputer binary dump file Choisir le fichier pour le fichier de déchargement de libdivecomputer Dump files (*.bin) Fichiers de décharge (*.bin) DownloadFromDiveComputer Download From Dive Computer Télécharger depuis l'ordinateur de plongée Vendor Fabricant Dive Computer Ordinateur de plongée Device or Mount Point Périphérique ou point de montage ... ... Force download of all dives Forcer le téléchargement de toutes les plongées Always prefer downloaded dives Choisir les plongées téléchargées par défaut OK OK Cancel Annuler Save libdivecomputer logfile Sauvegarder le fichier log de libdivecomputer Save libdivecomputer dumpfile Sauvegarder le fichier de décharge de libdivecomputer GlobeGPS Edit Selected Dive Locations Modifier le lieu de la plongée sélectionnée MainTab Dive Notes Notes de plongée Location Lieu Coordinates Coordonnées Divemaster Chef de palanquée Buddy Binôme Start time Heure de début Air temp Temp. air Water temp Temp. eau Tags Étiquettes Rating Évaluation Visibility Visibilité Suit Combinaison Notes Notes Equipment Équipement Dive Info Détails de plongée Date Date Interval Intervalle Gases Used Gaz utilisés Gas Consumed Gaz consommé SAC Consommation d'air Max. Depth Profondeur max. Ave. Depth Profondeur moy. OTU OTU Air Pressure Pression d'air Air Temperature Température air Water Temperature Température eau Dive Time Temps de plongée Salinity Salinité Stats Stats Depth Profondeur Temperature Température Duration Durée Total Time Temps total Dives Plongées Cylinders Blocs Add Cylinder Ajouter un bloc Weights Poids Add Weight System Ajouter un système de poids Trip Location Lieu du groupe Trip Notes Notes du groupe Save Sauvegarder Cancel Annuler This trip is being edited. Ce groupe est en train d'être édité. Multiple dives are being edited. Plusieurs plongées sont en train d'être éditées. This dive is being edited. Cette plongée est en train d'être éditée. /min /min unknown inconnu N N S S E E W O MainWindow Filter Filtrer &File &Fichier &Log &Journal &View &Vue &Help &Aide &Import &Importer &New logbook &Nouveau carnet de plongée New Nouveau Ctrl+N Ctrl+N &Open logbook &Ouvrir un carnet de plongée Open Ouvrir Ctrl+O Ctrl+O &Save Enregistrer Save Sauvegarder Ctrl+S Ctrl+S Save as Enregistrer sous Ctrl+Shift+S Ctrl+Maj+S Close Fermer Ctrl+W Ctrl+W Import Files Importer des fichiers Ctrl+I Ctrl+I Export &UDDF Exporter &UDDF Ctrl+U Ctrl+U &Print &Imprimer Ctrl+, Ctrl+, &Quit &Quitter Import from &dive computer Importer depuis l'&ordinateur de plongée Import &GPS data from Subsurface Service Importer les données &GPS depuis le service Subsurface Ctrl+G Ctrl+G &Edit Device Names &Modifier le nom du périphérique Ctrl++ Ctrl++ &Renumber &Renuméroter Ctrl+R Ctrl+R Toggle &Zoom Changer de &zoom &Yearly Statistics &Statistiques annuelles Ctrl+Y Ctrl+Y Dive List Liste de plongées Profile Profil Info Informations All Tout User &Manual Manuel d'utilisation Globe Globe P&lan Dive P&lannification de plongée Ctrl+L Ctrl+L Import CSV Importer un fichier CSV Import CS&V Importer un fichier CS&V Import from Divelogs.de Importer depuis divelogs.de Ctrl+P Ctrl+P Preferences Préférences Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Ajouter une plongée Auto Group Groupement automatique Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Ordinateur précédent Left Gauche Next DC Ordinateur suivant Right Droite Select Events Sélection des événements Input Plan Saisir le plan About Subsurface À propos de Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Ouvrir un Fichier Please save or cancel the current dive edit before closing the file. Veuillez enregistrer ou annuler vos modifications en cours avant de fermer le fichier. Please save or cancel the current dive edit before trying to plan a dive. Veuillez enregistrer ou annuler vos modifications en cours avant de démarrer une planification. Please save or cancel the current dive edit before trying to add a dive. Veuillez enregistrer ou annuler vos modifications en cours avant d'ajouter une nouvelle plongée. User Manual Manuel utilisateur Cannot find the Subsurface manual Impossible de trouver le manuel de Subsurface Do you want to save the changes you made in the file %1? Voulez-vous enregistrer les modifications du fichier %1 ? Do you want to save the changes you made in the datafile? Voulez-vous enregistrer les modifications du fichier de données ? Save Changes? Enregistrement des changements ? Changes will be lost if you don't save them. Les modifications seront perdues si vous ne les enregistrez pas. First finish the current edition before trying to do another. Veuillez finir votre modification en cours avant d'en faire une autre. Save File as Enregistrer le fichier sous Warning Avertissement Please save or cancel the current dive edit before opening a new file. Veuillez enregistrer ou annuler vos modifications en cours avant d'ouvrir un nouveau fichier. UDDF files (*.uddf *.UDDF) Fichiers UDDF (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Fichiers XML Subsurface (*.ssrf *.xml *.XML) PreferencesDialog Defaults Valeurs par défaut Units Unités Graph Graphique Language Langue Lists and Tables Listes et Tables Font Police Font size Taille de police Dives Plongées Default Dive file Fichier de plongée par défaut ... ... Display Invalid Afficher invalide Default Cylinder Bloc par défaut Use Default Cylinder Utiliser le bloc par défaut System Système Metric Métrique Imperial Impérial Personalize Personnalisé Depth Profondeur meter mètre feet pied bar bar psi psi liter litre cu ft pied cubique celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Paramètre par défaut Filter Filtrer Pressure Pression Volume Volume Temperature Température Weight Poids lbs livre US Time units Unités de temps Ascent/Descent speed denominator Dénominateur de vitesse de montée/descente Minutes Minutes Seconds Secondes Show Montrer threshold limite pHe pHe MOD MOD max ppO₂ ppO₂ maximum EAD END EADD EAD END EADD Dive computer reported ceiling Plafond signalé par l'ordinateur draw ceiling red Afficher en rouge le plafond Calculated ceiling Plafond calculé show all tissues montrer tous les tissus 3m increments incréments de 3m Calculate NDL/TTS Calculer LND/TRS GFLow at max depth GFLow à la profondeur max Misc Divers Preferences Préférences SAC Consommation d'air GFLow GFLow GFHigh GFHigh Restart required Redémarrage necessaire To correctly load a new language you must restart Subsurface. Vous devez redémarrer Subsurface pour prendre en compte la nouvelle langue. Open Default Log File Ouvrir le fichier de plongée par défaut Subsurface XML files (*.ssrf *.xml *.XML) Fichiers XML Subsurface (*.ssrf *.xml *.XML) PrintDialog &Preview &Prévisualisation P&rint &Impression &Close &Fermer Print Imprimer PrintLayout Dive# Plongée n° Date Date Depth Profondeur Duration Durée Master Chef Buddy Binôme Location Lieu PrintOptions Print options Options d'impression Print only selected dives Imprimer uniquement les plongées selectionnées Print in color Imprimer en couleur Print type Type d'impression 6 dives per page 6 plongées par page 2 dives per page 2 plongées par page Table print Impression du tableau Ordering Classer Profile on top Profil en haut Notes on top Notes en haut Sizing heights (% of layout) Hauteurs (% de la page) Profile height (43% - 85%) Hauteur du profil (43% - 85%) Other data height (8% - 17%) Hauteur des autres données (8% - 17%) Notes height (0% - 52%) Hauteur des notes (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Ajouter un changement de mélange Add Bookmark Ajouter un signet Remove Event Supprimer l'événement Hide similar events Cacher les événements similaires Unhide all events Dé-sélectionner tous les évènements Hide events Cacher les événements Hide all %1 events? Cacher tous les événements %1 ? Remove the selected event? Supprimer l'événement sélectionné ? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer ordinateur inconnu Set Duration: 10 minutes Réglez la durée : 10 minutes Scale Échelle Ruler Règle Measure properties of dive segments Mesure des propriétés d'une partie de la plongée Scale your dive to screen size Ajuster la plongée à la taille de l'écran Edit Editer pN pN pHe pHe pO pO air air EAN%1 EAN%1 Bailing out to OC Passer en CO begin Starts with space! début end Starts with space! fin ProfilePrintModel unknown inconnu Dive #%1 - %2 Plongée #%1 - %2 Max depth: %1 %2 Profondeur max: %1 %2 Duration: %1 min Durée: %1 min Gas Used: Gaz utilisé: SAC: Consommation d'air: Max. CNS: SNC Max.: Weights: Poids: Notes: Notes: Divemaster: Chef de palanquée: Buddy: Binôme: Suit: Combinaison: Viz: Visi: Rating: Évaluation: QObject AIR AIR Remove this Point Supprimer ce point Close Fermer Average Moyenne Minimum Minimum Maximum Maximum Move the map and double-click to set the dive location Déplacez la carte et double cliquez pour définir le lieu de la plongée RenumberDialog Renumber Renuméroter New starting number Nouveau numéro de départ ShiftTimesDialog Shift selected times Décaler l'heure Shift times of selected dives by Décaler les heures des plongées sélectionnées de h:mm h:mm earlier plus tôt later plus tard SubsurfaceAbout About Subsurface À propos de Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Journal de plongée multi-plateforme<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Licence &Website Site &web SubsurfaceWebServices Webservice Serveur Connecting... Connexion en cours... Download finished Téléchargement terminé Download error: %1 Erreur de téléchargement: %1 Connection Error: Erreur de connexion : Invalid user identifier! Identifiant utilisateur incorrect. Cannot parse response! Impossible de lire la réponse Download Success! Téléchargement réussi TableView Add Cylinder Ajouter un bloc TankInfoModel Description Description ml ml bar bar ToolTipItem Information Information WSInfoModel Description Description kg kg WebServices Webservice Connection Connexion au Webservice Status: Status: Enter your ID here Entrez votre ID ici Download Télécharger User ID ID utilisateur Password Mot de passe Upload Envoyer Operation timed out Temps de réponse dépassé pour l'opération Transfering data... Transfert des données en cours WeightModel Type Type Weight Poids Clicking here will remove this weigthsystem. Cliquer ici retirera ce système de poids. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Année > Mois / Groupe # Duration Total Durée Totale Average Moyenne Shortest Plus courte Longest Plus longue Depth (%1) Average Pronfondeur (%&) Moyenne Minimum Minimum Maximum Maximum SAC (%1) Average SAC (%1) Moyenne Temp. (%1) Average Temp. (%1) Moyenne gettextFromC pascal pascal bar bar psi psi l l cuft pied³ m m ft pied lbs livre US kg kg (%s) or (%s) (%s) ou (%s) air air integrated intégré belt ceinture ankle cheville backplate weight poids dorsaux clip-on clip-on Failed to read '%s' Impossible de la lecture « %s » Failed to read '%s'. Use import for CSV files. Impossible de lire '%s'. Veuillez utiliser l'importation de fichier CSV. Maximum number of supported columns on CSV import is %d Le nombre maximal de colonnes supporté pour les importations de fichiers CSV est %d. none aucun deco stop Arrêt de décompression rbt rbt ascent ascension ceiling plafond workload charge transmitter transmetteur violation violation bookmark marque-page surface surface safety stop palier de sécurité gaschange Changement de gas safety stop (voluntary) palier de sécurité (volontaire) safety stop (mandatory) palier de sécurité (obligatoire) deepstop Arrêt profond ceiling (safety stop) plafond (palier de sécurité) divetime Temps de plongée below floor event showing dive is below deco floor and adding deco time sous profondeur plancher maxdepth profondeur max OLF OLF PO2 PO2 airtime temps d'air rgbm rgbm heading entête tissue level warning Avertissement de niveau « tissue » non stop time temps sans arrêt invalid event number numéro d'événement non valide Unable to create parser for %s %s Impossible de créer une analyse pour %s %s Error registering the data Impossible d'enregistrer les données Error parsing the datetime Impossible d'analyser l'heure Dive %d: %s %d %04d Plongée n°%d - %s %d %04d Error parsing the divetime Impossible d'analyser le temps de plongée Error parsing the maxdepth Impossible d'analyser la profondeux maximale Error parsing the gas mix count Impossible d'analyser le nombre de mélange gazeux Error obtaining water salinity Impossible d'obtenir la salinité de l'eau Error obtaining surface pressure Erreur à l'obtention de la pression en surface Error parsing the gas mix Impossible d'analyser le mélange gazeux Error parsing the samples Impossible d'analyser des échantillons Event: waiting for user action Événement : attente d'une action de l'utilisateur model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) modèle = %u (0x%08x), firmware = %u (0x%08x), port série = %u (0x%08x) Error registering the event handler. Impossible d'enregistrer le gestionnaire d'événement. Error registering the cancellation handler. Impossible d'enregistrer le gestionnaire d'annulation. Dive data import error Erreur à l'import des données de plongées Unable to create libdivecomputer context Impossible de créer un contexte libdivecomputer Unable to open %s %s (%s) Impossible d'ouvrir %s %s (%s) Strange percentage reading %s Valeur de pourcentage étrange %s Failed to parse '%s'. Impossible d'analyser « %s ». Failed to parse '%s' Impossible d'analyser « %s » Database query get_events failed. Échec de la requête. Database connection failed '%s'. Connexion à la base de données impossible '%s'. Database query failed '%s'. Échec de la requête '%s'. Can't open stylesheet %s Impossible d'ouvrir le feuille de style %s EAN%d Nitrox%d Can't find gas %d/%d Impossible de trouver le gaz %d/%d Too many gas mixes Trop de gaz différents %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface sumilation de plongée basé sur un GFlow = %.0f et un GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Transition vers %.*f %s en %d:%02d min - temps %d:%02u sur %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Rester à %.*f %s pour %d:%02d min - temps %d:%02u sur %s Switch gas to %s Changer pour du gaz %s Gas consumption: Consommation de gaz : %.0f%s of %s %.0f%s de %s ean ean %s P:%d %s %s P : %d %s %s T:%.1f %s %s T : %.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Plafond calculé %.0f %s %s Tissue %.0fmin: %.0f %s %s Tissu %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Arrêt de sécurité : %umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d P:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Arrêt de sécurité : durée inconnue @ %.0f %s %s Deco:%umin @ %.0f %s %s Décompression : %umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Décompression : durée inconnue @ %.0f %s %s In deco %s En décompression %s NDL:%umin %s LND : %umin %s CNS:%u%% %s SNC : %u%% %s pO%s:%.2fbar %s pO%s : %.2fbar %s pN%s:%.2fbar %s pN%s : %.2fbar %s pHe:%.2fbar %s pHe : %.2fbar %s MOD:%d%s %s MOD : %d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD : %d%s END : %d%s EADD : %d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s En déco (calc) %s NDL:%umin (calc) %s LND:%umin (calc) %s TTS:%umin (calc) %s TRS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sPd:%.1f%s %s %sD:%.1f%s %s %sPd:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 plongées) %1 %2 (1 dive) %1 %2 (1 plongée) boat bateau shore rivage drift dérivante deep profondeur cavern grotte ice glace wreck épave cave grotte altitude altitude pool piscine lake Lac river rivière night nuit fresh eau douce student étudiant photo photo video vidéo instructor instructeur deco décompression more than %d days plus de %d jours %dd %dh %dmin %d j %d h %d min %dh %dmin %d h %d min for dives # pour les plongées n° for selected dives uniquement les plongées sélectionnées for dive #%d pour la plongée n°%d for selected dive uniquement la plongée sélectionnée for all dives pour toutes les plongées (no dives) (pas de plongées) Sun Dim. Mon Lun. Tue Mar. Wed Mer. Thu Jeu. Fri Ven. Sat Sam. Jan Janv. Feb Fév. Mar Mar. Apr Avril May Mai Jun Juin Jul Juil. Aug Août Sep Sept. Oct Oct. Nov Nov. Dec Déc. Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich : le système de fichier est presque plein Débranchez puis rebranchez l'ordinateur afin d'essayer à nouveau Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich : Le système de fichier est plein Débranchez puis rebranchez l'ordinateur afin d'essayer à nouveau Short write to req.txt file Is the Uemis Zurich plugged in correctly? Écriture partielle des progrès dans le fichier req.txt Est-ce que votre Uemis Zurich est branché correctement ? unknown inconnu Reading %s %s Lecture %s %s data données divelog entry id identifiant de l'entrée dans le journal divespot data id identifiant du site de plongée more data dive id plus d'identifiants de plongée wetsuit combinaison humide semidry semi-étanche drysuit Combinaison sèche shorty shorty vest veste long john salopette de combinaison jacket gilet full suit Combinaison intégrale 2 pcs full suit Combi 2 pièces membrane membrane Init Communication Initialisation de la communication Uemis init failed Impossible d'initialiser Uemis Start download Début du téléchargement Safety Stop Violation Violation du palier de sécurité Speed Alarm Alarme de vitesse Speed Warning Avertissement de vitesse PO2 Green Warning Avertissement PO2 Vert PO2 Ascend Warning Avertissement PO2 ascendant PO2 Ascend Alarm Alarme PO2 ascendant Tank Pressure Info Pression du bloc RGT Warning Avertissement temps d'air restant RGT Alert Alerte temps air restant Tank Change Suggested Changement de bloc suggéré Depth Limit Exceeded Profondeur plafond dépassée Max Deco Time Warning Avertissement de temps de décompression max Dive Time Info Temps de plongée Dive Time Alert Alerte temps de plongée Marker Marqueur No Tank Data Pas d'information sur le bloc Low Battery Warning Avertissement de batterie faible Low Battery Alert Alarme de batterie faible Subsurface-4.0.2/translations/subsurface_he.ts000066400000000000000000003724151226345450700215520ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) יבוא קובץ (CSV) ... ... PO2 PO2 Field Separator Field Configuration Import CSV file יבוא קובץ CSV Time זמן Depth עומק Temp טמפ Cns Stopdepth Pre-configured imports Open CSV Log File לפתוח יומן קבצי CSV CSV Files (*.csv);;All Files(*) CSV קבצי (*.csv);;כל הקבצים(*) CylindersModel Type סוג Size גודל WorkPress לחץ עבודה StartPress לחץ התחלתי EndPress לחץ סופי Switch at He% O O Clicking here will remove this cylinder. Cylinder cannot be removed This gas in use. Only cylinders that are not used in the dive can be removed. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames ערוך שמות מחשבים Remove the selected Dive Computer? להסיר את המחשב הנבחר? Are you sure that you want to remove the selected dive computer? האם אתם בטוחים שברצונכם להסיר את המחשב הנבחר? DiveComputerModel Model דגם Device ID מזהה התקן Nickname כינוי Clicking here will remove this divecomputer. DiveItem l/min ליטר לדקה cuft/min רגל מעוקב לדקה DiveListView Show Search Box הצג חיפוש expand all הצג הכל collapse all הסתר הכל collapse others remove dive(s) from trip create new trip above add dive(s) to trip immediately above merge trip with trip above merge trip with trip below delete dive(s) מחיקת צלילה/צלילות mark dive(s) invalid לא להתחשב בצלילות save As שמור בשם export As UDDF יצוא כקובץ UDDF shift times upload dive(s) to divelogs.de העלה צלילות לאתר divelogs.de Save Dives As... שמור צלילות בשם... Save File as שמור קובץ בשם UDDF files (*.uddf *.UDDF) UDDF קבצי (*.uddf *.UDDF) merge selected dives אחד צלילות נבחרות DivePlanner Bottom SAC צריכת גז בעומק מירבי SAC on DECO Stop צריכת גז בעצירת דקומפרסיה GFHigh גרדיאנט עליון GFLow גרדיאנט תחתון Last Stop at 6m עצירה אחרונה ב6 מ' Start Time זמן התחלה ATM Pressure לחץ (אטמ) DivePlannerGraphics 10m 10m 30ft 30 רגל Handler Position Error שגיאת מיקום One or more of your stops will be lost with this operations, Please, remove them first. עצירה אחת או יותר יאבדו בפעולה זו אנא הסירו אותם קודם DivePlannerPointsModel AIR אוויר Final Depth עומק מירבי Duration משך הצלילה Used Gas אוויר שנוצל CC Set Point Discard the Plan? למחוק תוכנית? You are about to discard your plan. אזהרה, אתם עומדים למחוק תוכנית צלילה. DivePlannerWidget Dive Planner Points Available Gases add dive data point DiveTripModel # # date תאריך m מטר ft רגל min דקה kg קילוגרם lbs ליברה suit חליפה cyl location מיקום SAC צריכת אוויר OTU OTU maxCNS DivelogsDeWebServices Invalid response from server תגובה לא חוקית מהשרת Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found תג XML הצפוי 'DiveDates' לא נמצא Malformed XML response. Line %1: %2 תגובת XML פגומה. שורה %1: %2 no dives were selected שום צלילות נבחרו failed to create zip file for upload: %1 נכשל ביצירת קובץ zip להעלאה: 1% cannot create temporary file: %1 לא ניתן ליצור קובץ זמני: 1% internal error: %1 שגיאה פנימית: %1 internal error שגיאה פנימית Done סיים Uploading dive list... העלאת רשימת צלילות... Downloading dive list... הורדת רשימת צלילות... Downloading %1 dives... הורדת 1% צלילות... Download finished - %1 ההורדה הסתיימה - %1 Corrupted download הורדה פגומה The archive could not be opened: %1 לא היה אפשרות לפתוח את הארכיון: %1 Upload failed ההעלאה נכשלה Upload successful ההעלאה הסתיימה בהצלחה Login failed שגיאת התחברות (הזדהות) Cannot parse response תשובה לא ברורה Error: %1 שגיאה: %1 Upload finished ההעלאה הסתיימה DownloadFromDCWidget OK אשר Error שגיאה Retry נסה שוב Choose file for divecomputer download logfile Log files (*.log) קבצי יומן (*.log) Warning אזהרה Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer משוך נתונים ממחשב צלילה Vendor יצרן Dive Computer מחשב צלילה Device or Mount Point כונן או ספריה ... ... Force download of all dives משוך את כל הצלילות. Always prefer downloaded dives תמיד העדף צלילות מורדות OK אשר Cancel בטל Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations MainTab Dive Notes הערות צלילה Location מיקום Coordinates קואורדינטות Divemaster מדריך צלילה Buddy בן זוג Start time זמן התחלה Air temp טמפ' האוויר Water temp טמפ' מים Tags תגיות Rating דירוג Visibility ראות Suit חליפה Notes הערות Equipment ציוד Dive Info פרטי צלילה Date תאריך Interval משך Gases Used אוויר שנוצל Gas Consumed אוויר שנוצל SAC צריכת אויר Max. Depth עומק מירבי Ave. Depth עומק ממוצע OTU OTU Air Pressure לחץ אוויר Air Temperature טמפרטורת אוויר Water Temperature טמפרטורת מים Dive Time משך הצלילה Salinity מליחות Stats סטטסטיקות Depth עומק Temperature טמפרטורה Duration משך הצלילה Total Time סה"כ זמן Dives צלילות Cylinders מיכלים Add Cylinder הוסף מיכל Weights משקולות Add Weight System הוסף מערכת משקולות Trip Location מיקום Trip Notes הערות Save שמור Cancel בטל This trip is being edited. Multiple dives are being edited. צלילות מרובות בעריכה. This dive is being edited. צלילה זו בעריכה. /min לדקה unknown לא ידוע N צ S ד E מז W מע MainWindow Filter פילטר &File &קובץ &Log &יומן &View &Help &עזרה &Import &ייבא &New logbook יומן &חדש New חדש Ctrl+N Ctrl+N &Open logbook &לפתוח יומן Open פתח Ctrl+O Ctrl+O &Save &שמור Save שמור Ctrl+S Ctrl+S Save as שמור בשם Ctrl+Shift+S Ctrl+Shift+S Close סגור Ctrl+W Ctrl+W Import Files ייבא קבצים Ctrl+I Ctrl+I Export &UDDF יצוא &UDDF Ctrl+U Ctrl+U &Print &הדפס Ctrl+, Ctrl+, &Quit &צא Import from &dive computer Import &GPS data from Subsurface Service Ctrl+G Ctrl+G &Edit Device Names Ctrl++ Ctrl++ &Renumber &מספר מחדש Ctrl+R Ctrl+R Toggle &Zoom &Yearly Statistics &סטטיסטיקה שנתית Ctrl+Y Ctrl+Y Dive List רשימת צלילות Profile פרופיל Info פרטים All כולם User &Manual &מדריך משתמש Globe גלובוס P&lan Dive ת&כנן צלילה Ctrl+L Ctrl+L Import CSV יבוא CSV Import CS&V יבוא CS&V Import from Divelogs.de יבוא מ- Divelogs.de Ctrl+P Ctrl+P Preferences העדפות Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive הוסף צלילה Auto Group קבץ אוטומטי Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC קודם Left שמאל Next DC הבא Right ימין Select Events בחירת אירועים Input Plan הכנסת תכנית About Subsurface אודות Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File פתך קובץ Please save or cancel the current dive edit before closing the file. נא לשמור או לבטל את עריכת הצלילה הנוכחית לפני סגירת הקובץ. Please save or cancel the current dive edit before trying to plan a dive. נא לשמור או לבטל את עריכת הצלילה הנוכחית לפני שאתה מנסה לתכנן צלילה. Please save or cancel the current dive edit before trying to add a dive. נא לשמור או לבטל את עריכת הצלילה הנוכחית לפני שאתה מנסה להוסיף צלילה. User Manual מדריך משתמש Cannot find the Subsurface manual קובץ המדריך למשתמש לא נמצא Do you want to save the changes you made in the file %1? האם ברצונכם לשמור שינויים בקובץ %1 ? Do you want to save the changes you made in the datafile? האם לשמור שינויים בקובץ? Save Changes? לשמור שינויים? Changes will be lost if you don't save them. כל השינויים יאבדו אם לא תשמרו אותם. First finish the current edition before trying to do another. ראשית תסיים את המהדורה הנוכחית לפני שאתה מנסה לעשות אחר. Save File as שמור קובץ בשם Warning אזהרה Please save or cancel the current dive edit before opening a new file. נא לשמור או לבטל את עריכת הצלילה הנוכחית לפני פתיחת קובץ חדש. UDDF files (*.uddf *.UDDF) UDDF קבצי (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) קבצי XML נתמכים (*.ssrf *.xml *.XML) PreferencesDialog Defaults ברירות מחדל Units יחידות Graph גרף Language שפה Lists and Tables רשימות וטבלאות Font גופן Font size גודל גופן Dives צלילות Default Dive file קובץ ברירות המחדל לצלילה ... ... Display Invalid שגיאת הצגה Default Cylinder Use Default Cylinder System מערכת Metric מידה Imperial אמריקאית Personalize התאמה אישית Depth עומק meter מטר feet רגל bar bar psi psi liter ליטר cu ft רגל מ"ק celsius צלסיוס fahrenheit פרנהייט kg קילוגרם pO₂ pO₂ pN₂ pN₂ System Default ברירת מחדל של המערכת Filter פילטר Pressure לחץ Volume נפח Temperature טמפרטורה Weight משקל lbs lbs Time units יחידות זמן Ascent/Descent speed denominator מקדם עליה וירידה Minutes דקות Seconds שניות Show הצג threshold סף pHe לחץ הליום MOD MOD max ppO₂ ppO₂ המקסימאלי EAD END EADD EAD END EADD Dive computer reported ceiling עומק מקסימלי שדווח ע"י מחשב הצלילה draw ceiling red סמן עומק מקסימלי באדום Calculated ceiling עומק מקסימלי מחושב show all tissues הצג כל סוגי רקמות 3m increments רווחים של 3 מטר Calculate NDL/TTS GFLow at max depth Misc שונות Preferences העדפות SAC צריכת אויר GFLow גרדיאנט תחתון GFHigh גרדיאנט עליון Restart required נדרשת הפעלה מחדש To correctly load a new language you must restart Subsurface. כדי לטעון שפה חדשה בצורה נכונה עליך להפעיל מחדש את Subsurface Open Default Log File פתח יומן ברירת מחדל Subsurface XML files (*.ssrf *.xml *.XML) קבצי XML נתמכים (*.ssrf *.xml *.XML) PrintDialog &Preview &תצוגה מקדימה P&rint ה&דפס &Close &סגור Print הדפס PrintLayout Dive# מספר צלילה Date תאריך Depth עומק Duration משך הצלילה Master מדריך Buddy בן זוג Location מיקום PrintOptions Print options אפשרויות הדפסה Print only selected dives הדפס רק צלילות נבחרות Print in color הדפס בצבע Print type סוג הדפסה 6 dives per page 6 צלילות לעמוד 2 dives per page 2 צלילות לעמוד Table print הדפס טבלא Ordering סדר Profile on top פרופיל למעלה Notes on top הערות למעלה Sizing heights (% of layout) סקלות גובה (באחוזים) Profile height (43% - 85%) גובה פרופיל (43% - 85%) Other data height (8% - 17%) גובה שאר המידע (8% - 17%) Notes height (0% - 52%) גובה הערות (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Add Bookmark Remove Event הסר את האירוע Hide similar events הסתר אירועים דומים Unhide all events חשוף את כל האירועים Hide events הסתר אירועים Hide all %1 events? הסתר את כל %1 האירועים Remove the selected event? הסר את האירוע שנבחרו? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer מחשב צלילה לא מוכר Set Duration: 10 minutes קבע זמן: 10 דקות Scale קנה מידה Ruler סרגל Measure properties of dive segments Scale your dive to screen size Edit ערוך pN pN pHe לחץ הליום pO pO air אוויר EAN%1 EAN%1 Bailing out to OC begin Starts with space! להתחיל end Starts with space! סוף ProfilePrintModel unknown לא ידוע Dive #%1 - %2 צלילות מס %1 - %2 Max depth: %1 %2 עומק מקסימלי: %1 %2 Duration: %1 min זמן: %1 דקות Gas Used: אוויר שנוצל: SAC: צריכת אויר: Max. CNS: Weights: משקולות: Notes: הערות: Divemaster: מדריך צלילה: Buddy: בן זוג: Suit: חליפה: Viz: ראות: Rating: QObject AIR אוויר Remove this Point Close סגור Average ממוצע Minimum מינימום Maximum מקסימום Move the map and double-click to set the dive location תזיז את המפה ולחץ לחיצה כפולה כדי לקבוע את מיקום הצלילה RenumberDialog Renumber מספר מחדש New starting number מספר התחלתי חדש ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm earlier מוקדם יותר later מאוחר יותר SubsurfaceAbout About Subsurface אודות Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &רישיון &Website &אתר אינטרנט SubsurfaceWebServices Webservice שרות איטרנט Connecting... מתחבר... Download finished ההורדה הסתיימה Download error: %1 שגיאת הורדה: %1 Connection Error: שגיאת חיבור: Invalid user identifier! שם משתמש לא חוקי! Cannot parse response! תשובה לא מובנת! Download Success! ההורדה הצליחה! TableView Add Cylinder הוסף מיכל TankInfoModel Description תיאור ml bar bar ToolTipItem Information מידע נוסף WSInfoModel Description תיאור kg קילוגרם WebServices Webservice Connection חיבור שרות איטרנט Status: מצב: Enter your ID here הכנס זיהוי כאן Download הורדה User ID זיהוי משתמש Password סיסמא Upload ההעלאה Operation timed out הפעולה נכשלה Transfering data... מעביר נתונים... WeightModel Type סוג Weight משקל Clicking here will remove this weigthsystem. kg lbs ft m YearlyStatisticsModel Year > Month / Trip שנה > חודש / טיול # # Duration Total משך כולל Average ממוצע Shortest קצר ביותר Longest ארוך ביותר Depth (%1) Average עומק (%1) ממוצע Minimum מינימום Maximum מקסימום SAC (%1) Average צריכת אויר (%1) ממוצע Temp. (%1) Average טמפ' (%1) ממוצע gettextFromC pascal פסקל bar bar psi psi l l cuft cuft m מטר ft רגל lbs lbs kg קילוגרם (%s) or (%s) (%S) או (%S) air אוויר integrated איטגרל belt חגורה ankle קרסול backplate weight משקל פלטת גב clip-on נצמד Failed to read '%s' קריאה מ'%S' נכשלה Failed to read '%s'. Use import for CSV files. Maximum number of supported columns on CSV import is %d none אין deco stop עצירה לדיקומפרסיה rbt ascent עליה ceiling תקרה workload עומס transmitter משדר violation חריגה bookmark surface שטח safety stop עצירת בטיחות gaschange החלפת גז safety stop (voluntary) עצירת בטיחות (יזומה) safety stop (mandatory) עצירת בטיחות (חובה) deepstop עצירה בעומק ceiling (safety stop) תקרה (עצירת בטיחות) divetime זמןצלילה below floor event showing dive is below deco floor and adding deco time maxdepth עומק מקס' OLF OLF PO2 PO2 airtime זמן אויר rgbm rgbm heading כותרת tissue level warning אזהרת רמות רקמות non stop time זמן ללא עצירה invalid event number מס' ארוע שגוי Unable to create parser for %s %s Error registering the data Error parsing the datetime Dive %d: %s %d %04d צלילה %d: %s %d %04d Error parsing the divetime Error parsing the maxdepth Error parsing the gas mix count Error obtaining water salinity שגיאה בקבלת מליחות מים Error obtaining surface pressure Error parsing the gas mix Error parsing the samples Event: waiting for user action אירוע: מחכה לפעולה של המשתמש model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) דגם=%u (0x%08x), הקושחה=%u (0x%08x), מספר סידורי=%u (0x%08x) Error registering the event handler. Error registering the cancellation handler. Dive data import error שגיאת יבוא נתוני צלילה Unable to create libdivecomputer context Unable to open %s %s (%s) לא ניתן לפתוח את %s %s (%s) Strange percentage reading %s Failed to parse '%s'. Failed to parse '%s' Database query get_events failed. שאילתת מסד נתונים של Get_events נכשל Database connection failed '%s'. החיבור למסד הנתונים נכשל '%s'. Database query failed '%s'. שאילתת מסד נתונים נכשל '%s'. Can't open stylesheet %s לא ניתן לפתוח את גיליון העיצוב %s EAN%d EAN%d Can't find gas %d/%d לא ניתן למצוא את הגז %d/%d Too many gas mixes %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Switch gas to %s לעבור לגז s% Gas consumption: צריכת דלק: %.0f%s of %s ean %s P:%d %s %s T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Deco:%umin @ %.0f %s %s דקומפרסיה:%uדקות @ %.0f %s %s Deco:unkn time @ %.0f %s %s דקומפרסיה: זמן לא ידוע @ %.0f %s %s In deco %s בתוך דקומפרסיה %s NDL:%umin %s CNS:%u%% %s pO%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 צלילות) %1 %2 (1 dive) %1 %2 (1 צלילה) boat ספינה shore חוף drift סחיפה deep עמוק cavern מחילה ice קרח wreck cave מערה altitude גובה pool ברכה lake אגם river נחל night לילה fresh fresh student תלמיד photo תצלום video וידאו instructor מדריך deco דקומפרסיה more than %d days יותר מ-%d ימים %dd %dh %dmin %dh %dmin for dives # לצלילות # for selected dives לצלילות שנבחרו for dive #%d לצלילה #%d for selected dive לצלילה שנבחרה for all dives לכל הצלילות (no dives) (שום צלילות) Sun ראשון Mon שני Tue שלישי Wed רביעי Thu חמישי Fri שישי Sat שבת Jan ינואר Feb פבואר Mar מרץ Apr אפריל May מאי Jun יוני Jul יולי Aug אוגוסט Sep ספטמבר Oct אוקטובר Nov נובמבר Dec דצמבר Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Short write to req.txt file Is the Uemis Zurich plugged in correctly? unknown לא ידוע Reading %s %s קורא %s %s data נתונים divelog entry id divespot data id more data dive id wetsuit חליפת צלילה semidry drysuit חליפה יבשה shorty vest אפוד long john לבנים ארוכים jacket ז'קט full suit חליפה מלאה 2 pcs full suit membrane ממברנה Init Communication Uemis init failed Start download התחל הורדה Safety Stop Violation Speed Alarm אזעקת מהירות Speed Warning אזהרת מהירות PO2 Green Warning PO2 Ascend Warning PO2 Ascend Alarm Tank Pressure Info RGT Warning אזהרת RGT RGT Alert התראת RGT Tank Change Suggested Depth Limit Exceeded Max Deco Time Warning Dive Time Info Dive Time Alert Marker No Tank Data Low Battery Warning אזהרת סוללה חלשה Low Battery Alert התראת סוללה חלשה Subsurface-4.0.2/translations/subsurface_hr_HR.ts000066400000000000000000003614261226345450700221600ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) ... PO2 PO2 Field Separator Field Configuration Import CSV file Time Vrijeme Depth Dubina Temp Temp Cns Stopdepth Pre-configured imports Open CSV Log File CSV Files (*.csv);;All Files(*) CylindersModel Type Vrsta Size Veličina WorkPress StartPress EndPress Switch at He% O Clicking here will remove this cylinder. Cylinder cannot be removed This gas in use. Only cylinders that are not used in the dive can be removed. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Promijeni nazive računala Remove the selected Dive Computer? Are you sure that you want to remove the selected dive computer? DiveComputerModel Model Model Device ID Nickname Naziv uređaja Clicking here will remove this divecomputer. DiveItem l/min cuft/min DiveListView Show Search Box expand all collapse all collapse others remove dive(s) from trip create new trip above add dive(s) to trip immediately above merge trip with trip above merge trip with trip below delete dive(s) mark dive(s) invalid save As export As UDDF shift times upload dive(s) to divelogs.de Save Dives As... Save File as UDDF files (*.uddf *.UDDF) merge selected dives DivePlanner Bottom SAC SAC on DECO Stop GFHigh GFLow Last Stop at 6m Start Time ATM Pressure DivePlannerGraphics 10m 30ft Handler Position Error One or more of your stops will be lost with this operations, Please, remove them first. DivePlannerPointsModel AIR Zrak Final Depth Duration Trajanje Used Gas CC Set Point Discard the Plan? You are about to discard your plan. DivePlannerWidget Dive Planner Points Available Gases add dive data point DiveTripModel # Br. date m m ft ft min min kg kg lbs lbs suit cyl location SAC SAC OTU OTU maxCNS maxCNS DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK Error Greška Retry Pokušaj ponovo Choose file for divecomputer download logfile Log files (*.log) Warning Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Preuzmi s ronilačkog računala Vendor Dive Computer Device or Mount Point ... Force download of all dives Prisilno preuzimanje svih urona Always prefer downloaded dives OK Cancel Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations MainTab Dive Notes Bilješke Location Lokacija Coordinates Divemaster Voditelj Buddy Buddy Start time Air temp Water temp Tags Rating Ocjena Visibility Vidljivost Suit Odijelo Notes Bilješke Equipment Oprema Dive Info Informacije o uronu Date Datum Interval Gases Used Gas Consumed SAC SAC Max. Depth Ave. Depth OTU OTU Air Pressure Air Temperature Water Temperature Dive Time Trajanje Salinity Stats Statistike Depth Dubina Temperature Temperatura Duration Trajanje Total Time Ukupno trajanje Dives Uroni Cylinders Boce Add Cylinder Weights Add Weight System Trip Location Trip Notes Save Cancel This trip is being edited. Multiple dives are being edited. This dive is being edited. /min unknown nepoznato N N S S E E W W MainWindow Filter Filter &File &Log &View &Help &Import &New logbook New Novi Ctrl+N &Open logbook Open Ctrl+O &Save Save Ctrl+S Save as Spremi kao Ctrl+Shift+S Close Zatvori Ctrl+W Import Files Ctrl+I Export &UDDF Ctrl+U &Print Ctrl+, &Quit Import from &dive computer Import &GPS data from Subsurface Service Ctrl+G &Edit Device Names Ctrl++ &Renumber Ctrl+R Toggle &Zoom &Yearly Statistics Ctrl+Y Dive List Profile Profil Info Informacije All User &Manual Globe P&lan Dive Ctrl+L Import CSV Import CS&V Import from Divelogs.de Ctrl+P Preferences Postavke Ctrl+Q Ctrl+D Add Dive Auto Group Ctrl+2 Ctrl+3 Ctrl+4 Ctrl+1 Prev DC Prethodno računalo Left Next DC Sljedeće računalo Right Select Events Odaberi događaje Input Plan Unesi plan urona About Subsurface O programu Subsurface F1 Ctrl+5 Open File Otvori datoteku Please save or cancel the current dive edit before closing the file. Please save or cancel the current dive edit before trying to plan a dive. Please save or cancel the current dive edit before trying to add a dive. User Manual Korisnički priručnik Cannot find the Subsurface manual Do you want to save the changes you made in the file %1? Do you want to save the changes you made in the datafile? Save Changes? Spremi promjene? Changes will be lost if you don't save them. First finish the current edition before trying to do another. Save File as Warning Please save or cancel the current dive edit before opening a new file. UDDF files (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) PreferencesDialog Defaults Units Jedinice Graph Language Lists and Tables Font Font size Dives Uroni Default Dive file ... Display Invalid Default Cylinder Use Default Cylinder System Metric Imperial Personalize Depth Dubina meter feet bar bar psi psi liter cu ft celsius fahrenheit kg kg pO₂ pN₂ System Default Filter Filter Pressure Pritisak Volume Temperature Temperatura Weight Težina lbs lbs Time units Ascent/Descent speed denominator Minutes Seconds Show threshold pHe MOD max ppO₂ EAD END EADD Dive computer reported ceiling draw ceiling red Calculated ceiling show all tissues 3m increments Calculate NDL/TTS GFLow at max depth Misc Preferences Postavke SAC SAC GFLow GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Subsurface XML files (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print PrintLayout Dive# Uron br. Date Datum Depth Dubina Duration Trajanje Master Master Buddy Buddy Location Lokacija PrintOptions Print options Print only selected dives Ispiši odabrane urone Print in color Ispis u boji Print type Vrsta ispisa 6 dives per page 6 urona po stranici 2 dives per page 2 urona po stranici Table print Tablični ispis Ordering Redosljed Profile on top Profil na vrhu Notes on top Bilješke na vrhu Sizing heights (% of layout) Profile height (43% - 85%) Other data height (8% - 17%) Notes height (0% - 52%) 0 ProfileGraphicsView Add Gas Change Add Bookmark Remove Event Hide similar events Unhide all events Hide events Hide all %1 events? Remove the selected event? %1 @ %2:%3 unknown divecomputer Set Duration: 10 minutes Scale Ruler Measure properties of dive segments Scale your dive to screen size Edit Uredi pN pHe pO air zrak EAN%1 Bailing out to OC Neplanirani prelazak na OC sustav begin Starts with space! započni end Starts with space! završi ProfilePrintModel unknown nepoznato Dive #%1 - %2 Max depth: %1 %2 Duration: %1 min Gas Used: SAC: Max. CNS: Weights: Notes: Divemaster: Buddy: Suit: Viz: Rating: QObject AIR Zrak Remove this Point Close Zatvori Average Ø Minimum Min. Maximum Max. Move the map and double-click to set the dive location RenumberDialog Renumber Renumeriraj New starting number Novi početni broj ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm earlier later SubsurfaceAbout About Subsurface O programu Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Website SubsurfaceWebServices Webservice Web servis Connecting... Spajanje... Download finished Download error: %1 Connection Error: Greška u komunikaciji: Invalid user identifier! Neispravna korisnička oznaka Cannot parse response! Ne mogu obraditi odziv Download Success! Preuzimanje uspješno! TableView Add Cylinder TankInfoModel Description ml bar bar ToolTipItem Information WSInfoModel Description kg kg WebServices Webservice Connection Status: Enter your ID here Download User ID Password Lozinka Upload Operation timed out Transfering data... WeightModel Type Vrsta Weight Težina Clicking here will remove this weigthsystem. kg lbs ft m YearlyStatisticsModel Year > Month / Trip # Br. Duration Total Average Shortest Longest Depth (%1) Average Minimum Maximum SAC (%1) Average Temp. (%1) Average gettextFromC pascal Pa bar bar psi psi l l cuft cuft m m ft ft lbs lbs kg kg (%s) or (%s) (%s) ili (%s) air zrak integrated integrirani belt pojas ankle gležanj backplate weight backplate olova clip-on clip-on Failed to read '%s' Nije uspjelo čitanje '%s' Failed to read '%s'. Use import for CSV files. Maximum number of supported columns on CSV import is %d none nijedan deco stop deko zastoj rbt rbt ascent izron ceiling strop workload opterećenje transmitter odašiljač violation povreda bookmark bookmark surface površina safety stop sigurnosna stanka gaschange promjena plina safety stop (voluntary) sigurnosna stanka (opcionalna) safety stop (mandatory) sigurnosna stanka (obavezna) deepstop dubinska stanka ceiling (safety stop) strop (sigurnosni zastoj) divetime trajanje urona below floor event showing dive is below deco floor and adding deco time maxdepth Max dubina OLF OLF PO2 PO2 airtime preostalo trajanje zraka rgbm rgbm heading kurs tissue level warning upozorenje tkivo non stop time non stop vrijeme invalid event number neispravan broj događaja Unable to create parser for %s %s Ne mogu kreirati parser za %s %s Error registering the data Greška pri registraciji podataka Error parsing the datetime Greška pri parsiranju datuma i vremena Dive %d: %s %d %04d Uron #%d - %s %d %04d Error parsing the divetime Greška pri parsiranju vremena urona Error parsing the maxdepth Greška pri parsiranju maksimalne dubine Error parsing the gas mix count Greška pri parsiranju broja mješavina Error obtaining water salinity Greška pri dohvaćanju saliniteta vode Error obtaining surface pressure Error parsing the gas mix Greška pri parsiranju mješavine plinova Error parsing the samples Greška pri parsiranju uzoraka Event: waiting for user action Događaj: čekanje na korisničku akciju model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Greška pri registraciji event handlera. Error registering the cancellation handler. Greška pri registraciji cancellation handlera Dive data import error Greška pri uvozu podataka Unable to create libdivecomputer context Ne mogu kreirati libdivecomputer kontekst Unable to open %s %s (%s) Nije uspjelo otvaranje %s %s (%s) Strange percentage reading %s Neobično očitanje postotka %s Failed to parse '%s'. Nije uspjelo parsiranje '%s'. Failed to parse '%s' Nije uspjelo parsiranje '%s' Database query get_events failed. Neuspjeo get_events na bazi. Database connection failed '%s'. Neuspjelo spajanje na bazu '%s'. Database query failed '%s'. Neuspjeo upit na bazu '%s'. Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d Ne mogu naći plin %d/%d Too many gas mixes Previše mješavina plinova %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface plan urona temeljen na GFlow = %.0f i GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Prelazak na %.*f %s u %d:%02d min - ukupno vrijeme %d:%02u na %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Stanka na %.*f %s u trajanju %d:%02d min - Ukupno vrijeme %d:%02u na %s Switch gas to %s Prebaci plin na %s Gas consumption: Potrošnja plina: %.0f%s of %s %.0f%s %s ean ean %s P:%d %s %s D:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Izračunati strop %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Sigurnosni zastanak:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Sigurnosni zastoj:nepoz.vrijeme @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko:nepoznato vrijeme @ %.0f %s %s In deco %s U deko %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C F %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (1 dive) boat brod shore obala drift drift deep dubok cavern pećina ice led wreck olupina cave špilja altitude nadmorska visina pool bazen lake jezero river rijeka night noć fresh student photo fotografija video video instructor deco deko more than %d days više od %d dana %dd %dh %dmin %dd %dh %dmin %dh %dmin %dst %dmin for dives # za urone # for selected dives za odabrane urone for dive #%d za uron #%d for selected dive za odabrani uron for all dives za sve urone (no dives) (nema urona) Sun Ned Mon Pon Tue Uto Wed Sri Thu Čet Fri Pet Sat Sub Jan Sij Feb Velj Mar Ožu Apr Tra May Svi Jun Lip Jul Srp Aug Kol Sep Ruj Oct Lis Nov Stu Dec Pro Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Datotečni sustav je skoro pun odspojite pa ponovo spojite ronilačko računalo i kliknite 'Retry' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Datotečni sustav je pun Iskopčajte i ponovo ukopčajte ronilačko računalo i pokušajte ponovo. Short write to req.txt file Is the Uemis Zurich plugged in correctly? Greška pri pisanju u datoteku req.txt Je li Uemis Zurich ispravno priključen? unknown nepoznato Reading %s %s Čitanje %s %s data podaci divelog entry id ID unosa u dnevniku divespot data id divespot data id more data dive id više podataka za ID urona wetsuit mokro odijelo semidry polusuho drysuit suho odijelo shorty shorty vest jakna long john long john jacket kompenzator plovnosti full suit puno odijelo 2 pcs full suit dvodjelno odijelo membrane membrana Init Communication Uspostavljanje veze Uemis init failed Uemis greška pri inicijalizaciji Start download Započni preuzimanje Safety Stop Violation Kršenje sigurnosne stanke Speed Alarm Alarm: Brzina Speed Warning Upozorenje: Brzina PO2 Green Warning Upozorenje: PO2 Zeleno PO2 Ascend Warning Upozorenje: Prebrzi izron / PO2 PO2 Ascend Alarm Alarm: Prebrzi izron / PO2 Tank Pressure Info Podaci od pritisku u boci RGT Warning RTG Upozorenje RGT Alert RGT Alarm Tank Change Suggested Preporučena izmjena boce Depth Limit Exceeded Premašeno ograničenje dubine Max Deco Time Warning Upozorenje: Max. vrijeme dekompresije Dive Time Info Info: Trajanje urona Dive Time Alert Alarm: Trajanje urona Marker Oznaka No Tank Data Nema podatka o boci Low Battery Warning Upozorenje: Baterija pri izmaku Low Battery Alert Alarm: Baterija pri izmaku Subsurface-4.0.2/translations/subsurface_id.ts000066400000000000000000003602351226345450700215470ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) ... ... PO2 PO2 Field Separator Field Configuration Import CSV file Time Depth Kedalaman Temp Cns Stopdepth Pre-configured imports Open CSV Log File CSV Files (*.csv);;All Files(*) CylindersModel Type Tipe Size Ukuran WorkPress WorkPress StartPress StartPress EndPress EndPress Switch at He% O Clicking here will remove this cylinder. Cylinder cannot be removed This gas in use. Only cylinders that are not used in the dive can be removed. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Ubah Nama Panggilan Perangkat Remove the selected Dive Computer? Lepas Perangkat berikut Are you sure that you want to remove the selected dive computer? Anda yakin ingin melepas Perangkat berikut? DiveComputerModel Model Model Device ID ID Perangkat Nickname Nama Panggilan Clicking here will remove this divecomputer. DiveItem l/min I/min cuft/min cuft/min DiveListView Show Search Box Munculkan Kotak Pencari expand all Tampilkan semua collapse all Sembunyikan semua collapse others remove dive(s) from trip create new trip above add dive(s) to trip immediately above merge trip with trip above merge trip with trip below delete dive(s) mark dive(s) invalid save As export As UDDF shift times upload dive(s) to divelogs.de Save Dives As... Save File as Simpan Berkas sebagai UDDF files (*.uddf *.UDDF) merge selected dives Gabungkan selam berikut DivePlanner Bottom SAC SAC bawah SAC on DECO Stop SAC pada pemberhentian DECO GFHigh GFHigh GFLow GFlow Last Stop at 6m Pemberhentian terakhir pada 6m Start Time Waktu mulai ATM Pressure Tekanan ATM DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Kesalahan posisi Handler One or more of your stops will be lost with this operations, Please, remove them first. Satu atau lebih dari Pemberhentianmu akan hilang melalui pengoperasian ini, Coba, lepas terlebih dahulu DivePlannerPointsModel AIR UDARA Final Depth Kedalaman akhir Duration Durasi Used Gas Gas terpaikai CC Set Point Titik CC Discard the Plan? Abaikan Rencana You are about to discard your plan. Kamu hendak mengabaikan Rencana DivePlannerWidget Dive Planner Points Titik-titik Rencana Selam Available Gases add dive data point DiveTripModel # # date m m ft ft min menit kg kg lbs lbs suit cyl location SAC SAC OTU OTU maxCNS maxCNS DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK OK Error Kesalahan Retry Choose file for divecomputer download logfile Log files (*.log) Warning Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Unduh dari Komputer Selam Vendor Vendor Dive Computer Komputer Selam Device or Mount Point Perangkat atau Pemasangan ... ... Force download of all dives Paksa unduh keseluruhan selam Always prefer downloaded dives Selalu pilih selam yang sudah diunduh OK OK Cancel Batal Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations MainTab Dive Notes Catatan Selam Location Lokasi Coordinates Koordinat Divemaster Divemaster Buddy Rekan Start time Air temp Water temp Tags Rating Peringkat Visibility Jarak Lihat Suit Pakaian Notes Catatan Equipment Perlengkapan Dive Info Info Selam Date Tanggal Interval Rentang Waktu Gases Used Seluruh Gas yang terpakai Gas Consumed Gas Terpakai SAC SAC Max. Depth Kedalaman Maks Ave. Depth Kedalaman Rata-rata OTU OTU Air Pressure Tekanan Udara Air Temperature Suhu Udara Water Temperature Suhu Air Dive Time Waktu Selam Salinity Kadar Garam Stats Statisktik Depth Kedalaman Temperature Suhu Duration Rentang Waktu Total Time Waktu Keseluruhan Dives Selam Cylinders Tabung Add Cylinder Tambah Tabung Weights Berat Add Weight System Tambah Sistem Berat Trip Location Lokasi Perjalanan Trip Notes Catatan Perjalanan Save Simpan Cancel Batal This trip is being edited. Multiple dives are being edited. This dive is being edited. /min /menit unknown Tak dikenal N U S S E T W B MainWindow Filter Saring &File &Log &View &Help &Import &New logbook New Baru Ctrl+N Ctrl+N &Open logbook Open Buka Ctrl+O Ctrl+O &Save Save Simpan Ctrl+S Ctrl+S Save as Simpan sebagai Ctrl+Shift+S Ctrl+Shift+S Close Tutup Ctrl+W Ctrl+W Import Files Impor Berkas Ctrl+I Ctrl+I Export &UDDF Ctrl+U &Print &Print Ctrl+, &Quit Import from &dive computer Import &GPS data from Subsurface Service Ctrl+G &Edit Device Names Ctrl++ &Renumber Ctrl+R Toggle &Zoom &Yearly Statistics Ctrl+Y Dive List Profile Info All User &Manual Globe P&lan Dive Ctrl+L Import CSV Import CS&V Import from Divelogs.de Ctrl+P Ctrl+P Preferences Preferensi Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Tambah Selam Auto Group Grup Otomatis Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Cltrl+1 Prev DC DC Sebelumnya Left Kiri Next DC DC Selanjunya Right Kanan Select Events Pilih Aktifitas Input Plan Masukkan Rencana About Subsurface Tentang Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Buka Berkas Please save or cancel the current dive edit before closing the file. Please save or cancel the current dive edit before trying to plan a dive. Please save or cancel the current dive edit before trying to add a dive. User Manual Cannot find the Subsurface manual Panduan Subsurface tak dapat ditemukan Do you want to save the changes you made in the file %1? Anda ingin menyimpan perubahan yang sudah dilakukan pada Berkas %1 Do you want to save the changes you made in the datafile? Anda ingin menyimpan perubahan yang sudah dilakukan pada datafile? Save Changes? Simpan perubahan? Changes will be lost if you don't save them. Perubahan akan hilang jika anda tidak simpan. First finish the current edition before trying to do another. Save File as Simpan Berkas sebagai Warning Please save or cancel the current dive edit before opening a new file. UDDF files (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML files (*.ssrf *.xml *.XML) PreferencesDialog Defaults Acuan Units Satuan Graph Grafik Language Lists and Tables Tabel dan daftar Font Huruf Font size Ukuran Huruf Dives Selam Default Dive file Berkas Dive Acuan ... ... Display Invalid Cacat Layar Default Cylinder Use Default Cylinder System Sistem Metric Metrik Imperial Imperial Personalize Personalisasi Depth edalaman meter feet bar bar psi psi liter cu ft celsius fahrenheit kg kgkg pO₂ pN₂ System Default Filter Saring Pressure Tekanan Volume Volume Temperature Suhu Weight Berat lbs lbs Time units Satuan Waktu Ascent/Descent speed denominator penyebut kecepatan naik/turun Minutes Menit Seconds Detik Show Tampilkan threshold Ambang Batas pHe pHe MOD MOD max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Batas yang dilaporkan perangkat draw ceiling red batas merah sejajar Calculated ceiling batas terhitung show all tissues Tampilkan semua jaringan 3m increments Kenaikan 3m Calculate NDL/TTS GFLow at max depth Misc Lain-lain Preferences Preferensi SAC SAC GFLow GFlow GFHigh GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Buka Berkas Log Acuan Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML files (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print PrintLayout Dive# Selam# Date Tanggal Depth Kedalaman Duration Durasi Master Master Buddy Rekan Location Lokasi PrintOptions Print options Pilihan Cetak Print only selected dives Cetak hanya untuk Selam berikut Print in color Cetak warna Print type Tipe Cetakan 6 dives per page 6 Selam tiap halaman 2 dives per page 2 Selam tiap halaman Table print Cetak Tabel Ordering Urutan Profile on top Profil di atas Notes on top Catatan di atas Sizing heights (% of layout) Tinggi Pengukuran (% dari layout) Profile height (43% - 85%) Tinggi Profil (43% - 85%) Other data height (8% - 17%) Berkas Ketinggian lain (8% - 17%) Notes height (0% - 52%) Ketinggian Catatan (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Add Bookmark Remove Event Hide similar events Unhide all events Hide events Hide all %1 events? Remove the selected event? %1 @ %2:%3 unknown divecomputer perangkat tidak dikenal Set Duration: 10 minutes Set Durasi: 10 Menit Scale Skala Ruler Penggaris Measure properties of dive segments Scale your dive to screen size Edit pN pHe pHe pO air udara EAN%1 EAN%1 Bailing out to OC Bailing out untuk OC begin Starts with space! Mulai end Starts with space! Akhir ProfilePrintModel unknown Tak dikenal Dive #%1 - %2 Selam #%1 - %2 Max depth: %1 %2 Kedalaman Maks: 1% 2% Duration: %1 min Durasi: %1 menit Gas Used: SAC: Max. CNS: Weights: Notes: Divemaster: Buddy: Suit: Viz: Rating: QObject AIR UDARA Remove this Point Close Tutup Average Rata-rata Minimum Minimal Maximum Maksimal Move the map and double-click to set the dive location RenumberDialog Renumber Penomeran Ulang New starting number Nomor Awal baru ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm earlier later SubsurfaceAbout About Subsurface Tentang Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Lisensi &Website &Website SubsurfaceWebServices Webservice Webservice Connecting... Download finished Download error: %1 Connection Error: Kesalahan Koneksi: Invalid user identifier! identifikasi pengguna tidak cocok! Cannot parse response! Respon gagal di telaah! Download Success! Unduh Sukses! TableView Add Cylinder Tambah Tabung TankInfoModel Description Penjelasan ml bar bar ToolTipItem Information Informasi WSInfoModel Description Penjelasan kg kgkg WebServices Webservice Connection Status: Enter your ID here Download User ID Password Upload Operation timed out Transfering data... WeightModel Type Tipe Weight Berat Clicking here will remove this weigthsystem. kg lbs ft m YearlyStatisticsModel Year > Month / Trip # # Duration Total Total Durasi Average Rata-rata Shortest Terpendek Longest Terjauh Depth (%1) Average Dalam (%1) Rata-rata Minimum Minimal Maximum Maksimal SAC (%1) Average SAC (%1) Rata-rata Temp. (%1) Average Temp. (%1) Rata-rata gettextFromC pascal Pascal bar bar psi psi l I cuft cuft m m ft ft lbs lbs kg kg (%s) or (%s) (%s) or (%s) air udara integrated terintegrasi belt sabuk ankle Pergelangan kaki backplate weight berat plat-punggung clip-on clip-on Failed to read '%s' Gagal baca '%s' Failed to read '%s'. Use import for CSV files. Maximum number of supported columns on CSV import is %d none kosong deco stop pemberhentian deco rbt rbt ascent nai ceiling batas workload beban kerja transmitter pemancar violation gangguan bookmark tandai surface permuakaan safety stop gaschange ganti gas safety stop (voluntary) safety stop (bebas) safety stop (mandatory) safety stop (wajib) deepstop deepstop ceiling (safety stop) batas (safety stop) divetime waktu selam below floor event showing dive is below deco floor and adding deco time maxdepth dalam maks OLF OLF PO2 PO2 airtime waktu mengudara rgbm rgbm heading judul tissue level warning peringatan tingkat jaringan non stop time waktu non stop invalid event number nomor kejadian tidak sesuai Unable to create parser for %s %s tidak dapat membuat pengurai untuk %s %s Error registering the data Gagal mendaftarkan data Error parsing the datetime Gagal mengurai tanggal Dive %d: %s %d %04d Selam %d: %s %d %04d Error parsing the divetime Gagal mengurai waktu selam Error parsing the maxdepth Gagal mengurai kedalamn maks Error parsing the gas mix count Gagal mengurai perhitungan campuran gas Error obtaining water salinity Error obtaining surface pressure Error parsing the gas mix Error parsing the samples Event: waiting for user action model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Error registering the cancellation handler. Dive data import error Unable to create libdivecomputer context Unable to open %s %s (%s) Strange percentage reading %s Failed to parse '%s'. Failed to parse '%s' Database query get_events failed. Database connection failed '%s'. Database query failed '%s'. Can't open stylesheet %s EAN%d Can't find gas %d/%d Too many gas mixes %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Switch gas to %s Gas consumption: %.0f%s of %s ean %s P:%d %s %s T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s In deco %s NDL:%umin %s CNS:%u%% %s pO%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C F %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (1 dive) boat shore drift deep cavern ice wreck cave altitude pool lake river night fresh student photo video instructor deco more than %d days %dd %dh %dmin %dh %dmin for dives # for selected dives for dive #%d for selected dive for all dives (no dives) Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Short write to req.txt file Is the Uemis Zurich plugged in correctly? unknown Tak dikenal Reading %s %s data divelog entry id divespot data id more data dive id wetsuit semidry drysuit shorty vest long john jacket full suit 2 pcs full suit membrane Init Communication Uemis init failed Start download Safety Stop Violation Speed Alarm Speed Warning PO2 Green Warning PO2 Ascend Warning PO2 Ascend Alarm Tank Pressure Info RGT Warning RGT Alert Tank Change Suggested Depth Limit Exceeded Max Deco Time Warning Dive Time Info Dive Time Alert Marker No Tank Data Low Battery Warning Low Battery Alert Subsurface-4.0.2/translations/subsurface_it_IT.ts000066400000000000000000003705321226345450700221640ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importa file (CSV) ... ... PO2 PO2 Field Separator Separatore di campo Field Configuration Configurazione Campo Import CSV file importa file CSV Time Ora Depth Profondità Temp Temperatura Cns CNS Stopdepth Pre-configured imports Importazioni preconfigurate Open CSV Log File Apri File di Log CSV CSV Files (*.csv);;All Files(*) CylindersModel Type Tipo Size Dimensione WorkPress StartPress EndPress Switch at He% He% O Clicking here will remove this cylinder. Facendo click qui si rimuove la bombola. Cylinder cannot be removed La bombola non può essere rimossa This gas in use. Only cylinders that are not used in the dive can be removed. Questo gas è in uso. Solo le bombole che non sono usate nell'immersione possono essere rimosse. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Modifica il soprannome del computer Remove the selected Dive Computer? Rimuovo il computer selezionato? Are you sure that you want to remove the selected dive computer? Sei sicuro di volere calncellare il computer seleizonato? DiveComputerModel Model Modello Device ID ID della periferica Nickname Nickname Clicking here will remove this divecomputer. Facendo click qui si rimuove questo computer. DiveItem l/min l/min cuft/min piedi cubi/min DiveListView Show Search Box Mostra la finestra di ricerca expand all espandi tutto collapse all collassa tutte le voci collapse others remove dive(s) from trip rimuovi l'immersione(i) dal viaggio create new trip above crea un nuovo viaggio sopra add dive(s) to trip immediately above aggiungi immersione(i) immediatamente sopra merge trip with trip above unisci il viaggio con il viaggio sopra merge trip with trip below unisci il viaggio con il viaggio sotto delete dive(s) cancella immersione(i) mark dive(s) invalid save As Salva come export As UDDF Esporta come UDDF shift times upload dive(s) to divelogs.de Save Dives As... Salva immersioni come ... Save File as Salva come UDDF files (*.uddf *.UDDF) File UDDF (*.uddf *.UDDF) merge selected dives unisci le immersioni selezionate DivePlanner Bottom SAC CAS sul fondo SAC on DECO Stop CAS nella tappa di decompressione GFHigh GFHigh GFLow GFLow Last Stop at 6m Ultima sosta a 6m Start Time Ora di inizio ATM Pressure DivePlannerGraphics 10m 10m 30ft 30 piedi Handler Position Error Gestore dell'errore di posizione One or more of your stops will be lost with this operations, Please, remove them first. Una o più soste verranno perse con questa operazione, Per favore, rimuovile prima. DivePlannerPointsModel AIR ARIA Final Depth Profondità finale Duration Durata Used Gas Gas usato CC Set Point CC Set Point Discard the Plan? Elimino il piano? You are about to discard your plan. Stai cancellando il piano DivePlannerWidget Dive Planner Points Punti del Dive Planner Available Gases Miscele disponibili add dive data point DiveTripModel # # date data m m ft ft min min kg kg lbs lbs suit muta cyl location Luogo SAC CAS OTU OTU maxCNS max CNS DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK OK Error Errore Retry Riprova Choose file for divecomputer download logfile Log files (*.log) Warning Avviso Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Scarica dal Computer Vendor Venditore Dive Computer Computer per immersioni Device or Mount Point ... ... Force download of all dives Forza il download di tutte le immersioni Always prefer downloaded dives Preferisci sempre le immersioni scaricate OK OK Cancel Annulla Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations Modifica le località d'immersione selezionate MainTab Dive Notes Note dell'immersione Location Luogo Coordinates Coordinate Divemaster Divemaster Buddy Compagno Start time Ora di inizio Air temp Temperatura aria Water temp Temperatura dell'acqua Tags Tags Rating Valutazione Visibility Visibilità Suit Muta Notes Note Equipment Attrezzatura Dive Info Informazioni sull'immersione Date Data Interval Intervallo Gases Used Gas usati Gas Consumed Gas consumato SAC CAS Max. Depth Profondità max Ave. Depth Profondità media OTU OTU Air Pressure Pressione aria Air Temperature Temperatura aria Water Temperature Temperatura dell'acqua Dive Time Tempo d'Immersione Salinity Salinità Stats Statistiche Depth Profondità Temperature Temperatura Duration Durata Total Time Tempo Totale Dives Immersioni Cylinders Bombole Add Cylinder Aggiungi bombola Weights Pesi Add Weight System Aggiungi un tipo di pesi Trip Location Luogo del viaggio Trip Notes Note di viaggio Save Salva Cancel Annulla This trip is being edited. Questo viaggio è stato editato. Multiple dives are being edited. Si stanno modificando immersioni multiple. This dive is being edited. Si sta modificando questa immersione /min /min unknown sconosciuto N N S S E E W W MainWindow Filter Filtro &File &File &Log &Log &View &Vista &Help &Aiuto &Import &Importa &New logbook &Nuovo logbook New Nuovo Ctrl+N Ctrl+N &Open logbook &Apri logbook Open Apri Ctrl+O Ctrl-O &Save &Salva Save Salva Ctrl+S Ctrl+S Save as Salva come Ctrl+Shift+S Ctrl+Shift+S Close Chiudi Ctrl+W Ctrl+W Import Files Importa files Ctrl+I Ctrl+I Export &UDDF Esporta &UUDF Ctrl+U Ctrl-U &Print &Stampa Ctrl+, Ctrl+, &Quit &Esci Import from &dive computer Importa &dal computer Import &GPS data from Subsurface Service Importa dati &GPS del servizio Subsurface Ctrl+G Ctrl+G &Edit Device Names &Modifica il nome della periferica Ctrl++ Ctrl++ &Renumber &Rinumera Ctrl+R Ctrl+R Toggle &Zoom &Yearly Statistics &Statistiche Annuali Ctrl+Y Ctrl+Y Dive List Lista immersioni Profile Profilo Info Informazioni All Tutti User &Manual &Manuale Utente Globe Globo P&lan Dive Pianifica immersione Ctrl+L Ctrl+L Import CSV Importa CSV Import CS&V Importa CS&V Import from Divelogs.de Importa da Divelogs.de Ctrl+P Ctrl+P Preferences Preferenze Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Aggiungi immersione Auto Group Raggruppamento Automatico Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC DC precedente Left Sinistra Next DC DC successivo Right Destra Select Events Seleziona eventi Input Plan Piano in ingresso About Subsurface Informazioni su Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Apri File Please save or cancel the current dive edit before closing the file. Please save or cancel the current dive edit before trying to plan a dive. Please save or cancel the current dive edit before trying to add a dive. User Manual Manuale Utente Cannot find the Subsurface manual Manuale di Subsurface non trovato Do you want to save the changes you made in the file %1? Vuoi salvare le modifiche fatte nel file %1? Do you want to save the changes you made in the datafile? Vuoi salvare le modifiche fatte nel datafile? Save Changes? Salvare le modifiche? Changes will be lost if you don't save them. Le modifiche saranno perse se tu non le salvi. First finish the current edition before trying to do another. Save File as Salva come Warning Avviso Please save or cancel the current dive edit before opening a new file. UDDF files (*.uddf *.UDDF) File UDDF (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) File XML Subsurface (*.ssrf *.xml *.XML) PreferencesDialog Defaults Defaults Units Unità Graph Grafico Language Lists and Tables Liste e tabelle Font Font Font size Grandezza font Dives Immersioni Default Dive file File immersione di default ... ... Display Invalid Visualizzazione errata Default Cylinder Bombola di default Use Default Cylinder Usa questa bombola come default System Sistema Metric Metrico Imperial Imperiale Personalize Personalizza Depth Profondità meter feet bar bar psi psi liter cu ft celsius fahrenheit kg kg pO₂ pN₂ System Default Filter Filtro Pressure Pressione Volume Volume Temperature Temperatura Weight Peso lbs lbs Time units Unità di Tempo Ascent/Descent speed denominator Denominatore della Risalita/Discesa Minutes Minuti Seconds Secondi Show Mostra threshold soglia pHe pHe MOD MOD max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Ceiling riportato dal computer draw ceiling red Calculated ceiling Ceiling calcolato show all tissues mostra tutti i tessuti 3m increments incrementi di 3m Calculate NDL/TTS Calcola NDL/TTS GFLow at max depth GFLow alla massima profondità Misc Varie Preferences Preferenze SAC CAS GFLow GFLow GFHigh GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Apri il log di default Subsurface XML files (*.ssrf *.xml *.XML) File XML Subsurface (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print Stampa PrintLayout Dive# Immersione n. Date Data Depth Profondità Duration Durata Master Master Buddy Compagno Location Luogo PrintOptions Print options Opzioni di stampa Print only selected dives Stampa solo le immersioni selezionate Print in color Stampa a colori Print type Stampa tipo 6 dives per page 6 immersioni per pagina 2 dives per page 2 immersioni per pagina Table print Stampa Tabella Ordering Ordinamento Profile on top Profilo in primo piano Notes on top Note in primo piano Sizing heights (% of layout) Profile height (43% - 85%) Other data height (8% - 17%) Notes height (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Aggiungi una miscela Add Bookmark Aggiungi un segnalibro Remove Event Rimuovi evento Hide similar events Nascondi eventi simili Unhide all events Hide events Nascondi eventi Hide all %1 events? Nascondo tutti i %1 eventi? Remove the selected event? Rimuovo l'evento selezionato? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer Computer sconosciuto Set Duration: 10 minutes Setta la durata: 10 minuti Scale Scala Ruler Righello Measure properties of dive segments Scale your dive to screen size Riscala l'immersione per l'ampiezza dello schermo Edit Modifica pN pHe pHe pO air aria EAN%1 EAN1% Bailing out to OC Bailing out in circuito aperto begin Starts with space! inizio end Starts with space! fine ProfilePrintModel unknown sconosciuto Dive #%1 - %2 Immersione #%1 - %2 Max depth: %1 %2 Massima profondità: %1 %2 Duration: %1 min Durata: %1 min Gas Used: Miscela usata: SAC: CAS: Max. CNS: Max. CNS: Weights: Pesi: Notes: Note: Divemaster: Divemaster: Buddy: Compagno: Suit: Muta: Viz: Rating: Valutazione: QObject AIR ARIA Remove this Point Rimuovi questo punto Close Chiudi Average Media Minimum Minimo Maximum Massimo Move the map and double-click to set the dive location RenumberDialog Renumber Rinumera New starting number Nuovo numero di inizio ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm h:mm earlier prima later dopo SubsurfaceAbout About Subsurface Informazioni su Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Software multipiattaforma per gestione immersioni<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Licenza &Website Sito web SubsurfaceWebServices Webservice Webservice Connecting... In connessione... Download finished Download error: %1 Connection Error: Errore di connessione: Invalid user identifier! Identificatore dell'utente non valido! Cannot parse response! Non posso analizzare la risposta! Download Success! Download effettuato! TableView Add Cylinder Aggiungi bombola TankInfoModel Description Descrizione ml ml bar bar ToolTipItem Information Informazione WSInfoModel Description Descrizione kg kg WebServices Webservice Connection Status: Status: Enter your ID here Inserisci il tuo ID qui Download Download User ID ID utente Password Password Upload Invia Operation timed out Transfering data... WeightModel Type Tipo Weight Peso Clicking here will remove this weigthsystem. Facendo click qui si rimuove il sistema di pesi. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Anno > Mese / Viaggio # # Duration Total Durata Totale Average Media Shortest Più corta Longest Più lunga Depth (%1) Average Profondità (%1) Media Minimum Minimo Maximum Massimo SAC (%1) Average SAC (%1) Media Temp. (%1) Average Temp. (%1) Media gettextFromC pascal pascal bar bar psi psi l l cuft piedi cubi m m ft ft lbs lbs kg kg (%s) or (%s) (%s) oder (%s) air aria integrated integrato belt cintura ankle caviglia backplate weight peso della piastra clip-on clip-on Failed to read '%s' Impossibile leggere '%s' Failed to read '%s'. Use import for CSV files. Errore di lettura '%s'. Usa importa per i file CSV. Maximum number of supported columns on CSV import is %d Il numero massimo di colonne supportate nel file CSV è di %d none nessuno deco stop deco stop rbt rbt ascent risalita ceiling ceiling workload carico di lavoro transmitter trasmettitore violation violazione bookmark segnalibro surface superficie safety stop sosta di sicurezza gaschange cambio gas safety stop (voluntary) sosta di sicurezza (facoltativa) safety stop (mandatory) sosta di sicurezza (obbligatoria) deepstop deepstop ceiling (safety stop) ceiling (sosta di sicurezza) divetime durata immersione below floor event showing dive is below deco floor and adding deco time sotto il piano maxdepth profondità massima OLF OLF PO2 PO2 airtime tempo in aria rgbm rgbm heading intestazione tissue level warning avviso del livello dei tessuti non stop time tempo di non stop invalid event number numero evento non valido Unable to create parser for %s %s Impossibile creare un parser per %s %s Error registering the data Errore registrando la data Error parsing the datetime Errore analizzando la data/il tempo Dive %d: %s %d %04d Immersione #%d: %s %d %04d Error parsing the divetime Errore analizzando il tempo di immersione Error parsing the maxdepth Errore analizzando la profondità massima Error parsing the gas mix count Errore analizzando il conteggio della miscela di gas Error obtaining water salinity Errore nell'ottenimento della salinità dell'acqua Error obtaining surface pressure Errore nell'ottenere la pressione superficiale Error parsing the gas mix Errore analizzando la miscela di gas Error parsing the samples Errore analizzando i campioni Event: waiting for user action Evento: in attesa dell' azione dell'utente. model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) modello=%u (0x%08x), firmware=%u (0x%08x), numero di serie=%u (0x%08x) Error registering the event handler. Errore registrando il gestore degli eventi. Error registering the cancellation handler. Errore registrando il gestore della cancellazione. Dive data import error Errore importazione dati immersione Unable to create libdivecomputer context Impossibile creare un contesto libdivecomputer Unable to open %s %s (%s) Impossibile aprire %s %s (%s) Strange percentage reading %s Lettura di strane percentuali %s Failed to parse '%s'. Impossibile analizzare '%s'. Failed to parse '%s' Impossibile analizzare '%s' Database query get_events failed. Interrogazione get_events fallita. Database connection failed '%s'. Connessione al database fallita '%s'. Database query failed '%s'. Interrogazione al database fallita '%s'. Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d Non trovo il gas %d/%d Too many gas mixes Troppe miscele gas %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Piano d'immersione di Subsurface basato su GFlow = %.0f e GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Transizione a %.*f %s in %d:%02d min - tempo %d:%02u su %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Fermati a %.*f %s per %d:%02d min - tempo trascorso %d:%02u su %s Switch gas to %s Cambiare gas a %s Gas consumption: Consumo gas: %.0f%s of %s %.0f%s di %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s⏎ T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Calcolo ceiling %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s⏎ Sosta di sicurezza:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s⏎ Sosta di sicurezza:tempo sconosciuto @ %.0f %s %s Deco:%umin @ %.0f %s %s⏎ Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s⏎ Deco:tempo sconosciuto @ %.0f %s %s In deco %s⏎ In decompressione %s NDL:%umin %s⏎ NDL:%umin %s CNS:%u%% %s⏎ CNS:%u%% %s pO%s:%.2fbar %s⏎ pO%s:%.2fbar %s pN%s:%.2fbar %s⏎ pN%s:%.2fbar %s pHe:%.2fbar %s⏎ pHe:%.2fbar %s MOD:%d%s %s⏎ MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s In decompressione (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 immersioni) %1 %2 (1 dive) %1 %2 (1 immersione) boat barca shore riva drift in corrente deep profondo cavern caverna ice ghiaccio wreck relitto cave grotta altitude altitudine pool piscina lake lago river fiume night notte fresh acqua dolce student allievo photo foto video video instructor istruttore deco deco more than %d days più di %d giorni %dd %dh %dmin %dt %dst %dmin %dh %dmin %dst %dmin for dives # per l'immersione # for selected dives per le immersioni selezionate for dive #%d per l'immersione #%d for selected dive per l'immersione selezionata for all dives per tutte le immersioni (no dives) (nessuna immersione) Sun Dom Mon Lun Tue Mar Wed Mer Thu Gio Fri Ven Sat Sab Jan Gen Feb Feb Mar Mar Apr Apr May Mag Jun Giu Jul Lug Aug Ago Sep Set Oct Ott Nov Nov Dec Dic Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Il File System è quasi pieno Disconnettere/riconnettere il computer subacqueo e cliccare "Riprova" Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: File System pieno Disconnettere/connettere il computer e riprovare Short write to req.txt file Is the Uemis Zurich plugged in correctly? Scrittura breve sul file req.txt Lo Uemis Zurich e' collegato correttamente? unknown sconosciuto Reading %s %s Sto leggendo %s %s data data divelog entry id id del log d'immersione divespot data id data id di divespot more data dive id più id di dati d'immersione wetsuit muta umida semidry semi stagna drysuit Muta stagna shorty shorty vest maglia long john long john jacket GAV full suit muta intera 2 pcs full suit Muta intera 2 pezzi membrane membrana Init Communication Inizializzo la comunicazione Uemis init failed Impossibile inizializzare l'Uemis Start download Inizio download Safety Stop Violation Violazione della tappa di sicurezza Speed Alarm Allarme Risalita Veloce Speed Warning Avviso Risalita Veloce PO2 Green Warning Avviso PO2 Verde PO2 Ascend Warning Avviso Incremento PO2 PO2 Ascend Alarm Allarme Incremento PO2 Tank Pressure Info Informazione Pressione della bombola RGT Warning Avviso RGT RGT Alert Allarme RGT Tank Change Suggested Suggerito Cambio Bombola Depth Limit Exceeded Limite Profondità Superato Max Deco Time Warning Avviso: Massimo tempo di decompressione Dive Time Info Info: Tempo d'Immersione Dive Time Alert Allarme: Tempo d'Immersione Marker Marcatore No Tank Data Nessun dato sulla bombola Low Battery Warning Avviso: Batteria Scarica Low Battery Alert Allarme: Batteria scarica Subsurface-4.0.2/translations/subsurface_nb_NO.ts000066400000000000000000003700771226345450700221530ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importer fil (CSV) ... ... PO2 pO₂ Field Separator Feltseparator Field Configuration Feltkonfigurasjon Import CSV file Importer CSV-fil Time Tid Depth Dybde Temp Temp Cns CNS Stopdepth Stoppdybde Pre-configured imports Prekonfigurerte importer Open CSV Log File Åpne CSV-loggfil CSV Files (*.csv);;All Files(*) CylindersModel Type Type Size Størrelse WorkPress Trykk StartPress Starttrykk EndPress Sluttrykk Switch at Gassbytte ved He% He% O O Clicking here will remove this cylinder. Klikk her for å fjerne denne flaska. Cylinder cannot be removed Flaska kan ikke fjernes This gas in use. Only cylinders that are not used in the dive can be removed. Denne gassen er i bruk. Du kan bare fjerne flasker som ikke er i bruk. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Rediger navn for dykkecomputer Remove the selected Dive Computer? Fjerne den valgte computeren? Are you sure that you want to remove the selected dive computer? Vil du fjerne den valgte computeren? DiveComputerModel Model Modell Device ID Enhets-ID Nickname Navn Clicking here will remove this divecomputer. Klikk her for å fjerne denne computeren. DiveItem l/min l/min cuft/min ft³/min DiveListView Show Search Box Vis søkeboks expand all vis alle turer collapse all slå sammen alle turer collapse others slå sammen andre turer remove dive(s) from trip fjern dykk fra tur create new trip above legg til ny tur over denne add dive(s) to trip immediately above legg dykk til turen over merge trip with trip above slå sammen tur med turen over merge trip with trip below slå sammen tur med turen under delete dive(s) slett dykk mark dive(s) invalid merk dykk som skjult save As lagre som export As UDDF eksporter som UDDF shift times forskyvning av tidspunkter upload dive(s) to divelogs.de last opp til divelogs.de Save Dives As... Lagre dykk som... Save File as Lagre som UDDF files (*.uddf *.UDDF) UDDF-filer (*.uddf *.UDDF) merge selected dives slå sammen valgte dykk DivePlanner Bottom SAC SAC på bunn SAC on DECO Stop SAC under deko GFHigh GF høy GFLow GF lav Last Stop at 6m Siste stopp på 6m Start Time Starttid ATM Pressure Atmosfæretrykk DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Handler Position-feil One or more of your stops will be lost with this operations, Please, remove them first. En eller flere av stoppene dine vil bli tapt hvis du fortsetter. Fjern dem før du gjør dette. DivePlannerPointsModel AIR Luft Final Depth Dybde Duration Varighet Used Gas Gass CC Set Point CC setpoint Discard the Plan? Forkaste planen? You are about to discard your plan. Du er i ferd med å forkaste planen. DivePlannerWidget Dive Planner Points Punkter i dykkeplan Available Gases Tilgjengelige gasser add dive data point legg til datapunkt DiveTripModel # # date dato m m ft ft min min kg kg lbs pund suit drakt cyl flaske location sted SAC SAC OTU OTU maxCNS maks CNS DivelogsDeWebServices Invalid response from server Ugyldig svar fra tjener Expected XML tag 'DiveDateReader', got instead '%1 Forventet XML-tag 'DiveDateReader', men fikk '%1 Expected XML tag 'DiveDates' not found Fant ikke XML-tag 'DiveDates' som forventet Malformed XML response. Line %1: %2 Feil formattert XML-svar. Linje %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Ferdig Uploading dive list... Laster opp liste over dykk... Downloading dive list... Laster ned liste over dykk... Downloading %1 dives... Laster ned %1 dykk... Download finished - %1 Nedlasting er ferdig - %1 Corrupted download Nedlastingen er skadet The archive could not be opened: %1 Arkivet kunne ikke åpnes: %1 Upload failed Opplasting feilet Upload successful Ferdig å laste opp Login failed Innlogging feilet Cannot parse response Kan ikke lese svar Error: %1 Feil: %1 Upload finished Opplasting er ferdig DownloadFromDCWidget OK OK Error Feil Retry Prøv igjen Choose file for divecomputer download logfile Log files (*.log) Warning Advarsel Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Last ned fra dykkecomputer Vendor Leverandør Dive Computer Dykkecomputer Device or Mount Point Enhet eller disk ... ... Force download of all dives Tvungen nedlasting av alle dykk Always prefer downloaded dives Foretrekk alltid nedlastede dykk OK OK Cancel Avbryt Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations Rediger valgte steder MainTab Dive Notes Dykk Location Sted Coordinates Koordinater Divemaster Dykkeleder Buddy Buddy Start time Starttid Air temp Lufttemp. Water temp Vanntemp. Tags Emner Rating Vurdering Visibility Sikt Suit Drakt Notes Notater Equipment Utstyr Dive Info Informasjon Date Dato Interval Intervall Gases Used Gasser Gas Consumed Gasskonsum SAC SAC Max. Depth Maksdybde Ave. Depth Snittdybde OTU OTU Air Pressure Lufttrykk Air Temperature Lufttemperatur Water Temperature Vanntemperatur Dive Time Dykketid Salinity Saltholdighet Stats Statistikk Depth Dybde Temperature Temperatur Duration Varighet Total Time Total tid Dives Dykk Cylinders Flasker Add Cylinder Legg til flaske Weights Vekter Add Weight System Legg til vektsystem Trip Location Tursted Trip Notes Turnotater Save Lagre Cancel Avbryt This trip is being edited. Denne turen redigeres. Multiple dives are being edited. Flere dykk redigeres. This dive is being edited. Dette dykket redigeres. /min /min unknown ukjent N N S S E Ø W V MainWindow Filter Filter &File &Fil &Log &Logg &View &Vis &Help &Hjelp &Import &Importer &New logbook &Ny loggbok New Ny Ctrl+N Ctrl+N &Open logbook Åpne l&oggbok Open Åpne Ctrl+O Ctrl+O &Save Lagre Save Lagre Ctrl+S Ctrl+S Save as Lagre som Ctrl+Shift+S Ctrl+Shift+S Close Lukk Ctrl+W Ctrl+W Import Files Importer filer Ctrl+I Ctrl+I Export &UDDF Eksporter &UDDF Ctrl+U Ctrl+U &Print Skriv ut Ctrl+, Ctrl+, &Quit Avslutt Import from &dive computer Importer fra &dykkecomputer Import &GPS data from Subsurface Service Importer &GPS-data fra Subsurface-tjenesten Ctrl+G Ctrl+G &Edit Device Names Rediger &enhetsnavn Ctrl++ Ctrl++ &Renumber Nummere&r på nytt Ctrl+R Ctrl+R Toggle &Zoom Bytt &zoom &Yearly Statistics Årlig statistikk Ctrl+Y Ctrl+Y Dive List Liste over dykk Profile Profil Info Info All Alle User &Manual Bruker&manual Globe Globus P&lan Dive P&lanlegg dykk Ctrl+L Ctrl+L Import CSV Importer CSV Import CS&V Importer CS&V Import from Divelogs.de Importer fra divelogs.de Ctrl+P Ctrl+P Preferences Valg Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Nytt dyk Auto Group Autogruppering Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Forrige DC Left Venstre Next DC Neste DC Right Høyre Select Events Velg hendelser Input Plan Legg inn plan About Subsurface Om Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Åpne fil Please save or cancel the current dive edit before closing the file. Lagre eller avbryt redigeringen før du lukker fila. Please save or cancel the current dive edit before trying to plan a dive. Lagre eller avbryt redigeringa før du planlegger et dykk. Please save or cancel the current dive edit before trying to add a dive. Lagre eller avbryt redigeringa før du legger til et nytt dykk. User Manual Brukermanual Cannot find the Subsurface manual Finner ikke manualen Do you want to save the changes you made in the file %1? Vil du lagre endringene i %1? Do you want to save the changes you made in the datafile? Vil du lagre endringene? Save Changes? Lagre endringer? Changes will be lost if you don't save them. Endringer vil gå tapt hvis du ikke lagrer. First finish the current edition before trying to do another. Avslutt redigeringa før du redigerer et nytt. Save File as Lagre som Warning Advarsel Please save or cancel the current dive edit before opening a new file. Lagre eller avbryt redigeringa før du åpner en ny fil. UDDF files (*.uddf *.UDDF) UDDF-filer (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML-filer (*.ssrf *.xml *.XML) PreferencesDialog Defaults Standardvalg Units Enheter Graph Graf Language Språk Lists and Tables Lister og tabeller Font Skrifttype Font size Skriftstørrelse Dives Dykk Default Dive file Standard dykkelogg ... ... Display Invalid Vis skjulte Default Cylinder Standardflaske Use Default Cylinder Bruk standardflaske System System Metric Metrisk Imperial Britiske mål Personalize Personaliser Depth Dybde meter meter feet fot bar bar psi psi liter liter cu ft ft³ celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Standard for system Filter Filter Pressure Trykk Volume Volum Temperature Temperatur Weight Vekt lbs pund Time units Tidsenheter Ascent/Descent speed denominator Enhet for opp-/nedstigningshastighet Minutes Minutter Seconds Sekunder Show Vis threshold grenseverdi pHe pHe MOD MOD max ppO₂ maks ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Tak fra dykkecomputer draw ceiling red vis tak med rød farge Calculated ceiling Kalkulert tak show all tissues vis alle vev 3m increments 3-meterstrinn Calculate NDL/TTS Regn ut NDL/TTS GFLow at max depth GF lav ved maksdybde Misc Ymse Preferences Valg SAC SAC GFLow GF lav GFHigh GF høy Restart required Programmet må startes på nytt To correctly load a new language you must restart Subsurface. For å bytte språk må du starte Subsurface på nytt. Open Default Log File Åpne standardlogg Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML-filer (*.ssrf *.xml *.XML) PrintDialog &Preview Forhåndsvisning P&rint Skriv ut &Close Lukk Print Skriv ut PrintLayout Dive# Dykk nr. Date Dato Depth Dybde Duration Varighet Master Master Buddy Buddy Location Sted PrintOptions Print options Utskriftsvalg Print only selected dives Skriv ut valgte dykk Print in color Fargeutskrift Print type Utskriftstype 6 dives per page 6 dykk per side 2 dives per page 2 dykk per side Table print Tabellutskrift Ordering Sortering Profile on top Profil øverst Notes on top Notater øverst Sizing heights (% of layout) Størrelse på høyder (i % av layout) Profile height (43% - 85%) Profilhøyder (43% - 85%) Other data height (8% - 17%) Høyde på andre data (8% - 17%) Notes height (0% - 52%) Notathøyde (0% -52%) 0 0 ProfileGraphicsView Add Gas Change Legg til gassbytte Add Bookmark Legg til bokmerke Remove Event Fjern hendelse Hide similar events Skjul lignende hendelser Unhide all events Hide events Skjul hendelser Hide all %1 events? Skjul alle %1 hendelser? Remove the selected event? Fjern den valgte hendelsen? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer ukjent dykkecomputer Set Duration: 10 minutes Varighet: 10 minutter Scale Målestokk Ruler Linjal Measure properties of dive segments Mål egenskaper ved dykk Scale your dive to screen size Skaler dykket til skjermstørrelsen Edit Rediger pN pN pHe pHe pO pO air luft EAN%1 EAN%1 Bailing out to OC Bytter til OC begin Starts with space! start end Starts with space! slutt ProfilePrintModel unknown ukjent Dive #%1 - %2 Dykk nr. %1- %2 Max depth: %1 %2 Max dybde: %1 %2 Duration: %1 min Varighet: %1 min Gas Used: Gass brukt: SAC: SAC: Max. CNS: Mac. CNS: Weights: Vekter: Notes: Notater: Divemaster: Dykkeleder: Buddy: Buddy: Suit: Drakt: Viz: Sikt: Rating: Vurdering: QObject AIR Luft Remove this Point Fjern dette punktet Close Lukk Average Gjennomsnitt Minimum Minimum Maximum Maksimum Move the map and double-click to set the dive location Finn sted i kartet og dobbeltklikk for å sette posisjon RenumberDialog Renumber Oppdater nummerering New starting number Nytt startnummer ShiftTimesDialog Shift selected times Flytt valgte tidspunkter Shift times of selected dives by Flytt valgte tidspunkter med h:mm h:mm earlier tidligere later senere SubsurfaceAbout About Subsurface Om Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multiplattform dykkelogg<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel med flere, 2011, 2012, 2013</span> &License &Lisens &Website &Webside SubsurfaceWebServices Webservice Nettjeneste Connecting... Kobler til... Download finished Nedlasting er ferdig Download error: %1 Feil ved nedlasting: %1 Connection Error: Feil med forbindelse Invalid user identifier! Ugyldig bruker-ID! Cannot parse response! Kan ikke lese svar! Download Success! Ferdig å laste ned TableView Add Cylinder Legg til flaske TankInfoModel Description Beskrivelse ml ml bar bar ToolTipItem Information Informasjon WSInfoModel Description Beskrivelse kg kg WebServices Webservice Connection Forbindelse til nettjeneste Status: Status: Enter your ID here Skriv ID-en din her Download Last ned User ID Bruker-ID Password Passord Upload Last opp Operation timed out Handlingen fikk tidsavbrudd Transfering data... Overfører data... WeightModel Type Type Weight Vekt Clicking here will remove this weigthsystem. Klikk her for å fjerne dette vektsystemet kg lbs ft m YearlyStatisticsModel Year > Month / Trip År > Måned / Tur # # Duration Total Varighet Total Average Snitt Shortest Kortest Longest Lengst Depth (%1) Average Dybde (%1) Snitt Minimum Minimum Maximum Maksimum SAC (%1) Average SAC (%1) Snitt Temp. (%1) Average Temp. (%1) Snitt gettextFromC pascal pascal bar bar psi psi l l cuft ft³ m m ft ft lbs pund kg kg (%s) or (%s) (%s) eller (%s) air luft integrated integrert bly belt vektbelte ankle ankelvekt backplate weight p-vekt clip-on clip-on Failed to read '%s' Kunne ikke åpne '%s' Failed to read '%s'. Use import for CSV files. Klarte ikke å lese '%s'. Bruk CSV-importen isteden. Maximum number of supported columns on CSV import is %d Maks antall kolonner i CSV-importen er %d none ingen deco stop dekostopp rbt rbt ascent oppstigning ceiling tak workload arbeidsbelastning transmitter sender violation brudd bookmark bokmerke surface overflate safety stop sikkerhetsstopp gaschange gassbytte safety stop (voluntary) sikkerhetsstopp (frivillig) safety stop (mandatory) sikkerhetsstopp (obligatorisk) deepstop dypstopp ceiling (safety stop) tak (sikkerhetsstopp) divetime dykketid below floor event showing dive is below deco floor and adding deco time under tak maxdepth maksdybde OLF OLF PO2 pO₂ airtime lufttid rgbm rgbm heading retning tissue level warning Advarsel: nivå i vev non stop time tid uten stopp invalid event number ugyldig hendelsesnummer Unable to create parser for %s %s Kunne ikke lage parser for %s %s Error registering the data Feil ved registrering av data Error parsing the datetime Feil ved lesing av dato Dive %d: %s %d %04d Dykk %d: %s %d %04d Error parsing the divetime Feil ved lesing av dykketid Error parsing the maxdepth Feil ved lesing av maksdybde Error parsing the gas mix count Feil ved lesing av gassmiksantall Error obtaining water salinity Feil ved lesing av salthetsgrad Error obtaining surface pressure Klarte ikke å hente overflatetrykk Error parsing the gas mix Feil ved lesing av gassmiks Error parsing the samples Feil ved lesing av detaljer Event: waiting for user action Hendelse: Venter på bruker model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) modell=%u (0x%08x), firmware=%u (0x%08x), serienr=%u (0x%08x) Error registering the event handler. Feil ved registrering av hendelseshåndterer. Error registering the cancellation handler. Feil ved registrering av avbruddshåndterer. Dive data import error Feil ved import av dykkedata Unable to create libdivecomputer context Kunne ikke opprette kontekst for libdivecomputer Unable to open %s %s (%s) Fikk ikke åpnet %s %s (%s) Strange percentage reading %s Rar lesing av prosent %s Failed to parse '%s'. Kunne ikke lese '%s'. Failed to parse '%s' Kunne ikke lese '%s' Database query get_events failed. Databasespørring get_events feilet. Database connection failed '%s'. Databaseforbindelse feilet '%s'. Database query failed '%s'. Databasespørring feilet '%s'. Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d Finner ikke gassen %d/%d Too many gas mixes For mange gassmikser %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface dykkeplan basert på GF lav = %.0f og GF høy = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Overgang til %.*f %s i %d:%02d min - kjøretid %d:%02u på %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Bli ved %.*f %s i %d:%02d min - kjøretid %d:%02u på %s Switch gas to %s Bytt gass til %s Gas consumption: Gasskonsum: %.0f%s of %s %.0f%s på %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Kalkulert tak %.0f %s %s Tissue %.0fmin: %.0f %s %s Vev %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Sikkerhetsstopp:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Sikkerhetsstopp: ukjent tid @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko:ukjent tid @ %.0f %s %s In deco %s I deko %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deko:%umin @ %.0f %s (kalk.) %s In deco (calc) %s I deko (kalk.) %s NDL:%umin (calc) %s NDL:%umin (kalk.) %s TTS:%umin (calc) %s TTS:%umin (kalk.) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 dykk) %1 %2 (1 dive) %1 %2 (1 dykk) boat båt shore landdykk drift strømdykk deep dypdykk cavern hule ice isdykk wreck vrakdykk cave grotte altitude høydedykk pool basseng lake innsjø river elv night nattdykk fresh ferskvann student elev photo foto video video instructor instruktør deco deko more than %d days mer enn %d dager %dd %dh %dmin %dt %dt %dmin %dh %dmin %dt %dmin for dives # for dykk # for selected dives for valgte dykk for dive #%d for dykk #%d for selected dive for valgte dykk for all dives for alle dykk (no dives) (ingen dykk) Sun søn Mon man Tue tir Wed ons Thu tor Fri fre Sat lør Jan jan Feb feb Mar mar Apr apr May mai Jun jun Jul jul Aug aug Sep sep Oct okt Nov nov Dec des Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Filsystem er nesten fullt Koble fra og til dykkecomputeren og klikk 'Prøv igjen' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Fullt filsystem Koble fra og til dykkecomputeren og prøv igjen Short write to req.txt file Is the Uemis Zurich plugged in correctly? Fikk ikke skrevet ferdig req.txt Er Uemis Zurich plugget i ordentlig? unknown ukjent Reading %s %s Leser %s %s data data divelog entry id id for oppføring i logg divespot data id id for dykkesteddata more data dive id mer data dykke-id wetsuit våtdrakt semidry semidry drysuit tørrdrakt shorty shorty vest vest long john ermeløs våtdrakt jacket overdel full suit hel drakt 2 pcs full suit todelt drakt membrane skalldrakt Init Communication Start kommunikasjon Uemis init failed Klarer ikke å lese fra Uemis Start download Start nedlasting Safety Stop Violation Brudd på sikkerhetsstopp Speed Alarm Alarm: oppstigningshastighet Speed Warning Advarsel: oppstigningshastighet PO2 Green Warning Advarsel: grønn / pO₂ PO2 Ascend Warning Advarsel: oppstigning / pO₂ PO2 Ascend Alarm Alarm: oppstigning / pO₂ Tank Pressure Info Info: tanktrykk RGT Warning Advarsel: gjenværende gasstid RGT Alert Alarm: gjenværende gasstid Tank Change Suggested Tankbytte foreslått Depth Limit Exceeded Maksgrense for dybde overskredet Max Deco Time Warning Advarsel: maks dekotid Dive Time Info Info: dykketid Dive Time Alert Alarm: dykketid Marker Markering No Tank Data Ingen tankinformasjon Low Battery Warning Advarsel: dårlig batteri Low Battery Alert Alarm: dårlig batteri Subsurface-4.0.2/translations/subsurface_nl_NL.ts000066400000000000000000003733451226345450700221630ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Bestand Importeren (CSV) ... ... PO2 PO2 Field Separator Scheiding tussen velden Field Configuration Veld Configuratie Import CSV file CSV bestand importeren Time Tijd Depth Diepte Temp Temperatuur Cns Cns Stopdepth Stop diepte Pre-configured imports Vooraf ingestelde import Open CSV Log File CSV logboek openen CSV Files (*.csv);;All Files(*) CSV Bestanden (*.csv);;Alle Bestanden (*) CylindersModel Type Type Size Grootte WorkPress Werkdruk StartPress Startdruk EndPress Einddruk Switch at Wissel op He% He% O O Clicking here will remove this cylinder. Klik hier om de fles te verwijderen. Cylinder cannot be removed Fles kan niet verwijderd worden This gas in use. Only cylinders that are not used in the dive can be removed. Dit gas wordt gebruikt. Enkel flessen die niet gebruikt worden kunnen verwijderd worden. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Bewerk duikcomputer apparaatnamen Remove the selected Dive Computer? Geselecteerde duikcomputer verwijderen? Are you sure that you want to remove the selected dive computer? Bent u zeker dat u de geselecteerde duikcomputer wilt verwijderen? DiveComputerModel Model Model Device ID Toestel ID Nickname Apparaatnaam Clicking here will remove this divecomputer. Klik hier om deze duikcomputer te verwijderen. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Zoekvak Tonen expand all alles uitklappen collapse all alles inklappen collapse others andere samenklappen remove dive(s) from trip duik(en) uit trip verwijderen create new trip above nieuwe duik aanmaken hierboven add dive(s) to trip immediately above duik(en) toevoegen aan de trip hierboven merge trip with trip above trip samenvoegen met trip hierboven merge trip with trip below trip samenvoegen met trip hieronder delete dive(s) duik(en) verwijderen mark dive(s) invalid markeer duik(en) als ongeldig save As bewaren Als export As UDDF Als UDDF exporteren shift times tijdstippen verschuiven upload dive(s) to divelogs.de duik(en) laden op divelogs.de Save Dives As... Duiken Bewaren Als Save File as Bestand Bewaren als UDDF files (*.uddf *.UDDF) UDDF bestanden (*.uddf *.UDDF) merge selected dives geselecteerde duiken samenvoegen DivePlanner Bottom SAC Gasverbruik (bodem) SAC on DECO Stop Gasverbruik tijdens decostop GFHigh GFHigh GFLow GFLow Last Stop at 6m Laatste stop op 6m Start Time Starttijd ATM Pressure Druk (atm) DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Geleider Positie Fout One or more of your stops will be lost with this operations, Please, remove them first. Een of meer stops zullen verloren gaan. Verwijder deze eerst. DivePlannerPointsModel AIR AIR Final Depth Eind diepte Duration Duur Used Gas Verbruikt Gas CC Set Point CC Set Point Discard the Plan? Plan verwijderen? You are about to discard your plan. U staat op het punt het plan te verwijderen DivePlannerWidget Dive Planner Points Duikplanner punten Available Gases Beschikbare Gassen add dive data point duik punt toevoegen DiveTripModel # Nr. date datum m m ft ft min min kg kg lbs US pond suit duikpak cyl fles location locatie SAC Gasverbruik OTU OTU maxCNS max. CNS DivelogsDeWebServices Invalid response from server Ongeldig antwoord van de server Expected XML tag 'DiveDateReader', got instead '%1 XML etiket 'DiveDateReader' werd verwacht, maar kreeg '%1 Expected XML tag 'DiveDates' not found Verwacht XML etket 'DiveDates' werd niet gevonden Malformed XML response. Line %1: %2 Slecht gevormd XML antwoord. Lijn %1: %2 no dives were selected geen duiken geselecteerd failed to create zip file for upload: %1 kan zip bestand voor opladen niet aanmaken: %1 cannot create temporary file: %1 kan tijdelijk bestand niet aanmaken: %1 internal error: %1 Interne fout: %1 internal error interne fout Done Klaar Uploading dive list... Duiklijst wordt opgeladen... Downloading dive list... Duiklijst wordt geladen... Downloading %1 dives... %1 duiken worden geladen... Download finished - %1 Download klaar - %1 Corrupted download Beschadigde download The archive could not be opened: %1 Het archief kon niet geopend worden: %1 Upload failed Opladen mislukt Upload successful Opladen gelukt Login failed Login mislukt Cannot parse response Kan antwoord niet correct ontleden Error: %1 Fout: %1 Upload finished Opladen klaar DownloadFromDCWidget OK OK Error Fout Retry Opnieuw Choose file for divecomputer download logfile Kies een bestand om duikcomputer log te downloaden Log files (*.log) Log bestanden (*.log) Warning Waarschuwing Saving the libdivecomputer dump will NOT download dives to the dive list. Duiken worden NIET in de duiklijst geladen als u de libdivecomputer dump opslaat. Choose file for divecomputer binary dump file Kies een bestand voor de duikcomputer binaire dump Dump files (*.bin) Dump bestanden (*.bin) DownloadFromDiveComputer Download From Dive Computer Download uit duikcomputer Vendor Merk Dive Computer Duikcomputer Device or Mount Point Toestel of Aankoppelpunt ... ... Force download of all dives Forceer download van alle duiken Always prefer downloaded dives Altijd gedownloade duiken gebruiken OK OK Cancel Annuleren Save libdivecomputer logfile libdivecomputer logbestand opslaan Save libdivecomputer dumpfile libdivecomputer dump opslaan GlobeGPS Edit Selected Dive Locations Bewerk geselecteerde duiklocaties MainTab Dive Notes Duiknotities Location Locatie Coordinates Coördinaten Divemaster Duikleider Buddy Buddy Start time Starttijd Air temp Lucht temp Water temp Water temp Tags Trefwoorden Rating Waardering Visibility Zicht Suit Pak Notes Notities Equipment Uitrusting Dive Info Duikinformatie Date Datum Interval Interval Gases Used Gebruikte gassen Gas Consumed Gasverbruik SAC Gasverbruik Max. Depth Max. Diepte Ave. Depth Gem. Diepte OTU OTU Air Pressure Luchtdruk Air Temperature Luchttemperatuur Water Temperature Watertemperatuur Dive Time Duiktijd Salinity Zoutgehalte Stats Statistieken Depth Diepte Temperature Temperatuur Duration Duur Total Time Totale tijd Dives Duiken Cylinders Flessen Add Cylinder Fles toevoegen Weights Gewichten Add Weight System Gewichtssysteem toevoegen Trip Location Trip locatie Trip Notes Trip Nota's Save Opslaan Cancel Annuleren This trip is being edited. Deze trip wordt bewerkt. Multiple dives are being edited. Meerdere duiken worden bewerkt. This dive is being edited. Deze duik wordt bewerkt. /min /min unknown onbekend N N S Z E O W W MainWindow Filter Filter &File Bestand &Log &Log &View Toon &Help &Help &Import &Importeren &New logbook &Nieuw logboek New Nieuw Ctrl+N Ctrl+N &Open logbook Logboek &Openen Open Open Ctrl+O Ctrl+O &Save Bewaar Save Opslaan Ctrl+S Ctrl+S Save as Opslaan als... Ctrl+Shift+S Ctrl+Shift+S Close Sluiten Ctrl+W Ctrl+W Import Files Bestanden importeren Ctrl+I Ctrl+I Export &UDDF &UDDF Exporteren Ctrl+U Ctrl+U &Print Afdrukken Ctrl+, Ctrl+, &Quit Afsluiten Import from &dive computer Importeren uit &duikcomputer Import &GPS data from Subsurface Service &GPS gegevens importeren van Subsurface Service Ctrl+G Ctrl+G &Edit Device Names Namen toestellen wijzigen Ctrl++ Ctrl++ &Renumber Hernummeren Ctrl+R Ctrl+R Toggle &Zoom &Zoom in-/uitschakelen &Yearly Statistics Jaarlijkse Statistieken Ctrl+Y Ctrl+Y Dive List Duiklijst Profile Profiel Info Informatie All Alle User &Manual Handleiding Globe Wereldbol P&lan Dive Duik P&lannen Ctrl+L Ctrl+L Import CSV CSV importeren Import CS&V CS&V importeren Import from Divelogs.de Importeren van Divelogs.de Ctrl+P Ctrl+P Preferences Instellingen Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Duik Toevoegen Auto Group Automatisch Groeperen Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Vorige DC Left Links Next DC Volgende DC Right Rechts Select Events gebeurtenissen selecteren Input Plan Voer plan in About Subsurface Over Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Bestand openen Please save or cancel the current dive edit before closing the file. Bewaar of maak de huidige wijziging ongedaan voor U het bestand sluit. Please save or cancel the current dive edit before trying to plan a dive. Bewaar of maak de huidige wijziging ongedaan voor U een duik plant. Please save or cancel the current dive edit before trying to add a dive. Bewaar of maak de huidige wijziging ongedaan voor U een duik toevoegt. User Manual Handleiding Cannot find the Subsurface manual De handleiding kan niet gevonden worden Do you want to save the changes you made in the file %1? Wilt u de wijzigingen in bestand %1 bewaren? Do you want to save the changes you made in the datafile? Wilt u de wijzigingen bijhouden in het bestand? Save Changes? Aanpassingen opslaan? Changes will be lost if you don't save them. Wijzigingen gaan verloren als u deze niet bewaart. First finish the current edition before trying to do another. Rond de huidige wijziging af vooraleer een volgende te beginnen. Save File as Bestand Bewaren als Warning Waarschuwing Please save or cancel the current dive edit before opening a new file. Bewaar of maak de huidige wijziging ongedaan voor u een nieuw bestand opent. UDDF files (*.uddf *.UDDF) UDDF bestanden (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML bestanden (*.ssrf *.xml *.XML) PreferencesDialog Defaults Standaardinstellingen Units Eenheden Graph Grafiek Language Taal Lists and Tables Lijsten en Tabellen Font Lettertype Font size Lettertype grootte Dives Duiken Default Dive file Standaard Duikbestand ... ... Display Invalid Ongeldig Scherm Default Cylinder Standaard fles Use Default Cylinder Gebruik standaard fles System Systeem Metric Metrisch Imperial Imperiaal Personalize Personaliseren Depth Diepte meter meter feet voet bar bar psi psi liter liter cu ft cu ft celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Systeem Standaardinstelling Filter Filter Pressure Druk Volume Volume Temperature Temperatuur Weight Gewicht lbs US pond Time units Tijdseenheden Ascent/Descent speed denominator Stijg-/daalsnelheid noemer Minutes Minuten Seconds Seconden Show Toon threshold drempelwaarde pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Plafond gerapporteerd door duikcomputer draw ceiling red plafond in het rood tekenen Calculated ceiling Berekend plafond show all tissues alle compartimenten tonen 3m increments 3m stappen Calculate NDL/TTS NDL/TTS Berekenen GFLow at max depth GFLow op max diepte Misc Allerlei Preferences Instellingen SAC Gasverbruik GFLow GFLow GFHigh GFHigh Restart required Herstarten noodzakelijk To correctly load a new language you must restart Subsurface. Om een nieuwe taal te laden dient u Subsurface te herstarten. Open Default Log File Standaard Logboek Openen Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML bestanden (*.ssrf *.xml *.XML) PrintDialog &Preview Voorbeeldweergave P&rint Afd&rukken &Close Sluiten Print Afdrukken PrintLayout Dive# Duik nr. Date Datum Depth Diepte Duration Duur Master Master Buddy Buddy Location Locatie PrintOptions Print options Afdrukopties Print only selected dives Alleen geselecteerde duiken afdrukken Print in color Afdrukken in kleur Print type Afdruktype 6 dives per page 6 duiken per bladzijde 2 dives per page 2 duiken per bladzijde Table print Afdrukken in tabelvorm Ordering Volgorde Profile on top Profiel bovenaan Notes on top Notities bovenaan Sizing heights (% of layout) Instellen hoogtes (% van opmaak) Profile height (43% - 85%) Profiel hoogte (43% - 85%) Other data height (8% - 17%) Andere gegevens hoogte (8% - 17%) Notes height (0% - 52%) Nota's hoogte (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Gaswissel toevoegen Add Bookmark Bladwijzer toevoegen Remove Event Gebeurtenis verwijderen Hide similar events Gelijkaardige gebeurtenissen verbergen Unhide all events Toon alle gebeurtenissen Hide events Gebeurtenissen verbergen Hide all %1 events? Alle %1 gebeurtenissen verbergen? Remove the selected event? Geselecteerde gebeurtenis verwijderen? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer onbekende duikcomputer Set Duration: 10 minutes Duur instellen: 10 minuten Scale Schaal Ruler Meetlat Measure properties of dive segments Eigenschappen van duiksegmenten berekenen Scale your dive to screen size Duik aan schermgrootte aanpassen Edit Bewerken pN pN pHe pHe pO pO air lucht EAN%1 EAN%1 Bailing out to OC Schakel om naar OC begin Starts with space! begin end Starts with space! eind ProfilePrintModel unknown onbekend Dive #%1 - %2 Duik #%1 - %2 Max depth: %1 %2 Max diepte: %1 %2 Duration: %1 min Duur: %1 min Gas Used: Verbruikt gas: SAC: Gasverbruik: Max. CNS: Max. CNS: Weights: Gewichten: Notes: Nota's: Divemaster: Divemaster: Buddy: Buddy: Suit: Duikpak: Viz: Zichtbaarheid: Rating: Beoordeling: QObject AIR AIR Remove this Point Dit punt verwijderen Close Sluiten Average Gemiddelde Minimum Kleinste Maximum Grootste Move the map and double-click to set the dive location Verplaats de kaart en dubbelklikk om de duiklocatie te selecteren RenumberDialog Renumber Hernummeren New starting number Nieuw beginnummer ShiftTimesDialog Shift selected times Geselecteerde tijdsstippen verschuiven Shift times of selected dives by Geselecteerde tijdsstippen verschuiven met h:mm u:mm earlier vroeger later later SubsurfaceAbout About Subsurface Over Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Licentie &Website &Website SubsurfaceWebServices Webservice Webservice Connecting... Verbinding wordt opgezet. Download finished Download klaar Download error: %1 Download fout: %1 Connection Error: Verbindingsfout: Invalid user identifier! Ongeldige gebruikersidentificatie Cannot parse response! Kan antwoord niet parsen! Download Success! Laden succesvol voltooid! TableView Add Cylinder Fles toevoegen TankInfoModel Description Beschrijving ml ml bar bar ToolTipItem Information Informatie WSInfoModel Description Beschrijving kg kg WebServices Webservice Connection Verbinding met Webservice Status: Status: Enter your ID here Geef uw ID in Download Downloaden User ID Gebruikers ID Password Wachtwoord Upload Uploaden Operation timed out Operatie duurt te lang Transfering data... Gegevens worden overgebracht... WeightModel Type Type Weight Gewicht Clicking here will remove this weigthsystem. Hier klikken om het gewichtssysteem te verwijderen kg lbs ft m YearlyStatisticsModel Year > Month / Trip Jaar > Maand / Trip # Nr. Duration Total Duur Totaal Average Gemiddeld Shortest Kortste Longest Langste Depth (%1) Average Diepte (%1) Gemiddeld Minimum Minimum Maximum Maximum SAC (%1) Average Gasverbruik (%1) Gemiddeld Temp. (%1) Average Temp. (%1) Gemiddeld gettextFromC pascal Pa bar bar psi psi l l cuft cuft m m ft ft lbs US pond kg kg (%s) or (%s) (%s) of (%s) air lucht integrated Geïntegreerd belt riem ankle enkel backplate weight backplate-gewicht clip-on clip-on Failed to read '%s' Fout bij lezen van '%s' Failed to read '%s'. Use import for CSV files. '%s' lezen is mislukt. Gebruik Importeren voor CSV bestanden. Maximum number of supported columns on CSV import is %d Het maximum aantal kolommen bij CSV importeren is %d none geen deco stop decompressiestop rbt RBT ascent opstijging ceiling plafond workload werklast transmitter zender violation schending bookmark bladwijzer surface oppervlakte safety stop veiligheidsstop gaschange gaswissel safety stop (voluntary) veiligheidsstop (vrijwillig) safety stop (mandatory) veiligheidsstop (verplicht) deepstop diepe stop ceiling (safety stop) plafond (veiligheidsstop) divetime duiktijd below floor event showing dive is below deco floor and adding deco time onder de vloer maxdepth Max. diepte OLF OLF PO2 PO2 airtime resterende luchttijd rgbm RGBM heading koers tissue level warning waarschuwing stikstofbelasting non stop time nultijd invalid event number ongeldig event-nummer Unable to create parser for %s %s Kan geen parser creëren voor %s %s Error registering the data Fout bij het registreren van de data Error parsing the datetime Fout bij verwerken van de datum en tijd Dive %d: %s %d %04d Duik nr. %d: %s %d %04d Error parsing the divetime Fout bij verwerken van de duikduur Error parsing the maxdepth Fout bij het verwerken van de maximum duikdiepte Error parsing the gas mix count Fout bij het verwerken van het aantal gasmengsels Error obtaining water salinity Fout bij het verkrijgen van het zoutgehalte Error obtaining surface pressure Fout bij bekomen van oppervlaktedruk Error parsing the gas mix Fout bij het verwerken van het gasmengsel Error parsing the samples Fout bij het verwerken van de samples Event: waiting for user action Event: wachten op handeling van gebruiker model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serienummer=%u (0x%08x) Error registering the event handler. Fout bij het registreren van de event handler. Error registering the cancellation handler. Fout bij het registreren van de cancellation handler. Dive data import error Fout bij importeren van duikdata Unable to create libdivecomputer context Kan geen context creëren voor libdivecomputer Unable to open %s %s (%s) Fout bij openen van %s %s (%s) Strange percentage reading %s Vreemde percentage %s Failed to parse '%s'. Fout bij analyseren van '%s'. Failed to parse '%s' Fout bij analyse van '%s' Database query get_events failed. Database-query get_events mislukt. Database connection failed '%s'. Databaseconnectie is mislukt '%s'. Database query failed '%s'. Database-query mislukt: '%s' Can't open stylesheet %s Kan de stylesheet %s niet openen EAN%d EAN%d Can't find gas %d/%d Kan gasmengsel %d/%d niet vinden Too many gas mixes Teveel gasmengsels %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface duikplan Gebaseerd op GFlow = %.0f en GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Ga naar %.*f %s over %d:%02d min - looptijd %d:%02u op %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Blijft op %.*f %s gedurende %d:%02d min - looptijd %d:%02u op %s Switch gas to %s Gaswissel naar %s Gas consumption: Gasverbruik: %.0f%s of %s %.0f%s %s ean EAN %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Berekend plafond %.0f %s %s Tissue %.0fmin: %.0f %s %s Compartiment %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Veiligheidsstop:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s gasverbruik:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Veiligheidsstop:onbek.tijd @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:onbek.tijd @ %.0f %s %s In deco %s In deco %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (berekend) %s In deco (calc) %s In deco (berekend) %s NDL:%umin (calc) %s NDL:%umin (berekend) %s TTS:%umin (calc) %s TTS:%umin (berekend) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 duiken) %1 %2 (1 dive) %1 %2 (1 duik) boat boot shore kust drift drift deep diep cavern spelonk ice ijs wreck wrak cave grot altitude hoogte pool zwembad lake meer river rivier night nacht fresh zoet student student photo foto video video instructor instructeur deco decompressie more than %d days meer dan %d dagen %dd %dh %dmin %dd %du %dmin %dh %dmin %du %dmin for dives # voor duik nr. for selected dives voor de geselecteerde duiken for dive #%d Voor duik nr. %d for selected dive voor de geselecteerde duik for all dives voor alle duiken (no dives) (geen duiken) Sun Zo Mon Ma Tue Di Wed Wo Thu Do Fri Vr Sat Za Jan jan Feb feb Mar mar Apr apr May mei Jun jun Jul jul Aug aug Sep sept Oct okt Nov nov Dec dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Bestandssysteem bijna vol AUB de duikcomputer loskoppelen en weer aansluiten en klik op 'Opnieuw' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Bestandssysteem vol AUB de duikcomputer loskoppellen en weer aansluiten en probeer opnieuw Short write to req.txt file Is the Uemis Zurich plugged in correctly? Gedeeltelijke schrijfvoortgang naar req.txt bestand Is de Uemis Zurich correkt aangesloten? unknown onbekend Reading %s %s Lezen %s %s data gegevens divelog entry id Duiklog gegeven ID divespot data id Duiklocatie data ID more data dive id meer data voor duik ID wetsuit natpak semidry semidroog drysuit droogpak shorty shorty vest vest long john long john jacket jack full suit tweedelig pak 2 pcs full suit 2-delig pak membrane membraan droogpak Init Communication Initialiseer communicatie Uemis init failed Uemis niet geïnitialiseerd Start download Begin download Safety Stop Violation veiligheidsstop overtreding Speed Alarm Alarm: snelheid Speed Warning Waarschuwing: snelheid PO2 Green Warning Waarschuwing: PO2 Groen PO2 Ascend Warning Waarschuwing: Opstijging / PO2 PO2 Ascend Alarm Alarm: Opstijging / PO2 Tank Pressure Info Info: Flesdruk RGT Warning Waarschuwing: resterende gas-tijd RGT Alert Alarm: resterende gas-tijd Tank Change Suggested Fleswissel voorgesteld Depth Limit Exceeded Dieptelimiet overschreden Max Deco Time Warning Waarschuwing: Maximale deco-tijd Dive Time Info Info: Duiktijd Dive Time Alert Alarm: Duiktijd Marker Markering No Tank Data Geen flesinformatie Low Battery Warning Waarschuwing:Lege batterij Low Battery Alert Alarm: Lege batterij Subsurface-4.0.2/translations/subsurface_pl_PL.ts000066400000000000000000003745021226345450700221630ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importuj plik (CSV) ... ... PO2 PO2 Field Separator Separator danych Field Configuration Konfiguracja pól Import CSV file Importuj plik CSV Time Czas Depth Głębokość Temp Temperatura Cns Cns Stopdepth Przystanek Pre-configured imports Predefiniowane konfiguracje Open CSV Log File Otwórz plik CSV CSV Files (*.csv);;All Files(*) Pliki CSV (*.csv);;Wszytkie pliki(*) CylindersModel Type Rodzaj Size Pojemność WorkPress Ciś. robocze StartPress Ciś. początkowe EndPress Ciś. końcowe Switch at Zmiana na He% He% O O Clicking here will remove this cylinder. Kliknięcie tu usunie butlę z listy. Cylinder cannot be removed Butla nie może być usunięta. This gas in use. Only cylinders that are not used in the dive can be removed. Ten gaz jest używany. Można usuwać tylko butle, których nie używasz. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Edycja nazw komputerów nurkowych Remove the selected Dive Computer? Usunąć wybrany komputer nurkowy? Are you sure that you want to remove the selected dive computer? Czy na pewno chcesz usunąć wybrany komputer nurkowy? DiveComputerModel Model Model Device ID ID urządzenia Nickname Nazwa Clicking here will remove this divecomputer. Kliknięcie tu usunie komputer nurkowy. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Pokaż okno wyszukiwania expand all rozwiń wszystkie collapse all zwiń wszystkie collapse others zwiń pozostałe remove dive(s) from trip usuń nurkowanie(a) z grupy create new trip above utwórz nową grupę powyżej add dive(s) to trip immediately above dodaj nurkowanie(a) do grupy powyżej merge trip with trip above połącz grupę z grupą powyżej merge trip with trip below połącz grupę z grupą poniżej delete dive(s) usuń nurkowanie(a) mark dive(s) invalid oznacz nurkowanie(a) jak niepoprawne save As zapisz jako export As UDDF eksportuj jako plik UDDF shift times zmień czas upload dive(s) to divelogs.de Wyślij nurkowanie(a) do divelogs.de Save Dives As... Zapisz nurkowania jako... Save File as Zapisz plik jako UDDF files (*.uddf *.UDDF) Pliki UDDF (*.uddf *.UDDF) merge selected dives połącz wybrane nurkowania DivePlanner Bottom SAC SAC przy dnie SAC on DECO Stop SAC na przystanku DECO GFHigh GFHigh GFLow GFLow Last Stop at 6m Ostatni przystanek na 6m Start Time Początek ATM Pressure Ciśnienie atmosferyczne DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Niedozwolone położenie punktu One or more of your stops will be lost with this operations, Please, remove them first. W wyniku tej operacji jeden lub więcej puntów znajdzie się poza zakresem. Proszę je najpierw usunąć. DivePlannerPointsModel AIR POWIETRZE Final Depth Głębokość końcowa Duration Czas Used Gas Używany gaz CC Set Point CC Set Point Discard the Plan? Porzucić plan? You are about to discard your plan. Masz zamiar porzucić plan DivePlannerWidget Dive Planner Points Plan nurkowy Available Gases Dostępne gazy add dive data point dodaj punkt do profilu DiveTripModel # # date data m m ft ft min min kg kg lbs lbs suit skafander cyl butla location miejsce SAC SAC OTU OTU maxCNS maxCNS DivelogsDeWebServices Invalid response from server Niepoprawna odpowiedź z serwera Expected XML tag 'DiveDateReader', got instead '%1 Oczekiwano tagu XML 'DiveDateReader', zamiast tego odczytano '%1 Expected XML tag 'DiveDates' not found Oczekiwany tag XML 'DiveDates' nie został znaleziony Malformed XML response. Line %1: %2 Uszkodzona odpowiedź XML. Linia %1: %2 no dives were selected nie wybrano żadnych nurkowań failed to create zip file for upload: %1 nie udało się utworzyć pliku zip do wysłania: %1 cannot create temporary file: %1 nie można utworzyć pliku tymczasowego: %1 internal error: %1 błąd wewnętrzny: %1 internal error błąd wewnętrzny Done Zakończ Uploading dive list... Wysyłanie listy nurkowań... Downloading dive list... Pobieranie listy nurkowań... Downloading %1 dives... Pobieranie %1 nurkowań... Download finished - %1 Zakończono pobieranie - %1 Corrupted download Pobrano uskodzone dane The archive could not be opened: %1 Archiwum nie mogło zostać otworzone: %1 Upload failed Wysyłanie nieudane Upload successful Wysyłanie zakończone sukcesem Login failed Błąd logowania Cannot parse response Nie można przetworzyć odpowiedzi Error: %1 Błąd: %1 Upload finished Wysyłanie zakończone DownloadFromDCWidget OK OK Error Błąd Retry Ponów Choose file for divecomputer download logfile Wybierz plik używany do logowania postępu pobierania danych Log files (*.log) Pliki logów (*.log) Warning Ostrzeżenie Saving the libdivecomputer dump will NOT download dives to the dive list. Użycie libdivecomputer w trybie diagnostycznym spowoduje, że pobrane nurkowania NIE ZOSTANĄ dodane do listy nurkowań. Choose file for divecomputer binary dump file Wybierz plik do którego zapisane zostaną dane binarne Dump files (*.bin) Pliki binarne (*.bin) DownloadFromDiveComputer Download From Dive Computer Pobierz z komputera nurkowego Vendor Producent Dive Computer Komputer nurkowy Device or Mount Point Urządzenie lub miejsce montowania ... ... Force download of all dives Wymuś pobranie wszystkich nurkowań Always prefer downloaded dives Pobrane dane mają priorytet OK OK Cancel Anuluj Save libdivecomputer logfile Zapisz log postępu libdivecomputer Save libdivecomputer dumpfile Zapisz zrzut danych libdivecomputer GlobeGPS Edit Selected Dive Locations Wskaż miejsce zaznaczonych nurkowań MainTab Dive Notes Opis nurkowania Location Miejsce Coordinates Współrzędne Divemaster Divemaster Buddy Partner Start time Początek Air temp Temperatura powietrza Water temp Temperatura wody Tags Tagi Rating Ocena Visibility Widzialność Suit Skafander Notes Opis Equipment Wyposażenie Dive Info Informacje Date Data Interval Przerwa powierzchniowa Gases Used Dostępne gazy Gas Consumed Zużyty gaz SAC SAC Max. Depth Max głębokość Ave. Depth Średnia głębokość OTU OTU Air Pressure Ciśnienie atmosferyczne Air Temperature Temperatura powietrza Water Temperature Temperatura wody Dive Time Czas nurkowania Salinity Zasolenie Stats Statystyka Depth Głębokość Temperature Temperatura Duration Czas Total Time Całkowity czas Dives Nurkowania Cylinders Butle Add Cylinder Dodaj butlę Weights Balast Add Weight System Dodaj balast Trip Location Miejsce nurkowań Trip Notes Opis nurkowań Save Zapisz Cancel Anuluj This trip is being edited. Ta grupa nurkowań jest obecnie edytowana. Multiple dives are being edited. Kilka nurkowań jest obecnie edytowanych. This dive is being edited. To nurkowanie jest obecnie edytowane. /min /min unknown nieznana N N S S E E W W MainWindow Filter Filtr &File Plik &Log Log &View Widok &Help Pomoc &Import Import &New logbook Nowy logbook New Nowy Ctrl+N Ctrl+N &Open logbook Otwórz logbook Open Otwórz Ctrl+O Ctrl+O &Save Zapisz Save Zapisz Ctrl+S Ctrl+S Save as Zapisz jako Ctrl+Shift+S Ctrl+Shift+S Close Zamknij Ctrl+W Ctrl+W Import Files Importuj pliki Ctrl+I Ctrl+I Export &UDDF Eksportuj UDDF Ctrl+U Ctrl+U &Print Drukuj Ctrl+, Ctrl+, &Quit Wyjdź Import from &dive computer Importuj z komputera nurkowego Import &GPS data from Subsurface Service Importuj dane GPS z Subsurface Service Ctrl+G Ctrl+G &Edit Device Names Edycja nazw komputerów nurkowych Ctrl++ Ctrl++ &Renumber Zmień numerację Ctrl+R Ctrl+R Toggle &Zoom Zmiana skali &Yearly Statistics Statystyka roczna Ctrl+Y Ctrl+Y Dive List Lista nurkowań Profile Profil Info Informacje All Wszystkie User &Manual Instrukcja obsługi Globe Mapa P&lan Dive Zaplanuj nurkowanie Ctrl+L Ctrl+L Import CSV Importuj plik CSV Import CS&V Importuj plik CSV Import from Divelogs.de Importuj z Divelogs.de Ctrl+P Ctrl+P Preferences Ustawienia Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Dodaj nurkowanie Auto Group Automatycznie grupuj Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Poprzedni komputer Left W lewo Next DC Następny komputer Right W prawo Select Events Wybór zdarzeń Input Plan Wprowadź plan About Subsurface O Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Otwórz plik Please save or cancel the current dive edit before closing the file. Zapisz zmiany lub anuluj edycję tego nurkowania przed zamknięciem pliku. Please save or cancel the current dive edit before trying to plan a dive. Zapisz zmiany lub anuluj edycję tego nurkowania przed planowaniem nowego. Please save or cancel the current dive edit before trying to add a dive. Zapisz zmiany lub anuluj edycję tego nurkowania przed dodaniem nowego. User Manual instrukcja obsługi Cannot find the Subsurface manual Nie można znaleźć dokumentacji Subsurface Do you want to save the changes you made in the file %1? Czy chcesz zapisać zmiany dokonane w pliku %1? Do you want to save the changes you made in the datafile? Czy chcesz zapisać wprowadzone zmiany? Save Changes? Zapisać zmiany? Changes will be lost if you don't save them. Zmiany zostaną utracone jeśli ich nie za zapiszesz. First finish the current edition before trying to do another. Dokończ edycję tego nurkowania przed rozpoczęciem kolejnej. Save File as Zapisz plik jako Warning Ostrzeżenie Please save or cancel the current dive edit before opening a new file. Zapisz zmiany lub anuluj to nurkowanie przez otwarciem nowego pliku. UDDF files (*.uddf *.UDDF) Pliki UDDF (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Pliki Subsurface XML (*.ssrf *.xml *.XML) PreferencesDialog Defaults Ogólne Units Jednostki Graph Wykres Language Język Lists and Tables Listy i tabele Font Czcionka Font size Rozmiar czcionki Dives Nurkowania Default Dive file Domyślny plik nurkowań ... ... Display Invalid Pokazuj nurkowania oznaczone jako niepoprawne Default Cylinder Domyślna butla Use Default Cylinder Użyj domyślnej butli System System Metric Metryczny Imperial Imperialny Personalize Dostosuj Depth Głębokość meter metry feet stopy bar bar psi psi liter litry cu ft stopy sześcienne (cu ft) celsius stopnie Celsjusza fahrenheit stopnie Fahrenheita kg kg pO₂ pO₂ pN₂ pN₂ System Default Domyślne ustawienia systemu Filter Filtr Pressure Ciśnienie Volume Objętość Temperature Temperatura Weight Balast lbs lbs Time units Jednostki czasu Ascent/Descent speed denominator Mianownik szybkości zanurzania/wynurzania Minutes minuty Seconds sekundy Show Pokaż threshold próg pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Sufit dekompresyjny z komputera nurkowego draw ceiling red rysuj sufit na czerwono Calculated ceiling Obliczony sufit dekompresjny show all tissues wszystkie tkanki 3m increments z krokiem 3m Calculate NDL/TTS Obliczenia NDL/TTS GFLow at max depth GFLow na maksymalnej głębokości Misc Różne Preferences Ustawienia SAC SAC GFLow GFLow GFHigh GFHigh Restart required Wymagane ponowne uruchomienie To correctly load a new language you must restart Subsurface. Aby użyć nowego języka musisz ponownie uruchomić Subsurface. Open Default Log File Otwórz domyślny plik Subsurface XML files (*.ssrf *.xml *.XML) Pliki Subsurface XML (*.ssrf *.xml *.XML) PrintDialog &Preview Podgląd P&rint Drukuj &Close Zamknij Print Drukuj PrintLayout Dive# Nurkowanie nr Date Data Depth Głębokość Duration Czas Master Divemaster Buddy Partner Location Miejsce PrintOptions Print options Opcje drukowania Print only selected dives Drukuj tylko zaznaczone nurkowania Print in color Drukuj w kolorze Print type Rodzaj wydruku 6 dives per page 6 nurkowań na stronę 2 dives per page 2 nurkowania na stronę Table print Tabela Ordering Kolejność Profile on top Profil na górze Notes on top Opis na górze Sizing heights (% of layout) Wysokości drukowanych sekcji (% całości) Profile height (43% - 85%) Profil (43% - 85%) Other data height (8% - 17%) Pozostałe dane (8% - 17%) Notes height (0% - 52%) Opis (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Dodaj zmianę gazu Add Bookmark Dodaj notatkę Remove Event Usuń znacznik Hide similar events Ukryj podobne znaczniki Unhide all events Odkryj wszystkie znaczniki Hide events Ukryj znaczniki Hide all %1 events? Ukryć %1 znaczniki? Remove the selected event? Usunąć wybrane znaczniki? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer nieznany komputer Set Duration: 10 minutes Ustaw czas trwania: 10 minut Scale Skala Ruler Linijka Measure properties of dive segments Pomiar parametrów fragmentu nurkowania Scale your dive to screen size Skalowanie profilu Edit Edytuj pN pN pHe pHe pO pO air powietrze EAN%1 EAN%1 Bailing out to OC Przejście na obieg otwarty begin Starts with space! początek end Starts with space! koniec ProfilePrintModel unknown nieznana Dive #%1 - %2 Nurkownie #%1 - %2 Max depth: %1 %2 Max głębokość: %1 %2 Duration: %1 min Czas: %1 min Gas Used: Użyty gaz: SAC: SAC: Max. CNS: Max CNS: Weights: Balast: Notes: Opis: Divemaster: Divemaster: Buddy: Partner: Suit: Skafander: Viz: Widzialność: Rating: Ocena: QObject AIR POWIETRZE Remove this Point Usuń ten punkt Close Zamknij Average średnia Minimum min. Maximum max. Move the map and double-click to set the dive location Przesuń mapę i wskaż lokalizację dwuklikiem RenumberDialog Renumber Zmień numerację New starting number Nowy numer początkowy ShiftTimesDialog Shift selected times Zmiana czasów nurkowań Shift times of selected dives by Przesuń czasy wybranych nurkowań o h:mm h:mm earlier wcześniej later później SubsurfaceAbout About Subsurface O Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Wieloplatformowy log nurkowy<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel i inni, 2011, 2012, 2013</span> &License Licencja &Website Strona WWW SubsurfaceWebServices Webservice Webservice Connecting... Łączenie... Download finished Pobieranie zakończone Download error: %1 Błąd pobierania: %1 Connection Error: Błąd połączenia: Invalid user identifier! Niepoprawny identyfikator użytkownika! Cannot parse response! Nie można przetworzyć odpowiedzi! Download Success! Pobieranie zakończone sukcesem! TableView Add Cylinder Dodaj butlę TankInfoModel Description Opis ml ml bar bar ToolTipItem Information Informacje WSInfoModel Description Opis kg kg WebServices Webservice Connection Połączenie z usługą internetową Status: Status: Enter your ID here Podaj swoje ID Download Pobierz User ID ID użytkownika Password Hasło Upload Wyślij Operation timed out Przekroczony czas Transfering data... Przesyłanie danych... WeightModel Type Rodzaj Weight Balast Clicking here will remove this weigthsystem. Kliknięcie tu usunie ten balast z listy. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Rok > Miesiąc / grupa # # Duration Total Czas trwania całkowity Average średni Shortest najkrótszy Longest najdłuższy Depth (%1) Average Głębokość (%1) średnia Minimum minimalna Maximum maksymalna SAC (%1) Average SAC (%1) średni Temp. (%1) Average Temperatura (%1) średnia gettextFromC pascal pascal bar bar psi psi l l cuft cuft m m ft ft lbs lbs kg kg (%s) or (%s) (%s) lub (%s) air powietrze integrated zintegrowany belt pas balastowy ankle na kostkach backplate weight na płycie clip-on doczepiany Failed to read '%s' Błąd odczytu '%s' Failed to read '%s'. Use import for CSV files. Nie udało sie odczytać '%s'. Użyj importu z pliku CSV. Maximum number of supported columns on CSV import is %d Maksymalna ilość kolumn danych przy imporcie CSV to %d none brak deco stop przystanek deco rbt pozostały czas denny ascent wynurzanie ceiling sufit workload wysiłek transmitter nadajnik violation naruszenie bookmark notatka surface powierzchnia safety stop przystanek bezpieczeństwa gaschange zmiana gazu safety stop (voluntary) przystanek bezpieczeństwa (opcjonalny) safety stop (mandatory) przystanek bezpieczeństwa (obowiązkowy) deepstop deepstop ceiling (safety stop) sufit (przystanek bezpieczeństwa) divetime czas nurkowania below floor event showing dive is below deco floor and adding deco time poniżej podłogi deco maxdepth Max głębokość OLF OLF PO2 PO2 airtime Pozostały czas oddychania rgbm rgbm heading kierunek tissue level warning Ostrzeżenie: poziom nasycenia tkanek non stop time czas bezdekompresyjny invalid event number niepoprawny znacznik Unable to create parser for %s %s Nie udało się utworzyć parsera dla %s %s Error registering the data Błąd podczas przetwarzania danych Error parsing the datetime Błąd podczas przetwarzania daty i czasu Dive %d: %s %d %04d Nurkowanie %d: %s %d %04d Error parsing the divetime Błąd podczas przetwarzania czasu nurkowania Error parsing the maxdepth Błąd podczas przetwarzania głębokości Error parsing the gas mix count Błąd podczas przetwarzania danych o ilości użytych rodzajów gazu Error obtaining water salinity Błąd podczas przetwarzania danych o zasoleniu Error obtaining surface pressure Błąd podczas przetwarzania danych o cienieniu atmosferycznym Error parsing the gas mix Błąd podczas przetwarzania danych o użytym rodzaju gazu Error parsing the samples Błąd podczas przetwarzania próbek Event: waiting for user action Oczekiwanie na działanie użytkownika model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), numer seryjny=%u (0x%08x) Error registering the event handler. Błąd rejestracji uchwytu (event handler) Error registering the cancellation handler. Błąd rejestracji uchwytu (cancellation handler) Dive data import error Błąd podczas importowania danych Unable to create libdivecomputer context Nie można utworzyć kontekstu libdivecomputer Unable to open %s %s (%s) Nie udało się otworzyć %s %s (%s) Strange percentage reading %s Podejrzany skład procentowy %s Failed to parse '%s'. Nie udało się przetworzyć '%s'. Failed to parse '%s' Nie udało się przetworzyć '%s' Database query get_events failed. Zapytanie bazy danych get_events nie powiodło się.⏎ Database connection failed '%s'. Błąd połączenia z bazą danych '%s'.⏎ Database query failed '%s'. Błąd komunikacji z bazą danych '%s'. Can't open stylesheet %s Nie można otworzyć arkusza stylów %s EAN%d EAN%d Can't find gas %d/%d Nie znaleziono gazu %d/%d Too many gas mixes Zbyt wiele rodzajów gazu %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface - Plan Nurkownia w oparciu o GFlow = %.0f oraz GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Przejście do %.*f %s w %d:%02d min - runtime %d:%02u z %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Pozostań na %.*f %s przez %d:%02d min - runtime %d:%02u z %s Switch gas to %s Zmiana gazu na %s Gas consumption: Zużycie gazu: %.0f%s of %s %.0f%s z %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Obliczony sufit %.0f %s %s Tissue %.0fmin: %.0f %s %s Tkanka %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Przyst. bezp.:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d Gł:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Przyst. bezp.:nieznany czas @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:nieznany czas @ %.0f %s %s In deco %s dekompresja %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (obliczone) %s In deco (calc) %s deco (obliczone) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sGł:%.1f%s %s %sD:%.1f%s %s %sGł:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 dives) %1 %2 (1 dive) %1 %2 (1 nurkowanie) boat z łodzi shore z brzegu drift dryf deep głębokie cavern kawerna ice podlodowe wreck wrakowe cave jaskiniowe altitude wysokość pool basen lake jezioro river rzeka night nocne fresh słodka student uczeń photo fotografia video video instructor instruktor deco deco more than %d days więcej niż %d dni %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # dla nurkowania nr for selected dives dla wybranych nurkowań for dive #%d dla nurkowania #%d for selected dive dla wybranego nurkowania for all dives dla wszystkich nurkowań (no dives) (brak nurkowań) Sun Nie Mon Pon Tue Wto Wed Śro Thu Czw Fri Pią Sat Sob Jan Sty Feb Lut Mar Mar Apr Kwi May Maj Jun Cze Jul Lip Aug Sie Sep Wrz Oct Paź Nov Lis Dec Gru Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: System plików jest prawie pełen Odłącz i podłącz ponownie komputer nurkowy i wybierz 'Ponów' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: System plików jest pełen Odłącz i podłącz ponownie komputer nurkowy i spróbuj jeszcze raz. Short write to req.txt file Is the Uemis Zurich plugged in correctly? Nieudany zapis do pliku req.txt Czy Uemis Zurich jest podłączony poprawnie? unknown nieznana Reading %s %s Czytanie %s %s data dane divelog entry id wpis dziennika nurkowego id divespot data id dane o miejscu nurkowania more data dive id dane nurkowania id wetsuit mokry semidry półsuchy drysuit suchy shorty krótki vest kamizelka long john długi jacket kurtka full suit pełna 2 pcs full suit pełna dwuczęściowa membrane membranowy Init Communication Nawiązywanie łączności Uemis init failed Błąd inicjalizacji Uemis Start download Rozpocznij pobieranie Safety Stop Violation Pominięcie przystanku bezpieczeństwa Speed Alarm Alarm prędkości wynurzania Speed Warning Ostrzeżenie: prędkość wynurzania PO2 Green Warning Ostrzeżenie: PO2 zielone PO2 Ascend Warning Ostrzeżenie: wynurzanie / PO2 PO2 Ascend Alarm Alarm: wynurzanie / PO2 Tank Pressure Info Ciśnienie w butli RGT Warning Ostrzeżenie: ilość gazu RGT Alert Alarm: ilość gazu Tank Change Suggested Zalecana zmiana gazu Depth Limit Exceeded Przekroczenie limitu głębokości Max Deco Time Warning Ostrzeżenie: maksymalny czas dekompresji Dive Time Info Informacja: czas nurkowania Dive Time Alert Alarm: czas nurkowania Marker Znacznik No Tank Data Brak danych o butli Low Battery Warning Ostrzeżenie: niski poziom baterii Low Battery Alert Alarm: niski poziom baterii Subsurface-4.0.2/translations/subsurface_pt_BR.ts000066400000000000000000003727361226345450700221720ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importar ficheiro (CSV) ... ... PO2 PO2 Field Separator Separador de campos Field Configuration Configuração de campos Import CSV file Importar ficheiro CSV Time Tempo Depth Profundidade Temp Temp Cns CNS Stopdepth Profundidade da paragem Pre-configured imports Importar pré-definições Open CSV Log File Abrir arquivo CSV Log CSV Files (*.csv);;All Files(*) CylindersModel Type Tipo Size Tamanho WorkPress Pressão de serviço StartPress Pressão inicial EndPress Pressão final Switch at Trocar aos He% He% O Clicking here will remove this cylinder. Ao clicar aqui irá eliminar esta garrafa. Cylinder cannot be removed A garrafa não pode ser eliminada This gas in use. Only cylinders that are not used in the dive can be removed. A mistura está a ser usada. Apenas pode remover as garrafas não usadas durante o mergulho. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Editar nome do computador de mergulho Remove the selected Dive Computer? Remover o computador de mergulho selecionado? Are you sure that you want to remove the selected dive computer? Tem a certeza que deseja remover o computador de mergulho seleccionado? DiveComputerModel Model Modelo Device ID ID do dispositivo Nickname Apelido Clicking here will remove this divecomputer. Ao clicar aqui irá remover este computador de mergulho. DiveItem l/min l/min cuft/min pés cúbicos/min DiveListView Show Search Box Mostrar caixa de busca expand all expandir todos collapse all colapsar todos collapse others colapsar outros remove dive(s) from trip remover mergulho(s) desta viagem create new trip above criar nova viagem acima add dive(s) to trip immediately above adicionar mergulho(s) à viagem imediatamente acima merge trip with trip above juntar viagem com a viagem acima merge trip with trip below juntar viagem com a viagem abaixo delete dive(s) eliminar mergulho(s) mark dive(s) invalid save As salvar como export As UDDF exportar como UDDF shift times mudar os tempos upload dive(s) to divelogs.de Save Dives As... Gravar mergulhos como... Save File as Salvar aquivo como UDDF files (*.uddf *.UDDF) Ficheiros UDDF (*.uddf *.UDDF) merge selected dives mesclar mergulhos selecionados DivePlanner Bottom SAC Consumo no fundo SAC on DECO Stop Consumo na parada de descompressão GFHigh GFHigh GFLow GFlow Last Stop at 6m Última parada aos 6m Start Time Hora de início ATM Pressure Pressão atmosférica DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Erro na posição One or more of your stops will be lost with this operations, Please, remove them first. Uma ou mais patamares serão eliminados com esta operação. Por favor, remova-os primeiro DivePlannerPointsModel AIR AR Final Depth Profundidade final Duration Duração Used Gas Gás utilizado CC Set Point CC Set Point Discard the Plan? Descartar o planejamento? You are about to discard your plan. Está prestes a eliminar o planejamento. DivePlannerWidget Dive Planner Points Pontos do plano de mergulho Available Gases Gases disponíveis add dive data point adicionar ponto ao mergulho DiveTripModel # # date data m m ft ft min min kg kg lbs lbs suit fato cyl garrafa location local SAC Consumo OTU OTU maxCNS CNS máx DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK OK Error Erro Retry Repetir Choose file for divecomputer download logfile Log files (*.log) Warning Aviso Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Baixar dados do computador de mergulho Vendor Vendedor Dive Computer Computador de mergulho Device or Mount Point Dispositivo ou ponto de montagem ... ... Force download of all dives Forçar baixar todos os mergulhos Always prefer downloaded dives Sempre preferir mergulhos baixados OK OK Cancel Cancelar Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations Editar locais seleccionados MainTab Dive Notes Notas do mergulho Location Local Coordinates Coordenadas Divemaster Instrutor de Mergulho Buddy Parceiro Start time hora de início Air temp Temp do Ar Water temp Temp da água Tags Etiquetas Rating Classificação Visibility Visibilidade Suit Roupa Notes Notas Equipment Equipamento Dive Info Info do mergulho Date Data Interval Intervalo Gases Used Gás utilizado Gas Consumed Gás consumido SAC Consumo Max. Depth Profundidade máxima Ave. Depth Profundidade Média OTU OTU Air Pressure Pressão do Ar Air Temperature Temperatura do Ar Water Temperature Temperatura da água Dive Time Tempo de mergulho Salinity Salinidade Stats Estatísticas Depth Profundidade Temperature Temperatura Duration Duração Total Time Tempo total Dives Mergulhos Cylinders Cilindros Add Cylinder Adicionar garrafa Weights Lastro Add Weight System Adicionar sistema de lastro Trip Location Local da viagem Trip Notes Notas sobre a viagem Save Salvar Cancel Cancelar This trip is being edited. Esta viagem está a ser editada. Multiple dives are being edited. Estão a ser editados vários mergulhos. This dive is being edited. Este mergulho está a ser editado. /min /min unknown desconhecido N N S S E L W O MainWindow Filter Filtro &File &Ficheiro &Log &Log &View &Ver &Help &Ajuda &Import &Importar &New logbook &Novo logbook New Novo Ctrl+N Ctrl+N &Open logbook &Abrir logbook Open Abrir Ctrl+O Ctrl+O &Save &Gravar Save Salvar Ctrl+S Ctrl+S Save as Salvar como Ctrl+Shift+S Ctrl+Shift+S Close Fechar Ctrl+W Ctrl+W Import Files Importar arquivos Ctrl+I Ctrl+I Export &UDDF Exportar %UDDF Ctrl+U Ctrl+U &Print &Imprimir Ctrl+, Ctrl+, &Quit %Fechar Import from &dive computer Importar do %computador de mergulho Import &GPS data from Subsurface Service Importar &GPS de serviço Subsurface Ctrl+G Ctrl+G &Edit Device Names %Editar nomes dos dispositivos Ctrl++ Ctrl++ &Renumber &Renumerar Ctrl+R Ctrl+R Toggle &Zoom Ligar/desligar &Zoom &Yearly Statistics &Estatísticas anuais Ctrl+Y Ctrl+Y Dive List Lista de mergulhos Profile Perfil Info Info All Tudo User &Manual &Manual do utilizador Globe Globo P&lan Dive P&lanear mergulho Ctrl+L Ctrl+L Import CSV Importar CSV Import CS&V Importar CS&V Import from Divelogs.de Importar de Divelogs.de Ctrl+P Ctrl+P Preferences Preferências Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Adicionar mergulho Auto Group Auto agrupar Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Computador de mergulho anterior Left Esquerda Next DC Computador de mergulho seguinte Right Direita Select Events Selecionar eventos Input Plan Introduzir Plano About Subsurface Sobre o Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Abrir arquivo Please save or cancel the current dive edit before closing the file. Por favor, salve ou cancele o mergulho atual antes de fechar o arquivo. Please save or cancel the current dive edit before trying to plan a dive. Por favor, salve ou cancele o mergulho atual antes de planejar um mergulho. Please save or cancel the current dive edit before trying to add a dive. Por favor, salve ou cancele o mergulho atual antes de tentar asicionar um mergulho. User Manual Cannot find the Subsurface manual Não foi possível encontrar o manual do Subsurface Do you want to save the changes you made in the file %1? Deseja gravar as alterações feitas ao ficheiro %1? Do you want to save the changes you made in the datafile? Deseja gravar as alterações feitas ao ficheiro de dados? Save Changes? Salvar alterações? Changes will be lost if you don't save them. As alterações serão perdidas se não forem gravadas. First finish the current edition before trying to do another. Primeiro termine a edição atual antes de editar outro. Save File as Salvar aquivo como Warning Aviso Please save or cancel the current dive edit before opening a new file. Por favor, salve ou cancele o mergulho atual antes de abrir um novo arquivo. UDDF files (*.uddf *.UDDF) Ficheiros UDDF (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Ficheiro XML do Subsurface (*.ssrf *.xml *.XML) PreferencesDialog Defaults Padrões Units Unidades Graph Gráfico Language Lists and Tables Listas e tabelas Font Fonte Font size Tamanho da fonte Dives Mergulhos Default Dive file Ficheiro de mergulhos padrão ... ... Display Invalid Mostrar inválidos Default Cylinder Garrafa padrão Use Default Cylinder Usar a Garrafa padrão System Sistema Metric Métrico Imperial Imperial Personalize Personalizar Depth Profundidade meter feet bar bar psi psi liter cu ft celsius fahrenheit kg kg pO₂ pN₂ System Default Filter Filtro Pressure Pressão Volume Volume Temperature Temperatura Weight Peso lbs lbs Time units Unidades de tempo Ascent/Descent speed denominator Denominador da velocidade de subida/descida Minutes Minutos Seconds Segundos Show Mostrar threshold limite pHe pHe MOD MOD max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Tecto reportado pelo computador de mergulho draw ceiling red pintar o tecto de vermelho Calculated ceiling Tecto calculado show all tissues mostrar todos os tecidos 3m increments incrementos de 3 m Calculate NDL/TTS Calcular NDL/TTS GFLow at max depth GFlow à profundidade máxima Misc Diversos Preferences Preferências SAC SAC GFLow GFlow GFHigh GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Abrir o logbook padrão Subsurface XML files (*.ssrf *.xml *.XML) Ficheiro XML do Subsurface (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print Imprimir PrintLayout Dive# Mergulho# Date Data Depth Profundidade Duration Duração Master Padrão Buddy Parceiro Location Local PrintOptions Print options Imprimir opções Print only selected dives Imprimir somente mergulhos selecionados Print in color Imprimir colorido Print type Tipo de impressão 6 dives per page 6 mergulhos por página 2 dives per page 2 mergulhos por página Table print Imprimir tabela Ordering Ordenando Profile on top Perfil no topo Notes on top Notas no topo Sizing heights (% of layout) Configurar alturas (% da janela) Profile height (43% - 85%) Altura do perfil (43% - 85%) Other data height (8% - 17%) Altura dos restantes dados (8% - 17%) Notes height (0% - 52%) Altura das notas (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Adicionar troca de gás Add Bookmark Adicionar marcador Remove Event Remover evento Hide similar events Esconder eventos semelhantes Unhide all events Hide events Ocultar eventos Hide all %1 events? Esconder todos os %1 eventos? Remove the selected event? Remover o evento seleccionado? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer computador de mergulho desconhecido Set Duration: 10 minutes Duração prevista: 10 minutos Scale Escala Ruler Régua Measure properties of dive segments Medir propriedades dos segmentos do mergulho Scale your dive to screen size Redimensionar o mergulho ao tamanho do ecrã Edit Editar pN pHe pHe pO air ar EAN%1 EAN%1 Bailing out to OC Troca de emergência para circuito aberto begin Starts with space! início end Starts with space! fim ProfilePrintModel unknown desconhecido Dive #%1 - %2 Mergulho #%1 - %2 Max depth: %1 %2 Profundidade máxima: %1 %2 Duration: %1 min Duração: %1 min Gas Used: Gás usado: SAC: Consumo: Max. CNS: CNS máximo: Weights: Lastro: Notes: Notas: Divemaster: Guia: Buddy: Companheiro: Suit: Fato: Viz: Visibilidade: Rating: Classificação: QObject AIR AR Remove this Point Remover este ponto Close Fechar Average Média Minimum Mínimo Maximum Máximo Move the map and double-click to set the dive location RenumberDialog Renumber Renumerar New starting number Novo número inicial ShiftTimesDialog Shift selected times Deslocar os tempos seleccionados Shift times of selected dives by Deslocar os tempos dos mergulhos seleccionados em h:mm h:mm earlier mais cedo later mais tarde SubsurfaceAbout About Subsurface Sobre o Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Licença &Website %Website SubsurfaceWebServices Webservice Serviço web Connecting... Conectando... Download finished Download error: %1 Connection Error: Erro de conexão: Invalid user identifier! Identificação de utilizador inválida ! Cannot parse response! Não é possível analisar a resposta ! Download Success! Operação de transferência bem sucedida! TableView Add Cylinder Adicionar garrafa TankInfoModel Description Descrição ml ml bar bar ToolTipItem Information Informação WSInfoModel Description Descrição kg kg WebServices Webservice Connection Status: Estado: Enter your ID here Inserir a sua ID aqui Download Descarregar User ID ID do utilizador Password Senha Upload Carregar Operation timed out Transfering data... WeightModel Type Tipo Weight Peso Clicking here will remove this weigthsystem. Ao clicar aqui irá remover este sistema de lastro kg lbs ft m YearlyStatisticsModel Year > Month / Trip Ano >Mês / Viagem # # Duration Total Duração Total Average Média Shortest Mais curto Longest Mais longo Depth (%1) Average Profundidade (%1) Média Minimum Mínimo Maximum Máximo SAC (%1) Average Consumo (%1) Médio Temp. (%1) Average Temp. (%1) Média gettextFromC pascal pascal bar bar psi psi l l cuft pés cúbicos m m ft ft lbs lbs kg kg (%s) or (%s) (%s) ou (%s) air ar integrated integrado belt cinto ankle tornozelo backplate weight lastro no arnês clip-on clip-on Failed to read '%s' Falha na leitura de '%s' Failed to read '%s'. Use import for CSV files. Não foi possível ler '%s'. Use importar para ficheiros CSV. Maximum number of supported columns on CSV import is %d O número máximo de colunas suportadas ao importar ficheiros CSV é %d none nenhum deco stop paragem de deco rbt rbt ascent subida ceiling tecto workload esforço transmitter transmissor violation transgressão bookmark favorito surface superfície safety stop parada de segurança gaschange troca de gás safety stop (voluntary) paragem de segurança (voluntária) safety stop (mandatory) paragem de segurança (obrigatória) deepstop paragem funda ceiling (safety stop) tecto (paragem de segurança) divetime duração do mergulho below floor event showing dive is below deco floor and adding deco time abaixo da zona de descompressão maxdepth Profundidade Máx OLF OLF PO2 PO2 airtime tempo de ar rgbm rgbm heading cabeçalho tissue level warning Alarme do nível nos tecidos non stop time tempo sem paragem invalid event number numero de evento inválido Unable to create parser for %s %s Não é possivel criar o "parser" para %s %s Error registering the data Erro no registo de dados Error parsing the datetime Erro na análise da data/tempo Dive %d: %s %d %04d Mergulho #%d:%s %d %04d Error parsing the divetime Erro na análise do tempo de mergulho Error parsing the maxdepth Erro na análise da profundidade máxima Error parsing the gas mix count Erro na análise na contagem da mistura de gás Error obtaining water salinity Erro na obtenção da salinidade da água Error obtaining surface pressure Erro na obtenção da pressão atmosférica Error parsing the gas mix Erro na análise da mistura de gás Error parsing the samples Erro na análise das amostras Event: waiting for user action Evento: à espera de acção do utilizador model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) modelo=%u (0x%08x), firmware=%u (0x%08x), Nº de série=%u (0x%08x) Error registering the event handler. Erro no registo do "event handler". Error registering the cancellation handler. Erro no registo do "cancellation handler". Dive data import error Erro a importar os dados do mergulho Unable to create libdivecomputer context Não é possivel criar contexto do libdivecomputer Unable to open %s %s (%s) Não se consegue abrir %s %s (%s) Strange percentage reading %s Leitura estranha das percentagens %s Failed to parse '%s'. Falha na análise de '%s'. Failed to parse '%s' Falha na análise de '%s' Database query get_events failed. A consulta "obter eventos" falhou. Database connection failed '%s'. Falha na ligação à base de dados '%s' Database query failed '%s'. A consulta da base de dados falhou '%s'. Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d Não é possível encontrar o gás %d/%d Too many gas mixes Demasiadas misturas de gás %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Plano de Mergulho Subsurface baseado em GFlow = %.0f e GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Transição de cota %.*f %s em %d:%02d min - runtime %d:%02u em %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Permanecer a %.*f %s durante %d:%02d min - runtime %d:%02u a %s Switch gas to %s Mudar para a mistura %s Gas consumption: Consumo de gás: %.0f%s of %s %.0f%s de %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Tecto calculado %.0f %s %s Tissue %.0fmin: %.0f %s %s Tecido %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Paragem de segurança:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Consumo:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Paragem de segurança: tempo desconhecido @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:tempo desconhecido @ %.0f %s %s In deco %s Em descompressão %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s PEA:%d%s PNE:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Descompressão:%umin @ %.0f %s (calc) %s In deco (calc) %s Em descompressão (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 mergulhos) %1 %2 (1 dive) %1 %2 (1 mergulho) boat barco shore costa drift drift deep profundo cavern caverna ice gelo wreck naufrágio cave caverna altitude altitude pool piscina lake lago river rio night noite fresh água doce student aluno photo foto video vídeo instructor instrutor deco deco more than %d days mais que %d dias %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # para mergulhos # for selected dives para mergulhos seleccionados for dive #%d para mergulho #%d for selected dive para mergulho seleccionado for all dives para todos os mergulhos (no dives) (nenhum mergulho) Sun Dom Mon Seg Tue Ter Wed Qua Thu Qui Fri Sex Sat Sáb Jan Jan Feb Fev Mar Mar Apr Abr May Mai Jun Jun Jul Jul Aug Ago Sep Set Oct Out Nov Nov Dec Dez Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: O sistema de ficheiros está quase cheio Desligue / ligue novamente o computador de mergulho e clique em "Repetir" Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: sistema de ficheiros está cheio Desligue / ligue o computador de mergulho e tente novamente Short write to req.txt file Is the Uemis Zurich plugged in correctly? Escrita curta do ficheiro req.txt. O Uemis Zurich está bem ligado? unknown desconhecido Reading %s %s Lendo %s %s data data divelog entry id identificador no diário de mergulho divespot data id identificação do local de mergulho more data dive id mais dados do identificador de mergulho wetsuit roupa seca semidry semi-seca drysuit roupa seca shorty short vest casaco long john long john jacket colete full suit fato completo 2 pcs full suit Fato completo 2 peças membrane membrana Init Communication Iniciar Comunicação Uemis init failed Falha ao iniciar Uemis Start download Iniciar download Safety Stop Violation Transgressão na paragem de segurança Speed Alarm Alarme de velocidade Speed Warning Aviso de velocidade PO2 Green Warning Aviso Verde PpO2 PO2 Ascend Warning Aviso de subida PpO2 PO2 Ascend Alarm Alarme de Subida PpO2 Tank Pressure Info Informação da pressão da garrafa RGT Warning Aviso tempo de gás restante RGT Alert Alerta de tempo de gás restante Tank Change Suggested Sugestão de troca de garrafa Depth Limit Exceeded Limite de profundidade excedido Max Deco Time Warning Aviso de tempo de descompressão máximo Dive Time Info Info de tempo de mergulho Dive Time Alert Alerta de tempo de mergulho Marker Marcador No Tank Data Sem dados registados da garrafa Low Battery Warning Aviso de nível de bateria Low Battery Alert Alerta de nível de bateria Subsurface-4.0.2/translations/subsurface_pt_PT.ts000066400000000000000000003760071226345450700222050ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importar ficheiro (CSV) ... ... PO2 PO2 Field Separator Separador de campos Field Configuration Configuração de campos Import CSV file Importar ficheiro CSV Time Tempo Depth Profundidade Temp Temp Cns CNS Stopdepth Profundidade da paragem Pre-configured imports Importar pré-definições Open CSV Log File Abrir ficheiro CSV CSV Files (*.csv);;All Files(*) Ficheiros CSV (*.csv);;Todos os ficheiros(*) CylindersModel Type Tipo Size Tamanho WorkPress Pressão de serviço StartPress Pressão inicial EndPress Pressão final Switch at Trocar aos He% He% O O Clicking here will remove this cylinder. Ao clicar aqui irá eliminar esta garrafa. Cylinder cannot be removed A garrafa não pode ser eliminada This gas in use. Only cylinders that are not used in the dive can be removed. A mistura está a ser usada. Apenas pode remover as garrafas não usadas durante o mergulho. psi psi bar bar l l cuft pés^3 DiveComputerManagementDialog Edit Dive Computer Nicknames Editar nome do computador de mergulho Remove the selected Dive Computer? Remover o computador de mergulho seleccionado? Are you sure that you want to remove the selected dive computer? Tem a certeza que deseja remover o computador de mergulho seleccionado? DiveComputerModel Model Modelo Device ID ID do dispositivo Nickname Alcunha Clicking here will remove this divecomputer. Ao clicar aqui irá remover este computador de mergulho. DiveItem l/min l/min cuft/min pés cúbicos/min DiveListView Show Search Box Mostrar caixa de busca expand all expandir todos collapse all colapsar todos collapse others colapsar outros remove dive(s) from trip remover mergulho(s) desta viagem create new trip above criar nova viagem acima add dive(s) to trip immediately above adicionar mergulho(s) à viagem imediatamente acima merge trip with trip above juntar viagem com a viagem acima merge trip with trip below juntar viagem com a viagem abaixo delete dive(s) eliminar mergulho(s) mark dive(s) invalid marcar mergulho(s) como inválido(s) save As gravar como export As UDDF exportar como UDDF shift times mudar os tempos upload dive(s) to divelogs.de exportar mergulho(s) para divelogs.de Save Dives As... Gravar mergulhos como... Save File as Gravar ficheiro como UDDF files (*.uddf *.UDDF) Ficheiros UDDF (*.uddf *.UDDF) merge selected dives juntar os mergulhos seleccionados DivePlanner Bottom SAC Consumo no fundo SAC on DECO Stop Consumo no patamar de descompressão GFHigh GFHigh GFLow GFlow Last Stop at 6m Última paragem aos 6 m Start Time Hora de início ATM Pressure Pressão atmosférica DivePlannerGraphics 10m 10 m 30ft 30 pés Handler Position Error Erro na posição One or more of your stops will be lost with this operations, Please, remove them first. Uma ou mais patamares serão eliminados com esta operação. Por favor, remova-os primeiro DivePlannerPointsModel AIR Ar Final Depth Profundidade final Duration Duração Used Gas Gás usado CC Set Point CC Set Point Discard the Plan? Eliminar o plano? You are about to discard your plan. Está prestes a eliminar o plano. DivePlannerWidget Dive Planner Points Pontos do plano de mergulho Available Gases Gases disponíveis add dive data point adicionar ponto ao mergulho DiveTripModel # # date data m m ft pés min min kg kg lbs libras suit fato cyl garrafa location local SAC Consumo OTU OTU maxCNS CNS máx DivelogsDeWebServices Invalid response from server Resposta inválida do servidor Expected XML tag 'DiveDateReader', got instead '%1 Esperada a tag XML 'DiveDateReader'. Em vez disso recebemos '%1 Expected XML tag 'DiveDates' not found A tag XML esperada 'DiveDates' não foi encontrada Malformed XML response. Line %1: %2 Resposta XML mal formada. Linha %1: %2 no dives were selected não foram seleccionados nenhuns mergulhos failed to create zip file for upload: %1 falha na criação do ficheiro zip para upload: %1 cannot create temporary file: %1 não foi possível criar o ficheiro temporário: %1 internal error: %1 erro interno: %1 internal error erro interno Done Concluído Uploading dive list... A carregar a lista dos mergulhos... Downloading dive list... A descarregar a lista dos mergulhos... Downloading %1 dives... A descarregar %1 mergulhos Download finished - %1 Descarga terminada - %1 Corrupted download Descarga corrompida The archive could not be opened: %1 Não foi possível abrir o ficheiro: %1 Upload failed Exportação falhou Upload successful Exportação bem sucedida Login failed O login falhou Cannot parse response Não foi possível analisar a resposta Error: %1 Erro: %1 Upload finished Carregamento terminado DownloadFromDCWidget OK OK Error Erro Retry Repetir Choose file for divecomputer download logfile Seleccione o ficheiro para descarregar os mergulhos do computador de mergulho Log files (*.log) Ficheiros log (*.log) Warning Aviso Saving the libdivecomputer dump will NOT download dives to the dive list. Gravar a descarga do libdivecomputer não vai descarregar os mergulhos para a lista Choose file for divecomputer binary dump file Seleccione o ficheiro para gravar a descarga binária do libdivecomputer Dump files (*.bin) Ficheiros dump (*.bin) DownloadFromDiveComputer Download From Dive Computer Transferir do computador de mergulho Vendor Marca Dive Computer Modelo Device or Mount Point Dispositivo ou ponto de montagem ... ... Force download of all dives Forçar a transferência de todos os mergulhos Always prefer downloaded dives Preferir sempre os mergulhos já transferidos OK OK Cancel Cancelar Save libdivecomputer logfile Gravar registo do libdivecomputer Save libdivecomputer dumpfile Gravar ficheiro de descarga do libdivecomputer GlobeGPS Edit Selected Dive Locations Editar locais seleccionados MainTab Dive Notes Notas Location Local Coordinates Coordenadas Divemaster Guia de mergulho Buddy Companheiros Start time Hora de início Air temp Temperatura do ar Water temp Temperatura da água Tags Etiquetas Rating Classificação Visibility Visibilidade Suit Fato Notes Notas Equipment Equipamento Dive Info Informações do mergulho Date Data Interval Intervalo de superfície Gases Used Gases usados Gas Consumed Gás consumido SAC Consumo Max. Depth Prof. Máxima Ave. Depth Prof. Média OTU OTU Air Pressure Pressão Air Temperature Temperatura do ar Water Temperature Temperatura da água Dive Time Duração Salinity Salinidade Stats Estatísticas Depth Profundidade Temperature Temperatura da água Duration Duração Total Time Tempo total Dives Mergulhos Cylinders Garrafas Add Cylinder Adicionar garrafa Weights Lastro Add Weight System Adicionar sistema de lastro Trip Location Local da viagem Trip Notes Notas sobre a viagem Save Gravar Cancel Cancelar This trip is being edited. Esta viagem está a ser editada. Multiple dives are being edited. Estão a ser editados vários mergulhos. This dive is being edited. Este mergulho está a ser editado. /min /min unknown desconhecido N N S S E E W O MainWindow Filter Filtros &File &Ficheiro &Log &Log &View &Ver &Help &Ajuda &Import &Importar &New logbook &Novo logbook New Novo Ctrl+N Ctrl+N &Open logbook &Abrir logbook Open Abrir Ctrl+O Ctrl+O &Save &Gravar Save Gravar Ctrl+S Ctrl+S Save as Guardar como... Ctrl+Shift+S Ctrl+Shift+S Close Encerrar Ctrl+W Ctrl+W Import Files Importar ficheiros Ctrl+I Ctrl+I Export &UDDF Exportar &UDDF Ctrl+U Ctrl+U &Print &Imprimir Ctrl+, Ctrl+, &Quit &Fechar Import from &dive computer Importar do &computador de mergulho Import &GPS data from Subsurface Service Importar &GPS de serviço Subsurface Ctrl+G Ctrl+G &Edit Device Names &Editar nomes dos computadores Ctrl++ Ctrl++ &Renumber &Renumerar Ctrl+R Ctrl+R Toggle &Zoom Ligar/desligar &Zoom &Yearly Statistics &Estatísticas anuais Ctrl+Y Ctrl+Y Dive List Lista de mergulhos Profile Perfil Info Info All Todos User &Manual &Manual do utilizador Globe Globo P&lan Dive P&lanear mergulho Ctrl+L Ctrl+L Import CSV Importar CSV Import CS&V Importar CS&V Import from Divelogs.de Importar a partir de Divelogs.de Ctrl+P Ctrl+P Preferences Preferências Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Adicionar mergulho Auto Group Agrupar automaticamente Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Computador de mergulho anterior Left Esquerda Next DC Computador de mergulho seguinte Right Direita Select Events Seleccionar Eventos Input Plan Introduzir Plano About Subsurface Sobre o Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Abrir Ficheiro Please save or cancel the current dive edit before closing the file. Por favor grave ou cancele as edições feitas a este mergulho antes de fechar o ficheiro. Please save or cancel the current dive edit before trying to plan a dive. Por favor grave ou cancele as edições a este mergulho antes de tentar planear outro. Please save or cancel the current dive edit before trying to add a dive. Por favor grave ou cancele as edições feitas a este mergulho antes de adicionar outro mergulho. User Manual Manual do utilizador Cannot find the Subsurface manual Não foi possível encontrar o manual do Subsurface Do you want to save the changes you made in the file %1? Deseja gravar as alterações feitas ao ficheiro %1? Do you want to save the changes you made in the datafile? Deseja gravar as alterações feitas ao ficheiro de dados? Save Changes? Guardar alterações? Changes will be lost if you don't save them. As alterações serão perdidas se não forem gravadas. First finish the current edition before trying to do another. Termine de editar este mergulho antes de editar um outro. Save File as Gravar ficheiro como Warning Aviso Please save or cancel the current dive edit before opening a new file. Por favor grave ou cancele as edições feitas a este mergulho antes de abrir um novo ficheiro. UDDF files (*.uddf *.UDDF) Ficheiros UDDF (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Ficheiro XML do Subsurface (*.ssrf *.xml *.XML) PreferencesDialog Defaults Defenições padrão Units Unidades Graph Gráfico Language Língua Lists and Tables Listas e tabelas Font Fonte Font size Tamanho da fonte Dives Mergulhos Default Dive file Ficheiro de mergulhos padrão ... ... Display Invalid Mostrar inválidos Default Cylinder Garrafa padrão Use Default Cylinder Usar a Garrafa padrão System Sistema Metric Métrico Imperial Imperial Personalize Personalizar Depth Profundidade meter metro feet pés bar bar psi psi liter litro cu ft pés cúbicos celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Linguagem do sistema Filter Filtros Pressure Pressão Volume Volume Temperature Temperatura Weight Peso lbs libra Time units Unidades de tempo Ascent/Descent speed denominator Denominador da velocidade de subida/descida Minutes Minutos Seconds Segundos Show Mostrar threshold limite pHe pHe MOD MOD max ppO₂ ppO₂ máxima EAD END EADD EAD END EADD Dive computer reported ceiling Tecto reportado pelo computador de mergulho draw ceiling red pintar o tecto de vermelho Calculated ceiling Tecto calculado show all tissues mostrar todos os tecidos 3m increments incrementos de 3 m Calculate NDL/TTS Calcular NDL/TTS GFLow at max depth GFlow à profundidade máxima Misc Diversos Preferences Preferências SAC Consumo GFLow GFlow GFHigh GFHigh Restart required É necessário reiniciar a aplicação To correctly load a new language you must restart Subsurface. Para alterar a linguagem é necessário reiniciar o Subsurface. Open Default Log File Abrir o logbook padrão Subsurface XML files (*.ssrf *.xml *.XML) Ficheiro XML do Subsurface (*.ssrf *.xml *.XML) PrintDialog &Preview %Previsão P&rint Im&primir &Close &Fechar Print Imprimir PrintLayout Dive# Mergulho # Date Data Depth Profundidade Duration Duração Master Padrão Buddy Companheiros Location Localização PrintOptions Print options Opções de impressão Print only selected dives Imprimir apenas os mergulhos seleccionados Print in color Imprimir a cores Print type Tipo de impressão 6 dives per page 6 mergulhos por página 2 dives per page 2 mergulhos por página Table print Imprimir tabela Ordering Ordenar Profile on top Perfil no topo Notes on top Notas no topo Sizing heights (% of layout) Configurar alturas (% da janela) Profile height (43% - 85%) Altura do perfil (43% - 85%) Other data height (8% - 17%) Altura dos restantes dados (8% - 17%) Notes height (0% - 52%) Altura das notas (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Adicionar troca de gás Add Bookmark Adicionar marcador Remove Event Remover evento Hide similar events Esconder eventos semelhantes Unhide all events Mostrar todos os eventos Hide events Esconder eventos Hide all %1 events? Esconder todos os %1 eventos? Remove the selected event? Remover o evento seleccionado? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer computador de mergulho desconhecido Set Duration: 10 minutes Duração prevista: 10 minutos Scale Escala Ruler Régua Measure properties of dive segments Medir propriedades dos segmentos do mergulho Scale your dive to screen size Redimensionar o mergulho ao tamanho do ecrã Edit Editar pN pN pHe pHe pO pO air ar EAN%1 EAN%1 Bailing out to OC Troca de emergência para circuito aberto begin Starts with space! iniciar end Starts with space! fim ProfilePrintModel unknown desconhecido Dive #%1 - %2 Mergulho #%1 - %2 Max depth: %1 %2 Prof. Máxima: %1 %2 Duration: %1 min Duração: %1 min Gas Used: Gás usado: SAC: Consumo: Max. CNS: CNS máximo: Weights: Lastro: Notes: Notas: Divemaster: Guia: Buddy: Companheiros: Suit: Fato: Viz: Visibilidade: Rating: Classificação: QObject AIR Ar Remove this Point Remover este ponto Close Encerrar Average Média Minimum Mínima Maximum Máxima Move the map and double-click to set the dive location Mova o mapa e dê um duplo clique para definir o local de mergulho RenumberDialog Renumber Renumerar New starting number Novo número inicial ShiftTimesDialog Shift selected times Deslocar os tempos seleccionados Shift times of selected dives by Deslocar os tempos dos mergulhos seleccionados em h:mm h:mm earlier mais cedo later mais tarde SubsurfaceAbout About Subsurface Sobre o Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Licença &Website %Website SubsurfaceWebServices Webservice Serviço web Connecting... Ligar ... Download finished Descarga terminada Download error: %1 Erro na descarga: %1 Connection Error: Erro de ligação: Invalid user identifier! Identificação de utilizador inválida ! Cannot parse response! Não é possível analisar a resposta ! Download Success! Operação de transferência bem sucedida! TableView Add Cylinder Adicionar garrafa TankInfoModel Description Descrição ml ml bar bar ToolTipItem Information Informação WSInfoModel Description Descrição kg kg WebServices Webservice Connection Ligação ao serviço web Status: Estado: Enter your ID here Inserir a sua ID aqui Download Descarregar User ID ID do utilizador Password Palavra-passe Upload Carregar Operation timed out A operação demorou demasiado tempo Transfering data... A transferir dados... WeightModel Type Tipo Weight Peso Clicking here will remove this weigthsystem. Ao clicar aqui irá remover este sistema de lastro kg kg lbs libra ft pés m m YearlyStatisticsModel Year > Month / Trip Ano >Mês / Viagem # # Duration Total Duração Total Average Média Shortest Mais curto Longest Mais longo Depth (%1) Average Profundidade (%1) Média Minimum Mínimo Maximum Máximo SAC (%1) Average Consumo (%1) Médio Temp. (%1) Average Temperatura (%1) Média gettextFromC pascal pascal bar bar psi psi l l cuft pés cúbicos m m ft pés lbs libras kg kg (%s) or (%s) (%s) ou (%s) air ar integrated integrado belt cinto ankle tornozelo backplate weight lastro no arnês clip-on clip-on Failed to read '%s' Falha na leitura de '%s' Failed to read '%s'. Use import for CSV files. Não foi possível ler '%s'. Use importar para ficheiros CSV. Maximum number of supported columns on CSV import is %d O número máximo de colunas suportadas ao importar ficheiros CSV é %d none nenhum deco stop paragem de deco rbt rbt ascent subida ceiling tecto workload esforço transmitter transmissor violation transgressão bookmark marcação surface superfície safety stop paragem de segurança gaschange troca de gás safety stop (voluntary) paragem de segurança (voluntária) safety stop (mandatory) paragem de segurança (obrigatória) deepstop paragem funda ceiling (safety stop) tecto (paragem de segurança) divetime duração do mergulho below floor event showing dive is below deco floor and adding deco time abaixo da zona de descompressão maxdepth Profundidade Máx OLF OLF PO2 PO2 airtime tempo de ar rgbm rgbm heading cabeçalho tissue level warning Alarme do nível nos tecidos non stop time tempo sem paragem invalid event number Número de evento inválido Unable to create parser for %s %s Não é possivel criar o "parser" para %s %s Error registering the data Erro no registo de dados Error parsing the datetime Erro na análise da data/tempo Dive %d: %s %d %04d Mergulho #%d:%s %d %04d Error parsing the divetime Erro na análise do tempo de mergulho Error parsing the maxdepth Erro na análise da profundidade máxima Error parsing the gas mix count Erro na análise na contagem da mistura de gás Error obtaining water salinity Erro na obtenção da salinidade da água Error obtaining surface pressure Erro na obtenção da pressão atmosférica Error parsing the gas mix Erro na análise da mistura de gás Error parsing the samples Erro na análise das amostras Event: waiting for user action Evento: à espera de acção do utilizador model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) modelo=%u (0x%08x), firmware=%u (0x%08x), Nº de série=%u (0x%08x) Error registering the event handler. Erro no registo do "event handler". Error registering the cancellation handler. Erro no registo do "cancellation handler". Dive data import error Erro a importar os dados do mergulho Unable to create libdivecomputer context Não é possivel criar contexto do libdivecomputer Unable to open %s %s (%s) Não se consegue abrir %s %s (%s) Strange percentage reading %s Leitura estranha das percentagens %s Failed to parse '%s'. Falha na análise de '%s'. Failed to parse '%s' Falha na análise de '%s' Database query get_events failed. A consulta "obter eventos" falhou. Database connection failed '%s'. Falha na ligação à base de dados '%s' Database query failed '%s'. A consulta da base de dados falhou '%s'. Can't open stylesheet %s Não é possível abrir a folha de estilos %s EAN%d EAN%d Can't find gas %d/%d Não é possível encontrar o gás %d/%d Too many gas mixes Demasiadas misturas de gás %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Plano de mergulho Subsurface baseado em GFlow = %.0f e GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Transição de cota %.*f %s em %d:%02d min - runtime %d:%02u em %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Permanecer a %.*f %s durante %d:%02d min - runtime %d:%02u a %s Switch gas to %s Alterar gás para %s Gas consumption: Consumo de gás: %.0f%s of %s %.0f%s de %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Tecto calculado %.0f %s %s Tissue %.0fmin: %.0f %s %s Tecido %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Paragem de segurança:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Consumo:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Paragem de segurança: tempo desconhecido @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco: Duração desconhecida @ %.0f %s %s In deco %s Em descompressão %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s PEA:%d%s PNE:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Descompressão:%umin @ %.0f %s (calc) %s In deco (calc) %s Em descompressão (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 mergulhos) %1 %2 (1 dive) %1 %2 (1 mergulho) boat barco shore costa drift à deriva deep profundo cavern caverna ice gelo wreck naufrágio cave gruta altitude em altitude pool piscina lake lago river rio night nocturno fresh água doce student aluno photo foto video vídeo instructor instrutor deco descompressão more than %d days mais de %d dias %dd %dh %dmin %dd, %dh %dmin %dh %dmin %dh %dmin for dives # para mergulhos # for selected dives para mergulhos seleccionados for dive #%d para mergulho #%d for selected dive para mergulho seleccionado for all dives para todos os mergulhos (no dives) (nenhum mergulho) Sun Dom Mon Seg Tue Ter Wed Qua Thu Qui Fri Sex Sat Sáb Jan Jan Feb Fev Mar Mar Apr Abr May Mai Jun Jun Jul Jul Aug Ago Sep Set Oct Out Nov Nov Dec Dez Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: O sistema de ficheiros está quase cheio Desligue / ligue novamente o computador de mergulho e clique em "Repetir" Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: sistema de ficheiros está cheio Desligue / ligue o computador de mergulho e tente novamente Short write to req.txt file Is the Uemis Zurich plugged in correctly? Escrita curta do ficheiro req.txt. O Uemis Zurich está bem ligado? unknown desconhecido Reading %s %s A ler %s %s data dados divelog entry id identificador no diário de mergulho divespot data id identificação do local de mergulho more data dive id mais dados do identificador de mergulho wetsuit fato húmido semidry semi-seco drysuit fato seco shorty short vest casaco long john long john jacket colete full suit fato completo 2 pcs full suit Fato completo 2 peças membrane membrana Init Communication Iniciar Comunicação Uemis init failed Falha ao iniciar Uemis Start download Começar transferência Safety Stop Violation Transgressão na paragem de segurança Speed Alarm Alarme de Velocidade Speed Warning Alarme de velocidade PO2 Green Warning Aviso Verde PpO2 PO2 Ascend Warning Aviso de subida PpO2 PO2 Ascend Alarm Alarme de Subida PpO2 Tank Pressure Info Informação da pressão da garrafa RGT Warning Aviso tempo de gás restante RGT Alert Alerta de tempo de gás restante Tank Change Suggested Sugestão de troca de garrafa Depth Limit Exceeded Limite de profundidade ultrapassado Max Deco Time Warning Aviso de tempo de descompressão máximo Dive Time Info Informação sobre a duração do mergulho Dive Time Alert Alerta de duração de mergulho Marker Marcador No Tank Data Sem dados registados da garrafa Low Battery Warning Aviso de Bateria Baixa Low Battery Alert Alerta de Bateria Baixa Subsurface-4.0.2/translations/subsurface_ru_RU.ts000066400000000000000000004103431226345450700222030ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Файл CSV ... ... PO2 PO2 Field Separator Разделитель Field Configuration Положение полей Import CSV file Импорт файла CSV Time Время Depth Глуб. Temp Темп. Cns CNS Stopdepth Остановка Pre-configured imports Шаблоны Open CSV Log File Журнал в формате CSV CSV Files (*.csv);;All Files(*) CSV файлы (*.csv);;Все файлы(*) CylindersModel Type Тип Size Объем WorkPress Раб.давл. StartPress Нач.давл. EndPress Кон.давл. Switch at Замена на He% He% O O Clicking here will remove this cylinder. Удалить этот баллон. Cylinder cannot be removed Баллон не может быть удален This gas in use. Only cylinders that are not used in the dive can be removed. Нельзя удалять баллоны, которые используются в погружении. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Дайвкомпьютеры Remove the selected Dive Computer? Удалить выбранный компьютер? Are you sure that you want to remove the selected dive computer? Вы действительно хотите удалить выбранный дайв-компьютер? DiveComputerModel Model Модель Device ID Идентификатор Nickname Имя устройства Clicking here will remove this divecomputer. Удалить этот дайв-компьютер. DiveItem l/min л/мин cuft/min куб.фут/мин DiveListView Show Search Box Показать поле поиска expand all развернуть все collapse all свернуть все collapse others свернуть остальные remove dive(s) from trip удалить погружение(-я) из поездки create new trip above создать новую поездку выше add dive(s) to trip immediately above добавить к поездке выше merge trip with trip above объединить с поездкой выше merge trip with trip below объединить с поездкой ниже delete dive(s) удалить погружение(-я) mark dive(s) invalid пометить как некорректные save As сохранить как export As UDDF экспорт UDDF shift times сдвинуть время upload dive(s) to divelogs.de выгрузить на divelogs.de Save Dives As... Сохранить погружения как... Save File as Сохранить как UDDF files (*.uddf *.UDDF) UDDF файлы (*.uddf *.UDDF) merge selected dives объединить выбранные DivePlanner Bottom SAC SAC на дне SAC on DECO Stop SAC на деко GFHigh GFHigh GFLow GFLow Last Stop at 6m Последняя остановка на 6м Start Time Начало ATM Pressure Атмосферное давление DivePlannerGraphics 10m 10м 30ft 30фут Handler Position Error Ошибка позиции обработчика One or more of your stops will be lost with this operations, Please, remove them first. Одна или несколько остановок будут утеряны во время этой операции. Удалите их. DivePlannerPointsModel AIR воздух Final Depth Конечная глубина Duration Длительность Used Gas Используемый газ CC Set Point Настройка CC Discard the Plan? Отменить план? You are about to discard your plan. Вы собираетесь отказаться от плана. DivePlannerWidget Dive Planner Points Точки погружения Available Gases Доступные газы add dive data point Добавить точку погружения DiveTripModel # date дата m м ft фут min мин kg кг lbs фунт suit костюм cyl баллон location местоположение SAC SAC OTU OTU maxCNS макс.CNS DivelogsDeWebServices Invalid response from server Неверный ответ сервера Expected XML tag 'DiveDateReader', got instead '%1 XML тег 'DiveDateReader' не найден, получен '%1 Expected XML tag 'DiveDates' not found XML тег 'DiveDates' не найден Malformed XML response. Line %1: %2 Неверный XML ответ. Строка %1: %2 no dives were selected не выбраны погружения failed to create zip file for upload: %1 ошибка создания zip-файла для выгрузки: %1 cannot create temporary file: %1 ошибка создания временного файла: %1 internal error: %1 внутренняя ошибка: %1 internal error внутренняя ошибка Done Готово Uploading dive list... Выгрузка списка погружений... Downloading dive list... Загрузка списка погружений... Downloading %1 dives... Загрузка %1 погружений... Download finished - %1 Загрузка завершена - %1 Corrupted download Поврежденная загрузка The archive could not be opened: %1 Невозможно открыть архив: %1 Upload failed Выгрузка не удалась Upload successful Выгрузка завершена Login failed Ошибка входа Cannot parse response Ошибка разбора ответа Error: %1 Ошибка: %1 Upload finished Выгрузка завершена DownloadFromDCWidget OK OK Error Ошибка Retry Повторить Choose file for divecomputer download logfile Выберите файл для журнала загрузки из дайв-компьютера Log files (*.log) Файлы журналов (*.log) Warning Предупреждение Saving the libdivecomputer dump will NOT download dives to the dive list. При сохранении дампа, погружения в журнал НЕ загружаются. Choose file for divecomputer binary dump file Выберите файл для двоичного дампа из дайв-компьютера Dump files (*.bin) Дамп-файлы (*.bin) DownloadFromDiveComputer Download From Dive Computer Загрузка из компьютера Vendor Производитель Dive Computer Модель компьютера Device or Mount Point Устройство или точка монтирования ... ... Force download of all dives Принудительная загрузка всех погружений Always prefer downloaded dives Предпочтение загруженным OK OK Cancel Отмена Save libdivecomputer logfile Сохранить журнал libdivecomputer Save libdivecomputer dumpfile Сохранить дамп-файл libdivecomputer GlobeGPS Edit Selected Dive Locations Изменить место погружений MainTab Dive Notes Погружение Location Местонахождение Coordinates Координаты Divemaster Инструктор Buddy Партнер Start time Начало Air temp Темп. воздуха Water temp Темп. воды Tags Метки Rating Оценка Visibility Видимость Suit Костюм Notes Примечания Equipment Снаряжение Dive Info Информация Date Дата Interval Интервал Gases Used Исп. газы Gas Consumed Расход газа SAC SAC Max. Depth Макс. глубина Ave. Depth Ср. глубина OTU OTU Air Pressure Давление воздуха Air Temperature Температура воздуха Water Temperature Температура воды Dive Time Время погр. Salinity Соленость Stats Статистика Depth Глуб. Temperature Температура Duration Длительность Total Time Общее время Dives Погружения Cylinders Баллоны Add Cylinder Добавить баллон Weights Грузы Add Weight System Добавить груз Trip Location Местонахождение поездки Trip Notes Заметки к поездке Save Сохранить Cancel Отмена This trip is being edited. Редактирование поездки. Multiple dives are being edited. Множественное редактирование. This dive is being edited. Редактирование погружения. /min /мин unknown неизвестно N С S Ю E В W З MainWindow Filter Фильтр &File Файл &Log Журнал &View Вид &Help Помощь &Import Импорт &New logbook Новый журнал New Новый Ctrl+N Ctrl+N &Open logbook Открыть журнал Open Открыть Ctrl+O Ctrl+O &Save Сохранить Save Сохранить Ctrl+S Ctrl+S Save as Сохранить как Ctrl+Shift+S Ctrl+Shift+S Close Закрыть Ctrl+W Ctrl+W Import Files Импорт файлов Ctrl+I Ctrl+I Export &UDDF Экспорт UDDF Ctrl+U Ctrl+U &Print Печать Ctrl+, Ctrl+, &Quit Выход Import from &dive computer Импорт из дайвкомпьютера Import &GPS data from Subsurface Service Импорт данных GPS из сервиса Subsurface Ctrl+G Ctrl+G &Edit Device Names Список дайвкомпьютеров Ctrl++ Ctrl++ &Renumber Перенумеровать Ctrl+R Ctrl+R Toggle &Zoom Переключить масштаб &Yearly Statistics Статистика за год Ctrl+Y Ctrl+Y Dive List Список погружений Profile Профиль Info Информация All Все User &Manual Руководство Globe Карта P&lan Dive Планировщик Ctrl+L Ctrl+L Import CSV Импорт CSV Import CS&V Импорт CSV Import from Divelogs.de Импорт с сайта Divelogs.de Ctrl+P Ctrl+P Preferences Предпочтения Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Добавить погружение Auto Group Авто-группировка Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Пред. компьютер Left Влево Next DC След. компьютер Right Вправо Select Events Выбрать события Input Plan Ввести план About Subsurface О Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Открыть файл Please save or cancel the current dive edit before closing the file. Сохраните или отмените изменения перед закрытием файла. Please save or cancel the current dive edit before trying to plan a dive. Сохраните или отмените изменения перед открытием планировщика. Please save or cancel the current dive edit before trying to add a dive. Сохраните или отмените изменения перед добавлением погружения. User Manual Руководство пользователя Cannot find the Subsurface manual Руководство не найдено Do you want to save the changes you made in the file %1? Сохранить изменения в файле %1? Do you want to save the changes you made in the datafile? Сохранить изменения в файле журнала? Save Changes? Сохранить изменения? Changes will be lost if you don't save them. Изменения будут утеряны, если вы не сохраните их. First finish the current edition before trying to do another. Закончите редактирование прежде чем редактировать другое. Save File as Сохранить как Warning Предупреждение Please save or cancel the current dive edit before opening a new file. Сохраните или отмените изменения перед открытием нового файла. UDDF files (*.uddf *.UDDF) UDDF файлы (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML файлы (*.ssrf *.xml *.XML) PreferencesDialog Defaults Общие Units Единицы Graph Профиль Language Язык Lists and Tables Списки и таблицы Font Шрифт Font size Размер шрифта Dives Погружения Default Dive file Журнал по умолчанию ... ... Display Invalid Показывать ошибочные Default Cylinder Баллон по умолчанию Use Default Cylinder Использовать System Система мер Metric Метрическая Imperial Имперская Personalize Настроить Depth Глубина meter метр feet фут bar Бар psi psi liter литр cu ft куб. фут celsius цельсий fahrenheit фаренгейт kg кг pO₂ pO₂ pN₂ pN₂ System Default Язык системы Filter Фильтр Pressure Давление Volume Объем Temperature Температура Weight Вес lbs фунт Time units Единицы времени Ascent/Descent speed denominator Делитель скорости спуска/подъема Minutes Минуты Seconds Секунды Show Показывать threshold порог pHe pHe MOD MOD max ppO₂ макс. ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Потолок компьютера draw ceiling red потолок красным Calculated ceiling Расчётный потолок show all tissues все ткани 3m increments шаг 3м Calculate NDL/TTS Рассчитывать NDL/TTS GFLow at max depth GFLow на макс. грубине Misc Разное Preferences Предпочтения SAC SAC GFLow GFLow GFHigh GFHigh Restart required Необходим перезапуск To correctly load a new language you must restart Subsurface. Для смены языка необходимо перезапустить Subsurface. Open Default Log File Журнал по умолчанию Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML файлы (*.ssrf *.xml *.XML) PrintDialog &Preview Просмотр P&rint Печать &Close Закрыть Print Печать PrintLayout Dive# Погр# Date Дата Depth Глуб. Duration Длительность Master Инструктор Buddy Партнер Location Местонахождение PrintOptions Print options Параметры печати Print only selected dives Печать выбранных погружений Print in color Цветная печать Print type Настройки печати 6 dives per page 6 погр. на стр. 2 dives per page 2 погр. на стр. Table print Таблица Ordering Макет страницы Profile on top Профиль наверху Notes on top Примечания наверху Sizing heights (% of layout) Высота элементов (% от макета) Profile height (43% - 85%) Профиль (43% - 85%) Other data height (8% - 17%) Прочее (8% - 17%) Notes height (0% - 52%) Заметки (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Добавить замену смеси Add Bookmark Добавить закладку Remove Event Удалить событие Hide similar events Скрыть похожие события Unhide all events Показать все события Hide events Спрятать события Hide all %1 events? Спрятать все события %1? Remove the selected event? Удалить выбранное событие? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer неизвестный компьютер Set Duration: 10 minutes Длительность: 10 мин Scale Масштаб Ruler Рулетка Measure properties of dive segments Параметры сегмента погружения Scale your dive to screen size Масштаб по размеру экрана Edit Редактировать pN pN pHe pHe pO pO air воздух EAN%1 EAN%1 Bailing out to OC Переход на Откр. Цикл begin Starts with space! начало end Starts with space! конец ProfilePrintModel unknown неизвестно Dive #%1 - %2 Погружение №%1 - %2 Max depth: %1 %2 Макс. глубина: %1 %2 Duration: %1 min Длительность: %1 мин Gas Used: Газы: SAC: SAC: Max. CNS: Макс. CNS: Weights: Грузы: Notes: Заметки: Divemaster: Инструктор: Buddy: Напарник: Suit: Костюм: Viz: Видимость: Rating: Рейтинг: QObject AIR воздух Remove this Point Удалить эту точку Close Закрыть Average Средняя Minimum Минимум Maximum Максимум Move the map and double-click to set the dive location Выберите место на карте двойным щелчком мыши. RenumberDialog Renumber Перенумеровать New starting number Начать нумерацию с ShiftTimesDialog Shift selected times Сдвинуть время Shift times of selected dives by Сдвинуть время выбранных погружений на h:mm h:mm earlier раньше later позже SubsurfaceAbout About Subsurface О Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Мультиплатформенный журнал погружений<br><span style='font-size: 8pt'>Линус Торвальдс, Дирк Хондел и другие, 2011, 2012, 2013</span> &License Лицензия &Website Веб-сайт SubsurfaceWebServices Webservice Вебсервис Connecting... Соединение... Download finished Загрузка завершена Download error: %1 Ошибка загрузки: %1 Connection Error: Ошибка соединения: Invalid user identifier! Неверный идентификатор пользователя! Cannot parse response! Невозможно разобрать ответ! Download Success! Успешная загрузка! TableView Add Cylinder Добавить баллон TankInfoModel Description Описание ml мл bar Бар ToolTipItem Information Информация WSInfoModel Description Описание kg кг WebServices Webservice Connection Соединение с веб-сервисом Status: Состояние: Enter your ID here Укажите свой идентификатор Download Загрузить User ID ID пользователя Password Пароль Upload Выгрузить Operation timed out Таймаут выполнения Transfering data... Передача данных... WeightModel Type Тип Weight Вес Clicking here will remove this weigthsystem. Удалить эту грузовую систему. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Год > Месяц / Поездка # Duration Total Длительность Общее Average Среднее Shortest Кратчайшее Longest Самое долгое Depth (%1) Average Глубина (%1) Среднее Minimum Минимум Maximum Максимум SAC (%1) Average SAC (%1) Среднее Temp. (%1) Average Темп. (%1) Среднее gettextFromC pascal Па bar Бар psi psi l л cuft куб. фут m м ft фут lbs фунт kg кг (%s) or (%s) (%s) или (%s) air воздух integrated интегрированный belt пояс ankle груз на ноги backplate weight груз на пластину clip-on карабины Failed to read '%s' Ошибка чтения '%s' Failed to read '%s'. Use import for CSV files. Ошибка чтения '%s'. Используйте импорт CSV. Maximum number of supported columns on CSV import is %d Для импорта CSV максимально допустимое кол-во колонок %d none отсутствует deco stop деко стоп rbt оставшееся время на дне ascent подъем ceiling потолок workload нагрузка transmitter передатчик violation нарушение bookmark закладка surface поверхность safety stop остановка безопасности gaschange замена смеси safety stop (voluntary) остановка безопасности (добровольно) safety stop (mandatory) остановка безопасности (обязательно) deepstop глубокая остановка ceiling (safety stop) потолок (остановка безопасности) divetime время погружения below floor event showing dive is below deco floor and adding deco time ниже пола maxdepth макс. глуб. OLF OLF PO2 PO2 airtime оставшееся время по воздуху rgbm rgbm heading направление tissue level warning насыщение тканей non stop time время без остановки invalid event number неверный номер события Unable to create parser for %s %s Невозможно создать анализатор для %s %s Error registering the data Ошибка регистрации данных Error parsing the datetime Ошибка разбора даты/времени Dive %d: %s %d %04d Погружение %d: %s %d %04d Error parsing the divetime Ошибка разбора времени погружения Error parsing the maxdepth Ошибка разбора макс. глубины Error parsing the gas mix count Ошибка разбора счетчика смесей Error obtaining water salinity Ошибка получения солености воды Error obtaining surface pressure Ошибка получения давления на поверхности Error parsing the gas mix Ошибка разбора смеси Error parsing the samples Ошибка разбора выборки Event: waiting for user action Событие: ожидание действия пользователя model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) модель=%u (0x%08x), прошивка=%u (0x%08x), серийный номер=%u (0x%08x) Error registering the event handler. Ошибка регистрации обработчика событий. Error registering the cancellation handler. Ошибка регистрации обработчика завершения. Dive data import error Ошибка импорта данных погружения Unable to create libdivecomputer context Невозможно создать контекст libdivecomputer Unable to open %s %s (%s) Невозможно открыть %s %s (%s) Strange percentage reading %s Странное значение процентов %s Failed to parse '%s'. Ошибка разбора '%s'. Failed to parse '%s' Ошибка разбора '%s' Database query get_events failed. Ошибка запроса get_events в БД. Database connection failed '%s'. Ошибка соединения с БД '%s'. Database query failed '%s'. Ошибка запроса к БД '%s'. Can't open stylesheet %s Невозможно открыть файл преобразования %s EAN%d EAN%d Can't find gas %d/%d Не найдена смесь %d/%d Too many gas mixes Слишком много смесей %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s План погружения Subsurface на основе значений нижний ГФ = %.0f и верхний ГФ = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Переход на %.*f %s за %d:%02d мин - рантайм %d:%02u на смеси %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Оставаться на %.*f %s в течение %d:%02d мин - рантайм %d:%02u на смеси %s Switch gas to %s Замена смеси на %s Gas consumption: Расход газа: %.0f%s of %s %.0f%s %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s C:%.2f %s %s Calculated ceiling %.0f %s %s Расчетный потолок %.0f %s %s Tissue %.0fmin: %.0f %s %s Ткани %.0fмин: %.0f %s %s Safetystop:%umin @ %.0f %s %s Ост.безоп:%uмин @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d Г:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fл/мин %s Safetystop:unkn time @ %.0f %s %s Ост.безоп:неизв. время @ %.0f %s %s Deco:%umin @ %.0f %s %s Деко:%uмин @ %.0f %s %s Deco:unkn time @ %.0f %s %s Деко:неизв. время @ %.0f %s %s In deco %s В деко %s NDL:%umin %s NDL:%uмин %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fбар %s pN%s:%.2fbar %s pN%s:%.2fбар %s pHe:%.2fbar %s pHe:%.2fбар %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Деко:%uмин @ %.0f %s (расч) %s In deco (calc) %s В деко (расч) %s NDL:%umin (calc) %s NDL:%uмин (расч) %s TTS:%umin (calc) %s TTS:%uмин (расч) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sГ:%.1f%s %s %sD:%.1f%s %s %sГ:%.1f%s %s%sV:%.2f%s %s%sС:%.2f%s %s %sV:%.2f%s %s %sС:%.2f%s %s %sP:%d %s %s %sД:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 погружений) %1 %2 (1 dive) %1 %2 (1 погружение) boat с лодки shore с берега drift течение deep глубокое cavern каверна ice подледное wreck рэк cave пещера altitude высокогорье pool бассейн lake в озере river в реке night ночное fresh пресная student ученик photo фото video видео instructor инструктор deco деко стоп more than %d days более %d дней %dd %dh %dmin %dд %dч %dмин %dh %dmin %dч %dмин for dives # для погружений № for selected dives для выбранных погружений for dive #%d для погружения №%d for selected dive для выбранного погружения for all dives для всех погружений (no dives) (нет погружений) Sun Вск Mon Пнд Tue Втр Wed Срд Thu Чтв Fri Птн Sat Суб Jan Янв Feb Фев Mar Мар Apr Апр May Май Jun Июн Jul Июл Aug Авг Sep Снт Oct Окт Nov Ноя Dec Дек Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Файловая система почти заполнена Отсоедините и подключите дайв-компьютер и нажмите "Повторить" Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Файловая система заполнена Отсоедините и подключите дайв-компьютер и попробуйте заново Short write to req.txt file Is the Uemis Zurich plugged in correctly? Прервана запись в файл req.txt Проверьте подключение Uemis Zurich. unknown неизвестно Reading %s %s Чтение %s %s data данные divelog entry id ид. записи журнала divespot data id ид. места погружения more data dive id ид. дополнительных данных погружения wetsuit мокрый semidry полусухой drysuit сухой shorty короткий vest жилет long john комбинезон jacket куртка full suit полный 2 pcs full suit полный из 2-х membrane мембрана Init Communication Инициализация связи Uemis init failed Ошибка инициализации Uemis Start download Начать загрузку Safety Stop Violation Нарушение остановки безопасности Speed Alarm Тревога: скорость Speed Warning Внимание: скорость PO2 Green Warning Внимание: PO2 (зеленый) PO2 Ascend Warning Внимание: PO2 при подъеме PO2 Ascend Alarm Тревога: PO2 при подъеме Tank Pressure Info Давление в баллоне RGT Warning Внимание: RGT RGT Alert Тревога: RGT Tank Change Suggested Предложена смена баллона Depth Limit Exceeded Превышен лимит глубины Max Deco Time Warning Внимание: макс. время деко Dive Time Info Время погружения Dive Time Alert Тревога: время погружения Marker Метка No Tank Data Нет данных о баллоне Low Battery Warning Внимание: заряд батареи Low Battery Alert Тревога: заряд батареи Subsurface-4.0.2/translations/subsurface_sk_SK.ts000066400000000000000000003722651226345450700221730ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Import súboru (CSV) ... ... PO2 PO2 Field Separator Oddeľovač položiek Field Configuration Configurácia položiek Import CSV file Import CSV súboru Time Čas Depth Hĺbka Temp Teplota Cns Cns Stopdepth Deco stop Pre-configured imports Predkonfigurovaný import Open CSV Log File Otvor CSV Log súbor CSV Files (*.csv);;All Files(*) CSV súbory (*.csv);;Všetky súbory CylindersModel Type Typ Size Veľkosť WorkPress Max. tlak StartPress Poč. tlak EndPress Konc. tlak Switch at Zmeň v He% He% O O Clicking here will remove this cylinder. Kliknutím sem vymažeš fľašu Cylinder cannot be removed Flaša nemôže byť vymazaná This gas in use. Only cylinders that are not used in the dive can be removed. Táto fľaša sa používa. Len fšaše nepoužité na ponor môžu byť vymazané. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Zmena voliteľného mena počítača Remove the selected Dive Computer? Zmazať vybraný počítač? Are you sure that you want to remove the selected dive computer? Si si istý, že chceš zmazať vybraný počítač? DiveComputerModel Model Model Device ID ID zariadenia Nickname Voliteľný názov Clicking here will remove this divecomputer. Kliknutín sem vymažeš počítač. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Zobraz vyhľadávací box expand all zobraz všetky collapse all zblaľ všetky collapse others zbaľ ostatné remove dive(s) from trip vymaž ponor(y) z akcie create new trip above vytvor novú akciu vyššie add dive(s) to trip immediately above pridaj ponor(y) do akcie hneď nad merge trip with trip above spoj akciu s akciou vyššie merge trip with trip below spoj akciu s akciou nižšie delete dive(s) zmaž ponor(y) mark dive(s) invalid označ neplatné ponor(y) save As uložiť ako export As UDDF exportuj ako UDDF shift times posun času upload dive(s) to divelogs.de nahraj ponor(y) na Save Dives As... Uložiť ponory ako... Save File as Uložiť súbor ako UDDF files (*.uddf *.UDDF) UDDF súbory (*.uddf *.UDDF) merge selected dives zluč vybrané ponory DivePlanner Bottom SAC SAC na dne SAC on DECO Stop SAC na DECO zastávke GFHigh GFHigh GFLow GFLow Last Stop at 6m Posledná zastávka v 6m Start Time Začiatok ATM Pressure ATM tlak DivePlannerGraphics 10m 10m 30ft 30 stôp Handler Position Error One or more of your stops will be lost with this operations, Please, remove them first. Jedna alebo viac zastávok budu touto operáciou zrušené. Vymaž ich prosím. DivePlannerPointsModel AIR Vzduch Final Depth Cieľová hĺbka Duration Dĺžka (min) Used Gas Použitá zmes CC Set Point Discard the Plan? Vymazať plán? You are about to discard your plan. Chystáš sa vymazať svoj plán. DivePlannerWidget Dive Planner Points Available Gases Zmesi k dispozícií add dive data point DiveTripModel # # date dátum m m ft ft min min kg kg lbs US libra suit oblek cyl fl. location lokalita SAC Spotreba plynu OTU OTU maxCNS max. CNS DivelogsDeWebServices Invalid response from server Neplatná odpoveď zo servera Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Očakávaný XML tag 'DiveDates' nebol nájdený Malformed XML response. Line %1: %2 Nekorektná XML odpoveď. Riadok %1: %2 no dives were selected neboli vybrané žiadne ponory failed to create zip file for upload: %1 zlyhanie pri vytváraní zip súboru pre nahratie: %1 cannot create temporary file: %1 nie je možné vytvoriť dočasný súbor internal error: %1 interná chyba internal error interná chyba Done Hotovo Uploading dive list... Nahrávanie zoznamu ponorov... Downloading dive list... Sťahovanie zoznamu ponorov... Downloading %1 dives... Sťahovanie %1 ponorov... Download finished - %1 Sťahovanie ukončené Corrupted download Poškodené sťahovanie The archive could not be opened: %1 Nemôžem otvoriť archív: Upload failed Nahrávanie zlýhalo Upload successful Úspešne nahrávanie Login failed Prihlásenie zlýhalo Cannot parse response Neviem spracovať odpoveď Error: %1 Chyba: Upload finished Nahrávanie ukončené DownloadFromDCWidget OK OK Error Chyba Retry Skús znovu Choose file for divecomputer download logfile Log files (*.log) Log súbory Warning Upozornenie Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) Dump súbory DownloadFromDiveComputer Download From Dive Computer Nahratie údajov z počítača Vendor Výrobca Dive Computer Počítač Device or Mount Point Zariadenie alebo bod pripojenia ... ... Force download of all dives Vynútiť načítanie všetkých ponorov Always prefer downloaded dives Vždy preferuj nahraté ponory OK OK Cancel Zrušiť Save libdivecomputer logfile Uložiť libdivecomputer logfile Save libdivecomputer dumpfile Uložiť GlobeGPS Edit Selected Dive Locations Edituj označené potápašské lokality MainTab Dive Notes Poznámky Location Miesto Coordinates Súradnice Divemaster Divemaster Buddy Buddy Start time Začiatok ponoru Air temp Teplota vzduchu Water temp Teplota vody Tags Značky Rating Hodnotenie Visibility Viditeľnosť Suit Oblek Notes Poznámky Equipment Výstroj Dive Info Informácie Date Dátum Interval Povrch. interval Gases Used Použité zmesi Gas Consumed Spotrebovaná zmes SAC Spotreba plynu Max. Depth Max. hĺbka Ave. Depth Priem. hĺbka OTU OTU Air Pressure Tlak vzduchu Air Temperature Teplota vzduchu Water Temperature Teplota vody Dive Time Čas Ponoru Salinity Slanosť Stats Štatistiky Depth Hĺbka Temperature Teplota Duration Dĺžka (min) Total Time Celkový čas Dives Ponory Cylinders Fľaše Add Cylinder Pridaj fľašu Weights Závažia Add Weight System Pridaj závažia Trip Location Lokalita Trip Notes Poznámky Save Uložiť Cancel Zrušiť This trip is being edited. Táto akcia je editovaná. Multiple dives are being edited. Viaceré ponory sú editované. This dive is being edited. Tento ponor sa edituje. /min /min unknown neznámy N N S S E E W W MainWindow Filter Filter &File &Súbor &Log &Log &View &Náhľad &Help &Help &Import &Import &New logbook &Nový logbook New Nový Ctrl+N Ctrl+N &Open logbook &Otvoriť logbook Open Otvor Ctrl+O Ctrl+O &Save &Uložiť Save Uložiť Ctrl+S Ctrl+S Save as Uložiť ako Ctrl+Shift+S Ctrl+Shift+S Close Zatvoriť Ctrl+W Ctrl+W Import Files Import súborov Ctrl+I Ctrl+I Export &UDDF Export &UDDF Ctrl+U Ctrl+U &Print &Tlačiť Ctrl+, Ctrl+, &Quit &Ukončiť Import from &dive computer Import z &počítača Import &GPS data from Subsurface Service Import &GPS dát zo Subsurface služby Ctrl+G Ctrl+G &Edit Device Names &Edituj názov zariadenia Ctrl++ Ctrl++ &Renumber &Prečisluj Ctrl+R Ctrl+R Toggle &Zoom Označit &Zväčšiť &Yearly Statistics &Ročná štatistika Ctrl+Y Ctrl+Y Dive List Zoznam ponorov Profile Profil Info Info All Všetko User &Manual Užívateľský &Manual Globe Zemeguľa P&lan Dive P&lanuj ponor Ctrl+L Ctrl+L Import CSV Import CSV Import CS&V Import CS&V Import from Divelogs.de Import z Divelogs.de Ctrl+P Ctrl+P Preferences Nastavenia Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Pridaj ponor Auto Group Automatické zgrupovanie Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Predchádzajúci DC Left Šipka v ľavo Next DC Nasledujúci DC Right Šipka v pravo Select Events Voľba udalosti Input Plan Plánovanie About Subsurface O Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Otvoriť súbor Please save or cancel the current dive edit before closing the file. Ulož alebo zruš aktuálne editovanie ponoru pred zatvorením súboru. Please save or cancel the current dive edit before trying to plan a dive. Ulož alebo zruš aktuálne editovanie ponoru pred plánovanim ponoru. Please save or cancel the current dive edit before trying to add a dive. Ulož alebo zruš aktuálne editovanie ponoru pred pridaním nového ponoru. User Manual Užívateľská príručka Cannot find the Subsurface manual Neviem nájsť manuál Do you want to save the changes you made in the file %1? Chceš uložiť zmeny prevedené v súbore %1? Do you want to save the changes you made in the datafile? Chces uložiť zmeny prevedené v dátovom súbore? Save Changes? Uložiť zmeny? Changes will be lost if you don't save them. Zmeny budu stratené ak ich neuložíš. First finish the current edition before trying to do another. Ulož alebo zruš aktuálne editovanie ponoru pred začatím editovania iného ponoru. Save File as Uložiť súbor ako Warning Upozornenie Please save or cancel the current dive edit before opening a new file. Ulož alebo zruš aktuálne editovanie ponoru pred otvorením nového súboru. UDDF files (*.uddf *.UDDF) UDDF súbory (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML súbory (*.ssrf *.xml *.XML) PreferencesDialog Defaults Predvolené Units Jednotky Graph Graf Language Jazyk Lists and Tables Zoznamy a tabuľky Font Font Font size Veľkosť fontu Dives Ponory Default Dive file Predvolený súbor s ponormi ... ... Display Invalid Zobraz neplatné Default Cylinder Predvolená fľaša Use Default Cylinder Použi prednastavenú fľašu System Systém Metric Metrický Imperial Imperiálny Personalize Personalizácia Depth Hĺbka meter meter feet stopa bar bar psi psi liter liter cu ft cu ft celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Systémove prednastavenia Filter Filter Pressure Tlak Volume Objem Temperature Teplota Weight Hmotnosť lbs US libra Time units Časové jednotky Ascent/Descent speed denominator Minutes Minuty Seconds Sekundy Show Zobraz threshold hranica pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Strop hlásený počítačom draw ceiling red zobraz strop červenou Calculated ceiling Zrátaný strop show all tissues zobraz všetky tkanivá 3m increments 3m krok Calculate NDL/TTS Zrátaj GFLow at max depth GFLow na max. hĺbke Misc Rôzne Preferences Nastavenia SAC Spotreba plynu GFLow GFLow GFHigh GFHigh Restart required Potrebný reštart To correctly load a new language you must restart Subsurface. Na korektné nahratie nového jazyka je potrebné reštartovať Subsurface. Open Default Log File Otvor predvolený Log súbor Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML súbory (*.ssrf *.xml *.XML) PrintDialog &Preview &Náhľad P&rint T&lač &Close &Zatvoriť Print Tlačiť PrintLayout Dive# Ponor č. Date Dátum Depth Hĺbka Duration Dĺžka (min) Master Master Buddy Buddy Location Miesto PrintOptions Print options Možnosti tlače Print only selected dives Tlačiť vybrané ponory Print in color Farebná tlač Print type Druh tlače 6 dives per page 6 ponorov na stránku 2 dives per page 2 ponory na stránku Table print Tlač tabuľky Ordering Radenie Profile on top Profil na vrchu Notes on top Poznámky na vrchu Sizing heights (% of layout) Profile height (43% - 85%) Výška profilu Other data height (8% - 17%) Vyška ostatných údajov Notes height (0% - 52%) Výška poznámok 0 0 ProfileGraphicsView Add Gas Change Pridaj zmenu zmesi Add Bookmark Pridať Bookmark Remove Event Vymaž udalosť Hide similar events Schovaj podobné udalosti Unhide all events Zobraziť všetky udalosti Hide events Schovaj udalosti Hide all %1 events? Schovať všetky %1 udalosti? Remove the selected event? Zmazať vybrané udalosti? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer neznámy počítač Set Duration: 10 minutes Scale Stupnica Ruler Pravítko Measure properties of dive segments Scale your dive to screen size Zväčši ponor na veľkosť obrazovky Edit Editovať pN pN pHe pHe pO pO air vzduch EAN%1 EAN%1 Bailing out to OC Záchrana na OC begin Starts with space! začiatok end Starts with space! koniec ProfilePrintModel unknown neznámy Dive #%1 - %2 Ponor #%1 - %2 Max depth: %1 %2 Max hĺbka: %1 %2 Duration: %1 min Trvanie: %1 min Gas Used: Použitá zmes: SAC: SAC: Max. CNS: Max. CNS: Weights: Závažia: Notes: Poznámky: Divemaster: Divemaster: Buddy: Buddy: Suit: Oblek: Viz: Viď: Rating: Hodnotenie: QObject AIR Vzduch Remove this Point Odstrániť tento bod Close Zatvoriť Average Priemer Minimum Minimum Maximum Maximum Move the map and double-click to set the dive location Posuň mapu a dvojklikom označ miesto ponoru RenumberDialog Renumber Prečíslovanie New starting number Nové začiatočné číslo ShiftTimesDialog Shift selected times Posun vybraných časov Shift times of selected dives by Posuň čas vybraných ponorov o h:mm h:mm earlier skôr later neskôr SubsurfaceAbout About Subsurface O Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Licencia &Website &Web stránka SubsurfaceWebServices Webservice Webservis Connecting... Pripájam... Download finished Sťahovanie ukončené Download error: %1 Chyba sťahovania Connection Error: Chyba spojenia Invalid user identifier! Neplatný identifikátor užívateľa! Cannot parse response! Nemôžem spracovať odpoveď! Download Success! Nahrávanie úspešne ukončené! TableView Add Cylinder Pridaj flašu TankInfoModel Description Popis ml ml bar bar ToolTipItem Information Informácie WSInfoModel Description Popis kg kg WebServices Webservice Connection Webservice Connection Status: Status: Enter your ID here Vlož svoje ID Download Stiahnutie User ID ID užívateľa Password Heslo Upload Nahratie Operation timed out Čas operácie vypršal Transfering data... Prenášanie dát... WeightModel Type Typ Weight Hmotnosť Clicking here will remove this weigthsystem. Kliknutim sem vymažeš záťažový systém. kg lbs ft m YearlyStatisticsModel Year > Month / Trip Rok > Mesiac / Akcia # # Duration Total Trvanie Celkové Average Priemer Shortest Najkratší Longest Najdlhší Depth (%1) Average Hĺbka (%1) Priemer Minimum Minimum Maximum Maximum SAC (%1) Average SAC (%1) Priemer Temp. (%1) Average Temp. (%1) Priemer gettextFromC pascal pascal bar bar psi psi l l cuft cuft m m ft ft lbs US libra kg kg (%s) or (%s) (%s) alebo (%s) air vzduch integrated integrované belt opasok ankle členok backplate weight backplate závažie clip-on clip-on Failed to read '%s' Chyba pri načítaní '%s' Failed to read '%s'. Use import for CSV files. Chyba pri čítaní '%s'. Použi import pre CSV súbory. Maximum number of supported columns on CSV import is %d Maximálny počet podporovaných stĺpcov pre CSV import je %d none žiaden deco stop dekompresná zastávka rbt rbt ascent výstup ceiling strop workload záťaž transmitter vysielač violation prekročenie bookmark poznámka surface povrch safety stop bezpečnostná zastávka gaschange zmena plynu safety stop (voluntary) bezpečnostná zastávka (dobrovoľná) safety stop (mandatory) bezpečnostná zastávka (povinná) deepstop hĺbková zastávka ceiling (safety stop) strop (bezpečnostná zastávka) divetime čas ponoru below floor event showing dive is below deco floor and adding deco time pod stropom maxdepth max. hĺbka OLF OLF PO2 PO2 airtime čas na vzduchu rgbm rgbm heading smer tissue level warning upozornenie nasýtenia tkanív non stop time non stop čas invalid event number neplatné číslo udalosti Unable to create parser for %s %s Nie je možné spracovať %s %s Error registering the data Chyba registrácie dát Error parsing the datetime Chyba spracovania času Dive %d: %s %d %04d Ponor #%d: %s %d %04d Error parsing the divetime Chyba spracovania času ponoru Error parsing the maxdepth Chyba spracovania maximálnej hĺbky Error parsing the gas mix count Chyba spracovania dýchacích zmesí Error obtaining water salinity Chyba získania slanosti vody Error obtaining surface pressure Chyba pri zisťovaní tlaku na povrchu Error parsing the gas mix Chyba spracovania zmesi plynu Error parsing the samples Chyba spracovania vzoriek Event: waiting for user action Udalosť: Čakanie na vstup uživateľa model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Chyba registrácia správcu udalosti. Error registering the cancellation handler. Chyba registrácie správcu ukončenia Dive data import error Chyba importu dát Unable to create libdivecomputer context Problém inicializácie libdivecomputer Unable to open %s %s (%s) Nie je možné otvoriť %s %s (%s) Strange percentage reading %s Zvláštne percenta v %s Failed to parse '%s'. Chyba pri spracovaní '%s'. Failed to parse '%s' Chyba pri spracovaní '%s' Database query get_events failed. Neúspešná požiadavka: get_events.⏎ Database connection failed '%s'. Spojenie s databázou zlýhalo '%s'. Database query failed '%s'. Požiadavka na databázu zlyhala '%s'. Can't open stylesheet %s Neviem otvoriť šablónu EAN%d EAN%d Can't find gas %d/%d Neviem nájsť zmes %d/%d Too many gas mixes Príliš veľa zmesí %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface plan ponoru zrátaný s GFlow = %.0f a GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Prechod na %.*f %s v %d:%02d min - runtime %d:%02u na %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Zostaň v %.*f %s na %d:%02d min - runtime %d:%02u na %s Switch gas to %s Zmena plynu na %s Gas consumption: Spotreba plynu: %.0f%s of %s %.0f%s z %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Vypočítaná hladina %.0f %s %s Tissue %.0fmin: %.0f %s %s Tkanivo %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Bezpečnostná zastávka:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Bezpečnostná zastávka:nezn. čas @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:nezn. čas @ %.0f %s %s In deco %s In deco %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s V deco (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 ponorov) %1 %2 (1 dive) %1 %2 (1 ponor) boat z lode shore z brehu drift prúdový deep hlboký cavern dutina ice ľad wreck vrak cave jaskyňa altitude výškovy pool bazén lake jazero river rieka night nočný fresh čerstvý student študent photo fotenie video kamera instructor inštruktor deco deco more than %d days viac než %d dní %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # pre ponory for selected dives pre vybrané ponory for dive #%d pre ponor #%d for selected dive pre vybraný ponor for all dives pre všetky ponory (no dives) (žiadné ponory) Sun Ne Mon Po Tue Ut Wed St Thu Št Fri Pi Sat So Jan Jan Feb Feb Mar Mar Apr Apr May Máj Jun Jun Jul Jul Aug Aug Sep Sep Oct Okt Nov Nov Dec Dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Súborovy systém takmer plný Odpoj/znovu pripoj počítač a klikni na 'Retry' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Súborový systém plný Odpoj a znovu pripoj počítač a skus znovu Short write to req.txt file Is the Uemis Zurich plugged in correctly? Čiastočný zápis do req.txt súboru Je Uemis Zurich korektne pripojený? unknown neznámy Reading %s %s Načítavam %s %s data data divelog entry id id položky logu divespot data id id dát miesta ponoru more data dive id id ďalších dát ponoru wetsuit neoprén semidry polosuchý drysuit suchý oblek shorty krátky vest vesta long john long john jacket vesta full suit celotelový oblek 2 pcs full suit 2 dielny oblek membrane membrana Init Communication Inicializácia komunikácie Uemis init failed Uemis - inicializácia neúspešná Start download Začať nahrávanie Safety Stop Violation Nedodržaná bezpečnostná zastávka Speed Alarm Alarm: Rýchlosť Speed Warning Upozornenie: Rýchlosť PO2 Green Warning PO2 Upozornenie: Zelená PO2 Ascend Warning PO2 Upozornenie: Výstup PO2 Ascend Alarm PO2 Alarm: Výstup Tank Pressure Info Info: Tlak vo fľaši RGT Warning Upozornenie: zostávajúci čas plynu RGT Alert Alarm: zostávajúci čas plynu Tank Change Suggested Odporúčaná zmena fľaše Depth Limit Exceeded Prekročená Maximálna Hĺbka Max Deco Time Warning Upozornenie: Max. dekompresný čas Dive Time Info Info: Čas Ponoru Dive Time Alert Alarm Času Ponoru Marker Značka No Tank Data Žiadne informácie o fľaši Low Battery Warning Upozornenie: Slabá batéria Low Battery Alert Alarm: Slabá batéria Subsurface-4.0.2/translations/subsurface_source.ts000066400000000000000000003745771226345450700224710ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) ... PO2 Field Separator Field Configuration Import CSV file Time Depth Temp Cns Stopdepth Pre-configured imports Open CSV Log File CSV Files (*.csv);;All Files(*) CylindersModel Type Size WorkPress StartPress EndPress Switch at He% O Clicking here will remove this cylinder. Cylinder cannot be removed This gas in use. Only cylinders that are not used in the dive can be removed. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Remove the selected Dive Computer? Are you sure that you want to remove the selected dive computer? DiveComputerModel Model Device ID Nickname Clicking here will remove this divecomputer. DiveItem l/min cuft/min DiveListView Show Search Box expand all collapse all collapse others remove dive(s) from trip create new trip above add dive(s) to trip immediately above merge trip with trip above merge trip with trip below delete dive(s) mark dive(s) invalid save As export As UDDF shift times upload dive(s) to divelogs.de Save Dives As... Save File as UDDF files (*.uddf *.UDDF) merge selected dives DivePlanner Bottom SAC SAC on DECO Stop GFHigh GFLow Last Stop at 6m Start Time ATM Pressure DivePlannerGraphics 10m 30ft Handler Position Error One or more of your stops will be lost with this operations, Please, remove them first. DivePlannerPointsModel AIR Final Depth Duration Used Gas CC Set Point Discard the Plan? You are about to discard your plan. DivePlannerWidget Dive Planner Points Available Gases add dive data point DiveTripModel # date m ft min kg lbs suit cyl location SAC OTU maxCNS DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK Error Retry Choose file for divecomputer download logfile Log files (*.log) Warning Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Vendor Dive Computer Device or Mount Point ... Force download of all dives Always prefer downloaded dives OK Cancel Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations MainTab Dive Notes Location Coordinates Divemaster Buddy Start time Air temp Water temp Tags Rating Visibility Suit Notes Equipment Dive Info Date Interval Gases Used Gas Consumed SAC Max. Depth Ave. Depth OTU Air Pressure Air Temperature Water Temperature Dive Time Salinity Stats Depth Temperature Duration Total Time Dives Cylinders Add Cylinder Weights Add Weight System Trip Location Trip Notes Save Cancel This trip is being edited. Multiple dives are being edited. This dive is being edited. /min unknown N S E W MainWindow Filter &File &Log &View &Help &Import &New logbook New Ctrl+N &Open logbook Open Ctrl+O &Save Save Ctrl+S Save as Ctrl+Shift+S Close Ctrl+W Import Files Ctrl+I Export &UDDF Ctrl+U &Print Ctrl+, &Quit Import from &dive computer Import &GPS data from Subsurface Service Ctrl+G &Edit Device Names Ctrl++ &Renumber Ctrl+R Toggle &Zoom &Yearly Statistics Ctrl+Y Dive List Profile Info All User &Manual Globe P&lan Dive Ctrl+L Import CSV Import CS&V Import from Divelogs.de Ctrl+P Preferences Ctrl+Q Ctrl+D Add Dive Auto Group Ctrl+2 Ctrl+3 Ctrl+4 Ctrl+1 Prev DC Left Next DC Right Select Events Input Plan About Subsurface F1 Ctrl+5 Open File Please save or cancel the current dive edit before closing the file. Please save or cancel the current dive edit before trying to plan a dive. Please save or cancel the current dive edit before trying to add a dive. User Manual Cannot find the Subsurface manual Do you want to save the changes you made in the file %1? Do you want to save the changes you made in the datafile? Save Changes? Changes will be lost if you don't save them. First finish the current edition before trying to do another. Save File as Warning Please save or cancel the current dive edit before opening a new file. UDDF files (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) PreferencesDialog Defaults Units Graph Language Lists and Tables Font Font size Dives Default Dive file ... Display Invalid Default Cylinder Use Default Cylinder System Metric Imperial Personalize Depth meter feet bar psi liter cu ft celsius fahrenheit kg pO₂ pN₂ System Default Filter Pressure Volume Temperature Weight lbs Time units Ascent/Descent speed denominator Minutes Seconds Show threshold pHe MOD max ppO₂ EAD END EADD Dive computer reported ceiling draw ceiling red Calculated ceiling show all tissues 3m increments Calculate NDL/TTS GFLow at max depth Misc Preferences SAC GFLow GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Subsurface XML files (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print PrintLayout Dive# Date Depth Duration Master Buddy Location PrintOptions Print options Print only selected dives Print in color Print type 6 dives per page 2 dives per page Table print Ordering Profile on top Notes on top Sizing heights (% of layout) Profile height (43% - 85%) Other data height (8% - 17%) Notes height (0% - 52%) 0 ProfileGraphicsView Add Gas Change Add Bookmark Remove Event Hide similar events Unhide all events Hide events Hide all %1 events? Remove the selected event? %1 @ %2:%3 unknown divecomputer Set Duration: 10 minutes Scale Ruler Measure properties of dive segments Scale your dive to screen size Edit pN pHe pO air EAN%1 Bailing out to OC begin Starts with space! end Starts with space! ProfilePrintModel unknown Dive #%1 - %2 Max depth: %1 %2 Duration: %1 min Gas Used: SAC: Max. CNS: Weights: Notes: Divemaster: Buddy: Suit: Viz: Rating: QObject AIR Remove this Point Close Average Minimum Maximum Move the map and double-click to set the dive location RenumberDialog Renumber New starting number ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm earlier later SubsurfaceAbout About Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Website SubsurfaceWebServices Webservice Connecting... Download finished Download error: %1 Connection Error: Invalid user identifier! Cannot parse response! Download Success! TableView Add Cylinder TankInfoModel Description ml bar ToolTipItem Information WSInfoModel Description kg WebServices Webservice Connection Status: Enter your ID here Download User ID Password Upload Operation timed out Transfering data... WeightModel Type Weight Clicking here will remove this weigthsystem. kg lbs ft m YearlyStatisticsModel Year > Month / Trip # Duration Total Average Shortest Longest Depth (%1) Average Minimum Maximum SAC (%1) Average Temp. (%1) Average gettextFromC pascal bar psi l cuft m ft lbs kg (%s) or (%s) air integrated belt ankle backplate weight clip-on Failed to read '%s' Failed to read '%s'. Use import for CSV files. Maximum number of supported columns on CSV import is %d none deco stop rbt ascent ceiling workload transmitter violation bookmark surface safety stop gaschange safety stop (voluntary) safety stop (mandatory) deepstop ceiling (safety stop) divetime below floor event showing dive is below deco floor and adding deco time maxdepth OLF PO2 airtime rgbm heading tissue level warning non stop time invalid event number Unable to create parser for %s %s Error registering the data Error parsing the datetime Dive %d: %s %d %04d Error parsing the divetime Error parsing the maxdepth Error parsing the gas mix count Error obtaining water salinity Error obtaining surface pressure Error parsing the gas mix Error parsing the samples Event: waiting for user action model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Error registering the cancellation handler. Dive data import error Unable to create libdivecomputer context Unable to open %s %s (%s) Strange percentage reading %s Failed to parse '%s'. Failed to parse '%s' Database query get_events failed. Database connection failed '%s'. Database query failed '%s'. Can't open stylesheet %s EAN%d Can't find gas %d/%d Too many gas mixes %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Switch gas to %s Gas consumption: %.0f%s of %s ean %s P:%d %s %s T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s In deco %s NDL:%umin %s CNS:%u%% %s pO%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C F %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (1 dive) boat shore drift deep cavern ice wreck cave altitude pool lake river night fresh student photo video instructor deco more than %d days %dd %dh %dmin %dh %dmin for dives # for selected dives for dive #%d for selected dive for all dives (no dives) Sun Mon Tue Wed Thu Fri Sat Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Short write to req.txt file Is the Uemis Zurich plugged in correctly? unknown Reading %s %s data divelog entry id divespot data id more data dive id wetsuit semidry drysuit shorty vest long john jacket full suit 2 pcs full suit membrane Init Communication Uemis init failed Start download Safety Stop Violation Speed Alarm Speed Warning PO2 Green Warning PO2 Ascend Warning PO2 Ascend Alarm Tank Pressure Info RGT Warning RGT Alert Tank Change Suggested Depth Limit Exceeded Max Deco Time Warning Dive Time Info Dive Time Alert Marker No Tank Data Low Battery Warning Low Battery Alert Subsurface-4.0.2/translations/subsurface_sv_SE.ts000066400000000000000000003715071226345450700221760ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) Importera fil (CSV) ... ... PO2 PO2 Field Separator Fältavskiljare Field Configuration Fältkonfiguration Import CSV file Importera CSV fil Time Tid Depth Djup Temp Temp Cns Cns Stopdepth Stoppdjup Pre-configured imports Förkonfigurerade importer Open CSV Log File Öppna CSV loggfil CSV Files (*.csv);;All Files(*) CSV filer (*.csv);;Alla Filer(*) CylindersModel Type Typ Size Storlek WorkPress Arbetstryck StartPress Starttryck EndPress Sluttryck Switch at Byt vid He% He% O O Clicking here will remove this cylinder. Klicka här för att ta bort denna flaska Cylinder cannot be removed Flaska kan inte tas bort This gas in use. Only cylinders that are not used in the dive can be removed. Denna gas används. Bara flaskor som inte används kan tas bort psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Ändra dykdatorers namn Remove the selected Dive Computer? Radera vald dykdator? Are you sure that you want to remove the selected dive computer? Är du säker på att du vill radera den valda dykdatorn? DiveComputerModel Model Modell Device ID Enhetsid Nickname Enhetsnamn Clicking here will remove this divecomputer. Klicka här för att ta bort denna dykdator DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box Visa sökruta expand all Expandera alla collapse all Sammanslå alla collapse others kollapsa andra remove dive(s) from trip ta bort dyk från resmål create new trip above skapa nytt resmål ovan add dive(s) to trip immediately above lägg till dyk(en) till resmål direkt ovan merge trip with trip above sammanfoga resmål med resmål ovan merge trip with trip below sammanfoga resmål med resmål nedan delete dive(s) radera dyk mark dive(s) invalid Markera dyk som ogiltiga save As Spara som export As UDDF Exportera som UDDF fil shift times skifta tider upload dive(s) to divelogs.de Ladda upp dyk till divelogs.de Save Dives As... Spara dyk som... Save File as Spara fil som UDDF files (*.uddf *.UDDF) UDDF filer (*.uddf *.UDDF) merge selected dives Sammanslå dyk DivePlanner Bottom SAC Botten SAC SAC on DECO Stop SAC på DEKOSTOP GFHigh GFHigh GFLow GFLow Last Stop at 6m Sista stoppet på 6m Start Time Starttid ATM Pressure Atmosfärstryck DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error Hantera possitionsfel One or more of your stops will be lost with this operations, Please, remove them first. Ett eller flera av dina stop försvinner med denna operation vänligen ta bort dessa först. DivePlannerPointsModel AIR LUFT Final Depth Slutdjup Duration Varaktighet Used Gas Använd gas CC Set Point CC Set Point Discard the Plan? Kassera plan? You are about to discard your plan. Du kommer kassera din plan DivePlannerWidget Dive Planner Points Dykplaneringspunkter Available Gases Tillgängliga gaser add dive data point lägg till dykdatapunkt DiveTripModel # # date datum m m ft ft min Min kg kg lbs pund suit dräkt cyl flaska location plats SAC SAC OTU OTU maxCNS maxCNS DivelogsDeWebServices Invalid response from server Ogiltigt svar från server Expected XML tag 'DiveDateReader', got instead '%1 Förväntade XML tag 'DiveDateReader' men fick istället '%1 Expected XML tag 'DiveDates' not found Förväntad XML tagg 'DiveDates' gick ej att finna Malformed XML response. Line %1: %2 Felformaterat XML svar. Rad %1: %2 no dives were selected inga dyk var markerade failed to create zip file for upload: %1 misslyckades med att skapa en zip-fil för uppladdning: %1 cannot create temporary file: %1 kunde inte skapa temporär fil: %1 internal error: %1 internt fel: %1 internal error internt fel Done Klar Uploading dive list... Laddar upp dyklista... Downloading dive list... Laddar ner dyklista... Downloading %1 dives... Laddar ner %1 dyk... Download finished - %1 Nedladdning klar - %1 Corrupted download Misslyckad nedladdning The archive could not be opened: %1 Arkivet kunde inte öppnas: %1 Upload failed Uppladdning misslyckades Upload successful Nedladdning lyckades Login failed Inloggning misslyckades Cannot parse response Kan inte tolka respons Error: %1 Fel: %1 Upload finished Uppladdning klar DownloadFromDCWidget OK OK Error Error Retry Försök igen Choose file for divecomputer download logfile Välj fil som loggfil för nerladdningen ifrån dykdatorn Log files (*.log) Loggfiler (*.log) Warning Varning Saving the libdivecomputer dump will NOT download dives to the dive list. Att spara en libdivecomputer-dump kommer inte att ladda ner dyken till dyklistan. Choose file for divecomputer binary dump file Välj fil för binär dumpning av nerladdningen ifrån dykdatorn Dump files (*.bin) Dumpfiler (*.bin) DownloadFromDiveComputer Download From Dive Computer Ladda ner från dykdator Vendor Leverantör Dive Computer Dykdator Device or Mount Point Enhet eller monteringspunkt ... ... Force download of all dives Tvinga nedladdning av alla dyk Always prefer downloaded dives Föredra alltid nedladdad dykinformation OK OK Cancel Avbryt Save libdivecomputer logfile Spara loggfil av nerladdningen ifrån dykdatorn Save libdivecomputer dumpfile Spara dumpfil ifrån dykdatorn GlobeGPS Edit Selected Dive Locations Ändra valda dykplatser MainTab Dive Notes Dykanteckningar Location Plats Coordinates Koordinater Divemaster Divemaster Buddy Parkamrat Start time Starttid Air temp Lufttemp Water temp Vattentemperatur Tags Taggar Rating Rankning Visibility Synlighet Suit Dräkt Notes Anteckningar Equipment Utrustning Dive Info Information Date Datum Interval Intervall Gases Used Gasanvändning Gas Consumed Gasanvändning SAC SAC Max. Depth Maxdjup Ave. Depth Medeldjup OTU OTU Air Pressure Lufttryck Air Temperature Lufttemperatur Water Temperature Vattentemperatur Dive Time Dyktid Salinity Salthalt Stats Statistik Depth Djup Temperature Temperatur Duration Varaktighet Total Time Total tid Dives Dyk Cylinders Flaskor Add Cylinder Lägg till flaska Weights Vikter Add Weight System Lägg till Viktsystem Trip Location Resmål Trip Notes Resmålsanteckningar Save Spara Cancel Avbryt This trip is being edited. Detta resmål håller på och ändras. Multiple dives are being edited. Flera dyk håller på och ändras. This dive is being edited. Detta dyk håller på och ändras. /min /min unknown okänd N N S S E E W W MainWindow Filter Filter &File &File &Log &Logg &View &Visa &Help &Hjälp &Import &Import &New logbook &Ny Loggbok New Ny Ctrl+N Ctrl+N &Open logbook &Öppna loggbok Open Öppna Ctrl+O Ctrl+O &Save &Spara Save Spara Ctrl+S Ctrl+S Save as Spara som Ctrl+Shift+S Ctrl+Shift+S Close Stäng Ctrl+W Ctrl+W Import Files Importera filer Ctrl+I Ctrl+I Export &UDDF Exportera &UDDF Ctrl+U Ctrl+U &Print &Skriv ut Ctrl+, Ctrl+, &Quit &Avsluta Import from &dive computer Ladda ner från dykdator Import &GPS data from Subsurface Service Importera &GPSdata från Subsurface webbtjänst Ctrl+G Ctrl+G &Edit Device Names &Ändra Enhetsnamn Ctrl++ Ctrl++ &Renumber &Renumrering Ctrl+R Ctrl+R Toggle &Zoom Zoom av/på &Yearly Statistics &Årsstatistik Ctrl+Y Ctrl+Y Dive List Dyklista Profile Profil Info Info All Alla User &Manual &Användarmanual Globe Glob P&lan Dive Pl&anera Dyk Ctrl+L Ctrl+L Import CSV Importera CSV Import CS&V Importera CS&V Import from Divelogs.de Import från Divelogs.de Ctrl+P Ctrl+P Preferences Inställningar Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive Nytt dyk Auto Group Autogruppering Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC Föregående dykdator Left Vänster Next DC Nästa dykdator Right Höger Select Events Välj händelser Input Plan Skriv plan About Subsurface Om Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File Öppna fil Please save or cancel the current dive edit before closing the file. Vänligen spara eller avbryt pågående ändring av dyk innan du stänger filen. Please save or cancel the current dive edit before trying to plan a dive. Vänligen spara eller avbryt pågående ändring av dyk innan du försöker planera ett dyk. Please save or cancel the current dive edit before trying to add a dive. Vänligen spara eller avbryt pågående ändring av dyk innan du försöker lägga till ett dyk. User Manual Användarmanual Cannot find the Subsurface manual Kan inte hitta Subsurface manualen Do you want to save the changes you made in the file %1? Vill du spara ändringarna gjorda i filen %1? Do you want to save the changes you made in the datafile? Vill du spara ändringarna gjorda i datafilen? Save Changes? Spara ändringar? Changes will be lost if you don't save them. Ändringar förloras om du inte sparar dom. First finish the current edition before trying to do another. Först avsluta den aktuella upplagan du försöker göra en annan. Save File as Spara fil som Warning Varning Please save or cancel the current dive edit before opening a new file. Vänligen spara eller avbryt pågående ändring av dyk innan du försöker öppna en ny fil. UDDF files (*.uddf *.UDDF) UDDF filer (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML filer (*.ssrf *.xml *.XML) PreferencesDialog Defaults Standardvärden Units Enheter Graph Graf Language Språk Lists and Tables Listor och tabeller Font Font Font size Fontstorlek Dives Dyk Default Dive file Standard dykfil ... ... Display Invalid Display ogiltig Default Cylinder Standardflaska Use Default Cylinder Använd standardflaska System System Metric Metrisk Imperial Imperial Personalize Personifiera Depth Djup meter meter feet fot bar bar psi psi liter liter cu ft ft³ celsius celsius fahrenheit fahrenheit kg kg pO₂ pO₂ pN₂ pN₂ System Default Systemets standardvärde Filter Filter Pressure Tryck Volume Volym Temperature Temperatur Weight Vikt lbs pund Time units Tidsenheter Ascent/Descent speed denominator Hastighetsnämnare. Minutes Minuter Seconds Sekunder Show Visa threshold Tröskel pHe pHe MOD MOD max ppO₂ max ppO₂ EAD END EADD EAD END EADD Dive computer reported ceiling Dykdator rapporterade tak draw ceiling red Visa tak i rött Calculated ceiling Visa beräknad tak-information show all tissues Visa alla vävnader 3m increments Inkrement 3m Calculate NDL/TTS Beräkna NDL/TTS GFLow at max depth GFLow på maxdjup Misc Blandat Preferences Inställningar SAC SAC GFLow GFLow GFHigh GFHigh Restart required Omstart krävs To correctly load a new language you must restart Subsurface. För att ladda nytt språk fullständigt måste Subsurface startas om. Open Default Log File Välj standard loggfil Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML filer (*.ssrf *.xml *.XML) PrintDialog &Preview Förhandsvisning P&rint Skriv ut &Close Stäng Print Skriv ut PrintLayout Dive# Dyknr Date Datum Depth Djup Duration Varaktighet Master master Buddy Parkamrat Location Plats PrintOptions Print options Utskriftsoptioner Print only selected dives Skriv ut valda dyk Print in color Skriv ut i färg Print type Utskriftstyp 6 dives per page 6 dyk per sida 2 dives per page 2 dyk per sida Table print Tabellutskrift Ordering Sortering Profile on top Profil ovanpå Notes on top Anteckningar ovanpå Sizing heights (% of layout) Dimensionering av höjder (% av layout) Profile height (43% - 85%) Profilhöjd (43% - 85%) Other data height (8% - 17%) Höjd på övriga uppgifter (8% - 17%) Notes height (0% - 52%) Anteckningar höjd (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change Lägg till gasbyte Add Bookmark Lägg till bokmärke Remove Event Ta bort händelse Hide similar events Göm liknande händelser Unhide all events Visa alla händelser Hide events Göm händelser Hide all %1 events? Göm alla %1händelser Remove the selected event? Ta bort markerad händelse %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer Okänd dykdator Set Duration: 10 minutes Sätt varaktighet: 10 minuter Scale Skala Ruler Linjal Measure properties of dive segments Mätegenskaper på dyksegment Scale your dive to screen size Skala dyk till skärmstorlek Edit Redigera pN pN pHe pHe pO pO air luft EAN%1 EAN%1 Bailing out to OC Bailout till öppet system begin Starts with space! start end Starts with space! slut ProfilePrintModel unknown okänd Dive #%1 - %2 Dyk #%1 - %2 Max depth: %1 %2 Maxdjup: %1 %2 Duration: %1 min Varaktighet: %1 min Gas Used: Gas använd: SAC: SAC: Max. CNS: Max. CNS: Weights: Vikter: Notes: Anteckningar: Divemaster: Divemaster: Buddy: Parkamrat: Suit: Dräkt: Viz: Sikt: Rating: Ranking: QObject AIR LUFT Remove this Point Ta bort denna punkt Close Stäng Average Genomsnitt Minimum Minimum Maximum Maximum Move the map and double-click to set the dive location Flytta runt kartan och dubbelklicka för att ställa in dykplats RenumberDialog Renumber Uppdatera numrering New starting number Nytt startnummer ShiftTimesDialog Shift selected times Skifta valda tider Shift times of selected dives by Skifta tider på valda dyk med h:mm h:mm earlier tidigare later senare SubsurfaceAbout About Subsurface Om Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-plattforms dykprogramvara<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, med fler, 2011, 2012, 2013</span> &License &License &Website &Hemsida SubsurfaceWebServices Webservice Webbtjänst Connecting... Ansluter... Download finished Nedladdning klar Download error: %1 Nedladdningsfel: %1 Connection Error: Kontaktfel: Invalid user identifier! Ogiltigt användarid! Cannot parse response! Kan inte tolka respons Download Success! Nedladdning lyckades! TableView Add Cylinder Lägg till flaska TankInfoModel Description Beskrivning ml ml bar bar ToolTipItem Information Information WSInfoModel Description Beskrivning kg kg WebServices Webservice Connection Anslutning till webbtjänst Status: Status: Enter your ID here Skriv in ditt ID här Download Ladda ned User ID Användarid Password Lösenord Upload Ladda upp Operation timed out Begäran tog för lång tid Transfering data... Överför data... WeightModel Type Typ Weight Vikt Clicking here will remove this weigthsystem. Klicka här för att ta bort detta viktsystem kg lbs ft m YearlyStatisticsModel Year > Month / Trip År > Månad / Resmål # # Duration Total Varaktighet Total Average Genomsnitt Shortest Kortaste Longest Längsta Depth (%1) Average Djup (%1) Medel Minimum Minimum Maximum Maximum SAC (%1) Average SAC (%1) Medel Temp. (%1) Average Temp. (%1) Medel gettextFromC pascal pascal bar bar psi psi l l cuft ft³ m m ft ft lbs pund kg kg (%s) or (%s) (%s) eller (%s) air luft integrated integrerat belt bälte ankle ankel backplate weight Ryggplattans vikt clip-on clip-on Failed to read '%s' Kunde inte öppna '%s' Failed to read '%s'. Use import for CSV files. Misslyckades att läsa %s'. Använd Import av CSV filer Maximum number of supported columns on CSV import is %d Maximalt antalet kolumner i CSV import är %d none inget deco stop dekostopp rbt rbt ascent uppstigning ceiling ceiling workload arbetsbelastning transmitter sändare violation kränkning bookmark bokmärke surface ytan safety stop säkerhetsstopp gaschange gasbyte safety stop (voluntary) säkerhetsstopp (frivilligt) safety stop (mandatory) säkerhetsstopp (obligatoriskt) deepstop djupstopp ceiling (safety stop) ceiling (säkerhetsstopp) divetime dyktid below floor event showing dive is below deco floor and adding deco time under golv maxdepth Maxdjup OLF OLF PO2 PO2 airtime gastid rgbm rgbm heading riktning tissue level warning vävnadsnivå non stop time non stop tid invalid event number okänt händelsenummer Unable to create parser for %s %s Kan inte skapa parser för %s %s Error registering the data Kunde inte registrera parser-data Error parsing the datetime Kunde inte tolka tid och datum Dive %d: %s %d %04d Dyk #%d: %s %d %04d Error parsing the divetime Kunde inte tolka dyktid Error parsing the maxdepth Kunde inte tolka maxdjup Error parsing the gas mix count Kunde inte tolka antal gasblandningar Error obtaining water salinity Kunde inte ladda vattnets salthalt Error obtaining surface pressure Kunde inte få tag i tyck vid ytan Error parsing the gas mix Kunde inte tolka gasblandning Error parsing the samples Kunde inte tolka sampel Event: waiting for user action Händelse: väntar på användaren model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) Error registering the event handler. Kunde inte registrera event-funktion Error registering the cancellation handler. Kunde inte registrera avbrytningsrutin Dive data import error Lyckades inte importera dykdata Unable to create libdivecomputer context Kan inte skapa libdivecomputer context Unable to open %s %s (%s) Kunde inte öppna fil %s %s (%s) Strange percentage reading %s Konstig procent läsning %s Failed to parse '%s'. Kunde inte läsa '%s'. Failed to parse '%s' Kunde inte läsa '%s' Database query get_events failed. Databasfråga get_events misslyckades. Database connection failed '%s'. Databasanslutning misslyckades '%s'. Database query failed '%s'. Databasfråga misslyckades '%s'. Can't open stylesheet %s Kunde inte öppna formatmall %s EAN%d EAN%d Can't find gas %d/%d Kan inte hitta gasen %d/%d Too many gas mixes För många gasblandningar %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface dykplan baserad på GFlow = %.0f och GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Dyk till %.*f %s i %d:%02d min - totaltid %d:%02u on %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Stanna vid %.*f %s för %d:%02d min - totaltid %d:%02u on %s Switch gas to %s Byt till gas %s Gas consumption: Gasanvändning: %.0f%s of %s %.0f%s av %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Beräknat tak %.0f %s %s Tissue %.0fmin: %.0f %s %s Vävnad %.0fmin: %0f %s %s Safetystop:%umin @ %.0f %s %s Såkerhetsstopp:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Säkerhetsstopp:okänd tid @ %.0f %s %s Deco:%umin @ %.0f %s %s Deko:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deko:okänd tid @ %.0f %s %s In deco %s i deko %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deko:%umin @ %.0f %s (calc) %s In deco (calc) %s i deko (calc) %s NDL:%umin (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 dyk) %1 %2 (1 dive) %1 %2 (1 dyk) boat båt shore strand drift ström deep djup cavern cavern ice is wreck vrak cave grotta altitude höjd pool pool lake sjö river älv night natt fresh färsk student student photo foto video video instructor Instruktör deco deko more than %d days mer än %d dagar %dd %dh %dmin %dd %dt %dmin %dh %dmin %dt %dmin for dives # för dykningar # for selected dives för utvalda dyk for dive #%d Dyk #%d for selected dive för valt dyk for all dives för alla dyk (no dives) (inga dyk) Sun sön Mon mån Tue tis Wed ons Thu tor Fri fre Sat lör Jan jan Feb feb Mar mar Apr apr May maj Jun jun Jul jul Aug aug Sep sep Oct okt Nov nov Dec dec Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Filsystem är nästan fullt Återanslut dykdatorn och försök igen Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Fullt filsystem Återanslut dykdatorn och försök igen Short write to req.txt file Is the Uemis Zurich plugged in correctly? Kunde inte skriva filen req.txt Är Uemis Zurich ordentligt ansluten? unknown okänd Reading %s %s Läser %s %s data data divelog entry id dyklog ID divespot data id dykplats ID more data dive id mer data dive id wetsuit våtdräkt semidry semidry drysuit torrdräkt shorty shorty vest väst long john Longjohn jacket jacka full suit fulldräkt 2 pcs full suit 2 pcs full suit membrane membran Init Communication Initierar anslutning Uemis init failed Kunde inte läsa från Uemis Start download Starta nedladdningen Safety Stop Violation Säkerhetsstopp ej uppfyllt Speed Alarm Alarm: uppstigningshastighet Speed Warning Varning: uppstigningshastighet PO2 Green Warning Varning: grön PO2 PO2 Ascend Warning Varning: uppstigning / PO2 PO2 Ascend Alarm Alarm: uppstigning / PO2 Tank Pressure Info Info: flasktryck RGT Warning Varning: gastid RGT Alert Varning: gastid Tank Change Suggested Tankbyte rekommenderat Depth Limit Exceeded Maxdjup har överskridits Max Deco Time Warning Varning: max dekotid Dive Time Info Dyktidsnot Dive Time Alert Dyktidsvarning Marker markering No Tank Data Ingen flaskinformation Low Battery Warning Batterivarning Low Battery Alert Batterivarning Subsurface-4.0.2/translations/subsurface_vi.ts000066400000000000000000003641131226345450700215700ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) ... PO2 PO2 Field Separator Field Configuration Import CSV file Time Thời gian Depth Độ sâu Temp Nhiệt độ Cns Stopdepth Pre-configured imports Open CSV Log File CSV Files (*.csv);;All Files(*) CylindersModel Type Loại Size Kích thước WorkPress StartPress EndPress Switch at He% O Clicking here will remove this cylinder. Cylinder cannot be removed This gas in use. Only cylinders that are not used in the dive can be removed. psi bar l cuft DiveComputerManagementDialog Edit Dive Computer Nicknames Chỉnh sửa tên thiết bị lặn Remove the selected Dive Computer? Are you sure that you want to remove the selected dive computer? DiveComputerModel Model Mô hình Device ID Nickname Tên Clicking here will remove this divecomputer. DiveItem l/min cuft/min DiveListView Show Search Box expand all collapse all collapse others remove dive(s) from trip create new trip above add dive(s) to trip immediately above merge trip with trip above merge trip with trip below delete dive(s) mark dive(s) invalid save As export As UDDF shift times upload dive(s) to divelogs.de Save Dives As... Save File as UDDF files (*.uddf *.UDDF) merge selected dives DivePlanner Bottom SAC SAC on DECO Stop GFHigh GFLow Last Stop at 6m Start Time ATM Pressure DivePlannerGraphics 10m 30ft Handler Position Error One or more of your stops will be lost with this operations, Please, remove them first. DivePlannerPointsModel AIR KHÔNG KHÍ Final Depth Duration Độ dài Used Gas CC Set Point Discard the Plan? You are about to discard your plan. DivePlannerWidget Dive Planner Points Available Gases add dive data point DiveTripModel # # date m m ft ft min nhỏ nhất kg lbs lbs suit cyl location SAC SAC OTU OTU maxCNS CNS tối đa DivelogsDeWebServices Invalid response from server Expected XML tag 'DiveDateReader', got instead '%1 Expected XML tag 'DiveDates' not found Malformed XML response. Line %1: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done Uploading dive list... Downloading dive list... Downloading %1 dives... Download finished - %1 Corrupted download The archive could not be opened: %1 Upload failed Upload successful Login failed Cannot parse response Error: %1 Upload finished DownloadFromDCWidget OK Error Lỗi Retry Thử lại Choose file for divecomputer download logfile Log files (*.log) Warning Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer Tải về từ Thiết Bị Lặn Vendor Dive Computer Device or Mount Point ... Force download of all dives Buộc tải về tất cả các lần lặn Always prefer downloaded dives OK Cancel Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations MainTab Dive Notes Ghi chú về lần lặn Location Địa điểm Coordinates Divemaster Người lặn giỏi nhất Buddy Bạn Start time Air temp Water temp Tags Rating Xếp hạng Visibility Tầm nhìn Suit Đồ lặn Notes Ghi chú Equipment Dụng cụ Dive Info Thông tin lần lặn Date Ngày tháng Interval Gases Used Gas Consumed SAC SAC Max. Depth Ave. Depth OTU OTU Air Pressure Air Temperature Water Temperature Dive Time Thời gian lặn Salinity Stats Trạng thái Depth Độ sâu Temperature Nhiệt độ Duration Độ dài Total Time Tổng số thời gian Dives Lần lặn Cylinders Xilanh Add Cylinder Weights Add Weight System Trip Location Trip Notes Save Lưu lại Cancel This trip is being edited. Multiple dives are being edited. This dive is being edited. /min unknown chưa rõ N N S S E E W W MainWindow Filter Bộ lọc &File &Log &View &Help &Import &New logbook New Mới Ctrl+N &Open logbook Open Ctrl+O &Save Save Lưu lại Ctrl+S Save as Lưu dưới dạng Ctrl+Shift+S Close Đóng lại Ctrl+W Import Files Ctrl+I Export &UDDF Ctrl+U &Print Ctrl+, &Quit Import from &dive computer Import &GPS data from Subsurface Service Ctrl+G &Edit Device Names Ctrl++ &Renumber Ctrl+R Toggle &Zoom &Yearly Statistics Ctrl+Y Dive List Profile Hồ sơ Info Thông tin All User &Manual Globe P&lan Dive Ctrl+L Import CSV Import CS&V Import from Divelogs.de Ctrl+P Preferences Tùy biến Ctrl+Q Ctrl+D Add Dive Auto Group Ctrl+2 Ctrl+3 Ctrl+4 Ctrl+1 Prev DC DC trước Left Next DC DC tiếp theo Right Select Events Chọn sự kiện Input Plan Nhập vào kế hoạch About Subsurface Thông tin F1 Ctrl+5 Open File Mở tập tin Please save or cancel the current dive edit before closing the file. Please save or cancel the current dive edit before trying to plan a dive. Please save or cancel the current dive edit before trying to add a dive. User Manual Hướng dẫn sử dụng Cannot find the Subsurface manual Do you want to save the changes you made in the file %1? Do you want to save the changes you made in the datafile? Save Changes? Lưu các thay đổi? Changes will be lost if you don't save them. First finish the current edition before trying to do another. Save File as Warning Please save or cancel the current dive edit before opening a new file. UDDF files (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) PreferencesDialog Defaults Units Đơn vị Graph Language Lists and Tables Font Font size Dives Lần lặn Default Dive file ... Display Invalid Default Cylinder Use Default Cylinder System Metric Imperial Personalize Depth Độ sâu meter feet bar bar psi psi liter cu ft celsius fahrenheit kg pO₂ pN₂ System Default Filter Bộ lọc Pressure Áp suất Volume Temperature Nhiệt độ Weight Cân nặng lbs lbs Time units Ascent/Descent speed denominator Minutes Seconds Show threshold pHe MOD max ppO₂ EAD END EADD Dive computer reported ceiling draw ceiling red Calculated ceiling show all tissues 3m increments Calculate NDL/TTS GFLow at max depth Misc Preferences Tùy biến SAC SAC GFLow GFHigh Restart required To correctly load a new language you must restart Subsurface. Open Default Log File Subsurface XML files (*.ssrf *.xml *.XML) PrintDialog &Preview P&rint &Close Print PrintLayout Dive# Lần lặn# Date Ngày tháng Depth Độ sâu Duration Độ dài Master Giỏi nhất Buddy Bạn Location Địa điểm PrintOptions Print options Print only selected dives Chỉ in những lần lặn được chọn Print in color In với màu Print type Loại in 6 dives per page 6 lần lặn mỗi trang 2 dives per page 2 lần lặn mỗi trang Table print In bảng Ordering Đang sắp trật tự Profile on top Hồ sơ trên cùng Notes on top Ghi chú trên cùng Sizing heights (% of layout) Profile height (43% - 85%) Other data height (8% - 17%) Notes height (0% - 52%) 0 ProfileGraphicsView Add Gas Change Add Bookmark Remove Event Hide similar events Unhide all events Hide events Hide all %1 events? Remove the selected event? %1 @ %2:%3 unknown divecomputer Set Duration: 10 minutes Scale Ruler Measure properties of dive segments Scale your dive to screen size Edit Chỉnh sửa pN pHe pO air không khí EAN%1 Bailing out to OC Thoát đến OC begin Starts with space! bắt đầu end Starts with space! kết thúc ProfilePrintModel unknown chưa rõ Dive #%1 - %2 Max depth: %1 %2 Duration: %1 min Gas Used: SAC: Max. CNS: Weights: Notes: Divemaster: Buddy: Suit: Viz: Rating: QObject AIR KHÔNG KHÍ Remove this Point Close Đóng lại Average Trung bình Minimum Nhỏ nhất Maximum Tối đa Move the map and double-click to set the dive location RenumberDialog Renumber Đánh số lại New starting number Số bắt đầu mới ShiftTimesDialog Shift selected times Shift times of selected dives by h:mm earlier later SubsurfaceAbout About Subsurface Thông tin <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License &Website SubsurfaceWebServices Webservice Dịch vụ web Connecting... Đang kết nối... Download finished Download error: %1 Connection Error: Lỗi kết nối: Invalid user identifier! Nhận dạng người dùng không hợp lệ! Cannot parse response! Không nhận được trả lời! Download Success! Tải về thành công! TableView Add Cylinder TankInfoModel Description ml bar bar ToolTipItem Information WSInfoModel Description kg WebServices Webservice Connection Status: Enter your ID here Download User ID Số hiệu người dùng Password Mật khẩu Upload Operation timed out Transfering data... WeightModel Type Loại Weight Cân nặng Clicking here will remove this weigthsystem. kg lbs ft m YearlyStatisticsModel Year > Month / Trip # # Duration Total Average Shortest Longest Depth (%1) Average Minimum Maximum SAC (%1) Average Temp. (%1) Average gettextFromC pascal pascal bar bar psi psi l l cuft cuft m m ft ft lbs lbs kg (%s) or (%s) (%s) hoặc (%s) air không khí integrated được tích hợp belt dây ràng ankle mắt cá chân backplate weight cân nặng giáp che clip-on clip-on Failed to read '%s' Thất bại khi đọc dữ liệu '%s' Failed to read '%s'. Use import for CSV files. Maximum number of supported columns on CSV import is %d none không deco stop dừng lại deco rbt rbt ascent đường dốc ceiling trần workload tải công việc transmitter máy phát radio violation độ xâm phạm bookmark đánh dấu surface bề mặt safety stop dừng an toàn gaschange thay đổi dưỡng khí safety stop (voluntary) dừng an toàn (tự nguyện) safety stop (mandatory) dừng an toàn (bắt buộc) deepstop deepstop ceiling (safety stop) trần (độ an toàn) divetime thời gian lặn below floor event showing dive is below deco floor and adding deco time maxdepth độ sâu tối đa OLF OLF PO2 PO2 airtime thời gian không khí rgbm rgbm heading thẳng tiến tissue level warning cảnh báo cấp độ mô non stop time không dừng lại thời gian invalid event number chỉ số sự kiện không hợp lệ Unable to create parser for %s %s Không thể tạo việc chuyển thông số cho %s %s Error registering the data Lỗi khi đăng ký dữ liệu Error parsing the datetime Lỗi khi chuyển thông số thời gian Dive %d: %s %d %04d Lần lặn %d: %s %d %04d Error parsing the divetime Lỗi khi chuyển thông số thời gian lặn Error parsing the maxdepth Lỗi khi chuyển thông số độ sâu tối đa Error parsing the gas mix count Lỗi khi chuyển tiếp thông số số lượng hỗn hợp dưỡng khí Error obtaining water salinity Lỗi khi thu nhận độ mặn của nước Error obtaining surface pressure Error parsing the gas mix Lỗi khi chuyển thông số hỗn hợp dưỡng khí Error parsing the samples Lỗi khi chuyển thông số các mẫu Event: waiting for user action Sự kiện: đang đợi thao tác từ người dùng model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) mô hình=%u (0x%08x), firmware=%u (0x%08x), số hiệu=%u (0x%08x) Error registering the event handler. Lỗi khi đăng ký quản lý sự kiện. Error registering the cancellation handler. Lỗi khi đăng ký việc hủy bỏ quản lý. Dive data import error Lỗi khi nhập dữ liệu lặn Unable to create libdivecomputer context Không thể tạo nội dung cho thiết bị đo lặn Unable to open %s %s (%s) Không thể mở %s %s (%s) Strange percentage reading %s Đang đọc tỉ lệ lạ %s Failed to parse '%s'. Thất bại khi chuyển thông số '%s'. Failed to parse '%s' Thất bại khi chuyển thông số '%s' Database query get_events failed. Thất bại khi truy vấn việc nhận_sự kiện từ cơ sở dữ liệu. Database connection failed '%s'. Thất bại khi kết nối cơ sở dữ liệu '%s'. Database query failed '%s'. Thất bại khi truy vấn dữ liệu '%s'. Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d Không tìm thấy dưỡng khí %d%d Too many gas mixes Quá nhiều dưỡng khí được trộn %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Kế hoạch lặn dưới bề mặt dựa trên GFlow = %.0f và GFhigh = %.0f Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s Chuyển đến %.*f %s trong %d:%02d phút - thời gian chạy %d:%02u tại %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s Ở %.*f %s đối với %d:%02d phút - thời gian chạy %d:%02u ở %s Switch gas to %s Chuyển dưỡng khí sang %s Gas consumption: Dưỡng khí tiêu thụ: %.0f%s of %s %.0f%s of %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s Trần đã tính toán %.0f %s %s Tissue %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s Dừng an toàn:%umin @ %.0f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s Dừng an toàn:chưa rõ thời gian @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:chưa rõ thời gian @ %.0f %s %s In deco %s Trong deco %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s In deco (calc) %s NDL:%umin (calc) %s TTS:%umin (calc) %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s C F %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (1 dive) boat thuyền shore bờ biển drift độ trôi deep sâu cavern hang lớn ice băng wreck vật trôi dạt cave hang động altitude độ cao so với mặt biển pool ao lake hồ river sông night ban đêm fresh student photo hình ảnh video video instructor deco deco more than %d days đã hơn %d ngày %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # cho các lần lặn # for selected dives cho các lần lặn được chọn for dive #%d cho lần lặn #%d for selected dive cho lần lặn được chọn for all dives cho mọi lần lặn (no dives) (không có cuộc lặn nào) Sun CN Mon T2 Tue T3 Wed T4 Thu T5 Fri T6 Sat T7 Jan Th1 Feb Th2 Mar Th3 Apr Apr May Th5 Jun Th6 Jul Th7 Aug Th8 Sep Th9 Oct Th10 Nov Th11 Dec Th12 Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: Hệ thống tập tin đã quá tải Ngắt kết nối/kết nối lại thiết bị đo lặn và click 'Thử lại' Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: Hệ thống tập tin quá tải Ngắt kết nối/kết nối lại thiết bị đo lặn và thử lại lần nữa Short write to req.txt file Is the Uemis Zurich plugged in correctly? Ghi ngắn gọn vào tập tin req.txt Uemis Zurich đã được gắn vào đúng cách chưa? unknown chưa rõ Reading %s %s Đang đọc %s %s data dữ liệu divelog entry id số dòng nhật trình lặn divespot data id số dữ liệu điểm lặn more data dive id thêm dữ liệu về chỉ số lần lặn wetsuit wetsuit semidry ít ướt drysuit đồ khô shorty ngắn vest áo khoác long john long john jacket jacket full suit thiết bị đầy đủ 2 pcs full suit 2 bộ pcs đầy đủ membrane lớp màng Init Communication Thiết lập giao tiếp Uemis init failed Thất bại cho việc thiết lập Uemis Start download Bắt đầu tải xuống Safety Stop Violation Dừng độ vi phạm an toàn Speed Alarm Báo động tốc độ Speed Warning Cảnh báo tốc độ PO2 Green Warning Cảnh báo PO2 xanh PO2 Ascend Warning Cảnh báo PO2 cao PO2 Ascend Alarm Cảnh báo PO2 cao Tank Pressure Info Thông tin áp suất bể nước RGT Warning Cảnh báo RGT RGT Alert Cảnh báo RGT Tank Change Suggested Đề nghị thay đổi bể nước Depth Limit Exceeded Giới hạn độ sâu cho phép Max Deco Time Warning Cảnh báo thời gian tối đa Deco Dive Time Info Thông tin về thời gian lặn Dive Time Alert Cảnh báo thời gian lặn Marker Người đánh dấu No Tank Data Không có dữ liệu bồn nước Low Battery Warning Cảnh báo năng lượng yếu Low Battery Alert Cảnh báo năng lượng yếu Subsurface-4.0.2/translations/subsurface_zh_TW.ts000066400000000000000000003676761226345450700222260ustar00rootroot00000000000000 CSVImportDialog Import File (CSV) 匯入檔案 (CSV) ... ... PO2 PO2 Field Separator 欄位分隔線 Field Configuration 欄位設定 Import CSV file 匯入 CSV 檔案 Time 時間 Depth 深度 Temp 溫度 Cns Cns Stopdepth 停留深度 Pre-configured imports 未設定前的匯入 Open CSV Log File 開啟 CSV 日誌檔案 CSV Files (*.csv);;All Files(*) CylindersModel Type 類型 Size 容量 WorkPress 工作壓力 StartPress 開始壓力 EndPress 結束壓力 Switch at 交換於 He% He% O O Clicking here will remove this cylinder. 於此處按下將移除此氣瓶. Cylinder cannot be removed 氣瓶無法移除 This gas in use. Only cylinders that are not used in the dive can be removed. 此為使用氣體. 只有在潛水時, 未使用的氣體才可以被移除. psi psi bar bar l l cuft cuft DiveComputerManagementDialog Edit Dive Computer Nicknames 編輯潛水電腦別名 Remove the selected Dive Computer? 移除選擇的潛水電腦? Are you sure that you want to remove the selected dive computer? 您確認要 移除選擇的潛水電腦? DiveComputerModel Model 型號 Device ID 裝置 ID Nickname 別名 Clicking here will remove this divecomputer. 於此處按下將會移除此潛水電腦. DiveItem l/min l/min cuft/min cuft/min DiveListView Show Search Box 顯示搜尋盒 expand all 全部展開 collapse all 全部摺疊 collapse others 摺疊其它 remove dive(s) from trip 自旅程中移除潛水 (多筆) create new trip above 於上方新增旅程 add dive(s) to trip immediately above 新增潛水 (所選) 至旅程上方. merge trip with trip above 與上方旅程合併 merge trip with trip below 與下方旅程合併 delete dive(s) 刪除潛水 (所選) mark dive(s) invalid 標示無效的潛水 (所選) save As 另存為 export As UDDF 匯出成 UDDF shift times 移動時間 upload dive(s) to divelogs.de 上傳潛水 (所選) 至 divelogs.de Save Dives As... 儲存潛水為... Save File as 另存新檔 UDDF files (*.uddf *.UDDF) UDDF 檔案 (*.uddf *.UDDF) merge selected dives 合併所選擇的潛水 DivePlanner Bottom SAC 水底耗氣率 SAC on DECO Stop 減壓停留耗氣率 GFHigh GFhigh GFLow GFlow Last Stop at 6m 最後於 6 米停留 Start Time 開始時間 ATM Pressure 大氣壓力 DivePlannerGraphics 10m 10m 30ft 30ft Handler Position Error 程式位置錯誤 One or more of your stops will be lost with this operations, Please, remove them first. 在這次流程, 有一或多個停留將會被跳過, 請預先移除它們. DivePlannerPointsModel AIR 空氣 Final Depth 最後深度 Duration 區間 Used Gas 已使用的氣體 CC Set Point 密閉式循環設定點 Discard the Plan? 取消這次計畫? You are about to discard your plan. 您將要放棄你的計劃. DivePlannerWidget Dive Planner Points 潛水計畫指示 Available Gases 可用氣瓶 add dive data point 新增潛水資料點 DiveTripModel # # date 日期 m m ft ft min min kg kg lbs lbs suit 防寒衣 cyl 氣瓶 location 位置 SAC 耗氣率 OTU 氧容許量 OTU maxCNS 最大 CNS DivelogsDeWebServices Invalid response from server 主機回傳不正確的回應. Expected XML tag 'DiveDateReader', got instead '%1 預期的 XML 標籤 'DiveDateReader', 取代了 '%1 Expected XML tag 'DiveDates' not found 無法找到預期的 XML 標籤 'DiveDates' Malformed XML response. Line %1: %2 異常的 XML 回應. 第 %1 行: %2 no dives were selected failed to create zip file for upload: %1 cannot create temporary file: %1 internal error: %1 internal error Done 完成 Uploading dive list... 上傳潛水列表... Downloading dive list... 下載潛水列表... Downloading %1 dives... 下載 %1 潛水... Download finished - %1 下載結束 - %1 Corrupted download 中斷下載 The archive could not be opened: %1 此存檔無法被開啟: %1 Upload failed 上傳失敗 Upload successful 上傳成功 Login failed 登入失敗 Cannot parse response 回覆無法解析 Error: %1 錯誤: %1 Upload finished 上傳結束 DownloadFromDCWidget OK 確認 Error 錯誤 Retry 重試 Choose file for divecomputer download logfile Log files (*.log) Warning 提醒 Saving the libdivecomputer dump will NOT download dives to the dive list. Choose file for divecomputer binary dump file Dump files (*.bin) DownloadFromDiveComputer Download From Dive Computer 從潛水電腦進行下載 Vendor 廠牌 Dive Computer 潛水電腦 Device or Mount Point 裝置或連接處 ... ... Force download of all dives 強制下載所有潛水記錄 Always prefer downloaded dives 總是保留已下載的潛水 OK 確認 Cancel 取消 Save libdivecomputer logfile Save libdivecomputer dumpfile GlobeGPS Edit Selected Dive Locations 編輯所選擇的潛水位置 MainTab Dive Notes 潛水記錄 Location 位置 Coordinates 座標 Divemaster 導潛 Buddy 潛伴 Start time 開始時間 Air temp 氣溫 Water temp 水溫 Tags 標籤 Rating 評分 Visibility 能見度 Suit 防寒衣 Notes 記錄 Equipment 裝備 Dive Info 潛水資訊 Date 日期 Interval 水面休息時間 Gases Used 使用氣體 Gas Consumed 氣體消耗 SAC 耗氣率 Max. Depth 最大深度 Ave. Depth 平均深度 OTU 氧容許量 OTU Air Pressure 氣壓 Air Temperature 氣溫 Water Temperature 水溫 Dive Time 潛水時間 Salinity 鹽度 Stats 統計 Depth 深度 Temperature 溫度 Duration 區間 Total Time 全部時間 Dives 潛水 Cylinders 氣瓶 Add Cylinder 新增氣瓶 Weights 配重 Add Weight System 增加配重系統 Trip Location 旅程位置 Trip Notes 旅程記錄 Save 儲存 Cancel 取消 This trip is being edited. 此旅程已被編輯. Multiple dives are being edited. 此些旅程已被編輯. This dive is being edited. 此潛水已被編輯. /min /min unknown 未知 N N S S E E W W MainWindow Filter 篩選器 &File 檔案 &Log 日誌 &View 檢視 &Help 幫助 &Import 匯入 &New logbook 建立新日誌 New 建立 Ctrl+N Ctrl+N &Open logbook 開啟日誌 Open 開啟 Ctrl+O Ctrl+O &Save 儲存 Save 儲存 Ctrl+S Ctrl+S Save as 另存為 Ctrl+Shift+S Ctrl+Shift+S Close 關閉 Ctrl+W Ctrl+W Import Files 匯入檔案 Ctrl+I Ctrl+I Export &UDDF 匯出 UDDF Ctrl+U Ctrl+U &Print 列印 Ctrl+, Ctrl+, &Quit 結束 Import from &dive computer 從潛水電腦匯入 Import &GPS data from Subsurface Service 自 Subsurface 服務匯入 GPS 資料 Ctrl+G Ctrl+G &Edit Device Names 編輯裝置名稱 Ctrl++ Ctrl++ &Renumber 重新編號 Ctrl+R Ctrl+R Toggle &Zoom 變焦切換 &Yearly Statistics 年統計 Ctrl+Y Ctrl+Y Dive List 潛水列表 Profile 資訊 Info 資訊 All 全部 User &Manual 使用者說明 Globe 地圖位置 P&lan Dive 計畫潛水 Ctrl+L Ctrl+L Import CSV 匯入 CSV Import CS&V 匯入 CSV Import from Divelogs.de 自 Divelogs.de 匯入 Ctrl+P Ctrl+P Preferences 環境設定 Ctrl+Q Ctrl+Q Ctrl+D Ctrl+D Add Dive 增加潛水 Auto Group 增加群組 Ctrl+2 Ctrl+2 Ctrl+3 Ctrl+3 Ctrl+4 Ctrl+4 Ctrl+1 Ctrl+1 Prev DC 上一個 DC Left 左邊 Next DC 下一個 DC Right 右邊 Select Events 選擇事件 Input Plan 輸入計畫 About Subsurface 關於 Subsurface F1 F1 Ctrl+5 Ctrl+5 Open File 開啟檔案 Please save or cancel the current dive edit before closing the file. 在關閉檔案前, 請儲存或取消此次潛水的編輯. Please save or cancel the current dive edit before trying to plan a dive. 在開始計畫潛水前, 請先儲存或取消此次潛水的編輯. Please save or cancel the current dive edit before trying to add a dive. 在新增潛水前, 請先儲存或取消此次潛水的編輯. User Manual 使用者說明 Cannot find the Subsurface manual 無法找到 Subsurface 使用說明 Do you want to save the changes you made in the file %1? 您是否要對檔案 %1 所做的修改儲存? Do you want to save the changes you made in the datafile? 您是否要對資料檔案所做的修改進行儲存? Save Changes? 儲存變更? Changes will be lost if you don't save them. 如果不進行儲存, 所做變更將會遺失. First finish the current edition before trying to do another. 在做另一編輯前, 請先結束此次編輯. Save File as 另存新檔 Warning 提醒 Please save or cancel the current dive edit before opening a new file. 在開啟新檔前, 請儲存或取消此次潛水的編輯. UDDF files (*.uddf *.UDDF) UDDF 檔案 (*.uddf *.UDDF) Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML 檔案 (*.ssrf *.xml *.XML) PreferencesDialog Defaults 預設值 Units 單位 Graph 圖表 Language 語言 Lists and Tables 列表與表單 Font 字型 Font size 字體大小 Dives 潛水 Default Dive file 預設潛水檔案 ... ... Display Invalid 顯示無效 Default Cylinder 預設氣瓶 Use Default Cylinder 使用的預設氣瓶 System 系統 Metric 公制 Imperial 英制 Personalize 個人化 Depth 深度 meter meter feet feet bar bar psi psi liter liter cu ft cu ft celsius 攝氏 fahrenheit 華氏 kg kg pO₂ pO₂ pN₂ pN₂ System Default 系統預設 Filter 篩選器 Pressure 壓力 Volume 容量 Temperature 溫度 Weight 重量 lbs lbs Time units 時間單位 Ascent/Descent speed denominator 上升/下降速度單位 Minutes Seconds Show 顯示 threshold 門檻 pHe pHe MOD MOD max ppO₂ 最大 ppO2 EAD END EADD EAD END EADD Dive computer reported ceiling 潛水電腦回報的深度 draw ceiling red 以紅色繪製深度 Calculated ceiling 計算的深度 show all tissues 顯示所有組織 3m increments 3m 增量 Calculate NDL/TTS 計算 NDL/TTS GFLow at max depth 最大深度的 GFLow Misc 其它 Preferences 環境設定 SAC 耗氣率 GFLow GFlow GFHigh GFhigh Restart required 需要重新啟動 To correctly load a new language you must restart Subsurface. 您必須重新啟動 Subsurface 來正確載入新的語言 Open Default Log File 開啟預設的日誌檔案 Subsurface XML files (*.ssrf *.xml *.XML) Subsurface XML 檔案 (*.ssrf *.xml *.XML) PrintDialog &Preview 預覽 P&rint 列印 &Close 關閉 Print 列印 PrintLayout Dive# 潛水編號 # Date 日期 Depth 深度 Duration 區間 Master 專長 Buddy 潛伴 Location 位置 PrintOptions Print options 列印選項 Print only selected dives 只列印所選的潛水 Print in color 彩色列印 Print type 列印類型 6 dives per page 每頁 6 支潛水 2 dives per page 每頁 2 支潛水 Table print 表格列印 Ordering 順序 Profile on top 潛水資訊在上方 Notes on top 潛水記錄在上方 Sizing heights (% of layout) 調整高度 (版面的 %) Profile height (43% - 85%) 潛水資訊欄位高度 (43% - 85%) Other data height (8% - 17%) 其餘資料欄位高度 (8% - 17%) Notes height (0% - 52%) 記錄欄位高度 (0% - 52%) 0 0 ProfileGraphicsView Add Gas Change 增加氣瓶交換 Add Bookmark 增加書籤 Remove Event 移除事件 Hide similar events 隱藏相似事件 Unhide all events Hide events 隱藏事件 Hide all %1 events? 隱藏所有 %1 事件? Remove the selected event? 移除所選擇的事件? %1 @ %2:%3 %1 @ %2:%3 unknown divecomputer 未知的潛水電腦 Set Duration: 10 minutes 設定區間: 10 分鐘 Scale 比例 Ruler 尺規 Measure properties of dive segments 各潛水項目的量測設定 Scale your dive to screen size 調整潛水至螢幕大小 Edit 編輯 pN pN pHe pHe pO pO air air EAN%1 EAN%1 Bailing out to OC 跳脫至 OC begin Starts with space! 開始 end Starts with space! 結束 ProfilePrintModel unknown 未知 Dive #%1 - %2 潛水 #%1 - %2 Max depth: %1 %2 最大深度: %1 %2 Duration: %1 min 區間: %1 min Gas Used: 消耗氣體: SAC: 耗氣率: Max. CNS: 最大 CNS: Weights: 配重: Notes: 記錄: Divemaster: 導潛: Buddy: 潛伴: Suit: 防寒衣: Viz: Viz: Rating: 評分: QObject AIR 空氣 Remove this Point 移除此點 Close 關閉 Average 平均 Minimum 最低 Maximum 最高 Move the map and double-click to set the dive location 在地圖上移動, 並且雙擊來設定潛水位置 RenumberDialog Renumber 重新編號 New starting number 新的開始編號 ShiftTimesDialog Shift selected times 移動所選擇的時間 Shift times of selected dives by 移動所選擇潛水的時間,根據 h:mm h:mm earlier 較早 later 較晚 SubsurfaceAbout About Subsurface 關於 Subsurface <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>Multi-platform divelog software<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> <span style='font-size: 18pt; font-weight: bold;'>Subsurface %1 </span><br><br>跨平台潛水日誌軟體<br><span style='font-size: 8pt'>Linus Torvalds, Dirk Hohndel, and others, 2011, 2012, 2013</span> &License 版權 &Website 網站 SubsurfaceWebServices Webservice 網頁服務 Connecting... 連結... Download finished 下載結束 Download error: %1 下載失敗: %1 Connection Error: 連結錯誤: Invalid user identifier! 錯誤的使用者 Id ! Cannot parse response! 回覆無法解析! Download Success! 下載成功! TableView Add Cylinder 新增氣瓶 TankInfoModel Description 描述 ml ml bar bar ToolTipItem Information 資訊 WSInfoModel Description 描述 kg kg WebServices Webservice Connection 網頁服務連結 Status: 狀態: Enter your ID here 於此處輸入您的 ID Download 下載 User ID 使用者 ID Password 密碼 Upload 上傳 Operation timed out 操作時間結束 Transfering data... 移轉資料... WeightModel Type 類型 Weight 重量 Clicking here will remove this weigthsystem. 按此處移除配重系統 kg kg lbs lbs ft ft m m YearlyStatisticsModel Year > Month / Trip 年 > 月 / 旅程 # # Duration Total 區間 全部 Average 平均 Shortest 最短 Longest 最長 Depth (%1) Average 深度 (%1) 平均 Minimum 最小 Maximum 最大 SAC (%1) Average 耗氣率 (%1) 平均 Temp. (%1) Average 溫度 (%1) 平均 gettextFromC pascal pascal bar bar psi psi l l cuft cuft m m ft ft lbs lbs kg kg (%s) or (%s) (%s) 或 (%s) air air integrated 整合型 belt 配重帶 ankle 腳踝 backplate weight 背板配重 clip-on 吊掛式 Failed to read '%s' 無法讀取 '%s' Failed to read '%s'. Use import for CSV files. 讀取 '%s' 失敗, 使用匯入 CSV 檔案. Maximum number of supported columns on CSV import is %d CSV 匯入最大支援 %d 欄位. none deco stop 減壓停留 rbt rbt ascent 上升 ceiling 深度 workload 工作量 transmitter 發射器 violation 違反 bookmark 書籤 surface 水面 safety stop 安全停留 gaschange 氣瓶更換 safety stop (voluntary) 安全停留 (非必要) safety stop (mandatory) 安全停留 (強制性) deepstop 深停留 ceiling (safety stop) 深度 (安全停留) divetime 潛水時間 below floor event showing dive is below deco floor and adding deco time below floor maxdepth 最大深度 OLF OLF PO2 PO2 airtime 空氣時間 rgbm rgbm heading 標題 tissue level warning 組織等級警告 non stop time 無停留時間 invalid event number 錯誤的事件編號 Unable to create parser for %s %s 無法建立解析 %s %s Error registering the data 錯誤的登錄資料 Error parsing the datetime 日期時間解析錯誤 Dive %d: %s %d %04d 潛水 %d: %s %d %04d Error parsing the divetime 潛水時間解析錯誤 Error parsing the maxdepth 最大深度解析錯誤 Error parsing the gas mix count 混合氣體數量解析錯誤 Error obtaining water salinity 得到錯誤的海水鹽度 Error obtaining surface pressure 得到錯誤的水面壓力 Error parsing the gas mix 混合氣體解析錯誤 Error parsing the samples 樣本解析錯誤 Event: waiting for user action 事件: 等待使用者動作 model=%u (0x%08x), firmware=%u (0x%08x), serial=%u (0x%08x) 型號=%u (0x%08x), 韌體=%u (0x%08x), 序號=%u (0x%08x) Error registering the event handler. 錯誤的註冊程序. Error registering the cancellation handler. 錯誤的註冊取消程序. Dive data import error 匯入潛水資料錯誤 Unable to create libdivecomputer context 無法建立 libdivecomputer 上下文 Unable to open %s %s (%s) 無法開啟 %s %s (%s) Strange percentage reading %s 有問題的讀取比例 %s Failed to parse '%s'. 無法解析訊息 '%s' . Failed to parse '%s' 無法解析訊息 '%s' Database query get_events failed. 資料庫讀取 get_events 失敗. Database connection failed '%s'. 資料庫連結錯誤 '%s' . Database query failed '%s'. 資料庫要求錯誤 '%s' . Can't open stylesheet %s EAN%d EAN%d Can't find gas %d/%d 無法找到氣源 %d/%d Too many gas mixes 太多氣體混合 %s Subsurface dive plan based on GFlow = %.0f and GFhigh = %.0f %s Subsurface 潛水計畫 以 GFlow = %.0f 和 GFhigh = %.0f 為基礎 Transition to %.*f %s in %d:%02d min - runtime %d:%02u on %s 禁搭飛機 %.*f %s 在 %d:%02d min - 運行時間 %d:%02u 在 %s Stay at %.*f %s for %d:%02d min - runtime %d:%02u on %s 在 %.*f %s 停留 %d:%02d min - 時間運行 %d:%02u 於 %s Switch gas to %s 更換氣體至 %s Gas consumption: 氣體消耗: %.0f%s of %s %.0f%s of %s ean ean %s P:%d %s %s P:%d %s %s T:%.1f %s %s T:%.1f %s %s V:%.2f %s %s V:%.2f %s %s Calculated ceiling %.0f %s %s 計算的深度 %.0f %s %s Tissue %.0fmin: %.0f %s %s 組織 %.0fmin: %.0f %s %s Safetystop:%umin @ %.0f %s %s 安全停留:%umin @ %.0f %s @:%d:%02d D:%.1f %s @:%d:%02d D:%.1f %s %s SAC:%2.1fl/min %s 耗氣率:%2.1fl/min %s Safetystop:unkn time @ %.0f %s %s 安全停留:未知時間 @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:%umin @ %.0f %s %s Deco:unkn time @ %.0f %s %s Deco:時間未知 @ %.0f %s %s In deco %s 減壓中 %s NDL:%umin %s NDL:%umin %s CNS:%u%% %s CNS:%u%% %s pO%s:%.2fbar %s pO%s:%.2fbar %s pN%s:%.2fbar %s pN%s:%.2fbar %s pHe:%.2fbar %s pHe:%.2fbar %s MOD:%d%s %s MOD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s EAD:%d%s END:%d%s EADD:%d%s %s Deco:%umin @ %.0f %s (calc) %s Deco:%umin @ %.0f %s (計算) %s In deco (calc) %s In deco (計算) %s NDL:%umin (calc) %s NDL:%umin (預計) %s TTS:%umin (calc) %s TTS:%umin (預計) %sT: %d:%02d min %sT: %d:%02d min %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s %sD:%.1f%s %s%sV:%.2f%s %s%sV:%.2f%s %s %sV:%.2f%s %s %sV:%.2f%s %s %sP:%d %s %s %sP:%d %s C C F F %1, %2 %3, %4 %5:%6 %1, %2 %3, %4 %5:%6 %1 %2, %3 %4:%5 %1 %2, %3 %4:%5 %1 %2 (%3 dives) %1 %2 (%3 潛水) %1 %2 (1 dive) %1 %2 (1 潛水) boat 船潛 shore 岸潛 drift 放流 deep 深潛 cavern 地洞 ice 冰潛 wreck 沈船 cave 洞穴 altitude 高海拔 pool 泳池 lake 湖泊 river 河流 night 夜潛 fresh 新進 student 學生 photo 照片 video 影片 instructor 教練 deco 減壓 more than %d days 超過 %d日 %dd %dh %dmin %dd %dh %dmin %dh %dmin %dh %dmin for dives # 針對潛水 # for selected dives 針對選擇的潛水 for dive #%d 針對潛水 #%d for selected dive 針對選擇的潛水 for all dives 針對所有潛水 (no dives) (無潛水) Sun 周日 Mon 周一 Tue 周二 Wed 周三 Thu 周四 Fri 周五 Sat 周六 Jan 1月 Feb 2月 Mar 3月 Apr 4月 May 5月 Jun 6月 Jul 7月 Aug 8月 Sep 9月 Oct 10月 Nov 11月 Dec 12月 Uemis Zurich: File System is almost full Disconnect/reconnect the dive computer and click 'Retry' Uemis Zurich: 檔案系統使用空間已接近額滿 請將潛水電腦中斷/重新連接 並按下"重試"鈕 Uemis Zurich: File System is full Disconnect/reconnect the dive computer and try again Uemis Zurich: 檔案系統使用空間已額滿 請將潛水電腦中斷/重新連接 並再次嘗試 Short write to req.txt file Is the Uemis Zurich plugged in correctly? 無法寫入 req.txt 檔案 請確認 Uemis Zurich 是否正確連接? unknown 未知 Reading %s %s 讀取 %s %s data 資料 divelog entry id 潛水記錄連結 id divespot data id 潛點資料 id more data dive id 更多潛水記錄, 潛水編號 wetsuit 濕式防寒衣 semidry 半乾衣 drysuit 乾式防寒衣 shorty 短袖防寒衣 vest 背心 long john 長約翰式 jacket 夾克式 full suit 全身式防寒衣 2 pcs full suit 2 件式防寒衣 membrane 膜組織 Init Communication 初始化通訊 Uemis init failed Uemis 初始化失敗 Start download 開始下載 Safety Stop Violation 違反安全停留 Speed Alarm 速度過快警示 Speed Warning 速度過快提醒 PO2 Green Warning PO2 提醒 PO2 Ascend Warning PO2 上升提醒 PO2 Ascend Alarm PO2 上升警告 Tank Pressure Info 氣瓶壓力資訊 RGT Warning RGT 提醒 RGT Alert RGT 警告 Tank Change Suggested 氣瓶更換建議 Depth Limit Exceeded 超過深度限制 Max Deco Time Warning 最大減壓時間提醒 Dive Time Info 潛水時間資訊 Dive Time Alert 潛水時間警告 Marker 標記 No Tank Data 無氣瓶資料 Low Battery Warning 電池低電量提醒 Low Battery Alert 電池低電量警示 Subsurface-4.0.2/uemis-downloader.c000066400000000000000000000634361226345450700172650ustar00rootroot00000000000000/* * uemis-downloader.c * * Copyright (c) Dirk Hohndel * released under GPL2 * * very (VERY) loosely based on the algorithms found in Java code by Fabian Gast * which was released under the BSD-STYLE BEER WARE LICENSE * I believe that I only used the information about HOW to do this (download data from the Uemis * Zurich) but did not actually use any of his copyrighted code, therefore the license under which * he released his code does not apply to this new implementation in C */ #include #include #include #include #include #include "gettext.h" #include "libdivecomputer.h" #include "uemis.h" #include "divelist.h" #define ERR_FS_ALMOST_FULL QT_TRANSLATE_NOOP("gettextFromC","Uemis Zurich: File System is almost full\nDisconnect/reconnect the dive computer\nand click \'Retry\'") #define ERR_FS_FULL QT_TRANSLATE_NOOP("gettextFromC","Uemis Zurich: File System is full\nDisconnect/reconnect the dive computer\nand try again") #define ERR_FS_SHORT_WRITE QT_TRANSLATE_NOOP("gettextFromC","Short write to req.txt file\nIs the Uemis Zurich plugged in correctly?") #define BUFLEN 2048 #define NUM_PARAM_BUFS 10 #if UEMIS_DEBUG & 64 /* we are reading from a copy of the filesystem, not the device - no need to wait */ #define UEMIS_TIMEOUT 50 /* 50ns */ #define UEMIS_LONG_TIMEOUT 500 /* 500ns */ #define UEMIS_MAX_TIMEOUT 2000 /* 2ms */ #else #define UEMIS_TIMEOUT 50000 /* 50ms */ #define UEMIS_LONG_TIMEOUT 500000 /* 500ms */ #define UEMIS_MAX_TIMEOUT 2000000 /* 2s */ #endif static char *param_buff[NUM_PARAM_BUFS]; static char *reqtxt_path; static int reqtxt_file; static int filenr; static int number_of_files; static char *mbuf = NULL; static int mbuf_size = 0; static int nr_divespots = 0; /* helper function to parse the Uemis data structures */ static void uemis_ts(char *buffer, void *_when) { struct tm tm; timestamp_t *when = _when; memset(&tm, 0, sizeof(tm)); sscanf(buffer,"%d-%d-%dT%d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); tm.tm_mon -= 1; tm.tm_year -= 1900; *when = utc_mktime(&tm); } /* float minutes */ static void uemis_duration(char *buffer, duration_t *duration) { duration->seconds = ascii_strtod(buffer, NULL) * 60 + 0.5; } /* int cm */ static void uemis_depth(char *buffer, depth_t *depth) { depth->mm = atoi(buffer) * 10; } static void uemis_get_index(char *buffer, int *idx) { *idx = atoi(buffer); } /* space separated */ static void uemis_add_string(const char *buffer, char **text) { /* do nothing if this is an empty buffer (Uemis sometimes returns a single * space for empty buffers) */ if (!buffer || !*buffer || (*buffer == ' ' && *(buffer + 1) == '\0')) return; if (!*text) { *text = strdup(buffer); } else { char *buf = malloc(strlen(buffer) + strlen(*text) + 2); strcpy(buf, *text); strcat(buf, " "); strcat(buf, buffer); free(*text); *text = buf; } } /* still unclear if it ever reports lbs */ static void uemis_get_weight(char *buffer, weightsystem_t *weight, int diveid) { weight->weight.grams = uemis_get_weight_unit(diveid) ? lbs_to_grams(ascii_strtod(buffer, NULL)) : ascii_strtod(buffer, NULL) * 1000; weight->description = strdup(translate("gettextFromC","unknown")); } static struct dive *uemis_start_dive(uint32_t deviceid) { struct dive *dive = alloc_dive(); dive->downloaded = TRUE; dive->dc.model = strdup("Uemis Zurich"); dive->dc.deviceid = deviceid; return dive; } /* send text to the importer progress bar */ static void uemis_info(const char *fmt, ...) { static char buffer[256]; va_list ap; va_start(ap, fmt); vsnprintf(buffer, sizeof(buffer), fmt, ap); va_end(ap); progress_bar_text = buffer; } static long bytes_available(int file) { long result; long now = lseek(file, 0, SEEK_CUR); result = lseek(file, 0, SEEK_END); lseek(file, now, SEEK_SET); return result; } static int number_of_file(char *path) { int count = 0; #ifdef WIN32 struct _wdirent *entry; _WDIR *dirp = (_WDIR *)subsurface_opendir(path); #else struct dirent *entry; DIR *dirp = (DIR *)subsurface_opendir(path); #endif while (dirp) { #ifdef WIN32 entry = _wreaddir(dirp); if (!entry) break; #else entry = readdir(dirp); if (!entry) break; if (entry->d_type == DT_REG) /* If the entry is a regular file */ #endif count++; } #ifdef WIN32 _wclosedir(dirp); #else closedir(dirp); #endif return count; } static char *build_filename(const char *path, const char *name) { int len = strlen(path) + strlen(name) + 2; char *buf = malloc(len); #if WIN32 snprintf(buf, len, "%s\%s", path, name); #else snprintf(buf, len, "%s/%s", path, name); #endif return buf; } /* Check if there's a req.txt file and get the starting filenr from it. * Test for the maximum number of ANS files (I believe this is always * 4000 but in case there are differences depending on firmware, this * code is easy enough */ static bool uemis_init(const char *path) { char *ans_path; int i; if (!path) return FALSE; /* let's check if this is indeed a Uemis DC */ reqtxt_path = build_filename(path,"req.txt"); reqtxt_file = subsurface_open(reqtxt_path, O_RDONLY, 0666); if (!reqtxt_file) { #if UEMIS_DEBUG & 1 fprintf(debugfile, ":EE req.txt can't be opened\n"); #endif return FALSE; } if (bytes_available(reqtxt_file) > 5) { char tmp[6]; read(reqtxt_file, tmp, 5); tmp[5] = '\0'; #if UEMIS_DEBUG & 2 fprintf(debugfile, "::r req.txt \"%s\"\n", tmp); #endif if (sscanf(tmp + 1, "%d", &filenr) != 1) return FALSE; } else { filenr = 0; #if UEMIS_DEBUG & 2 fprintf(debugfile, "::r req.txt skipped as there were fewer than 5 bytes\n"); #endif } close (reqtxt_file); /* It would be nice if we could simply go back to the first set of * ANS files. But with a FAT filesystem that isn't possible */ ans_path = build_filename(path, "ANS"); number_of_files = number_of_file(ans_path); free(ans_path); /* initialize the array in which we collect the answers */ for (i = 0; i < NUM_PARAM_BUFS; i++) param_buff[i] = ""; return TRUE; } static void str_append_with_delim(char *s, char *t) { int len = strlen(s); snprintf(s + len, BUFLEN - len, "%s{", t); } /* The communication protocoll with the DC is truly funky. * After you write your request to the req.txt file you call this function. * It writes the number of the next ANS file at the beginning of the req.txt * file (prefixed by 'n' or 'r') and then again at the very end of it, after * the full request (this time without the prefix). * Then it syncs (not needed on Windows) and closes the file. */ static void trigger_response(int file, char *command, int nr, long tailpos) { char fl[10]; snprintf(fl, 8, "%s%04d", command, nr); #if UEMIS_DEBUG & 4 fprintf(debugfile,":tr %s (after seeks)\n", fl); #endif lseek(file, 0, SEEK_SET); write(file, fl, strlen(fl)); lseek(file, tailpos, SEEK_SET); write(file, fl + 1, strlen(fl + 1)); #ifndef WIN32 fsync(file); #endif close(file); } static char *next_token(char **buf) { char *q, *p = strchr(*buf, '{'); if (p) *p = '\0'; else p = *buf + strlen(*buf) - 1; q = *buf; *buf = p + 1; return q; } /* poor man's tokenizer that understands a quoted delimter ('{') */ static char *next_segment(char *buf, int *offset, int size) { int i = *offset; int seg_size; bool done = FALSE; char *segment; while (!done) { if (i < size) { if (i < size - 1 && buf[i] == '\\' && (buf[i+1] == '\\' || buf[i+1] == '{')) memcpy(buf + i, buf + i + 1, size - i - 1); else if (buf[i] == '{') done = TRUE; i++; } else { done = TRUE; } } seg_size = i - *offset - 1; if (seg_size < 0) seg_size = 0; segment = malloc(seg_size + 1); memcpy(segment, buf + *offset, seg_size); segment[seg_size] = '\0'; *offset = i; return segment; } /* a dynamically growing buffer to store the potentially massive responses. * The binary data block can be more than 100k in size (base64 encoded) */ static void buffer_add(char **buffer, int *buffer_size, char *buf) { if (!buf) return; if (! *buffer) { *buffer = strdup(buf); *buffer_size = strlen(*buffer) + 1; } else { *buffer_size += strlen(buf); *buffer = realloc(*buffer, *buffer_size); strcat(*buffer, buf); } #if UEMIS_DEBUG & 16 fprintf(debugfile,"added \"%s\" to buffer - new length %d\n", buf, *buffer_size); #endif } /* are there more ANS files we can check? */ static bool next_file(int max) { if (filenr >= max) return FALSE; filenr++; return TRUE; } static char *first_object_id_val(char* buf) { char *object, *bufend; if (!buf) return NULL; bufend = buf + strlen(buf); object = strstr(buf, "object_id"); if (object && object + 14 < bufend) { /* get the value */ char tmp[10]; char *p = object + 14; char *t = tmp; #if UEMIS_DEBUG & 2 char debugbuf[50]; strncpy(debugbuf, object, 49); debugbuf[49] = '\0'; fprintf(debugfile, "buf |%s|\n", debugbuf); #endif while (p < bufend && *p != '{' && t < tmp + 9) *t++ = *p++; if (*p == '{') { *t = '\0'; return strdup(tmp); } } return NULL; } /* ultra-simplistic; it doesn't deal with the case when the object_id is * split across two chunks. It also doesn't deal with the discrepancy between * object_id and dive number as understood by the dive computer */ static void show_progress(char *buf, const char *what) { char *val = first_object_id_val(buf); if (val) { /* let the user know what we are working on */ #if UEMIS_DEBUG & 2 fprintf(debugfile,"reading %s %s\n", what, val); #endif uemis_info(translate("gettextFromC","Reading %s %s"), what, val); free(val); } } static void uemis_increased_timeout(int *timeout) { if (*timeout < UEMIS_MAX_TIMEOUT) *timeout += UEMIS_LONG_TIMEOUT; usleep(*timeout); } /* send a request to the dive computer and collect the answer */ static bool uemis_get_answer(const char *path, char *request, int n_param_in, int n_param_out, const char **error_text) { int i = 0, file_length; char sb[BUFLEN]; char fl[13]; char tmp[101]; const char *what = translate("gettextFromC","data"); bool searching = TRUE; bool assembling_mbuf = FALSE; bool ismulti = FALSE; bool found_answer = FALSE; bool more_files = TRUE; bool answer_in_mbuf = FALSE; char *ans_path; int ans_file; int timeout = UEMIS_LONG_TIMEOUT; reqtxt_file = subsurface_open(reqtxt_path, O_RDWR | O_CREAT, 0666); snprintf(sb, BUFLEN, "n%04d12345678", filenr); str_append_with_delim(sb, request); for (i = 0; i < n_param_in; i++) str_append_with_delim(sb, param_buff[i]); if (! strcmp(request, "getDivelogs") || ! strcmp(request, "getDeviceData") || ! strcmp(request, "getDirectory") || ! strcmp(request, "getDivespot") || ! strcmp(request, "getDive")) { answer_in_mbuf = TRUE; str_append_with_delim(sb, ""); if (! strcmp(request, "getDivelogs")) what = translate("gettextFromC","divelog entry id"); else if (!strcmp(request, "getDivespot")) what = translate("gettextFromC","divespot data id"); else if (!strcmp(request, "getDive")) what = translate("gettextFromC","more data dive id"); } str_append_with_delim(sb, ""); file_length = strlen(sb); snprintf(fl, 10, "%08d", file_length - 13); memcpy(sb + 5, fl, strlen(fl)); #if UEMIS_DEBUG & 1 fprintf(debugfile,"::w req.txt \"%s\"\n", sb); #endif if (write(reqtxt_file, sb, strlen(sb)) != strlen(sb)) { *error_text = translate("gettextFromC",ERR_FS_SHORT_WRITE); return FALSE; } if (! next_file(number_of_files)) { *error_text = translate("gettextFromC",ERR_FS_FULL); more_files = FALSE; } trigger_response(reqtxt_file, "n", filenr, file_length); usleep(timeout); mbuf = NULL; mbuf_size = 0; while (searching || assembling_mbuf) { if (import_thread_cancelled) return FALSE; progress_bar_fraction = filenr / 4000.0; snprintf(fl, 13, "ANS%d.TXT", filenr - 1); ans_path = build_filename(build_filename(path, "ANS"), fl); ans_file = subsurface_open(ans_path, O_RDONLY, 0666); read(ans_file, tmp, 100); close(ans_file); #if UEMIS_DEBUG & 8 tmp[100]='\0'; fprintf(debugfile, "::t %s \"%s\"\n", ans_path, tmp); #elif UEMIS_DEBUG & 4 char pbuf[4]; pbuf[0] = tmp[0]; pbuf[1] = tmp[1]; pbuf[2] = tmp[2]; pbuf[3] = 0; fprintf(debugfile, "::t %s \"%s...\"\n", ans_path, pbuf); #endif free(ans_path); if (tmp[0] == '1') { searching = FALSE; if (tmp[1] == 'm') { assembling_mbuf = TRUE; ismulti = TRUE; } if (tmp[2] == 'e') assembling_mbuf = FALSE; if (assembling_mbuf) { if (! next_file(number_of_files)) { *error_text = translate("gettextFromC",ERR_FS_FULL); more_files = FALSE; assembling_mbuf = FALSE; } reqtxt_file = subsurface_open(reqtxt_path, O_RDWR | O_CREAT, 0666); trigger_response(reqtxt_file, "n", filenr, file_length); } } else { if (! next_file(number_of_files - 1)) { *error_text = translate("gettextFromC",ERR_FS_FULL); more_files = FALSE; assembling_mbuf = FALSE; searching = FALSE; } reqtxt_file = subsurface_open(reqtxt_path, O_RDWR | O_CREAT, 0666); trigger_response(reqtxt_file, "r", filenr, file_length); uemis_increased_timeout(&timeout); } if (ismulti && more_files && tmp[0] == '1') { int size; snprintf(fl, 13, "ANS%d.TXT", assembling_mbuf ? filenr - 2 : filenr - 1); ans_path = build_filename(build_filename(path, "ANS"), fl); ans_file = subsurface_open(ans_path, O_RDONLY, 0666); size = bytes_available(ans_file); if (size > 3) { char *buf = malloc(size - 2); lseek(ans_file, 3, SEEK_CUR); read(ans_file, buf, size - 3); buf[size - 3] = '\0'; buffer_add(&mbuf, &mbuf_size, buf); show_progress(buf, what); free(buf); param_buff[3]++; } close(ans_file); timeout = UEMIS_TIMEOUT; usleep(UEMIS_TIMEOUT); } } if (more_files) { int size = 0, j = 0; char *buf = NULL; if (!ismulti) { snprintf(fl, 13, "ANS%d.TXT", filenr - 1); ans_path = build_filename(build_filename(path, "ANS"), fl); ans_file = subsurface_open(ans_path, O_RDONLY, 0666); size = bytes_available(ans_file); if (size > 3) { buf = malloc(size - 2); lseek(ans_file, 3, SEEK_CUR); read(ans_file, buf, size - 3); buf[size - 3] = '\0'; buffer_add(&mbuf, &mbuf_size, buf); show_progress(buf, what); #if UEMIS_DEBUG & 8 fprintf(debugfile, "::r %s \"%s\"\n", ans_path, buf); #endif } size -= 3; close(ans_file); free(ans_path); } else { ismulti = FALSE; } #if UEMIS_DEBUG & 8 fprintf(debugfile,":r: %s\n", buf); #endif if (!answer_in_mbuf) for (i = 0; i < n_param_out && j < size; i++) param_buff[i] = next_segment(buf, &j, size); found_answer = TRUE; free(buf); } #if UEMIS_DEBUG & 1 for (i = 0; i < n_param_out; i++) fprintf(debugfile,"::: %d: %s\n", i, param_buff[i]); #endif return found_answer; } static void parse_divespot(char *buf) { char *bp = buf + 1; char *tp = next_token(&bp); char *tag, *type, *val; char locationstring[1024] = ""; int divespot, len; double latitude = 0.0, longitude = 0.0; if (strcmp(tp, "divespot")) return; do tag = next_token(&bp); while (*tag && strcmp(tag, "object_id")); if (! *tag) return; type = next_token(&bp); val = next_token(&bp); divespot = atoi(val); do { tag = next_token(&bp); type = next_token(&bp); val = next_token(&bp); if (!strcmp(type, "string") && *val && strcmp(val, " ")) { len = strlen(locationstring); snprintf(locationstring + len, sizeof(locationstring) - len, "%s%s", len ? ", " : "", val); } else if (!strcmp(type, "float")) { if (!strcmp(tag, "longitude")) longitude = ascii_strtod(val, NULL); else if (!strcmp(tag, "latitude")) latitude = ascii_strtod(val, NULL); } } while (tag && *tag); uemis_set_divelocation(divespot, locationstring, latitude, longitude); } static void track_divespot(char *val, int diveid, char **location, degrees_t *latitude, degrees_t *longitude) { int id = atoi(val); if (id >= 0 && id > nr_divespots) nr_divespots = id; uemis_mark_divelocation(diveid, id, location, latitude, longitude); return; } static char *suit[] = { "", QT_TRANSLATE_NOOP("gettextFromC","wetsuit"), QT_TRANSLATE_NOOP("gettextFromC","semidry"), QT_TRANSLATE_NOOP("gettextFromC","drysuit") }; static char *suit_type[] = { "", QT_TRANSLATE_NOOP("gettextFromC","shorty"), QT_TRANSLATE_NOOP("gettextFromC","vest"), QT_TRANSLATE_NOOP("gettextFromC","long john"), QT_TRANSLATE_NOOP("gettextFromC","jacket"), QT_TRANSLATE_NOOP("gettextFromC","full suit"), QT_TRANSLATE_NOOP("gettextFromC","2 pcs full suit") }; static char *suit_thickness[] = { "", "0.5-2mm", "2-3mm", "3-5mm", "5-7mm", "8mm+", QT_TRANSLATE_NOOP("gettextFromC","membrane") }; static void parse_tag(struct dive *dive, char *tag, char *val) { /* we can ignore computer_id, water and gas as those are redundant * with the binary data and would just get overwritten */ if (! strcmp(tag, "date")) { uemis_ts(val, &dive->when); } else if (!strcmp(tag, "duration")) { uemis_duration(val, &dive->dc.duration); } else if (!strcmp(tag, "depth")) { uemis_depth(val, &dive->dc.maxdepth); } else if (!strcmp(tag, "file_content")) { uemis_parse_divelog_binary(val, dive); } else if (!strcmp(tag, "altitude")) { uemis_get_index(val, &dive->dc.surface_pressure.mbar); } else if (!strcmp(tag, "f32Weight")) { uemis_get_weight(val, &dive->weightsystem[0], dive->dc.diveid); } else if (!strcmp(tag, "notes")) { uemis_add_string(val, &dive->notes); } else if (!strcmp(tag, "u8DiveSuit")) { if (*suit[atoi(val)]) uemis_add_string(translate("gettextFromC",suit[atoi(val)]), &dive->suit); } else if (!strcmp(tag, "u8DiveSuitType")) { if (*suit_type[atoi(val)]) uemis_add_string(translate("gettextFromC",suit_type[atoi(val)]), &dive->suit); } else if (!strcmp(tag, "u8SuitThickness")) { if (*suit_thickness[atoi(val)]) uemis_add_string(translate("gettextFromC",suit_thickness[atoi(val)]), &dive->suit); } } /* This function is called for both divelog and dive information that we get * from the SDA (what an insane design, btw). The object_id in the divelog * matches the logfilenr in the dive information (which has its own, often * different object_id) - we use this as the diveid. * We create the dive when parsing the divelog and then later, when we parse * the dive information we locate the already created dive via its diveid. * Most things just get parsed and converted into our internal data structures, * but the dive location API is even more crazy. We just get an id that is an * index into yet another data store that we read out later. In order to * correctly populate the location and gps data from that we need to remember * the adresses of those fields for every dive that references the divespot. */ static void process_raw_buffer(uint32_t deviceid, char *inbuf, char **max_divenr, bool keep_number, int *for_dive) { char *buf = strdup(inbuf); char *tp, *bp, *tag, *type, *val; bool done = FALSE; int inbuflen = strlen(inbuf); char *endptr = buf + inbuflen; bool log = FALSE; char *sections[10]; int s, nr_sections = 0; struct dive *dive = NULL; if (for_dive) *for_dive = -1; bp = buf + 1; tp = next_token(&bp); if (strcmp(tp, "divelog") == 0) { /* this is a divelog */ log = TRUE; tp = next_token(&bp); if (strcmp(tp,"1.0") != 0) { free(buf); return; } } else if (strcmp(tp, "dive") == 0) { /* this is dive detail */ tp = next_token(&bp); if (strcmp(tp,"1.0") != 0) { free(buf); return; } } else { /* don't understand the buffer */ free(buf); return; } if (log) dive = uemis_start_dive(deviceid); while (!done) { /* the valid buffer ends with a series of delimiters */ if (bp >= endptr - 2 || !strcmp(bp, "{{")) break; tag = next_token(&bp); /* we also end if we get an empty tag */ if (*tag == '\0') break; for (s = 0; s < nr_sections; s++) if (!strcmp(tag, sections[s])) { tag = next_token(&bp); break; } type = next_token(&bp); if (!strcmp(type, "1.0")) { /* this tells us the sections that will follow; the tag here * is of the format dive-
*/ sections[nr_sections] = strchr(tag, '-') + 1; #if UEMIS_DEBUG & 4 fprintf(debugfile, "Expect to find section %s\n", sections[nr_sections]); #endif if (nr_sections < sizeof(sections) - 1) nr_sections++; continue; } val = next_token(&bp); if (log && ! strcmp(tag, "object_id")) { free(*max_divenr); *max_divenr = strdup(val); dive->dc.diveid = atoi(val); if (keep_number) dive->number = atoi(val); } else if (!log && ! strcmp(tag, "logfilenr")) { /* this one tells us which dive we are adding data to */ dive = get_dive_by_diveid(atoi(val), deviceid); if (for_dive) *for_dive = atoi(val); } else if (!log && dive && ! strcmp(tag, "divespot_id")) { track_divespot(val, dive->dc.diveid, &dive->location, &dive->latitude, &dive->longitude); } else if (dive) { parse_tag(dive, tag, val); } if (log && ! strcmp(tag, "file_content")) done = TRUE; /* done with one dive (got the file_content tag), but there could be more: * a '{' indicates the end of the record - but we need to see another "{{" * later in the buffer to know that the next record is complete (it could * be a short read because of some error */ if (done && ++bp < endptr && *bp != '{' && strstr(bp, "{{")) { done = FALSE; record_dive(dive); mark_divelist_changed(TRUE); dive = uemis_start_dive(deviceid); } } if (log) { if (dive->dc.diveid) { record_dive(dive); mark_divelist_changed(TRUE); } else { /* partial dive */ free(dive); } } free(buf); return; } static char *uemis_get_divenr(char *deviceidstr) { uint32_t deviceid, maxdiveid = 0; int i; char divenr[10]; deviceid = atoi(deviceidstr); for (i = 0; i < dive_table.nr; i++) { struct divecomputer *dc = &dive_table.dives[i]->dc; while (dc) { if (dc->model && !strcmp(dc->model, "Uemis Zurich") && (dc->deviceid == 0 || dc->deviceid == 0x7fffffff || dc->deviceid == deviceid) && dc->diveid > maxdiveid) maxdiveid = dc->diveid; dc = dc->next; } } snprintf(divenr, 10, "%d", maxdiveid); return strdup(divenr); } const char *do_uemis_import(const char *mountpath, short force_download) { char *newmax = NULL; int start, end, i, offset; uint32_t deviceidnr; char objectid[10]; char *deviceid = NULL; const char *result = NULL; char *endptr; bool success, keep_number = FALSE, once = TRUE; if (dive_table.nr == 0) keep_number = TRUE; uemis_info(translate("gettextFromC","Init Communication")); if (! uemis_init(mountpath)) return translate("gettextFromC","Uemis init failed"); if (! uemis_get_answer(mountpath, "getDeviceId", 0, 1, &result)) goto bail; deviceid = strdup(param_buff[0]); deviceidnr = atoi(deviceid); /* the answer from the DeviceId call becomes the input parameter for getDeviceData */ if (! uemis_get_answer(mountpath, "getDeviceData", 1, 0, &result)) goto bail; /* param_buff[0] is still valid */ if (! uemis_get_answer(mountpath, "initSession", 1, 6, &result)) goto bail; uemis_info(translate("gettextFromC","Start download")); if (! uemis_get_answer(mountpath, "processSync", 0, 2, &result)) goto bail; /* before starting the long download, check if user pressed cancel */ if (import_thread_cancelled) goto bail; param_buff[1] = "notempty"; /* if we have an empty divelist or force it, then we start downloading from the * first dive on the Uemis; otherwise check which was the last dive downloaded */ if (!force_download && dive_table.nr > 0) newmax = uemis_get_divenr(deviceid); else newmax = strdup("0"); start = atoi(newmax); for (;;) { param_buff[2] = newmax; param_buff[3] = 0; success = uemis_get_answer(mountpath, "getDivelogs", 3, 0, &result); /* process the buffer we have assembled */ if (mbuf) process_raw_buffer(deviceidnr, mbuf, &newmax, keep_number, NULL); if (once) { char *t = first_object_id_val(mbuf); if (t && atoi(t) > start) start = atoi(t); free(t); once = FALSE; } /* if the user clicked cancel, exit gracefully */ if (import_thread_cancelled) goto bail; /* if we got an error or got nothing back, stop trying */ if (!success || !param_buff[3]) break; /* finally, if the memory is getting too full, maybe we better stop, too */ if (progress_bar_fraction > 0.85) { result = translate("gettextFromC",ERR_FS_ALMOST_FULL); break; } /* clean up mbuf */ endptr = strstr(mbuf, "{{{"); if (endptr) *(endptr + 2) = '\0'; } if (sscanf(newmax, "%d", &end) != 1) end = start; #if UEMIS_DEBUG & 2 fprintf(debugfile, "done: read from object_id %d to %d\n", start, end); #endif free(newmax); offset = 0; for (i = start; i <= end; i++) { snprintf(objectid, sizeof(objectid), "%d", i + offset); param_buff[2] = objectid; #if UEMIS_DEBUG & 2 fprintf(debugfile, "getDive %d, object_id %s\n", i, objectid); #endif /* there is no way I have found to directly get the dive information * for dive #i as the object_id and logfilenr can be different in the * getDive call; so we get the first one, compare the actual divenr * with the one that we wanted, calculate the offset and try again. * What an insane design... */ success = uemis_get_answer(mountpath, "getDive", 3, 0, &result); if (mbuf) { int divenr; process_raw_buffer(deviceidnr, mbuf, &newmax, FALSE, &divenr); if (divenr > -1 && divenr != i) { offset = i - divenr; #if UEMIS_DEBUG & 2 fprintf(debugfile, "got dive %d -> trying again with offset %d\n", divenr, offset); #endif i = start - 1; continue; } } if (!success || import_thread_cancelled) break; } success = TRUE; for (i = 0; i <= nr_divespots; i++) { char divespotnr[10]; snprintf(divespotnr, sizeof(divespotnr), "%d", i); param_buff[2] = divespotnr; #if UEMIS_DEBUG & 2 fprintf(debugfile, "getDivespot %d\n", i); #endif success = uemis_get_answer(mountpath, "getDivespot", 3, 0, &result); if (mbuf) parse_divespot(mbuf); } bail: (void) uemis_get_answer(mountpath, "terminateSync", 0, 3, &result); if (! strcmp(param_buff[0], "error")) { if (! strcmp(param_buff[2],"Out of Memory")) result = translate("gettextFromC",ERR_FS_FULL); else result = param_buff[2]; } free(deviceid); return result; } Subsurface-4.0.2/uemis.c000066400000000000000000000300571226345450700151220ustar00rootroot00000000000000/* * uemis.c * * UEMIS SDA file importer * AUTHOR: Dirk Hohndel - Copyright 2011 * * Licensed under the MIT license. */ #include #include #include "gettext.h" #include "dive.h" #include "uemis.h" #include #include /* * following code is based on code found in at base64.sourceforge.net/b64.c * AUTHOR: Bob Trower 08/04/01 * COPYRIGHT: Copyright (c) Trantor Standard Systems Inc., 2001 * NOTE: This source code may be used as you wish, subject to * the MIT license. */ /* * Translation Table to decode (created by Bob Trower) */ static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq"; /* * decodeblock -- decode 4 '6-bit' characters into 3 8-bit binary bytes */ static void decodeblock (unsigned char in[4], unsigned char out[3]) { out[0] = (unsigned char) (in[0] << 2 | in[1] >> 4); out[1] = (unsigned char) (in[1] << 4 | in[2] >> 2); out[2] = (unsigned char) (((in[2] << 6) & 0xc0) | in[3]); } /* * decode a base64 encoded stream discarding padding, line breaks and noise */ static void decode(uint8_t *inbuf, uint8_t *outbuf, int inbuf_len) { uint8_t in[4], out[3], v; int i,len,indx_in=0,indx_out=0; while (indx_in < inbuf_len) { for (len = 0, i = 0; i < 4 && (indx_in < inbuf_len); i++) { v = 0; while ((indx_in < inbuf_len) && v == 0) { v = inbuf[indx_in++]; v = ((v < 43 || v > 122) ? 0 : cd64[ v - 43 ]); if (v) v = ((v == '$') ? 0 : v - 61); } if (indx_in < inbuf_len) { len++; if (v) in[i] = (v - 1); } else in[i] = 0; } if (len) { decodeblock(in, out); for(i = 0; i < len - 1; i++) outbuf[indx_out++] = out[i]; } } } /* end code from Bob Trower */ /* * convert the base64 data blog */ static int uemis_convert_base64(char *base64, uint8_t **data) { int len,datalen; len = strlen(base64); datalen = (len/4 + 1)*3; if (datalen < 0x123+0x25) { /* less than header + 1 sample??? */ fprintf(stderr,"suspiciously short data block\n"); } *data = malloc(datalen); if (! *data) { datalen = 0; fprintf(stderr,"Out of memory\n"); goto bail; } decode(base64, *data, len); if (memcmp(*data,"Dive\01\00\00",7)) fprintf(stderr,"Missing Dive100 header\n"); bail: return datalen; } struct uemis_helper { int diveid; int lbs; int divespot; char **location; degrees_t *latitude; degrees_t *longitude; struct uemis_helper *next; }; static struct uemis_helper *uemis_helper = NULL; static struct uemis_helper *uemis_get_helper(int diveid) { struct uemis_helper **php = &uemis_helper; struct uemis_helper *hp = *php; while (hp) { if (hp->diveid == diveid) return hp; if (hp->next) { hp = hp->next; continue; } php = &hp->next; break; } hp = *php = calloc(1, sizeof(struct uemis_helper)); hp->diveid = diveid; hp->next = NULL; return hp; } static void uemis_weight_unit(int diveid, int lbs) { struct uemis_helper *hp = uemis_get_helper(diveid); if (hp) hp->lbs = lbs; } int uemis_get_weight_unit(int diveid) { struct uemis_helper *hp = uemis_helper; while (hp) { if (hp->diveid == diveid) return hp->lbs; hp = hp->next; } /* odd - we should have found this; default to kg */ return 0; } void uemis_mark_divelocation(int diveid, int divespot, char **location, degrees_t *longitude, degrees_t *latitude) { struct uemis_helper *hp = uemis_get_helper(diveid); hp->divespot = divespot; hp->location = location; hp->longitude = longitude; hp->latitude = latitude; } void uemis_set_divelocation(int divespot, char *text, double longitude, double latitude) { struct uemis_helper *hp = uemis_helper; #if 0 /* seems overkill */ if (!g_utf8_validate(text, -1, NULL)) return; #endif while (hp) { if (hp->divespot == divespot && hp->location) { *hp->location = strdup(text); hp->longitude->udeg = round(longitude * 1000000); hp->latitude->udeg = round(latitude * 1000000); } hp = hp->next; } } /* Create events from the flag bits and other data in the sample; * These bits basically represent what is displayed on screen at sample time. * Many of these 'warnings' are way hyper-active and seriously clutter the * profile plot - so these are disabled by default * * we mark all the strings for translation, but we store the untranslated * strings and only convert them when displaying them on screen - this way * when we write them to the XML file we'll always have the English strings, * regardless of locale */ static void uemis_event(struct dive *dive, struct divecomputer *dc, struct sample *sample, uemis_sample_t *u_sample) { uint8_t *flags = u_sample->flags; int stopdepth; static int lastndl; if (flags[1] & 0x01) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Safety Stop Violation")); if (flags[1] & 0x08) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Speed Alarm")); #if WANT_CRAZY_WARNINGS if (flags[1] & 0x06) /* both bits 1 and 2 are a warning */ add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Speed Warning")); if (flags[1] & 0x10) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","PO2 Green Warning")); #endif if (flags[1] & 0x20) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","PO2 Ascend Warning")); if (flags[1] & 0x40) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","PO2 Ascend Alarm")); /* flags[2] reflects the deco / time bar * flags[3] reflects more display details on deco and pO2 */ if (flags[4] & 0x01) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Tank Pressure Info")); if (flags[4] & 0x04) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","RGT Warning")); if (flags[4] & 0x08) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","RGT Alert")); if (flags[4] & 0x40) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Tank Change Suggested")); if (flags[4] & 0x80) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Depth Limit Exceeded")); if (flags[5] & 0x01) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Max Deco Time Warning")); if (flags[5] & 0x04) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Dive Time Info")); if (flags[5] & 0x08) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Dive Time Alert")); if (flags[5] & 0x10) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Marker")); if (flags[6] & 0x02) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","No Tank Data")); if (flags[6] & 0x04) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Low Battery Warning")); if (flags[6] & 0x08) add_event(dc, sample->time.seconds, 0, 0, 0, QT_TRANSLATE_NOOP("gettextFromC","Low Battery Alert")); /* flags[7] reflects the little on screen icons that remind of previous * warnings / alerts - not useful for events */ #if UEMIS_DEBUG & 32 int i, j; for (i = 0; i < 8; i++) { printf(" %d: ", 29 + i); for (j = 7; j >= 0; j--) printf ("%c", flags[i] & 1 << j ? '1' : '0'); } printf("\n"); #endif /* now add deco / NDL * we don't use events but store this in the sample - that makes much more sense * for the way we display this information * What we know about the encoding so far: * flags[3].bit0 | flags[5].bit1 != 0 ==> in deco * flags[0].bit7 == 1 ==> Safety Stop * otherwise NDL */ stopdepth = rel_mbar_to_depth(u_sample->hold_depth, dive); if ((flags[3] & 1) | (flags[5] & 2)) { /* deco */ sample->in_deco = TRUE; sample->stopdepth.mm = stopdepth; sample->stoptime.seconds = u_sample->hold_time *60; sample->ndl.seconds = 0; } else if (flags[0] & 128) { /* safety stop - distinguished from deco stop by having * both ndl and stop information */ sample->in_deco = FALSE; sample->stopdepth.mm = stopdepth; sample->stoptime.seconds = u_sample->hold_time *60; sample->ndl.seconds = lastndl; } else { /* NDL */ sample->in_deco = FALSE; lastndl = sample->ndl.seconds = u_sample->hold_time *60; sample->stopdepth.mm = 0; sample->stoptime.seconds = 0; } #if UEMIS_DEBUG & 32 printf("%dm:%ds: p_amb_tol:%d surface:%d holdtime:%d holddepth:%d/%d ---> stopdepth:%d stoptime:%d ndl:%d\n", sample->time.seconds / 60, sample->time.seconds % 60, u_sample->p_amb_tol, dive->dc.surface_pressure.mbar, u_sample->hold_time, u_sample->hold_depth, stopdepth, sample->stopdepth.mm, sample->stoptime.seconds, sample->ndl.seconds); #endif } /* * parse uemis base64 data blob into struct dive */ void uemis_parse_divelog_binary(char *base64, void *datap) { int datalen; int i; uint8_t *data; struct sample *sample = NULL; uemis_sample_t *u_sample; struct dive *dive = datap; struct divecomputer *dc = &dive->dc; int template, gasoffset; int active = 0; datalen = uemis_convert_base64(base64, &data); dive->dc.airtemp.mkelvin = C_to_mkelvin((*(uint16_t *)(data + 45)) / 10.0); dive->dc.surface_pressure.mbar = *(uint16_t *)(data + 43); if (*(uint8_t *)(data + 19)) dive->dc.salinity = SEAWATER_SALINITY; /* avg grams per 10l sea water */ else dive->dc.salinity = FRESHWATER_SALINITY; /* grams per 10l fresh water */ /* this will allow us to find the last dive read so far from this computer */ dc->model = strdup("Uemis Zurich"); dc->deviceid = *(uint32_t *)(data + 9); dc->diveid = *(uint16_t *)(data + 7); /* remember the weight units used in this dive - we may need this later when * parsing the weight */ uemis_weight_unit(dc->diveid, *(uint8_t *)(data + 24)); /* dive template in use: 0 = air 1 = nitrox (B) 2 = nitrox (B+D) 3 = nitrox (B+T+D) uemis cylinder data is insane - it stores seven tank settings in a block and the template tells us which of the four groups of tanks we need to look at */ gasoffset = template = *(uint8_t *)(data+115); if (template == 3) gasoffset = 4; if (template == 0) template = 1; for (i = 0; i < template; i++) { float volume = *(float *)(data+116+25*(gasoffset + i)) * 1000.0; /* uemis always assumes a working pressure of 202.6bar (!?!?) - I first thought * it was 3000psi, but testing against all my dives gets me that strange number. * Still, that's of course completely bogus and shows they don't get how * cylinders are named in non-metric parts of the world... * we store the incorrect working pressure to get the SAC calculations "close" * but the user will have to correct this manually */ dive->cylinder[i].type.size.mliter = volume; dive->cylinder[i].type.workingpressure.mbar = 202600; dive->cylinder[i].gasmix.o2.permille = *(uint8_t *)(data+120+25*(gasoffset + i)) * 10 + 0.5; dive->cylinder[i].gasmix.he.permille = 0; } /* first byte of divelog data is at offset 0x123 */ i = 0x123; u_sample = (uemis_sample_t *)(data + i); while ((i < datalen) && (u_sample->dive_time)) { /* it seems that a dive_time of 0 indicates the end of the valid readings */ /* the SDA usually records more samples after the end of the dive -- * we want to discard those, but not cut the dive short; sadly the dive * duration in the header is a) in minutes and b) up to 3 minutes short */ if (u_sample->dive_time > dive->dc.duration.seconds + 180) break; if (u_sample->active_tank != active) { active = u_sample->active_tank; add_gas_switch_event(dive, dc, u_sample->dive_time, active); } sample = prepare_sample(dc); sample->time.seconds = u_sample->dive_time; sample->depth.mm = rel_mbar_to_depth(u_sample->water_pressure, dive); sample->temperature.mkelvin = C_to_mkelvin(u_sample->dive_temperature / 10.0); sample->sensor = active; sample->cylinderpressure.mbar = (u_sample->tank_pressure_high * 256 + u_sample->tank_pressure_low) * 10; sample->cns = u_sample->cns; uemis_event(dive, dc, sample, u_sample); finish_sample(dc); i += 0x25; u_sample++; } if (sample) dive->dc.duration.seconds = sample->time.seconds - 1; return; } Subsurface-4.0.2/uemis.h000066400000000000000000000027021226345450700151230ustar00rootroot00000000000000/* * defines and prototypes for the uemis Zurich SDA file parser */ #ifndef UEMIS_H #define UEMIS_H #include #include "dive.h" #ifdef __cplusplus extern "C" { #endif void uemis_parse_divelog_binary(char *base64, void *divep); int uemis_get_weight_unit(int diveid); void uemis_mark_divelocation(int diveid, int divespot, char **location, degrees_t *longitude, degrees_t *latitude); void uemis_set_divelocation(int divespot, char *text, double longitude, double latitude); typedef struct { uint16_t dive_time; uint16_t water_pressure; // (in cbar) uint16_t dive_temperature; // (in dC) uint8_t ascent_speed; // (units unclear) uint8_t work_fact; uint8_t cold_fact; uint8_t bubble_fact; uint16_t ascent_time; uint16_t ascent_time_opt; uint16_t p_amb_tol; uint16_t satt; uint16_t hold_depth; uint16_t hold_time; uint8_t active_tank; // bloody glib, when compiled for Windows, forces the whole program to use // the Windows packing rules. So to avoid problems on Windows (and since // only tank_pressure is currently used and that exactly once) I give in and // make this silly low byte / high byte 8bit entries uint8_t tank_pressure_low; // (in cbar) uint8_t tank_pressure_high; uint8_t consumption_low; // (units unclear) uint8_t consumption_high; uint8_t rgt; // (remaining gas time in minutes) uint8_t cns; uint8_t flags[8]; } __attribute((packed)) uemis_sample_t; #ifdef __cplusplus } #endif #endif /* UEMIS_H */ Subsurface-4.0.2/webservice.h000066400000000000000000000007051226345450700161400ustar00rootroot00000000000000#ifdef __cplusplus extern "C" { #endif //extern void webservice_download_dialog(void); //extern bool webservice_request_user_xml(const gchar *, gchar **, unsigned int *, unsigned int *); extern int divelogde_upload(char *fn, char **error); extern unsigned int download_dialog_parse_response(char *xmldata, unsigned int len); enum { DD_STATUS_OK, DD_STATUS_ERROR_CONNECT, DD_STATUS_ERROR_ID, DD_STATUS_ERROR_PARSE, }; #ifdef __cplusplus } #endif Subsurface-4.0.2/windows.c000066400000000000000000000104231226345450700154650ustar00rootroot00000000000000/* windows.c */ /* implements Windows specific functions */ #include "dive.h" #include "display.h" #include #include #include #include #include #include #include const char system_divelist_default_font[] = "Sans 8"; const char *system_default_filename(void) { char datapath[MAX_PATH]; const char *user; char *buffer; int len; /* I don't think this works on Windows */ user = getenv("USERNAME"); if (! SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, datapath))) { datapath[0] = '.'; datapath[1] = '\0'; } len = strlen(datapath) + strlen(user) + 17; buffer = malloc(len); snprintf(buffer, len, "%s\\Subsurface\\%s.xml", datapath, user); return buffer; } int enumerate_devices (device_callback_t callback, void *userdata) { // Open the registry key. HKEY hKey; int index = -1; LONG rc = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey); if (rc != ERROR_SUCCESS) { return -1; } // Get the number of values. DWORD count = 0; rc = RegQueryInfoKey (hKey, NULL, NULL, NULL, NULL, NULL, NULL, &count, NULL, NULL, NULL, NULL); if (rc != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } DWORD i; for (i = 0; i < count; ++i) { // Get the value name, data and type. char name[512], data[512]; DWORD name_len = sizeof (name); DWORD data_len = sizeof (data); DWORD type = 0; rc = RegEnumValue (hKey, i, name, &name_len, NULL, &type, (LPBYTE) data, &data_len); if (rc != ERROR_SUCCESS) { RegCloseKey(hKey); return -1; } // Ignore non-string values. if (type != REG_SZ) continue; // Prevent a possible buffer overflow. if (data_len >= sizeof (data)) { RegCloseKey(hKey); return -1; } // Null terminate the string. data[data_len] = 0; callback (data, userdata); index++; if (is_default_dive_computer_device(name)) index = i; } RegCloseKey(hKey); return index; } /* this function converts a utf-8 string to win32's utf-16 2 byte string. * the caller function should manage the allocated memory. */ static wchar_t *utf8_to_utf16_fl(const char *utf8, char *file, int line) { assert(utf8 != NULL); assert(file != NULL); assert(line); /* estimate buffer size */ const int sz = strlen(utf8) + 1; wchar_t *utf16 = (wchar_t *)malloc(sizeof(wchar_t) * sz); if (!utf16) { fprintf(stderr, "%s:%d: %s %d.", file, line, "cannot allocate buffer of size", sz); return NULL; } if (MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, sz)) return utf16; fprintf(stderr, "%s:%d: %s", file, line, "cannot convert string."); free((void *)utf16); return NULL; } #define utf8_to_utf16(s) utf8_to_utf16_fl(s, __FILE__, __LINE__) /* bellow we provide a set of wrappers for some I/O functions to use wchar_t. * on win32 this solves the issue that we need paths to be utf-16 encoded. */ int subsurface_open(const char *path, int oflags, mode_t mode) { int ret = -1; if (!path) return -1; wchar_t *wpath = utf8_to_utf16(path); if (wpath) { ret = _wopen(wpath, oflags, mode); free((void *)wpath); return ret; } return ret; } FILE *subsurface_fopen(const char *path, const char *mode) { FILE *ret = NULL; if (!path) return ret; wchar_t *wpath = utf8_to_utf16(path); if (wpath) { const int len = strlen(mode); wchar_t wmode[len + 1]; for (int i = 0; i < len; i++) wmode[i] = (wchar_t)mode[i]; wmode[len] = 0; ret = _wfopen(wpath, wmode); free((void *)wpath); return ret; } return ret; } /* here we return a void pointer instead of _WDIR or DIR pointer */ void *subsurface_opendir(const char *path) { _WDIR *ret = NULL; if (!path) return ret; wchar_t *wpath = utf8_to_utf16(path); if (wpath) { ret = _wopendir(wpath); free((void *)wpath); return (void *)ret; } return (void *)ret; } #ifndef O_BINARY #define O_BINARY 0 #endif struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp) { #if defined(LIBZIP_VERSION_MAJOR) /* libzip 0.10 has zip_fdopen, let's use it since zip_open doesn't have a * wchar_t version */ int fd = subsurface_open(path, O_RDONLY | O_BINARY, 0); struct zip *ret = zip_fdopen(fd, flags, errorp); if (!ret) close(fd); return ret; #else return zip_open(path, flags, errorp); #endif } int subsurface_zip_close(struct zip *zip) { return zip_close(zip); } Subsurface-4.0.2/xslt/000077500000000000000000000000001226345450700146215ustar00rootroot00000000000000Subsurface-4.0.2/xslt/DivingLog.xslt000066400000000000000000000173041226345450700174240ustar00rootroot00000000000000 / Subsurface-4.0.2/xslt/MacDive.xslt000066400000000000000000000434361226345450700170570ustar00rootroot00000000000000 Subsurface-4.0.2/xslt/SuuntoDM4.xslt000066400000000000000000000115401226345450700173400ustar00rootroot00000000000000 Subsurface-4.0.2/xslt/SuuntoSDM.xslt000066400000000000000000000244511226345450700174040ustar00rootroot00000000000000 Weather: Visibility: Boat name: 21.0% 0 0 0 Subsurface-4.0.2/xslt/commonTemplates.xsl000066400000000000000000000131331226345450700205210ustar00rootroot00000000000000 0 Subsurface-4.0.2/xslt/csv2xml.xslt000066400000000000000000000152061226345450700171370ustar00rootroot00000000000000 , 1 0 Subsurface-4.0.2/xslt/divelogs-export.xslt000066400000000000000000000077231226345450700207010ustar00rootroot00000000000000 Subsurface-4.0.2/xslt/divelogs.xslt000066400000000000000000000102711226345450700173520ustar00rootroot00000000000000 / Subsurface-4.0.2/xslt/jdivelog2subsurface.xslt000066400000000000000000000357321226345450700215170ustar00rootroot00000000000000 Diveactivity: Divetype: Visibility: Gloves: Comment: 21.0% 0 l 0 0 Subsurface-4.0.2/xslt/udcf.xslt000066400000000000000000000102211226345450700164520ustar00rootroot00000000000000 - : Subsurface-4.0.2/xslt/uddf-export.xslt000066400000000000000000000423661226345450700200110ustar00rootroot00000000000000 Subsurface Team http://subsurface.hohndel.org/ Subsurface-4.0.2/xslt/uddf.xslt000066400000000000000000000474431226345450700164730ustar00rootroot00000000000000 / /