PKmN'ppNuRadioMC/__init__.py""" NuRadioMC: Simulating the radio emission of neutrinos from interaction to detector""" __version__ = "0.2.0"PKmNla1X X %NuRadioMC/EvtGen/NuRadioMCtoAraSim.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units import argparse import h5py parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('hdf5input', type=str, help='path to NuRadioMC hdf5 input event list') parser.add_argument('AraSiminput', type=str, help='path to AraSim input file') parser.add_argument('avgDepth', type=float, help='average depth of all antennas in meters (use positive numbers)') args = parser.parse_args() fin = h5py.File(args.hdf5input, 'r') #AraStationDep = 178.5598 / units.m AraStationDep = args.avgDepth / units.m event_ids = fin['event_ids'] flavors = np.array(fin['flavors']) energies = np.array(fin['energies']) ccncs = np.array(fin['interaction_type']) xx = np.array(fin['xx']) yy = np.array(fin['yy']) zz = np.array(fin['zz']) zeniths = np.array(fin['zeniths']) azimuths = np.array(fin['azimuths']) inelasticity = np.array(fin['inelasticity']) n_events = len(event_ids) nuflavorint = (np.absolute(flavors) - 10) / 2 nu_nubar = (-1 * np.sign(flavors) + 1) / 2 pnu = np.log10(energies) currentint = np.ones(n_events) posnu_r = np.sqrt((xx) ** 2 + (yy) ** 2 + (-1.0 * zz - AraStationDep) ** 2) posnu_phi = np.ones(n_events) posnu_theta = np.ones(n_events) print("AraStationDep = " + str(AraStationDep)) for i in range(n_events): if (ccncs[i] == "cc"): currentint[i] = 1 else: currentint[i] = 0 if (yy[i] >= 0): posnu_phi[i] = np.arccos(xx[i] / np.sqrt((xx[i]) ** 2 + (yy[i]) ** 2)) else: posnu_phi[i] = -1.0 * np.arccos(xx[i] / np.sqrt(xx[i] ** 2 + yy[i] ** 2)) + 2.0 * np.pi if (-1.0 * zz[i] >= AraStationDep): posnu_theta[i] = -1.0 * np.arccos(np.sqrt(xx[i] ** 2 + yy[i] ** 2) / posnu_r[i]) else: posnu_theta[i] = np.arccos(np.sqrt(xx[i] ** 2 + yy[i] ** 2) / posnu_r[i]) with open(args.AraSiminput, 'w') as fout: fout.write("//VERSION=0.1\n//EVENT_NUM=" + str(n_events) + "\n//evid nuflavorint nu_nubar pnu currentint posnu_r posnu_theta posnu_phi nnu_theta nnu_phi elast_y\n") # fout.write("//VERSION=0.1\n//EVENT_NUM=" + str(n_events) + "\n//evid nuflavorint nu_nubar pnu currentint posnu_r posnu_theta posnu_phi nnu_theta nnu_phi\n") for i in range(n_events): # fout.write("{:08d} {:>+5d} {:.5e} {:s} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f}\n".format(event_ids[i], flavors[i], energies[i], ccncs[i], xx[i], yy[i], zz[i], zeniths[i], azimuths[i], inelasticity[i])) fout.write("{:08d} {:01d} {:01d} {:.3f} {:01d} {:.4f} {:.4f} {:.4f} {:.4f} {:.4f} {:.4f}\n".format(event_ids[i], int(nuflavorint[i]), int(nu_nubar[i]), pnu[i], int(currentint[i]), posnu_r[i], posnu_theta[i], posnu_phi[i], np.pi - zeniths[i], np.pi + azimuths[i], inelasticity[i])) # fout.write("{:08d} {:01d} {:01d} {:.3f} {:01d} {:.4f} {:.4f} {:.4f} {:.4f} {:.4f}\n".format(event_ids[i], int(nuflavorint[i]), int(nu_nubar[i]), pnu[i], int(currentint[i]), posnu_r[i], posnu_theta[i], posnu_phi[i], np.pi - zeniths[i], np.pi + azimuths[i])) fout.close() PKmNШ0AANuRadioMC/EvtGen/READMEThis folder contains moduls that generate a neutrino event list. PKmNNuRadioMC/EvtGen/__init__.pyPKmN+"NuRadioMC/EvtGen/create_tau_tab.pyfrom NuRadioMC.EvtGen.generator import * filename = 'decay_library.hdf5' fout = h5py.File(filename, 'w') #times = np.linspace(1e-3*tau_rest_lifetime, 10*tau_rest_lifetime, 200) times = np.linspace(-3,10,100) times = 10**times * tau_rest_lifetime energies = np.linspace(15, 20, 100) energies = 10**energies * units.eV # "Clever" way of looping. However, we can't see the progress with this. #tables = [ [ get_decay_time_losses(energy, 1000*units.km, average=True, compare=True, user_time=time) # for time in times ] for energy in energies ] tables = [] for itime, time in enumerate(times): row = [] for ienergy, energy in enumerate(energies): print(itime, ienergy) row.append( get_decay_time_losses(energy, 1000*units.km, average=True, compare=False, user_time=time) ) tables.append(row) tables = np.array(tables) fout['decay_times'] = tables[:,:,0] fout['decay_energies'] = tables[:,:,1] fout['rest_times'] = times fout['initial_energies'] = energies fout.close() PKmN|#NuRadioMC/EvtGen/decay_library.hdf5HDF  `TREE0(HEAPP(dddd ?@4 480\hSNODx 8((dddd ?@4 4@80\hdd ?@4 4y 0\x?tn}?.Lޗc?7 ??zK?0?l>g? VK? Ƃ?kM?"i?6l ?$Zz:? ?f?Px?Ȏ ?T:?S(4?t?t?Vv ?zC@?B;@ߌg@-M@@* @£]1@Gv@؝s @W$ONDf@G @o;@100U@a?}b !@P6##@i_\%@&(@ ֐P +@2x.@W@1@.*A|93@cS5@RA8@?;@>@`0A@6qOC@ЧݰE@y`Bb]H@Sb=^K@@MϽN@n@jkcq@}ņs@u@^LANd@t쬇@@*3@N5@;*l@7@@ c[#k@(z@=@rs@8t!@ Kh@sKש@5.@ @4asv@W@@ɼ_@14o@F/I@!Dfž@X@b{@Jf@4S@d_+@}@r:\!@Qĩ@o.$?S\G?T'?F=z"?${?葺?vA;9;?_?yfD?GB?]'?S2?,Q?޳ ?!t a?b?_ P?ޤ_BG@Oh@;]@iC+}@ : @Z֟,@q[@]i?@y% 1@OQK@g.^j@L @X$ hp!@,fC#@>&@Sā(@[$+@ND=0/@eb1@Q׼W3@|x6@!,8@f;@#;3T?@8ڂA@}C@\13F@zBLH@*cHL@܈49wO@Q@S@ KV@9J Y@k \@͚'_@/'+=a@ qic@':af@"i@:l@9?o@%e3q@=7 s@xqv@$3y@՛A%K|@.W @A.숃ԁ@u@\ڃv@U65@DI@~sҭ@̑@~JP@ߴ¡b@)2@Oh[ @Urf@)2*>襡@T£@0_@y~@l䧫@3Dz@u@@ihQ@@'?v@ٻ}@c{ed@gړ@r㥪k@SQ5@ A-*@-K@5 2.@DQ @2T9@7Q7a@8-$R@R]@YDg@7!B?NZ{? S+W?~t[?{?Y *?Z?s2:?9j?$q? ^?bifE?/$?T_]?[YS8~@@Ɂ0@'h{`@2nB @J/@" @ӫ@&Nœ@e-n@Z@NMg|@a@kp@I( @t1ء"@w9 %@%/'@$¦Ā*@5KLj-@2 0@p`r2@ib\5@-0_7@^G|:@U(=@丑x@@2cB@Pɍy1E@SG@,{J@zsEn N@P@4R@~HU@h W@֙00Z@|7,)^@Z`@kCc@]e@'( 1g@ñNj@>@Dn@vp@ns@M4nu@3k@x@h {@DU~@V)@I`p7@r@ct@n;#G@&l@TQ@J(@W] @گd@w|@@fll@/?!@ǽ@@q Ƿ(@T@+}z@>+a@m @Vt@KGh@B@2@;@Zj݅?u=?:7F?G]T?(z?AbKW?M菚?AgS?6?a?V ?]ǰ|?/9Y@5`@8P@'` @F( @xǡ@k4@.J+@89^&k@~.@SI@24@6!@ $@٣x&@pL)@ k,@!!./@1@ h#4@NFq6@;i9@ʐS<@% T@@B@ I;D@肹F@y?I@#:L@QP@ HR@9TVQT@)TV@3%A@HU}@@߷>ω@Ó@ ?@ʡI:@ 䧺q@uw@@dҳ@*aΜ@"5#@^*!@2[}7>@\`=@/jX@F TW@l^@o@ 鼳@WȔ@VG˵@$K@&NY@BH@7ͅ`@5ד@-ƥ@/I@]@5w @tP@GOiv@;G1@g& @@촎@ m=@(@5iyu@y}?+?!)?:!?nN=?*/+4?}?MVyb?DF?q@/@z3M@<*@@$ @1@~}@P @{Pf@{E @c@R.SIU@Cw-r !@턞kJ##@)t%@Ņ &(@+w +@b(x.@<~_1@b>93@e{h5@!7B8@ʸ?;@~F>@܆d 1A@AӏOC@'yAE@]H@>^K@WCN@9!8l_DQ@2eS@e U@h hxX@`QL|[@@1e3^@$cVa@r yc@yise@&ZJh@QUk@mn@ eq@e $Ns@#u@3X@Bx@~˨{@# @:n@Sr@u$V)=@UzW@5~ Ԫ@`Gd @͂Kj@gw @B:J@Z @"@2+ݞ@ݤ~J@h&/]@wԭ@٤B@CW"@GU@2?@ @%@GRi@ݮ5@@(@z4@@6@Tѷ@Bf@@B%@9Qi(N@(Wс@2@i@ IW@c@]2I@/B@%%{@"2zX@0+@H@ڕ8 ?R?is=?쥭r?>? Ms? (@pf4@33U0ZU@WxJ@s)d @Y!l @I[,0@x=/@Tm@e7@!/@E_@L` ;C @D"@+OtX$@׽, '@8,)@ŌQ-@XFV0@\%fY2@ښqN4@Մ5 (7@vM:@8=@u-i@@+)oB@D@BG@lԞ J@:3)YM@cל{P@ `TƒR@qͼT@l$\W@@q2ݬ9T@^ʏ@UՑ@6u`@?X p@Ws/)@05@2(@%C@dK7֣@?6@!vnܨ@2Cϫ@Zg@q x_@@ȿf@G@!'#@K^|d@EnxT@&Tiݡ@Uw@"z@Vlj}@ @n@@W0}`@U:a`@N%Oc@eP_e@h@,"j@=unKGn@lĻq@!8s@IϏAqu@x@< {@ً[~@0^z @r"@3ҵ}z@hLU@vn5@X_ ]@(5 @^ F!K@ p@PYr @z@L}9@@{Մ@w+@@(Qʧ@;)@kzƭ@e@e@1^4Y@s'@ι@M@aP2+@@ԝS@DJ@>-@1z÷@,9y@"G:@\ʋ7@=G)@/,i@vb@pU{@mJ@8i`n @Ey}@@2@; Q@w~F@Ri S@xE4@i@?KM@Ql@⿓@%O$4@0q@o 1@'P@\h @ ( @`mԡ@>ȵ<@3"@]4k@[.@hKJ@u@ױ)!@M $@Ő&@~ؒL)@O>>k,@Ud/@1@ $4@S6@Q;j9@,U<@4@@y B@Ŷ`\;D@&F@#9I@L@ }gP@,R@jŬRT@51V@/;TY@``~#\@bB,`@XNZ*b@l5gd@h6f@(ߩi@4`*l@*j;p@5c:r@W$æ@тz@1 Q@C*@ 9б@k!@ݿe4@_Fø@]df@%HPL@v|@,B?H@C @M@T\W˽@v@M_Q`@ s`uC@t@֮rt@~m@v@ ކ@WCQ@f@ق*@yY3@\ @-vX@8@bma@e@Ph@Y5<@*e@5@]P@ *.@uҹ|@zhO@Q$5 @v .1@铅@O @\f@-̵ @d@kGaU@Wĝ !@+]##@ٹ%@ 2>&(@; +@R.y.@Ȑ~1@^e93@Ɲ5@aEvB8@"C@;@\z>@xNH_1A@JPC@"襱E@^^H@l_6|_K@CbN@qzTDQ@pieS@lU@\fyX@"J}[@M^@vObWa@lPzc@qye@ 91Kh@{ݘk@hn@Sugq@BNrI׋s@?dVu@@Ix@߭{@ҵ_^@%{r@WQ@._S@``Y@[p@̠dxƥ@o` pa@՜6I@f<ޅ@i$@;@$,I@6@q>D{@4^u @$,i@ L=@ ?@d|#[s@n:@y@1R@yo@&nkP]@ ܧ&@@%k@ BI@펚9@%P@q]V@@gVȄ@5@:EZ@>[@z]@EZnu`@kP b@{d@ qug@gXj@/`)m@xsםp@};]r@,%t@`(dw@Bmz@>}@=V@•5 Ԥ@seS@|ּY@OOJ8@S:W@]5D@?g@X?Ƕ@ah@9CXQ@XAȇ@cF{+@5p{@֘3@.2@qV5@Mh0H@Ž%@}ď]@E@Ui@+m@wӓ@P@XbFE@߬g@?)5[D@7-["@v@t*[@{@_GrA@rd@r_@SIP@"{V+ @#m@ @Н@a@"e@2#s@MRy@c"k@f ]@ٚ@`T@B % @(p!@@#@Nf&@H·(@&+@S1D~0/@6⣄1@3@6@5}8@x;@KU?@ A@nWC@v4F@ݞyUH@(J̖L@|]xO@{=Q@-5S@%%}HnMV@31v7) Y@Q-I#\@BHN_@@#(,a@[s c@Ӑdf@%&i@ ?l@ZvTo@žq@B f_t@0(xv@'0ttT @אQ@06@|%v @xW@']R@tDO?AĪ@>6@&Qs?@G$p@7@_^^@[-@0E@[ P0@}@Ukp@޼=B8@C(R@iC@@="@]䴟@:O@ 2 @e.@ЊJ+@xDj*f@Uv@]NF@V@<,Y@?4@зȫ#P@I@zQ@\/ì={t@w@Ց*\y@Bֈ}@J I@[IAI@QXA@cߵ @K mS@ @F$oM@)6+_K@S@⇔@.ߓ@$֙@d>_@'N?@coM6@^qi@09Rަ@Pt@@J? @4N)#@z5@7rTdg@6it@Sc@T~@4tN@)9?@@/ib@d@ͿJ@!@};@%q@cH~@Hi@pgx@@~&@w@{Fܐ@U/@UQ4f@\@GS`sW}@EP@hQ2@{@@}T@QT'@Kɔ@PBt@`mn3j@,3@c@3c^@UV\@-G\@і&]@G=^@O8d@5Z-g@oi@5(k@צm@qn@,17A;xzAO$]y.@1@W93@;5@B8@@;@ޜ>@H-1A@kG_PC@f" E@{L^H@gV`K@ѵr+N@wƘA]EQ@(sfS@!̀U@ezX@Nj~[@F^^@~bXa@Q{c@ce@Mh@؀0ek@fo@F08iq@aO`Pas@y u@?mSx@<{@߆K@Hpv@Mқ@u@c8{@}R&@4j)%@gcz@ZG@{n<@(,@I@im@(hb+@@FS@A&w@,q@Ev,@[NMm@$-@@i'[@Fb([@Q@J@k}jH@t$H@K@RY|^P@M^V@;w4^@|f@ږC@o@u-x@^@%|@Ei@2[x@ }#uOA>/A"TAxyrA$z[>VA=ϝ4@D+{(7@:@X8=@F2i@@1IoB@qY#o@̧.@@[hAWPA @y@*S[|@6sB@T2@|̗@@QRN@h&i@RRv@Ga7@ C՜@nʼʊ@hEJ@,g!~W_@1ymҟ@#sס@Je@îj@Դښ@h*'!@{~@K C螱@p[@d@Yj@w4>y@ SO.@Vr@cz@>&@=+X{~@k\@'* f@ @I豤@оs@vg@‰@ի+@tc-@`2W@›`j@Qb]&+@`@!~C@@%ܮr@F8@h@k y΄>@Ń!@ѧ@ B@@0@/@AztL%@=4@R@X@/P@/ @7g@❺qf@ߢ8FR@T@;HjuA@}k@lw)y~@7@fDR@PQ@C@(ع@e/ @&@91@]@@ɋa%@!=@8V@'q@Y;@*=ѥ@AL[@eg@XE!@; AzU+ACZC)A˵AAAA(WAEvc/Ac `iA01A!AxA#AsZ A|DAs9 ACĈI@GL@9%E5P@[CR@08fST@*VV@a胥Y@H \@.`@h:,b@׎fid@TQ¶f@kҘ[i@$l@?p@~%J?r@'B~t@ w@,py@hx }@ZUz-M@ė`RN@˳O@m@ 7@M| 1@*T@d T@&@V@dy@_q@+'BM@XM*H@pnk@@ʘH @v>t=׬@s{%@ :@w:,8@9h@@oGRC@N?5@Bnz@¼@^y@F@ظ]+@oK@8}䊽@n쎐u@-TX0@#cj@wU@)NQ7H@%7UZ[@fRX$@l@:T@Lt@̐h@H/j @@+ɘ@d av@ؑc@f%_@@~@o@Ϋ_^@2M7@MRya@deH2@kZaR@#o.t@ʾ5@U @܁R@Gɬ@2'@ӝL%A"A*HA rA)hAU'$A@RA:A\QA'*A^W!}AAWr>AY֔{AJUOARFAT A[AݗA8 [c A~GFQ@WgS@~U@5N/d{X@~[@>@\]M@ѭ]@Mm稵@5w6@Fʬ @xyH*4@.f@{@g@a@A@H@UdH@W@&[w@qh@e@h8@mr@$wW@( p޿@VN@) f@b@[d@@L]@Y{>,@z @SP6@K @AAN@nЂ@Er@Xo@ox{@cw @Ss"&@<L@nUʧu@R{@Vc/@I@M2#@m)4O@~e=A<AʍgAN1A=AA#A[:AFA"=A ofA}A함,kAwͦA AA,$ALkH׭A%6 A?(# A06C A$88 At0L A*>_W@ϊ)j@Z@|]@-,ɏ`@ܸmb@Kotd@Bxg@M]j@"M m@v p@z @-6@*?FW@N";ˍ@TW`aj@ ,ƒ@m|@@(@ 9Z@Tǝ@QҊ@V&@ɓ@Y?@'e@Sڏ@V⇏@$BD@ƌ#@s4@@~@_ZZ+@(<@1.8R@tԋ^@5@RPiџ@Y9_t@:V@@X9Ͱ@o@H@^ @Ov)@~z@1r&@$و@MxV0@ i@9wY@/u@/ؘ@߂@͛zqZ@R?r m@ @r@P@@RZ@ <>F@.5v@X;@y@\F@C@uv,^w@+UAl.VA@RA0n?!AgQAAmtPA*Z} A m|Aa&Ae-ΤA(d7AnTzWA˞kYA/,AfwAg1M AgI9: A#&  A6_ AVE͖- A[^gx AW'6a; Aȣ Ae (CE A*J` _@Da@C?Tnc@P)hf@bl(+i@~97El@(to@7Lq@E<t@5Ev@_{Dy@b`|@B@Sr@@7KH@7MbyW@Pj}Bt@]W@j(K@w Q!@!1gD@\Ù[@t@6r;@ PI@+e#7@~5@u>@NJ@b?70@:}F|@_<޳@7:@۸@DȻ@^x@c P@IN@Do@H@a-O@>]讈@U_@h3@ n@ՋQm@-%4V@h7.a@NsU@⚦l; @@~V@Yݽ@?j z@WGRM@bk$4@<,F.@|:@,H+@yxA@i:^@9J%@9`Ҫ@35@ @T>@bu@QO@ZFj@dd&@Wc@OB\XA UǃGAKAn<AK\ yAASDMAz$1A;|AS\ATaA:A 4bA5M^ Aι A`lA} A>P A+cԗ Adh/# AH.g A< ,6 A' AaJbEA7AU8PAvY)ee@Bh@pkx(j@pAqPn@(5_q@o\@^s@s?ozu@fx@̌){@`n~@8r@`wޭ0@o錅@g+g+3@FNq,@jȂ@fK @ Uv:@0@s:@W0@y~@z@2@\j.@1}$@Nd@L lS@S@OXue͡@oY½@ΖCv@d5ۉ@I١@4xw<@!n:@&I9t@hrmmӓ@D@AU\@Nsc@x~Ah@Q(_@@u@EԪ@WHA/Q*A S5A^hJoA ]bAA鋑PAPJAjw Ah )A3MMA/_A0;AvAraw' Ag}u AA+Q A k Ab v A0wQ AȖ A U$ A" A<=AKqAI\RA'"8A>߉1AG3sA0"Al@3B@p@܁Ar@OWt@gVjw@n[#=y@KR }@1P@{>HR@dE퓄@ ·@L$@hH{p#@/w#[@β,E]@졖K@%@ F@|d^'@:ALtAZACd,A)|AhŶpA(AX SqAkrtNAyZEAoy† ALX A'q A"%lQ A A_(| AL;` A#1 AR3Ae³A8$ GRAW`AfB 6A;%{A>AABiIAMjAA's@(u@rˮkx@b,{@o$'@߈~@ S @CT@Lj@sơӋ@R)2>@,;@ء㼱@L@n.qј@k@ۛ@/B@뉡@6R9@[n*@xiM@\@q@l@K~@">ڵ@LFt@+QZ@f@y@hme@kB@ c@FI^@7!R@}G@%cH @oϨ@k@zAc@ߋG@"Qƈ@ϡw3@m\:@5\@T)@kOy@Y^@h*@aP@F%@m[d7@]@6u@K@}UQ@@g6x@`Bym@pԥR@:@68m@b?Jx @mAoټAlH}iA]qAƁAdEnAj#A#AB/lAkC(A"bAYܨ`AW?^A/ٍ1ANI Aly AtS AU ά@' Al Ao΋^ AHZ"9 AlR A2"'A A*PA=,AJ:AbA_JAcFAe\$ӘWA3N@Aov3Adw'A&ьlANtPYAA>Mz@7վ}@ M@_‚@rĞ@ @@^@׍@ @qϒ@0@=v@4m @yޝ@5 @C}΢@>gW@;tr@^@]@r@4''t@GaXX@t`l@E3m 6@AlcVP@Va@)5L@k@<@I^@֮e8;@ua@ 9Sk@5+O@ j_@*́ @.m @_ >@ ܂@tME@Z@)5"L@.q@Q~]_@p8e@s9@n@@Rį@'#ݥ@Y'@o@CBEԼ@G"@d{"h@ל@z4+#@NNh@p @6]9%A-tHA;aAh<Ap|A6pAݗPA-w3A}cޮAkju\AALAjs]AO| A4զ AR=(_S A Ag߅ AM&; A|՝d A#VFz A٧LKA%ӲAXx8lLA(ÞArKEt>A kA{gAtimA>pXfA( dAUc<A}U*>AtSAѱA@(AWAÆrA08A?(A^s\Q@35 R@ցE@`@|@Y @lD@L*,@ӥ@.Gl@Br'@!3"@BvJ@v>k!*@a/:@fdfk`@u@#j8@#R@@Ώn@sz@PMڨ@%4$hk@OB~@aP@,K@%_ d@'+@Q6:@ƭp@ و@dR@u@q>@ l@3V@n@@k@V$0#@(@ߍU@t[D@.' @+9`F@b,K@u~@c!@& ѐ@+ݘǥO@y@vf@< ?a@4-f@/@֗P@ _> @;./O<AOTiAA]ҤdAngADA puXḀZ@A ~~A>AZAIIi" A&dAdci A  AEa A_Nmk A Al/ֺ Ad ` Aܽ)0AM#ץAt۠fFA}wAI,„AANaCAC@A`i)AȶLuA ;] Aĝ A 3<`3UAu9A 鉅{AbL>/AE5'wAvWZAj֐kAz;aKAzpATA{>&A]mA{ZA@۷B6@W{6(@_6](@%5JD@@2oѯI@oI!D@y@D@@L-@ƈFF@V@fC@9X6@M! J@V@ԏ+@QQCz@(ۑ/ @1@$V@T@Z^@%W2@1]Jq@$? "@J@_SHW/@,VǼ @ j@ 9L@E}q@$9@ @udWZ@lY@7 Ӧ@Q Aw@\4\2e@{xdn@Vui@)@+r@]3K@c0@O[@ʲ-@rV_A_BJvCALwՔA(phA &35AԎH;A AfAɱnlA60A%AKfOA 6.AX5A!-Ax`wAs=twA4׽A~#G(PAM A -A@Y].A8oA`)oA~h@0f@Ew@rgC3@4 @N^=@i@k@j@2@ׅ%@o"/@ ]@tT0&X@WZ厴@ n@-pʹ@2޼@W[%@u8F @9),@@& @hd@le8-@`$HU@@@Z@Rӷ@] Lg%@Օ@~A@+m1x@lg)@J@@x@rlO@jn޷W@U@7~@̾f\@RH/@2 @Xqdn@=dw @>:rN@ @&E@3b@?6M@HfZjA9.A޸A˸AhDB}Aj[ BAw2AhA,?iALfKAKS AA`ُ A*W@ A] Am>ޱ AXg A@RP|_ A/( AV`AE/A69BA @DAe#A;3Av@AֽAѤAhZi^5A pA9A31#Aэ#qA?!A} A3ʤi WAHI2aAAE8Aj,/A\yA5=xAG3meAGpAԞFA9;AnjMA[A_AUAa 4@⷟5@f@oU\@YǏA@oCon@>,@[@&9@Z AkM@Ng@9 @2l} @{ED@Ii@bt5@P@):[@{#-Ѡ@/%%@Y#@@ER"@Jjc@s^?@!@NxP@c;@@?@@qޞ@& Hw@'hb@~f}[l@W~@f@8q)=@Ps@}+%)@<À@|:U@O@h'@c3CB@<@ˤO@Qj@xJ``o@.fAT7MAA%AQ)AN!|AGAA,M\Ar|aiAkh$jA&䥍q/ AhMU0 A;@^T A& u AR-eu4 Ap\ As~t A يeAA $lAIuD#CA AADYKAR짱BAp #A)0JAFovAǾ'A2CAgs2A:bAXr]7<4ArnĂAXL_sA,JA{ kAɰUhAHZxlAsC0 OA kAJA8:A(*ÇA#FA YeAO,fA-rAcBelS@tP@ɰ@dy:CaӲ@Y>-@١du@ʂRgo~@еa@_XT&@i6:@wv@%nMw1@B@W=@03]@f9 X6@"m@r}z/@2}@2@ ְ?h@7@Й',@@Z6d@Jz@X@8Y@BeeH@ @[1c^@i_P@t(@QO.@M @ԥ4@}@Xi2W@[@[@U}YAL^lAEԽ?A0A1rA0_EA4A%A|~ <_A4}TQ0AKH5A7ە=Aƛ Aж9g A0 A=F AMz A#: AwEAYC{AeX-A*PE@A6HèpAlATA"Ago^A\`A3\oAbA(dA%Aς A%_AeA{fSAHSAD;AtXA0AAƤAdaAO8$*APݔyAcYYAE\0CANjA{B큲AEh@A?DRA)T@Av ;AދA^xAsSd:A/GAFR@4@@9Ă@ @R@'p@}&o 2@5ã@ 8_@_k@L*Lӿ@O=@K @6e@E@ w@ӳr3\@n6@ch?@1@(BCU@ @Bt=@Q@mǞ@R=i@;q@KWX@tx>`@ooG@F6P@tB#A@\BAf@|9@D@#eA@N҆ @Q4@zRw#@yXٙ@2_@H\@C"@YAeVAn_gA!gCA)J{iA$AOuAC\A-AT7bAUL8)9 A*o A.(AF A|s1 AW (o@ A\zVR AwplAztAgAV(;AGAFAB7l]ACj1A5+AZQovA^A^,A2,A`ATsq6Ao#A"bYAP 8A=AT19ߎAҦ1AZAbA%A(;vwA?9GA!A%eA MAc4i Aa9ޒ[A$A΄A#MAi6A՟>6EAW2Ay"AM`ATGASPIA,zm3 AƊ:@Vี@bXPU :@b߸R@Y@i!bJ@8@˕2~@ 7f@qX@qQ_@dՖ@M'j@r@:@Is)@%Ruȕ@.@:Lb@qVNh @^@-@qـ@E@yU@m@x >M@+ȼ@*@'@k @0@km_@Hg@ ֎mt@Ǽ@FTχv@нd@R@@D@9$Av%ADjnAawtAVbYA >A^DG"A%A` AAq A;A2aM bA@%AZH AUoAUۜA돡AQtA[?A,zA<$sA)bFA|12As5lA#v AAr AaAq[A` A][A$ʨA~) \A=HYAȔAtU_AqOAt=Au%A`AeJ AT A!A6c6"A:)T@aa@w<%@@ջU@TS!N6@4c\@јR@n[DÁ@_U3@<_%@0+q2@mHG@ K@׿@]|z@p@4:@{2N)@|@@h@~'G@~K@h{<t@6ei@2jfJ4@nޜ@J8EkB@>")@Rw-@a@jT@hV@Y3&@-oh@(8o,@LU@Df13AVg1"A#0ANA+\HAƄABrA?_b$`A"LAR7 A;V9! A^/6 Ap8= A`0A A> AFuHA4tA7"(A'冯AA%jA!I A]:A5_2A4FsAHe콂jAՃdABg/A8A A`MA'A$AEG bAb!AO SAamAA~AvrAUA$OQA$YnqA1-A=LAwpmA ARrAAlAt&!yAG>i A.vAjNAAf?18A,;A{MuAwl A A1;!A*A :<"AZZ"Aboǹ#A1t$A,@1P@kZ@R0@BN@&P@9̞@ p@怍@AepjE(@n|]!@#*N@2;@9'U@SeM7@=i.@6@m5@Uj@+2@?2@ @9 C@@q%t@>l@;K@ؑu1@T~/@w@* Dj@_==@ A\A]IhaAr0Al~tA~6A)ѓ+A"AAĈ'׿A0 AQ/ A`O AXh ܄ Aqs AAW'ڱA;iݝ#A<; A//A SoAt,AaHVFA]ejA?C-A,NE}Al$ A ЛFA[Ah( A~U;kA6UA"(AW%XA9>A~6?AFAV =A NA3IAu A?HfkA]A8SA.jAf^A)N$ Acm A5# A݄-%!AeGg!A,"A"A+4#As=#AQAq$APܷ^M%A|m&A-&Au2'A(A*a)AZ*A7Th+AH,ACG-@4t.@.,L@M hG@ /@3ֹm@:Wf@.T@H@zTR@ZI+@du@Szf@ ȏ@o/!1@N03@sNG@,ś@t'<@V0@h-n@ ž@d@fpi@tY=AX 1KAm1^AFuA}3юA,mݿrA:kA!m A1U) Al An< A6q-V Azۓo AzPAA(VA][1ɖAq-cAjAѳjAJ$Ax^kA6A5[aeAX3AH1XAYAuEA O`'dA1>+A1A, AqbyA(A PA.&A1"AIIAkcARAl&>ATQ3BA0)1xAe{A 7A;5Aw%t AjDOSA᤬AI)` At;+(pA{a qAn AbZB AHvk Au A0 A+!A!A:q!Aۨc@["A3yv"A;q2h#AB?{$Al[Ū$AYQ_%A,b4&A%&Ae3_s'ArAgA굷wA(LAAAAA%A@A)AM3SnAՆ!A8UA4+Ab 6AsA%JAf֗|A٫CSANA4ېsAǟA(4_AnK|A:UHA}ʨA„. ARemA;A[  AKE A`KNJy A8¬ AЊ AM!A2w1!AN bg!AIM!A?{!A'SQ"Ab~w"A֙,T-#A0\-#A/>$AJi $AEd>2%AX5&AkG&Ay$'Al/k(APsY)Af-*A|!+A-ש+A2w,AYV-A|-U.ATY-4.AZ@%y=/AѬK5/Awщ@_HcH@kƜi@S@)@h˖e?@ .@z;jW@%g2U1@{-@@!@vu{@vN@q9@$&;@u R@Q h|@ OK[AFA]w@A%A cAE_JAEAN!\A˚Jx A)Ā< Aqx A؏ AϽQXAiAjAbDA,7}AY'pA)I%AհAkK%AA->A7-0CA3OAA3]NYAO Al:ZA. A쁵TAA14cGA[ Aّ2A1Az)A!Ak@W_A)UQcA2ZA-f9Ap{A{? Amn<8pAAAg;} AG^gO A<6R Aj A l 6 AE+v!A:SK!AK!AG9 !Aa1;!ASI"A5>"AOE"Ay@"A9>-#ACgN#A $AuW$AU%A3Af%AXC`&A%'A #C'Aj* AdxA?A-͆A2s5*AKA6(lAPN AaDňAB@A$A]n+nA*fA޷PA:MB#Ag'DfAJA^;Ae˺-A^=JAأS tA)QAt_{A?QA}AAPHA`^#A`a98AdX\AF8!AcO8AA $1crAĨ.`?Aj % AE[ AE* Azi" AHy  AJ歭+!A:%Oj|`!A\yB!A3R!AJ'\O!Am/5/"AS, f"A!ؙ"A9?H"As*xK"A((#Al#Aױ|#A<ܼ$Ac5.$A5k8$AJ& z%A<+&AZv &Av5D'AF$'A5(Ak?q[)ATJ*A5PK%*A$/n+AX 9?,AN1,Aز+@ADa:@ @WUok@j94)@@+3@ @;_wAAÓ,AZMAޢHAGaARti]A: i 5 A g+" Aʆ A.= Ag{MA]BWA63A!ToA}`Ap AǶ!A9YA׺A4AI+=AἼxAQtAj AT Az,:.5A8AΏ]+TA4M*ATiAo<bACvANKAr9+zA7OACY#wA'ATvkA LAWU, A_Pf A Ag5+ ARG!AbfxG!AS}!A{³!Az</!A"AS"AO"A1ʉO;"A5O"A2*#Atsqc#A.woAK#AKn#A5#AZ ($A Qk$Aeĺ$AIF%Aɶ~%Aӈa%AG+r&Awʳ&AHn,'AMY].(AU޽(AS.z|)AMJQw)*AiL^*Af\%T+Ae8J+,ApsC),Abge-Ay9cp-AZ=r.A.A0H/Af/A!Z/Ai0Ad峚40A~{R0A*o0ADn0AkIe0AgtD@~v7@Me@be@~Ʌ@S@̸h=@ FF܅@ڃAUAJ~F-(ARA,0RgoADh]`A@FHAhK AD Aޔ@ Aj@o1A6uxPA"f2A\ڒAW{LAOApA-c 8mA~9A6MA>^yAGmQ[#AeFt8A”fnA\AQAAn$?JA]7AZ,h {AxwQAE8 AlD3M0Ab1"AiGA&A+UAp:PAHÕm- AYc,m AO A? AX^&!A)zb!AU`ؖ!Am0!AwS"A%#}J"AP/"Awq֣"A"A_fv '#A8P_#A"w#AL&#A $A_L=$AJ']5y$AR[u$A~kh$Aшש %AQٺ?%A\m%AQ%AF(&A"dB&AS&A;]x'Ah'AVZ9(APi)A{i炈)AX'U*A *AH|+A,,Ai,AmTCM-AMx-AJxsG.AX p ٱ.AN9/A_/AB/AMJ/AB0APT=0AI^0Aѯv}0A D0Ae;b0A60AOz0A_3Ȍ@|-u@qM@'%@'}o@=5A:I}AQzSAs=ACAWEA>]S Aj A) ϴv ADw A"_A+@-A;|פAIA㭕|Au=ADJpAb3AX,48nAđ#A0@dA0Ao5~1A%A>CA8i$A4pA>㛅XbA 4 A3A #7*AGK̼A `h& Ao(m AiZ AZ Al<:!ABJ|!AK' N!AvI!A1i><"Ag8z"App"AVFr"A<.#AMj#Adm#A7R#A#$AH1N$ATob$Ac F$A$A2K.%A=m%AdH%AH %A.&A$@&AbZt&A1Q&Ad,G&A46wQ'AC'Ao2(A>#}\(Axj' )A)A*AJHU*A"A/+AT1+AuQG,A7+,A XgL-ATx-A"I..AmkOߎ.AՄ.Ak9/Az/Ar/Al0AO80Am\0A5Dr0Aiu׆0Ao*S0An50AQ11AΦc-1A8E} :1A8R U1AKp_-A)[0sA>h@,A, ,;A3AA$ `ޚAG/X 7A A ~ A k7 AeA5NA m(AY%%A^yA6"rAB+&AKmUA$AρjAFK Ab AT| z AFT A[)G!A!A !M!AaQ "Az2An|2A9>2A>F>2AͿ>3A4853A#PR3A×~+o3AM43AU1@ AI~(,AImA3 x&A&[䐅A$d]qvA"#FA)UR"AvA4bYZA÷A)-A9&qAS2FACAbSe"|A~K.@0 Ant A6`!AZGO}!AP2!A@9Q"AqÃ"AޫX#A,~#AmEj#A+kdG=$AUu$AS $AoEM%Aݔݷ%AvF%AhՈBM&A;1&AV&Al T='AL'AeUA'AHUgx (A gh,A,A;$ ,A"8%-ABp-A̤-Am-Akà-AiӜ/.ADȹk.A>xx.A.Av{F/Aq|ۚ/A4=/Ah]O'0AcW0AlNcݫ0AMP0A땧0A.FG1ALR_AO1A5i.1Ah|1A|1A22A?C2AaV7q2A/o2A6Un2Ahw2A) 3A|tI3ACMq3AP!y3A߆ȁ3A`L%԰3A{ Ӵ4Az.>%4ABE4A`}Xe4ACσ4A2W_`E4A\&½4AIR4A-AJY?AIA,V#A~ndAsf8PA٣aYAe25A+B}* Ag5 ACK Acp!AA'1!A]"A!I"AuجyG#A#Ab9*$A2oЙ$AK%Avq%AI䓻o%A1d}&A&A eǥ&At*V'A.h'Ag['Ad##(AL~~(A>(A4'.)AI)Aa)A}vm(*A x*A*A1!+Ayq_+Aa+Ak.u+A{M^:,A.U,AW6[,AUR -A]L-A>-Ad[-A % ~.A yƏM.Ad͊3.Aސ˼.A޷,/AkLA/AɨЁ/A䊼/An/AYmE0A#50A%P}W0Ar|0A>00A0A8Dn0A y0A:Ӕ0Aw1A{c<@1Ap h1A+w%1A];V1AY W1A툘2AJcL2A&}2ATͮ2Awr2A3Aي{E3A[ kw3Ag64A#c4A6&4AlNbV4ArlZ4AGګY,5AyQ'55A@1f0\5Ajd5Ah5AɗlA5A) 5Ar 6A{0*6AstH6AHe6A4DEz6A2 6Aeh(W"A`h"Aj"A,"AK.#Ai(#A#Ac$A@)RC$Ay>yMK%A5Ew-%AZ9&A{J&AO_[&'Aā5b'A#gf(A*(A?0(A Ab)A.)AAb:*A4*Az? +AKn+Aeo+Ao1,Afکt,AQ :,A MG-AweX-A@-A؅bL.A+=Y&˟.Au Æ.AA/A߹5/A@:/A餥d0A>90A>]0A~竛0A@}0A9)\:0A_p50A<ò 1A(- f+1ASdK1Ar_k1A*T1Ab&1AɮWj1AZ"1A"22A׺t%2A1B2Axx]2AQf =z2Aay2A`9E 2AL2A~~22A63AӎWؒ&3Aj鈳A3A !_3A3A103A`P3A93Ask"4AIoP4AY4AYW4Aug}$T4A_y;5A%gr`F5A?x5Aer5A|5AX* 6A!=6AUl6A-d6AE^6A36Ag7ACI7A'ɸr7A>zU7AWJ7Ac%7AȔ 8Al7,8A\EN8Aáo8A48A28Ap8Axm8Ar\t9A(A:(AE},})AX9T)AO;)APp^*AJOgo*Ag*A6O+AUdo+A;,AĊS,AIr)-Aew-AC.A~/.A.A윚m/AǷ/A $0AΓ+Z0A 0AJc0Ap^>0A4%1A͈6U1Ay 1A3XM1Awb1APْ 2An82A7c2A+2A'J2A[2A>3AD3Ll+3AeJW3Q3AEBOv3Ae3A#uj3Ax:s3A 4A/(&4AKm6G4A2}Q4h4AHT04Apj<4A#4A 4AWj95Aص#5AB5Au$Cb5A5AFF5A{L 5APf~5A7%u5A"6A5'x86AWL6A ac6A@z]}6AP6AXa6Aq6A{ 7A$ן37A f_7A;=7A8C(7A17A(܆"8A Q8A3+/8A T8AG%LJA8Ah9A=I9A)ҿy9Aڤu}R9A6+9Aԕ-:Aϧ21:A\:AXjv:A@:ARs}$:Ayߋ:A7";ACF;Azi;ADQ;ADv;Aey`k;A ;A63X ?7ASf7A;֌7AL띲7A ˹7A`u:7A8AƪB8ACse8An8Am8AZE@8Av8A 9A?)9A{-w_H9AaN9wh9A[[9A *l9A|.9A& 9AG9A(v:A|Am7:A CZ:A=:AYm:AI9\­:A):AZ"P:A!IZ:Aɹ+;AcjC;A(3j;A;A;A3;AZJANS+9>A5f>A2;>A̋ >AE(>AN?AC8?A~\ł^?AFa"+?A ^.?Ag?A,?AO@A+߫i@A83%@Ab54@AfD2B@A楟ioP@A)!6A9eۿ6A~U6ASl6ABi4"7Af&$nR7AB+Ar7A"Y7A"x7AJe418AÄl8A[ 8A18Aޝ9ADaY9ALt֓9A͆"9A?:API=:Ays:AH:A}Q:Arp;A^B;A6)Et;A؍$;Aљ;A AOD0>AyaYnR>AJHt>AmL]>A=4>A֓&n>AY>AFyg?At]5?AOdU?Aa#r?A"~?A 1?A _?Aٱ?Aϕ*@A#Vݞ@AK #@AYm6@AMC@AP`VM@A(]Y@Av'Rf@AJ[Wu@AtG@A1_@A@A#@Ar'8@AǶ8@A%AA>AA9p6AAyGrOAA_ hAAї AAeGAAhˡ³AA>?F;AAּWAA?AAABA=)BA @BA~DUBAf@jBAL6#BAaBA/w%BA^ dgBAW5PBA& -BABA.ȰSBA<% CAAPCA +CA6LJ9CA/ GCAo&>A2+>AS5>AcA2'?A$sW?A\cw?AU⣉?Ar?An@Ap_8@A_ V@A[[t@A;@Actcb@Am@AC@A>HAAH,Q!AAI?CQHAM7$dHAYivHA٪HAݽFFјHA8_ΩHA?HA͜HA>P$HAkHAޚ5HA;J#G IA&_iIAއ6(IAAt7IAzGIA'VIAv cIA3՛RrIA IAr7k8IA*-ڥIAoj IA* KsIA3Bgr}IA UIAVIAou}IAx^JA~JAV(I0JA\PFJA]JAsBauJAKJAI&^JA萆QJA 8dJA vJA*qom KA/#KAq;KAOESKA:ukKAy=KAK lcKA tCKAw7j%KA.i'KA(QeKAn^LA#LA)1,(LA$Re~.:LAtdKLA Gt\LARlLAS|LAeLADVxLA zLA;LAKgC"LAdq&LA*.o12LAC0 CLAWM XLA)EoLAM*LA(jtLAB7 LAxLLA60VLAMA.ы8MA/VMAJsMA䝐MAeCMAΕxMA3MAZnHoNA'NArYE[5NAC&) ONAl[W1hNA=ϫ ՀNA2 NAx{NA NA`NAc @NAphI OAOA$U-'l4OAf|HOARβ\OA\wpOA./rȃOA/3{OApD9OA%jOAh%@GOAҤOA+gOAPAFpPA1?*PA4PA/!PA )PAOv80PA F8PAp_`@PAFfGPAFa ߙOPAbgVPAɋ]PAdPAB0lPA`I?uPAG>~PAzz1'PAZWPA]PA,RPAtPApfaPAшPAzhPA"5%PAm UPAluPA1 &SPAsxPAsPA:RrK QA(QAP^$QAHa0QAF$:=QA|NvIQA#UQAw]aQAnlQA$HTxQAHiQA -\5QAܰ&dQA,QArҬQAkQAQAcOQA?pQAQ17QARZQA*QAvs%QAZQAdQAPDRA)πSAS SAjLwSAz"4SA&e#SAS/SA^~T7TA%#CTAYOTA(;[TA9 (fTA.qTAYу|TAM5(TAi!TA(̛TATzХTApcTAdCTAPżTA9TA[,TA=]gTA TA;ZjTA6'TAɟOUABuUAUA>EUAhp UA C[%(UAo60UAM_d7UA)>x>UAFUAWVAz]VA;y_AVAĺYAmIYAȱYAJF))YAMYAf׍YAAbYAq{FwSZA,ZAp8 w?ZAa=.ZAz!2[A /\AL<3 \A "e\ATA\A8ݺ%$\A:#(.\A{|E4\AJ69\A=nz?\AК bF\AurM\At\nU\AI!_\A2i\A1s\ARџ\~\A\A8(\AC\AOj\A"\Am\A\Aqtr\Az\A,cc\A^%]Awt]A /В]Al%m']AĹX3]A m=]AmOH]A@Q`R]A@&k\]A7 f]A|<Ro]A`Rx]Al. ]AGv]A̘7]Ai|]A ]Ax]A-t]AzTT{]A#laABR:maA{paA|ZtaA•yaA4!aA aAaAUKaAڷQeaA9%TϢaA90CCaA.\MaA*ٯaA=waA]8aA7QaA9aA%aaA^ŎaA\aAzaAUaA?aA'&lbA@@ bAG]bAHbAe*bA h bA$%&bA>w+bAFέ0bAKy5bAFi:bA}b?bAt]DbḀ=IbA$MbAVDmRbA%VbABXG[bAxh^_bA&cbA hbA9]lbA9(-pbAz'*tbAoxbA:3{bA`kbAabA|nWbAEҬ_bA(K bAX`bAbAn bAGH2bA2ڢbAuW&bA[B&WbA]FbAWxNbA0cAۯ,NcAPUcAAcAicAZzcAjIaG%cA l*cA/cA*5cA tJ9cA_>Y>cA06oCcAGcAJLcASYPcA݋HTcAoXcAkS\cAalA`cAccAgcAVǒgA>ߓgAlOW~ÖgAq.gAZ,':gA1gAgAVˮUgA=gA}TU gAcsgAdgAOݤZgAfKgA2mgAhǚ^gA6gA{HgA hAQR hA%hAshA?mhAD4zC$hA\bgl*hAϥt0hAj0\6hA]BZ%pA/MǂApATvDpA} #[GpA 0JpA,VLpA!;OpAFVRpA:TTpAљYiWpA%PZpA+At\pATg^pAmJ{9apA8cpAJLepAO hpA飥>jpA~flpA']npAϙ$ppAȲrpAos:tpAYvpA>sxpAFzpAuwۙ|pA_44^e~pAO5_FpAr;JpAAL pA/ʅpA|b pA~3pA7pApAdӭpAKſpA_`\pAB]pA @pA^pA+rK:FpAn[+pA<N^pA怖Z!pAgpApA<@0pAEspAK6pA6YpA8{pAPy_pA}pAִpA OpA o(lpA]gvpA ~ypAX>pAq]pAQupAșpApApAdBRpAjpAo pA,TpALvpA oipAKppALyɛpA9cpA/MpAn uAn uA/ uA| )uASƚuAq|3uAYzuAisuAHuA]KuA%LLcuAU"uA^|ֶuA:uAA7uAXuAFmuAj=uAis#wkuAAGAuAj)uAnpuA%uA%O.uAX+uAuAwVuA(uApH'uAVuAn0uAeYBuA)RuAzauAYauA6uA>vA{vA716vA(D2vAUm vAݗ vAxH vA뇗vAK_ vAڴ vA6vASvAHq vA wvAvA\bPvAnb!vAn7~#vAP%vA&+'vAl (vA.*vA`J-vAhh/vA|1vA5L2vAcwY3vA Me5vA/HvA<J@vAHv^VCvAHZcbFvAymYIvA|d-cLvAٌmyOvAߗRvAsb2UvAВXvAyoZ[vAV_vA "bvAIK&evAyghvA0qkvAvmvA`ʣNpvAiXRsvAc uvAi@xvA6~zvAR`}vAPP>vAe/+{vAqyG !vA6OW; ~Av~A'{~A3~A%A~AZ:~A "~Aa`~AR4 ~A+b"~AjAr}$~A&~AGw(~A/ӎf*~At=,~A.~A<-/~AQAQAQAXlߙƒAFfÃAwufŃA\ߞǃA-)ȃAʃA)\̃A?7΃AЃAueуAsӃAOՃAYq׃A}<كAjeڃAP:܃A"ab oރA6E\A.}A/MmXA)A1,uA0`=AEEqA0kALMAىаANhr A1`A(ARʖAT6ADpA4aAMAJuA}A6N:A!V;AA$D?AJpAJpAJpAJpA'5AZA'M~:A݂AWeÊALŊAjNJA+^GɊA7~$ˊA|s̊A.ΊA놠ЊA kpҊA$K3ԊAՊA}׊A6@NيAWxڊAAT܊A) ފAƻߊA$+Aٮk(A&YOACXȁAxNA9/X@AAc͇AG;s)A iAV*A97BA|A^Y/AR`RAN4pA[A*A A5ҹAZAaDAgAo?A~rAIAtjA~HAHA?AGyA:OA\D5AxG0AdCAžmA@Aב A Ab?k Ax}^\ AL+g AlD܌ AcAXNfA5ikzAήrAE'fAA}uA0Ae1MZA7'AaA؋jCAŠ2 A`fL"A/t#A f:%ADzBM&At'(Aymb)AH*A6*+AS6-AfAi.A)/A0AV #1Afuh2A!$3A}<4AZP5All6A]r;7A68 x8A/"HsA0"HsA0"HsA0"HsA0"HsAuAA>AhfA_AWAXxpA+[]`_A yMA`:A9=/%A`G A{w AX!AT"A^xҌ#Akb$A34%A-&A/&A'AM6Q(AZ )A-%)ADVY|*A-+Ay+A/!,AW.,-AL0-A㝪qp.AzUˌ /AJ/A:B>0A$0Aad1Ay1AR2AV7 3Aj3A<{`4Am4AY[5A,rP5At6A8ڻ6A7Al7A)8A=8A1k8Ai$c9AD9A\S:ANI:AVr;A/;AWF+A6?APQ?AIx@Ao〰0AAhAABArvCAˏ>DAPwEA!38EA,BFA+]GA[ HAjdHAƵ1IAXJAةɝKAS֖KAd;lLAMALMA]_yVNATNAOA#PA%ZPA׋+'QAQA'RA#rRAHSAd>SAV|SA' vA) vA) vA) vA) vA) vA) vAzA @{A%6@U|A *}Aw}~ALlA؆lYAK~DA,A AxACфAPǫhA4-A>PRA=o6 A )#y鈘AjAgoAʇ,Aɵ勘AZ{A"hLA&:As5~A ]OKABAM|A#,A[RC.ƑAK]A!A\Yo>A(A$ەA@(A(xA6AHfPA@;;A1z纗AY; 9ANAi`b5AMCAj ATDA'AZAũ˯A`wrA_A|J쐝A{@aAGA桘A{?CAYFOAnb! AxϤAT Aɬ\AQ9%AyAQAZ{A!\?A@AMAЊwA 4-A*OւޭA&)DA7T3Ao֯ASuAK%:ASr}AE{3Akw𾲘AEAlȳAJ)Y+FA# A45AԧAӜA/\⌠A0\⌠A0\⌠A0\⌠A0\⌠A0\⌠A0\⌠A0\⌠A0\⌠A0\⌠A0\⌠ARĐA};A( A8C~'A ƛA=D_AZ70A6Ay [AŔA0B.AwsAZAc\Am&AaAK1xAoҗA.܋+AY`sA9טAۋ*A慺|AH̙AgkAf+ohAi A%2AuFAijAgqԛAj$AD/]AҠAОᜠA "A;؝bAaܡAҧߝABu A`xYAL`A̋֞AA FAHbALABGAMAAEALYؠA7b AGuIAYAաAn$AtxAТA j,AhP苣AAOAnmળAe@fAS>|AKkॠAT#CArAlN xAG;dA~A0NA]tAKʨAvHA! pAj߿A?; AO}WA;A6䪠A(E8(AKcgiAZmA5[嫠Ae~F AiAYApaAlddAmddAmddAmddAmddAmddAmddAmddAmddAmddAmddAmddAmddAmddAmddAmddA}TjA>QkAnvRkA-lAeqlA.pSNmA "hmA~mAq4/nA0anA:nAsAG`sA=!6sAxY9sAU00tAmestAZtArtAM\5uAJ-ntuA"}PuAd]uAa ,vA *hvAIvA6ivAnHwA;BRwA.&wA3wA_ xAd-UxAӾ|xAB!*xAxAepyA$&^yA:&yAi yAH)KzA^zAGzAh7z^{A֮{A;n|n"|ALϐ<|Aߠچ|AXN}AL}ALq~ADw~A ~A6AϮAʃAj*GA 瞋AfvA5CAtpoqA(@߁A?')A>qAaAAd)};A\&ZAqZALj"ZAG[AXL[ANC"[A/;[A;F8\Ah^\AlI\ABv\Ah ]A_]ATm]Ad]Az`^A| S^A+g ^A^Az_AJ̜=_A7с|_A>^9_A)" `AL;v@`Ai3h`AځG`ATP`AȰcaATQGJaA_aaAB|aA+6bA:bAibA.IcAcA*ӵ dA qdAOpdAB,:eA/aeAQAfA i}bfAefA/5 )"gAز gAb+gAe2hA".hAvhA3.iA]}iAyiAjA?I ]jAjA &jA$0U'kAF[fkAIkA?4kAsa/lAb_NNlATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATATA%4jAʊA~qEA0ˇA+ꇴALt AY})A$ZFAEdA/*لA\18AeܼA^وAAcnAʱ@A([AnAeJA; |A*A*i߉A{eA$ ,AVAGA17IAߊAطTAaAA[sA!6%ťA׋Am AnJ\;ApMlAIǺA3kˌAYA=j'AcTAgHAs iKArҍA8An! A²UEAFYiAb2A{-4筎Ad~~ΎA>A*y A')AkFA aAD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-AD-A-1mKʻA_V?tʻA}oܛʻA9kCʻA}@wʻAy{ ˻A9ZT.˻AnP˻A=p˻Aa/#˻AQV˻As˻A=˻A̻Ad4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpAf4TpA}y=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A >=A[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA[qA*EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EA,EAn]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]An]AxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxAxA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XA1:XAVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB}jhA}jhA}jhA|jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAp}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPBq}MPB}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsBsB}jhA}jhA}jhA}jhA|jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAciBciBciBciBciBciBciBciBciBciBciBciBciBciBciB ^xA ^xA ^xAciB ^xAciB ^xA ^xA ^xA ^xA ^xAciB ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xAsvxA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAt)5$Bu)5$Bu)5$Bu)5$Bu)5$Bu)5$B ^xA ^xA ^xA ^xA ^xA ^xAu)5$Bu)5$B ^xA ^xAu)5$Bu)5$B ^xA ^xA ^xA ^xAu)5$Bu)5$B ^xA ^xA ^xA ^xA ^xAu)5$B ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA|jhA}jhA}jhA#v+=W+B%v+=W+B%v+=W+B%v+=W+B%v+=W+B%v+=W+B ^xA ^xA ^xA ^xA ^xA ^xA%v+=W+B%v+=W+B ^xA ^xA@jA@jA ^xA ^xA ^xA ^xA@jA@jA ^xA ^xA ^xA ^xA ^xA@jA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAvvZ2BxvZ2BxvZ2BxvZ2BxvZ2BxvZ2BxvZ2B ^xA ^xA ^xA ^xA ^xA ^xA ^xA@jA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAh(9B cA cA cA cA cA cA ^xA ^xA ^xA ^xA ^xA ^xA ^xA@jA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAZ?@B cA cA cA cA cA cA ^xA ^xA ^xA ^xA ^xA ^xA ^xA@jA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA~GzFB@jA@jA ^xA ^xA ^xA ^xA ^xA@jA@jA@jA@jA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhANB@jA@jA ^xA ^xA ^xA ^xA ^xA@jA@jA@jA@jA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAfv$TB ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA|jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAٛ_\B ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA72cB ^xA ^xA ^xA ^xA ^xA ^xAsvxA ^xA ^xA ^xA ^xA ^xA ^xA ^xAsvxA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA|jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhAV+iB ^xA ^xA ^xA ^xA ^xA ^xAsvxA ^xA ^xA ^xA ^xA ^xA ^xA ^xAsvxA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA|jhA֑RqB ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA|jhA}jhA}jhAV qwB ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA ^xA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA}jhA|jhA}jhA4&k CH'@CMCGN$C6Ct69Cld(ʄCdqgZCo/x2;CzpDvC}ԋCR䊕CwhߔC@IqCd鏽SC39gC&>NC(CtwC*m`Ch'!eCWaJC=ݢC*n묲CF|Cr 'CP9egCzLCZ5譞CM웤Cx]>CqCGCRvsCjRCRzUzC_(C{J%C/"C/`CB؄H*C]>´ Ca9!CRrnC/, Cw?/C;0CWaCMR1CCnV$CNC$  CK4XCOcvD%$]DPyVD8eͯD%suDĨηfK D_cs. D4&k C?Ct=\CM*$CbDCkCpGCq { Cbp"C^h<$CQ+ag&Cv1)Cmd=,Cbj0C?' 2CAgT4C96C:09Cb6!Cs'CCIM\Cѻv3CkCd3l6CC"CEBCJF.#C.LCiϥC2CU~ECSC},Cb.ɣC+[6C$HCI4&CAKPC~[C lC(#~aoCOqC(ZOݔCBmDֵýщDWeDp}ݺDQuD4&k CO4>C,z*Cy$CCg* kCPC%x CnQ"CoĮ<$C+a&Cq )C 2P2,C b0CӔ32Cq[T4C6v(6C#9CfG.BCk9lDCFChc)ICLC\TH=BPC3R.{CRCTC? WC40YC$̠]C<MT`CG!iXbC1fdC1f%gC%5jCH4mCugpC;mFƝlrC~۱tCϬO>wC[zCб+S}CwC(ǰCўƄCiTC6K3Crs lC?ECt/ԡCKCDՔC,KdC'@YCCld"|Ch,誌C[ntCཎCZCwP@ ƴCZugICLжC2M3qp1CqCPCmCq CgiC&ؔCyO}LCNbFC2*CeCkrC֌sC'aCS<!C>CSlw.C,®@C:dCk)CXzl8C:j[C9Ώ,C65Cu.C̱C A D22+}DB/䫾D4&k C4&9<C-O<Cbi׸$CA \CdkC?m;C'fv Cx "CK~<$C V\&Cl)C+]*,CYl]0CQ}2Cz(rQT4CY6C̀ 9C9mP}C=2GvCu|CϓbÄC6>QC@E/C99gCYzC/Cϗ5C@\4C+e\CfSCA JCφC{ZDCcD mCCvh CIYCj6C~BCCtt;C3n)CC P$CɻJcC 15CBOCKJCQCȷQ%C{&`9CgpCC#Ù(ECbCCRCK%Ca㞛C`ZC)y$VQCkFCsD6C !C~~Cp%C~CVQF;3tCof.C4&k Cڂ8CFC|д$CPꤠCfkC hvC?p CTչ"C\wr<$CQL&C3)CuS,CK0CFAG2C]j3T4C;lUo6C֦9C8wCE|zCH}C7>qCfQVvCغCDluGFCi4!C}1UCyvvC$[(zCfSCh1*]DCXCQGCPHkC]ychCӀCJe^ CZ ClC^'I=CB2JZ+C5QC.Cm]C6үOCvN'CrCtH2Cr<_Co]*CXs,NC9CX6dCbCUCUCBhC{K1CBPC]C!jjC@6O)CC!,{C\']lCBݧ CsA̸XC(P=C MCj6$CØ஠CJjCTFnC$k CX "Coi<$C]8@&ClE߈)C3,C>0CϏ82CN_\T4Co8a6Ceaܭ9CweAICAOLC3%\APC)eVBRCMmTC*҆ WC΅YCj@/]CύR`C+$UbC*RvdCE!gC%riC < #?-mCzhQbpCYxtfrCǠtCct4wC~fzCz.OB}C'mCD,qC7Cä=CNCVV:GCrmCJnCkЭC1M1CMQCcJ)C @rWCK PCQCJ` C77Cדr¬Cw$ Ch:i=ChVqC*&bbC*dC˻CLC#cJK.C+9YCB!CvI(CEoSC"c[CzC `Cr'ϽC4&k Ck0CُCor$C\N>C !jCmdCW )-nwCdzZCSձ=C 0.CeLYCazd¦CŚ^&qCa6lCKSغCäsZC$丳Cf)6;%C1/ϋFkC!omC^S'Cp٨CDkCaKTCL}EdCH&: C#CiC@gCӘ2C?1頦CLC%C}Cj ̃bC!N\BCwCHthCNCC6xCr%McC%AC?mCPF'yCSE:CPCU6C|&SC|Hu -CRݬCjDC+DVC4&k C g*CgáC$CN3Ca~jCIpVCmZ C-jc"CwL<$CW%T&CC謈)C|V<,CBI0C2CoDS4C݂r6C{,9C]aC+C;{ňHCJCEMCϏCP(V-CTdžOCieCY1mCgCfCT(C7,[֕CԉSC,ů YC6ynC|CoFC'VKCSO+CChC4&k C "C*eCq$CնC'~jCRCC$u?N Caዌ"CNO6<$C@5yA&Cc蹅)C‹,C:CA0Cn?k2Cg鐕S4C*ח%6C'ǥ9CK8&! ]C"N`CQgPbCg޴dCgC3ZiCPmCGIXpCzYrCRtCMwCK-AyC7 }C1awVCr!,TC'> C<9g&CTSىCxh 5C/^;Cؑ.CdZ\C%7OɖC/p~C>U$CؐnAٟCf< G]ȡCnOףC MCͮ*C^ͥ`gC%> sCbECZ{Ck(ഴC5GMݶCfeJ2C[HƵCpgC&Cn,(C~>C$birCn2C C&@jMC=fuCf*ǰCFPOC9BrECsXq8C'CC$$Ce{CQ#C;۟\CG;5C>{Cq$0bC1C5پwvC=ֳCRXqCr=CuJs:C|CސC"DCPg/):%CRfdC4&k C-Cq3~Cjeu$CzC~vzjCP)Ch#= CTYDu"C" <$C^&պ&CVBP)Ci>,C60C6W[z/2C2%FS4C-6Cz?9ClhPCځ>RCΆM}TC1`=WCPW5YC1"]C~0xK`C,3LbCI^dC,,ZgCzab7iC(ymCZ ^RpCTQrC6>Cd͊wC> yCBέcc }CB 4IC-.CC/JyCuUC ܍ȵCK ZˌCJ%C! C@0s-CSCvO2C2<V!Cۦ`CFʧ{CvCx6DC1WrY C+ؾCM{CW&RC D-oCw#ճCqyJʵCD`C&5lCߔ}zCTWC CPD\ Ci߄C^CUO4C1]$C{CS^C.ްC9%ekwCCnmC`Ce>Ch4MC(*C7ϵ;CRY)$C.l޿C4zC r+C[(YC CԦC4&k C tvCEÿsCB$CSRgCEjC@CK% CSIV"C+;$C _䞺&Cd)C#z߭,C0Ce2CW0R4C06C;j9C*8r6C3*9CxKl~PC+_C%{Ck[1CζoC̉C)C C ByCC.m.mC \ CE0CY^RC:V)CqCIACjXܤC4&k CEDCn2zRCk5 Z$C[E1*CZ\jCYC\%L C"Ckl;$CQ4'&C$)CS²,Cݽ0C+#2CeQ4C&9֌p6C-<9C%ܗIC C2LCc+48PCJUw6RC#sTCRaUVCީYC\eCџ\CCOBe=`C96:bCzʮ2tdC+,5fC4R iClC :1pChH^'rC=bXtCMsvCmг'gyCЏ|CoA&Cۯ+sC$6*~C ZC$ CJՋCkCy4KDC3Ѹ4C3TC{ClL1C+MCA]~CC ZCiɧSCQ.C*]N@/(CDߝ>CD WqpCE`QC:/"C* IGCʈC7o4γC.=CM_ChCKS C&C@#$CڱOC( \TsCicCOA Cs'C|.f=C:CdsCW/nCwCϑ7:Ck[C:,Cߕ_CI]L CS+e >C|^YiCr\*CrٲC] CV C3VCpC'P0CꀌqACPCJ9 _C4&k CzCet8Cz6$C1*CoWjCCCV Cكh"C_H;$C<k&C Ir)CmNmȫ,CZX#0C02CwzP4CP}6C*t9CWWDmFC/IC\`ˋLCQ4PCu1RC!hlTC GPVC焼YCy]\C:Z4`CPf.bCj{&fdCfCziC"}N@lC6N8pCKrC%9tCKjHߣvCtAUyC(پ]U|CXcULC<4_֯C9JCNlCkCb6LC2OXCט~ؐClm(C¶C2hwՖC{,-CyXɳCH%hiC|ԦC݂/CŻQUΣC#0,6Cq˕bFC?ofC^C>CBڮC#F5ogC4?`C24{FWCnNICh~5C+CzCV溊ĶC!e86Cu`/DCUC2CTCw)CC-`2C'JC,:XCd  oC3lżCm~MCTYC5;C нCxhC$0CmbXC70i:|C K C(~Ci#ѾCCB~=CxЗC8E- C6C4&k Cج}CZcCݬE$CqHICg~iCu΋CzQeU CK`A"Ci~:$C,&CrѬ)C|i,CrR0CNM2CJO4Cِ<6C6 9C97'CdC`C]g}Cf,vk Cdի[CQѓC7Co3NC-T cCs uC3煷CM?CkCh-ˬC]DC C4&k CKX8CTL.C#C9cCqLPiCkh 1CZrMs CLP"C"3i9$CFT&C'=)CYOި,C4c80C@N+62C)D,M4CXܿ6Csw˚9C%sCՌ&vC7-xC/{C+<~C CG{5bCk=CDC;|̹C[;cCqN!BCK J,CK}ҒCK}VqC!nCd`COrpiC)CXCd>C ڵtC~B┡CBRs%CΚQأCMrC/1%C}%%CO0C0o60C3F?%Cz CzC*$Cm>CT;wCOCOC .CtjC4&k CAy@CR!Cno#COoCgthC!E []CBx^ C7"CB8$CxFs&Cȅ)CL,CCZ0C2CPJ4Cib6C>e9C%ޠ &CH^2lߞC7IC` Cb CR#ofCy4)wCo6.C(tۤCNԛ~CTc-CXͣC O&Ci\C)iM COZpC˨CV[}YCH"hC;f$C+C_V,C7OCS֣ZzC楌CpêC5Ck.C3C+C ?l>C;8zNCxjG]CpOkC+UvCCL۸ƢC@hCbB CnVLCC4&k CǶʡ[C#ROC<6"C NC#gC2=Cֆe Czqrh!Cu :u7$C&C쒻3)C)we,CCQ0C\B2C#"G4C獶6C+Beu9C̬8_X6TC UFVCˍaYC@4m\C?Z_C?}E*aCPcC%SAfCtThCLZkCnC,M;qCH ,sChvOuC&FwC [6zC)0Z}C.6YCl|CUZ]hC#JClJIqLC*hlC~oCpC47C)mKyCH_rp’CIC‰ bCL`WCrCķ3NCIK6CMkʛC,DC C}*C}&lCi{CB(PC~hCA_ɡCZ!CX{~rCCC чC^? pXCn,ۛCXksRCR辜C")2!C {yCɝC&ICsx#RC8ʅ܋C{sCb~4CR+!OC#~:Ca[CŒwCKdSCVC CT͟C QݟCA4CCm8lC;QhCŏP CCu:ͨC7C啊CǛC#x-$%C=<$C4&k C2mCZU1;Cjb!C RC; +0eC ڪCh; C9!C =3$Cڿ&CNx)CUUXљ,CŅQ0Cf2Cr;<4Cj[o6C]ܤ}9C4К )CB>ACVhO+CkCp>HC=oGhC}lC1BCXC &C ԖC: C5K8CdsbCdq4C_KPC"9O{ǗCW_CWvCsACi!C$%1CyE?CovwLC XC# bC*9lCsCzCHWC#뇘CM9׈CF?dCY)oC JNTC|_ʤCgrCCFCC4&k CXCIpfdC91^ CeVȚCwcCk3C` C\AS!CXgq/$CL Ū&C͖s)ChE,Cn[ 0C!S2C܃+m34CeG6C)o9C 6Շ1CJ(4C6D6Cf\y`|[9C ?&UnQCx@5SCm^^UC޲sWCኼXZC󻕟.]C-d"`CZaC \cCvru^eC{gCkTiC8$"lCDfanC)FECpC-;6qCi V5sC4:vߔtC->uCok\wC{xCDYzC@H>s{Cr|CCLJ~Cv XG3COT+CB32ǴC!'q5CV C[!9&C `CmC=ƃ7Cw䪅C^,^̃C C=FC3zC>(gzCey҄CxmmCm&e6CBJ5C/OC^fC{k"{CeٍCoX{CTCBWCC ŅC @υC,n:ׅCޅCɇ$HCRzCACjMjCFη]CwƵC2CJ+CeCn PACxEg&CvZZ;?C^4wC}XCC81C4&k CTCnC2hCqJCQJkWCUS8sCAOCESj!Cb7h$C9^&CsͧR)C!g,C*&/C9j1Cy4Cdm6C~9CB|C~"ACe DQCC` :5ECʣ=۷GC3gJC?LCnOCiVQCIDźTSC64UCi<1WCŁJZLYCj[CV ]C.X-`C=m$ TaC@OUbCꖔ]cC}Ta&eC߁&afCI%1ngC-GhC~jCr&-kCr(DlC~_QNmCHnCL2oCh6|qpCAkpCR9pCqC{fkqC/yqC9qC]D+rC e_rCQ rConrClrCrCrїsC55sC>7w!MsCSasCnH9tsC8IesC%sC35˟sC@4sCUU@;sCnO&sCahsCysCv#SosCKSsCisC:(dzsC(`;sC:=vsCś+sC@9sCKsC&~JsCLb9sC7XtCnxsCpro tC9tC8ÃAtCLΠIStC侫:EtC$$]sCheXstCjR&tCtV uC itCBLtC5Y0UsC4MuC4&k C^b}C?nC4d#y CI|CZ:C"LC ChiYf!CRcJ#C  V&CFe)C~F߄i,C T/C;1C!3CIzd5C&h^8CpW.';CqV9>Cmˤr@C"lBC\"DC8FC*C=IC:KC KNCK;tPC{+o:?hC!݁lhCD{iCW}gjCυjC]jC|k ckCά%kC4FlC7;dlCAoǩlCKslC"m|mCb^)OmC?T!{mCLʡmCftx:mC cCy-3dCJdCdC5+]8eC,AeC' eCO*eCyq\+fCo3B YfCCfC)[!fCLSfCffC{[GfC,gCocŬ&gCY]8gCdTuHgCxߔUgC8gbgCR?mgCӡ5ugCm_gC2ۆgC)/gCC{YgCKgC$ךgC:ģgCxީgC<gCL3egCx6gC5q7gCĹgCixgCHǕgCwƨgCgC)D5hCl8E&hC崗gCgC'hCi_hC^.hC򲟠hCԉgCpDhCF]/kC}7/lnCˣ]pC-#i3rC7{ sC4&k C 2̸C*C0C.O2_C{<&C,!yC U@vC+z!CZ#C|&CG7(CR4x+C_>.C.s1C2C5CD.5i7CT%9C,W>SCHȍjTCPӒUCB0VC0'vWC/dNXCQԑYCc>ZCRܼX[CS\Cd̜c]Cih^CBŔ3^Cwodg_Ct_CZI<`Cw`C(R`CbC`txbCCa[bC*_)Ύ4Cjp6C%ߒ9C;CbH>C/3Ax@CBCCCɫ|_YEC/xSGCn+HCYE봤JC6wLCsJNC.w PChupPCZn.8QCl<[RCi#{SCGhATCոTCSjUC"eSVC=J |VCYoyWCm>R]WCǗ|qXC9 6kXCڭXc>YCa+YCyYC2v\-ZClZC8{}VZC6 7ZC.$[CB s,[CLP[C Po[C}d7[C [CZ$[C2[CH:][C#k}[C+׈[CӴ \C3\ChG\CN0N"\C)\C-\CIĔ7\Cdo>\Ct4#B\C9A7G\C|B O\Cy`pY\C zuT\C X\CNr\C"W\Cᰉ\CCz\CNEl\Cf>@\CGyy\C?\C6\Ci.˸]C]CY]Cl\Cӽ[C)X^C `C+窈bCooYdCYFMfC]O[chCP^jC`JlCN]coCnpC4&k C1C,ΤC8SCH_8*CG]CvhC)T CcL^J!CtblG#C'ez%C]}I_'CU*CCG+s-C/δ.N0C0g:2CU/ڃ3CYX5Cڡo7CIA:CZ]JCG~@FLC"OMC7ӏNCÙ:OCi oPCʙPCS%tQC=N`QC~3PcSRC"dRC–SCk_SC.$SC<ʒ+SCfvi}&TC[TC֊TC ~TCn4,TCKITCtH@UCѤ4UC~4KUCaR`UCrUCcUCƫCUCsUC%6ӨUC5h5ײUC#y UCKUCupmUCOUC6%l̈́UC:UCrUC4$\UC`UUC(LuUC3UC!ҝ=UC0AUC~~zUCaC VC7?&UC%VC``VC{ّVC1e"_VCEEVC0ʳUC@VC6 WC6ꐭU-WC'VC =VCeUC,?XC|ItZCZD.]C|_CrK8kaCNbChdC \ifCSƱ9hC8jC.kCKmC4&k C&lC?ECߍC5C$$Cƒ rCrCs9 !Cc#"Cݳ0%C so`'CN+h)Ceى,C<ƈ/Cn`8W1C93Cxnp4CU26Cy8C_:C }o'PC6MPC]}PC,PC߈]E PC8bsPCPC5XPCPCύQC@wQCkQC$`QCԡAgQCECCcADCH9DCKYqECEC;;.tFC1FC pKGC_GCGCSUFHCzqțHCZHCp3GHC*ICĵTICFIzIC*F6IC0pICT RICߐICt0gICRJC4hXJC +JC<(9JC DJChlKJCzVJCzj^JCܩ`zeJC':iJCwWlqJCp5oJC>׬yJC8JCd7JC`bJCNJCA6JCe3JC{FZJCNmJC]+cJC b_JCmޞJCekxKCGX JCSJCH[KCJTWKC"C`LC33YKC=qSJCVCDKC H9MCmBkWPCCDEQC+\qSCEL"UC LoVCQx>XC)ZCd!v\C*3^CY7`Ck< aCŠɬaCּbCB9(_cC/žcC4&k C`sC(tQCKNQC +CECC5ۃC [V C "Cq;#C@\%CM 'C=*C$M,C/CS϶0CUF 2C>}Ux3Cpl4CX06C7CcȦ8Cl],:Cnn;CN+vCbF?C,^$k@C`R@CtgBACAC'I?ACZ_PDBC]-_BCh0BCUCC-5CC&bCCDCCLCCI F_CC^UoCCZ @DC*DC џQ,DC-ry~=DC 2MMLDC&ZDCL$eDCߏ'pDCW١yDCAg@DCW!DC5yߎDCĊ=6 DClDC~DC 'w9DCTa>DC4mDC7JDC;`DClDCˏWDCWDCDCEDC^"DCi.DCim4DC @NECEC`fNDC1UDCG2EC\[BƅECH 28EChECkăDC:ZECՁ%}GC ߟICfKC-.xLNCVjiPC?ʹQC!PuSCkuTCM1UC|4WCj}XCVܴ&YCҩbVZCď-/܂\CcUyZ\C>s]CL+C\C4&k CKoiC C&D{ CE*C[]{C.CQ}t0Cɮ-C]ۦIi!C__#C|mP$C&C (C_^*CPg,CVOS.C\:0CxF1C#2CrNǴ3Cqظ4CAr5Ci%G6Cq7CK_8C(9C,y9Cʵ:C= `8.;Cs;CX*AC/j>CC"q>CX*U>C) ?C6M7?C1 B\?C2{}?Ca?C`Q/?CIs?Ci|M?C-?C>_y;?C 9h)@C @C偉9@C3@Csmk@Cx/@C{<.<#@CL)9"@Cj;@)@Czm9_-@C#G0@C+994@CZ/q5@Cwʠ*@CDZ>@CE"/A@C)GچA@C5K@C39Z@CX +@C՛y@Cw`G@C出C@CɨWv@C.iz@C%ACƕ,AC7M²@CYs]?C`[@C~[tBCleDCAGECJPGCN_nlIC TYKCNMCR/_GOC $ZPCzE6R[QC%YoRCAn4;SCJ XSC1sTC)b"TC:TC4@,&TCYsTCSCd&RC4&k CYo"ɲSCMCCAC`CC$c;:CS0̵CvojDkC7*n Cn"C"/^#CF%CW?.&C",[(CFvI+K*Ctz+CcsS-C-J/C(sjPq0CddP51CsM>1Ch2CII3Ckxr3C39&v4Cf)4C"At5CP5CgaH6CdVS6CY6CSҫ->7CF7Cչ7C:H7C8C qD8C,th8Ckv+8Cg;WZ8Cቈ 8C8C5y$8Ci8CVX59C2j9C1P9C]89)9CO19C%99C,'N@9CݟZG9C$X0J9CGS9Ct T9C V^9C\zpc9Cq9/h9C1gn9Cpr9Cse9C>_{9Co9C/1bC}9Caj1s9C1{9Cogn9Cz 09C P9CvyuI&w9CqhD9C/:ClXL:Cn:CudY#:C8C(B":CT3C+kV3C,5(l3C$AǺ~3CٛQ3Cу3CZ3C,ϵ3Cό3C_E_3C_CH3Cns 3C03C323C[D3Cpt3Cg3C8yX3C3Cq3C~03C2OQ4C74Cn4C)* 4C4Ch`2 4CU)4C$.4CN 4CVc4C%d4Cj[4C{s4C?4CX[0<5C$#5CNig4C9y\3C&H 5C q6Ct:8C. `:CL+KC/:\@C_/ACUpBCF)BC[CCĹmoDCvDC6 ܭ`ECsYECD|ECBJ+(ECd1DCp'ICCHרsBCX2ACӚu>CAfN:C^7C73C4&k CiJ' CCHٯC kfC386CC CC*#C=;C/C]?n[CF6*A C~!Cm-$?"CΒ#Ceл]$C|Ge%C%=io&CSQeB'CՋ ^(CNI)C#t&)Cˋ i*C *Cӝ+C"fl+CBb,CcD}(,C_w-CLzJe-CvE-C(ϿZ-Cg.CJ.C Τǘs.C4*+XF.C߄t.Cu[ .Cid.Ccm/CrU /C'/CC$6/CZ*D/CgO/C#1NZ/Cu`/CNk/Cb3r/CiFF0w/CR[5~/CF0/C/C/#kM/CBX%/C4:/Cg?/C/C혖nf/Cǒf̬/CPB/Cwȗb/C'/C8[/Cr0CT 0COh/Ct,0CpUt0C1L0Cۆ Ƭ0C )70Ct8.CԦ0CѾs1C5cB3Cw4C~UZ5CxKu87CmCk&h>CM~$>C0`>C"V>C}=CX;v#C $C[k$CM%Ci9U&%C4H_%C#7E&CR\&C:&Cgv.%'Cl`'Cjw+'CRŌ^'CI"'C#ץ (C]k.(C;J(C'-c(CM̼x(C1]ˋ(C?rO2(CN?ڪ(CM׷(CL(C$#0(C>(C$C(Ci(C{(Ccrw(C̪(C?(C*Q(CW)CIjh)Cd )CÏ)C0P2)C*d)Ce)CK/)C=Ao)CoD)CrBG)C QI )CWJ)C# Ď)C-9 )CQ#ཀྵ)Cp8`*C섬*Csz*Cno7q)CLu&i(C *C +Ca 2-C8F/C0C8f1CMڊ2C2IAP3C,U4C )5C]xU5Cp 5C0h6CdQܷ 6C@F5C]c5C؛<4C̄#3CeS1C//R9/C S,Cpݨs(CS9j$C \0- C C@\C4&k C4&k C4&k C4&k C4&k Ck! Cӂ)C{fł|C6C14CʮBC5YC絵FC##/˓C #C/70Y#C@G#Cy $C y $C*K$CR9$Cl2A$$C?e#C\$C3^$CMM#C(`k|k$Cka)%CwF%C~̠"%Cտ1qS$CS7 z#C h$C#wA0%Cv1'C*N(C 0/)C=tk+Ce=,CܗO-CA60;.C˩.C`_Fr/C 3^,/C//CaJ:/CąIĵ2.C,C=ÞI+CXЏE)CPI4~&ChBZ$CX&!C$mCI-C`+c C@d) C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k CF,[eC`NC,iC:ˋC[Cg?rgբC:6xuCLkޙC# CAaZCۻ#CArRC>C!!CmͭCX:+CŜC.CR[C˙0<CGCz$0CbB|gC=_~C9q-CZCV49& C0$C>CjMMJTCt gC3gxCt\CԔPlCm^iYCְCTC äLCpD=C%FC4KC+'XCrߟ Cwy&C8uCZU&CBCa _LC{C'P C0feS CAR Cg C! CHygCvcH C;속Q C CL C] C'T !C/6 CDB CTRC H C {])!CX "C L"Cji J#Cn{$CJ4=%C %CDQM&C&C &C@&Cf55&CDa0Y%C8T$Cyx#C " "C` C<CP(9C0"5qFC죷RgC4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C׬C>:OC3ACbmCXÒGPCf} Cױ=C!YCCtC!CMZ^Cc@CͥCejCjaC$ںCS%CnMVC2B/.CץCՐoCA GC{$CNC}+'CZ8C &GCSCoz_CEsiCZRwrCyCMRcҀCڨ>LChl\TC?CNC@jCT-?Cy~C*^&C2wCOC,C\-C?9CVCUY$CڣCCCnl+CމKC|7CѯACC7{CgBiCkCvDۺeC򤘼PC'CXC2[&C&CԞE COs@C^I) Cm Q C8W C=4 CDh<CGkCnڎwC*(CPGo)C6MC&YC(rkDCJ]SC4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C^ C^S C:?CÏtC2{CW#uC.(tC[+C/C~C0`vC!CW&e:CkCU才CVt]CiCb3CVC 0+C5L}>C PC3^Cޢ4"lC_wC-?CUVC QJhC|!uCnjCKCT8 CrCyFRC; ʹCYCxW|CyCgÜC׀C;C9CDC/C$\2GC^InC2$CT CFC !C%EPCcC7sCװ{ClyCxLCSCCCp FŔC{}>CICgpvCC'gh^C;NCY.C18٫C`CŠfBCD$[Cr5y C$cC7C?CHxpC@ΠY C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k Ce4{ C/n5 CH' CIAC+ױC#畮dC륰OmCGkǺCeC0*KChNw7C>WNC>:cbC\sCw45CG ]$C9Cd CZCMiݶCIBJCoCxYCO {C|C)ù2C;CC7QpC*/rC^ 5iC׎2CkC&C [ǽC@-fCj>C2vR6CטCDO CTp<CU$CFcNCyIEC2DClq=C8:#C쭧C"Q"VC_CC31CïȋCm[nCϭCuUCU{CCauC=}&[BTC{nC(Y|DCHCq>)C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k C4&k CP{>H\>a4<ա>b۔6 >QVR>n7>Zm>ç\7>#Z>wM>MIIL >4 a?>l>!#f>Od1>4ϟ4?щqm ?密?8>Fm?3 ?%?u-?(/U3?t:?[>B?ӮoH??P?=bV?ݒ^?fa[d?xk?*;r?J"y? T?^% s?d?F>w?.k ?TA?6ؕ?HQ?YU?gv?L@ǟF?.C#?Yqd?N?|n;?*J-A?I+?+?0R^G?-)@٭ @f!<^@'`a5@ܯ|-!@b '@E:0@75@f=@d#D@$9}D2K@of fR@]X@a`@꿸#f@+n@&+dt@49|@~0m@|KG։@^z@YB@+@(!@bMüJ@./ѳ@?)к@z#@n2@Ƞ@#qw@e@)汐@>b@,F#@!{x@RHJ;A<PA.AY͂WA*NrAW*#Atn*A#41A#28ANM{^@A%FA4&k CTcBC͛C_֯$C鰠Cm:kC6 CG~ C"C} <$Czn&C٣)C1MJ,COr0CXn2CvT4CfL6C0$I9C["1%YbC%dCh!'gCZhjC@ų7mC#ipC7=orC |zCM*N_C&矝C_gCk氢CC~ܕCs y~Cp­C.ӏACU?ƲCC*/C8ɝC CC(S1.CS߳0C0ѼCg=C5l CC,2 zCסIC-ChC)=F,CCM CxbC!CbCƕPCjJkCi_ C@w6|C\c"C{ClitCDxL[6D ,D;F+ ?DZ/< DoigD^)/D%uMD@xDdd ?@4 4 | 0\xdecay_timesdecay_energiesrest_timesinitial_energies`PKmNLLNuRadioMC/EvtGen/generator.py# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units from NuRadioMC.utilities import inelasticities from six import iterkeys, iteritems from scipy import constants from scipy.integrate import quad from scipy.interpolate import interp1d import scipy.interpolate as interpolate from scipy.optimize import fsolve from scipy.interpolate import RectBivariateSpline import h5py import os import logging logger = logging.getLogger("EventGen") logging.basicConfig() VERSION_MAJOR = 1 VERSION_MINOR = 1 HEADER = """ # all quantities are in the default NuRadioMC units (i.e., meters, radians and eV) # all geometry quantities are in the NuRadioMC default local coordinate system: # coordinate origin is at the surface # x axis is towards Easting, y axis towards Northing, z axis upwards # zenith/theta angle is defined with respect to z axis, i.e. 0deg = upwards, 90deg = towards horizon, 180deg = downwards # azimuth/phi angle counting northwards from East # # the collumns are defined as follows # 1. event id (integer) # 2. neutrino flavor (integer) encoded as using PDG numbering scheme, particles have positive sign, anti-particles have negative sign, relevant for us are: # 12: electron neutrino # 14: muon neutrino # 16: tau neutrino # 3. energy of neutrino (double) # 4. charge or neutral current interaction (string, one of ['cc', 'nc'] # 5./6./7. position of neutrino interaction vertex in cartesian coordinates (x, y, z) (in default NuRadioMC local coordinate system) # 8. zenith/theta angle of neutrino direction (pointing to where it came from, i.e. opposite to the direction of propagation) # 9. azimuth/phi angle of neutrino direction (pointing to where it came from, i.e. opposite to the direction of propagation) # 10. inelasticity (the fraction of neutrino energy that goes into the hadronic part) # """ # Mass energy equivalent of the tau lepton tau_mass = constants.physical_constants['tau mass energy equivalent in MeV'][0] * units.MeV # Lifetime of the tau (rest frame). Taken from PDG tau_rest_lifetime = 290.3 * units.fs density_ice = 0.9167 * units.g / units.cm ** 3 cspeed = constants.c * units.m / units.s def load_input_hdf5(filename): """ reads input file into memory Parameters ---------- filename: string Name of the file Returns ------- fin: dictionary Dictionary containing the elements in filename """ h5fin = h5py.File(filename, 'r') fin = {} for key, value in iteritems(h5fin): fin[key] = np.array(value) h5fin.close() return fin def create_interp(filename): """ Creates RectBivariateSpline functions for interpolating the decay times and energies from filename Parameters ---------- filename: string name of the hdf5 file containing the table Returns ------- (interp_time, interp_energies): tuple of RectBivariateSpline functions """ fin = load_input_hdf5(filename) log_time_bins = np.log10(fin['rest_times']) log_energy_bins = np.log10(fin['initial_energies']) f_time = RectBivariateSpline(log_time_bins, log_energy_bins, np.log10(fin['decay_times']) ) f_energies = RectBivariateSpline(log_time_bins, log_energy_bins, np.log10(fin['decay_energies']) ) def interp_time(time, energy): return 10**f_time(np.log10(time), np.log10(energy)) def interp_energies(time, energy): return 10**f_energies(np.log10(time), np.log10(energy)) return (interp_time, interp_energies) def mean_energy_loss(energy): """ Returns the mean energy loss of a tau per g/cm2 as a function of the tau energy This function is a linear (in log scale) approximation above 1 PeV to the curve found in https://doi.org/10.1016/j.astropartphys.2006.11.003 Parameters ---------- energy: float Tau energy Returns ------- Energy loss per amount of matter (float) """ E0 = 1*units.PeV if (energy > E0): b1 = 1.e-7 * units.cm ** 2 / units.g b2 = 1.8e-7 * units.cm ** 2 / units.g return b1*energy + b2*energy*np.log10(energy/E0) else: return 0. def get_tau_decay_rest(energy): """ Calculates the random tau decay time without time dilation """ # The tau decay time is taken assuming an exponential decay # and applying the inverse transform method tau_decay_rest = -np.log(1 - np.random.uniform(0, 1)) * tau_rest_lifetime return tau_decay_rest def get_tau_decay_time(energy): """ Calculates the random tau decay time taking into account time dilation """ gamma = energy / tau_mass # tau_mass must be in natural units (c = 1) tau_decay_rest = get_tau_decay_rest(energy) tau_decay_time = gamma * tau_decay_rest return tau_decay_time def get_decay_time_losses(energy, distmax, average=False, compare=False, user_time=None): """ Calculates the decay time assuming photonuclear energy losses above 1 PeV and using the quasi-continuous approximation. See https://doi.org/10.1016/j.astropartphys.2006.11.003 for details. Parameters ---------- energy: float energy of the incident neutrino distmax: float maximum distance for which we calculate energy losses. It should be similar to the maximal dimension of the simulation volume. average: bool If False, a random decay time at rest is calculated If True, the tau mean lifetime at rest is used compare: bool If True, returns a tuple with the decay time with losses and without If False, only the decay time with losses is returned user_time: float If user_time is not None, the tau decay time in rest frame is taken as equal to user_time and the average flag is ignored. Returns ------- decay_time: float Tau decay time with photonuclear losses energy_decay: float Tau energy at the time of decay decay_time_no_losses: float Tau decay time without losses """ E0 = 1*units.PeV if (energy <= E0): #raise ValueError('Energy is equal to or less than 1 PeV. Returning decay time without energy loss.') if user_time is None: return get_tau_decay_time(energy), energy else: gamma = energy/tau_mass return gamma*user_time, energy # At these energies, we can use the speed of light as the tau speed timemax = distmax/cspeed Estep = energy/1000. times = [0.] timebreak = None energies = np.arange(energy, E0, -Estep) if (energies[-1] != E0): energies = np.append(energies, E0) # This function returns the inverse of the energy loss, needed for the # calculation of the ellapsed times def loss_int(E): return 1./mean_energy_loss(E) # We loop over the energies and integrate the inverse of the energy loss # so that we obtain the corresponding time at which the particle has a # given energy. for finalenergy in energies[1:]: # If the energy is less than 1 PeV, we stop. if (finalenergy < E0): timebreak = quad(loss_int, E0, energy)/density_ice/cspeed times.append(timebreak) break time = quad(loss_int, finalenergy, energy)[0]/density_ice/cspeed times.append(time) if (time > timemax): break energies = energies[0:len(times)] if user_time is not None: tau_decay_rest = user_time elif not average: tau_decay_rest = get_tau_decay_rest(energy) else: tau_decay_rest = tau_rest_lifetime # We use an interpolation for having the energies as a function of time energies_interp = interp1d(times, energies) # This function returns the Lorentz factor for a given time t def gamma(t): if timebreak is not None and t > timebreak: return E0/tau_mass elif (t > timemax): return energies[-1]/tau_mass elif (t > times[-1]): return E0/tau_mass elif (t < 0): return np.inf else: return energies_interp(t)/tau_mass # This function returns the inverse of the Lorentz factor at a time t def inv_gamma(t): return 1./gamma(t) # This function integrates the inverse of the Lorentz factor in order # to obtain the proper time for the tau between the times t0 and t1 def proper_time(gamma_function, t0, t1): return quad(inv_gamma, t0, t1)[0] # This function returns the difference between the proper time of the tau # at a time t and its decay time (in the tau rest frame) def times_diff(t): return proper_time(gamma, 0, t)-tau_decay_rest # We obtain the decay time for the observer finding the roots for the # difference between the proper time and the decay time in the rest frame decay_time = fsolve(times_diff,1e3*units.ns)[0] energy_decay = gamma(decay_time)*tau_mass if not compare: return decay_time, energy_decay else: decay_time_no_losses = tau_decay_rest*gamma(0) return decay_time, decay_time_no_losses, energy_decay def get_tau_speed(energy): """ Calculates the speed of the tau lepton """ gamma = energy / tau_mass if (gamma < 1): #raise ValueError('The energy is less than the tau mass. Returning zero speed') return 0 beta = np.sqrt(1 - 1 / gamma ** 2) return beta * constants.c * units.m / units.s def get_tau_decay_length(energy, distmax=0, table=None): """ calculates the decay length of the tau Parameters ---------- energy: float Tau energy distmax: float maximum distance for which we calculate energy losses. It should be similar to the maximal dimension of the simulation volume. table: RectBivariateSpline type function. See get_decay_time_tab. Returns ------- decay_time, decay_energy: float, float Tau decay time and tau decay energy """ if (energy <= 1*units.PeV): decay_time = get_tau_decay_time(energy) v = get_tau_speed(energy) return decay_time * v, energy else: if table is None: decay_time, decay_energy = get_decay_time_losses(energy, distmax) else: decay_time, decay_energy = get_decay_time_tab(table, energy) return decay_time * cspeed, decay_energy def get_decay_time_tab(table, energy, time=None): """ Calculates the decay time assuming photonuclear energy losses above 1 PeV and using the quasi-continuous approximation. See https://doi.org/10.1016/j.astropartphys.2006.11.003 for details. This version uses tabulated histograms to speed up the computation. Parameters ---------- table: tuple of 2 RectBivariateSpline type functions table[0](time,energy) must interpolate the decay time in lab frame table[1](time,energy) must interpolate the decay energy in lab frame energy: float energy of the incident neutrino time: float If time is not None, the tau decay time in rest frame is taken as equal to time. If time is None, a random time is drawn. Returns ------- decay_time: float Tau decay time with photonuclear losses energy_decay: float Tau energy at the time of decay """ if time is None: time = get_tau_decay_rest(energy) decay_time = table[0](time, energy)[0,0] decay_energy = table[1](time, energy)[0,0] return decay_time, decay_energy def get_tau_decay_vertex(x, y, z, E, zenith, azimuth, distmax, table=None): """ Let us assume that the tau has the same direction as the tau neutrino to calculate the vertex of the second shower Parameters ---------- x: float x coordinate of the vertex position y: float y coordinate of the vertex position z: float z coordinate of the vertex position E: float Tau energy after neutrino interaction zenith: float Zenith arrival direction azimuth: float Azimuth arrival direction distmax: float maximum distance for which we calculate energy losses. It should be similar to the maximal dimension of the simulation volume. table: tuple of 2 RectBivariateSpline type functions Returns ------- second_vertex_x: float x coordinate of the decay position second_vertex_y: float y coordinate of the decay position second_vertex_z: float z coordinate of the decay position decay_energy: float Tau energy at the moment of decay """ L, decay_energy = get_tau_decay_length(E, distmax, table) second_vertex_x = L second_vertex_x *= np.sin(zenith) * np.cos(azimuth) second_vertex_x += x second_vertex_y = L second_vertex_y *= np.sin(zenith) * np.sin(azimuth) second_vertex_y += y second_vertex_z = L second_vertex_z *= np.cos(zenith) second_vertex_z += z return second_vertex_x, second_vertex_y, second_vertex_z, decay_energy def get_tau_cascade_properties(tau_energy): """ Given the energy of a decaying tau, calculates the properties of the resulting cascade. Parameters ---------- tau_energy: float Tau energy at the moment of decay Returns ------- cascade_energy: float The energy of the resulting cascade cascade_type: string Decay type: 'tau_had', 'tau_em', or 'tau_mu' """ # TODO: calculate cascade energy # TODO: include the rest of the particles produced branch = inelasticities.random_tau_branch() products = inelasticities.inelasticity_tau_decay(tau_energy, branch) return products, branch def write_events_to_hdf5(filename, data_sets, attributes, n_events_per_file=None, start_file_id=0): """ writes NuRadioMC input parameters to hdf5 file this function can automatically split the dataset up into multiple files for easy multiprocessing Parameters ---------- filename: string the desired output filename (if multiple files are generated, a 'part000x' is appended to the filename data_sets: dict a dictionary with the data sets attributes: dict a dictionary containing the meta attributes n_events_per_file: int (optional, default None) the number of events per file additional_interactions: dict or None (default) a dictionary containing potential additional interactions, such as the second tau interaction vertex. """ n_events = len(np.unique(data_sets['event_ids'])) logger.info("saving {} events in total".format(n_events)) total_number_of_events = attributes['n_events'] if "start_event_id" not in attributes: attributes["start_event_id"] = 0 # backward compatibility if(n_events_per_file is None): n_events_per_file = n_events else: n_events_per_file = int(n_events_per_file) iFile = -1 evt_id_first = data_sets['event_ids'][0] evt_id_last_previous = 0 # save the last event id of the previous file start_index = 0 n_events_total = 0 while True: iFile += 1 filename2 = filename evt_ids_this_file = np.unique(data_sets['event_ids'])[iFile * n_events_per_file : (iFile + 1) * n_events_per_file] if(len(evt_ids_this_file) == 0): logger.info("no more events to write in file {}".format(iFile)) break if((iFile > 0) or (n_events_per_file < n_events)): filename2 = filename + ".part{:04}".format(iFile + 1 + start_file_id) fout = h5py.File(filename2, 'w') fout.attrs['VERSION_MAJOR'] = VERSION_MAJOR fout.attrs['VERSION_MINOR'] = VERSION_MINOR fout.attrs['header'] = HEADER for key, value in attributes.iteritems(): fout.attrs[key] = value fout.attrs['total_number_of_events'] = total_number_of_events evt_id_first = evt_ids_this_file[0] evt_id_last = evt_ids_this_file[-1] tmp = np.squeeze(np.argwhere(data_sets['event_ids'] == evt_id_last)) # set stop index such that last event is competely in file if(tmp.size == 1): stop_index = tmp + 1 else: stop_index = tmp[-1] + 1 # if(evt_id_last >= n_events): # evt_id_last = n_events # stop_index = len(data_sets['event_ids']) # else: # tmp = np.squeeze(np.argwhere(data_sets['event_ids'] > evt_id_last)) # set stop index such that last event is competely in file # if(tmp.size == 1): # stop_index = tmp # else: # stop_index = tmp[0] for key, value in data_sets.iteritems(): fout[key] = value[start_index:stop_index] # determine the number of events in this file (which is NOT the same as the entries in the file) # case 1) this is not the last file -> number of events is difference between last event id of the current and previous file + 1 # case 2) it is the last file -> total number of simulated events - last event id of previous file # case 3) it is the first file -> last event id + 1 - start_event_id # case 4) it is the first and last file -> total number of simulated events evt_ids_next_file = np.unique(data_sets['event_ids'])[(iFile + 1) * n_events_per_file : (iFile + 2) * n_events_per_file] n_events_this_file = None if(iFile == 0 and len(evt_ids_next_file) == 0): # case 4 n_events_this_file = total_number_of_events elif(len(evt_ids_next_file) == 0): # last file -> case 2 n_events_this_file = total_number_of_events - evt_id_last_previous + attributes['start_event_id'] elif(iFile == 0): # case 3 n_events_this_file = evt_id_last - attributes['start_event_id'] + 1 else: # case 1 n_events_this_file = evt_id_last - evt_id_last_previous print('writing file {} with {} events (id {} - {}) and {} entries'.format(filename2, n_events_this_file, evt_id_first, evt_id_last, stop_index - start_index)) fout.attrs['n_events'] = n_events_this_file fout.close() n_events_total += n_events_this_file start_index = stop_index evt_id_last_previous = evt_id_last if(evt_id_last == n_events): # break while loop if all events are saved break logger.info("wrote {} events in total".format(n_events_total)) def primary_energy_from_deposited(Edep, ccnc, flavor, inelasticity): """ Calculates the primary energy of the neutrino from the deposited energy in the medium. Parameters ---------- Edep: float deposited energy ccnc: string indicates 'nc', neutral current; 'cc', charged current flavor: int neutrino flavor inelasticity: float inelasticity of the interaction """ if (ccnc == 'nc'): return Edep/inelasticity elif (ccnc == 'cc'): if (np.abs(flavor) == 12): return Edep elif (np.abs(flavor) == 14): return Edep/inelasticity elif (np.abs(flavor) == 16): return Edep/inelasticity # TODO: change this for taus def ice_cube_nu_fit(energy, slope=-2.19, offset=1.01): # from https://doi.org/10.22323/1.301.1005 # ApJ slope=-2.13, offset=0.9 flux = 3 * offset * (energy / (100 * units.TeV))**slope * 1e-18 * \ (units.GeV**-1 * units.cm**-2 * units.second**-1 * units.sr**-1) return flux def get_GZK_1(energy): """ model of (van Vliet et al., 2019, https://arxiv.org/abs/1901.01899v1) of the cosmogenic neutrino flux for a source evolution parameter of m = 3.4, a spectral index of the injection spectrum of α = 2.5, a cut-off rigidity of R = 100 EeV, and a proton fraction of 10% at E = 10^19.6 eV """ E, J = np.loadtxt(os.path.join(os.path.abspath(os.path.dirname(__file__)), '../examples/Sensitivities/ReasonableNeutrinos1.txt')) E *= units.GeV J *= units.GeV * units.cm**-2 * units.s**-1 * units.sr**-1 / E**2 get_flux = interpolate.interp1d(E, J, fill_value=0, bounds_error=False) return get_flux(energy) def get_energy_from_flux(Emin, Emax, n_events, flux): """ returns randomly distribution of energy according to a flux Parameters ---------- Emin: float minumum energy Emax: float maximum energy n_event: int number of events to generate flux: function must return flux as function of energy in units of events per energy, time, solid angle and area Returns: array of energies """ xx_edges = np.linspace(Emin, Emax, 10000000) xx = 0.5 * (xx_edges[1:] + xx_edges[:-1]) yy = flux(xx) cum_values = np.zeros(xx_edges.shape) cum_values[1:] = np.cumsum(yy * np.diff(xx_edges)) inv_cdf = interpolate.interp1d(cum_values, xx_edges) r = np.random.uniform(0, cum_values.max(), n_events) return inv_cdf(r) def generate_eventlist_cylinder(filename, n_events, Emin, Emax, fiducial_rmin, fiducial_rmax, fiducial_zmin, fiducial_zmax, full_rmin=None, full_rmax=None, full_zmin=None, full_zmax=None, thetamin=0.*units.rad, thetamax=np.pi*units.rad, phimin=0.*units.rad, phimax=2*np.pi*units.rad, start_event_id=1, flavor=[12, -12, 14, -14, 16, -16], n_events_per_file=None, spectrum='log_uniform', add_tau_second_bang=False, tabulated_taus=True, deposited=False, start_file_id=0): """ Event generator Generates neutrino interactions, i.e., vertex positions, neutrino directions, neutrino flavor, charged currend/neutral current and inelastiviy distributions. All events are saved in an hdf5 file. Parameters ---------- filename: string the output filename of the hdf5 file n_events: int number of events to generate Emin: float the minimum neutrino energy (energies are randomly chosen assuming a uniform distribution in the logarithm of the energy) Emax: float the maximum neutrino energy (energies are randomly chosen assuming a uniform distribution in the logarithm of the energy) fiducial_rmin: float lower r coordinate of fiducial volume (the fiducial volume needs to be chosen large enough such that no events outside of it will trigger) fiducial_rmax: float upper r coordinate of fiducial volume (the fiducial volume needs to be chosen large enough such that no events outside of it will trigger) fiducial_zmin: float lower z coordinate of fiducial volume (the fiducial volume needs to be chosen large enough such that no events outside of it will trigger) fiducial_zmax: float upper z coordinate of fiducial volume (the fiducial volume needs to be chosen large enough such that no events outside of it will trigger) full_rmin: float (default None) lower r coordinate of simulated volume (if None it is set to 1/3 of the fiducial volume, if second vertices are not activated it is set to the fiducial volume) full_rmax: float (default None) upper r coordinate of simulated volume (if None it is set to 5x the fiducial volume, if second vertices are not activated it is set to the fiducial volume) full_zmin: float (default None) lower z coordinate of simulated volume (if None it is set to 1/3 of the fiducial volume, if second vertices are not activated it is set to the fiducial volume) full_zmax: float (default None) upper z coordinate of simulated volume (if None it is set to 5x the fiducial volume, if second vertices are not activated it is set to the fiducial volume) thetamin: float lower zenith angle for neutrino arrival direction thetamax: float upper zenith angle for neutrino arrival direction phimin: float lower azimuth angle for neutrino arrival direction phimax: float upper azimuth angle for neutrino arrival direction start_event: int default: 1 event number of first event flavor: array of ints default: [12, -12, 14, -14, 16, -16] specify which neutrino flavors to generate. A uniform distribution of all specified flavors is assumed. The neutrino flavor (integer) encoded as using PDF numbering scheme, particles have positive sign, anti-particles have negative sign, relevant for us are: * 12: electron neutrino * 14: muon neutrino * 16: tau neutrino n_events_per_file: int or None the maximum number of events per output files. Default is None, which means that all events are saved in one file. If 'n_events_per_file' is smaller than 'n_events' the event list is split up into multiple files. This is useful to split up the computing on multiple cores. spectrum: string defines the probability distribution for which the neutrino energies are generated * 'log_uniform': uniformly distributed in the logarithm of energy * 'E-?': E to the -? spectrum where ? can be any float * 'IceCube-nu-2017': astrophysical neutrino flux measured with IceCube muon sample (https://doi.org/10.22323/1.301.1005) * 'GZK-1': GZK neutrino flux model from van Vliet et al., 2019, https://arxiv.org/abs/1901.01899v1 for 10% proton fraction (see get_GZK_1 function for details) * 'GZK-1+IceCube-nu-2017': a combination of the cosmogenic (GZK-1) and astrophysical (IceCube nu 2017) flux add_tau_second_bang: bool if True simulate second vertices from tau decays tabulated_taus: bool if True the tau decay properties are taken from a table deposited: bool If True, generate deposited energies instead of primary neutrino energies start_file_id: int (default 0) in case the data set is distributed over several files, this number specifies the id of the first file (useful if an existing data set is extended) """ attributes = {} n_events = int(n_events) attributes['n_events'] = n_events attributes['start_event_id'] = start_event_id attributes['fiducial_rmin'] = fiducial_rmin attributes['fiducial_rmax'] = fiducial_rmax attributes['fiducial_zmin'] = fiducial_zmin attributes['fiducial_zmax'] = fiducial_zmax if(full_rmin is None): if(add_tau_second_bang): full_rmin = fiducial_rmin / 3. else: full_rmin = fiducial_rmin if(full_rmax is None): if(add_tau_second_bang): full_rmax = fiducial_rmax * 5. else: full_rmax = fiducial_rmax if(full_zmin is None): if(add_tau_second_bang): full_zmin = fiducial_zmin * 5. else: full_zmin = fiducial_zmin if(full_zmax is None): if(add_tau_second_bang): full_zmax = fiducial_zmax / 3. else: full_zmax = fiducial_zmax attributes['rmin'] = full_rmin attributes['rmax'] = full_rmax attributes['zmin'] = full_zmin attributes['zmax'] = full_zmax attributes['flavors'] = flavor attributes['Emin'] = Emin attributes['Emax'] = Emax attributes['thetamin'] = thetamin attributes['thetamax'] = thetamax attributes['phimin'] = phimin attributes['phimax'] = phimax attributes['deposited'] = deposited data_sets = {} # generate neutrino vertices randomly data_sets["azimuths"] = np.random.uniform(phimin, phimax, n_events) u = np.random.uniform(np.cos(thetamax), np.cos(thetamin), n_events) data_sets["zeniths"] = np.arccos(u) # generates distribution that is uniform in cos(theta) rr_full = np.random.triangular(full_rmin, full_rmax, full_rmax, n_events) data_sets["xx"] = rr_full * np.cos(data_sets["azimuths"]) data_sets["yy"] = rr_full * np.sin(data_sets["azimuths"]) data_sets["zz"] = np.random.uniform(full_zmin, full_zmax, n_events) fmask = (rr_full >= fiducial_rmin) & (rr_full <= fiducial_rmax) & (data_sets["zz"] >= fiducial_zmin) & (data_sets["zz"] <= fiducial_zmax) # fiducial volume mask data_sets["event_ids"] = np.arange(n_events) + start_event_id data_sets["n_interaction"] = np.ones(n_events, dtype=np.int) # generate neutrino flavors randomly data_sets["flavors"] = np.array([flavor[i] for i in np.random.randint(0, high=len(flavor), size=n_events)]) """ #from AraSim nue:nueb:numu:numub:nutau:nutaub = 0.78: 0.22: 0.61: 0.39: 0.61: 0.39 flaRnd = np.random.uniform(0., 3., n_events) flavors = np.ones(n_events, dtype = np.int64) for i, r in enumerate(flaRnd): if (r <= 0.78): flavors[i] = flavor[0] elif (r <= 1.0): flavors[i] = flavor[1] elif (r <= 1.61): flavors[i] = flavor[2] elif (r <= 2.0): flavors[i] = flavor[3] elif (r <= 2.61): flavors[i] = flavor[4] else: flavors[i] = flavor[5] """ # generate energies randomly if(spectrum == 'log_uniform'): data_sets["energies"] = 10 ** np.random.uniform(np.log10(Emin), np.log10(Emax), n_events) elif(spectrum.startswith("E-")): # enerate an E^gamma spectrum. gamma = float(spectrum[1:]) gamma += 1 Nmin = (Emin)**gamma Nmax = (Emax)**gamma def get_inverse_spectrum(N, gamma): return np.exp(np.log(N)/gamma) data_sets["energies"] = get_inverse_spectrum(np.random.uniform(Nmax, Nmin, size=n_events), gamma) elif(spectrum == "GZK-1"): """ model of (van Vliet et al., 2019, https://arxiv.org/abs/1901.01899v1) of the cosmogenic neutrino flux for a source evolution parameter of m = 3.4, a spectral index of the injection spectrum of α = 2.5, a cut-off rigidity of R = 100 EeV, and a proton fraction of 10% at E = 10^19.6 eV """ data_sets["energies"] = get_energy_from_flux(Emin, Emax, n_events, get_GZK_1) elif(spectrum == "IceCube-nu-2017"): data_sets["energies"] = get_energy_from_flux(Emin, Emax, n_events, ice_cube_nu_fit) elif(spectrum == "GZK-1+IceCube-nu-2017"): def J(E): return ice_cube_nu_fit(E) + get_GZK_1(E) data_sets["energies"] = get_energy_from_flux(Emin, Emax, n_events, J) else: logger.error("spectrum {} not implemented".format(spectrum)) raise NotImplementedError("spectrum {} not implemented".format(spectrum)) # generate charged/neutral current randomly data_sets["interaction_type"] = inelasticities.get_ccnc(n_events) # generate inelasticity data_sets["inelasticity"] = inelasticities.get_neutrino_inelasticity(n_events) """ #from AraSim epsilon = np.log10(energies / 1e9) inelasticity = pickY(flavors, ccncs, epsilon) """ if deposited: data_sets["energies"] = [primary_energy_from_deposited(Edep, ccnc, flavor, inelasticity) \ for Edep, ccnc, flavor, inelasticity in \ zip(data_sets["energies"], data_sets["interaction_type"], \ data_sets["flavors"], data_sets["inelasticity"])] data_sets["energies"] = np.array(data_sets["energies"]) data_sets_fiducial = {} if not add_tau_second_bang: # save only events with interactions in fiducial volume for key, value in iteritems(data_sets): data_sets_fiducial[key] = value[fmask] else: # Initialising data_sets_fiducial with empty values for key, value in iteritems(data_sets): data_sets_fiducial[key] = [] if tabulated_taus: cdir = os.path.dirname(__file__) table = create_interp(os.path.join(cdir, 'decay_library.hdf5')) else: table = None mask = (data_sets["interaction_type"] == 'cc') & (np.abs(data_sets["flavors"]) == 16) logger.info("{} taus are created in nu tau interactions -> checking if tau decays in fiducial volume".format(np.sum(mask))) n_taus = 0 for event_id in data_sets["event_ids"]: iE = event_id - start_event_id first_inserted = False x = data_sets['xx'][iE] y = data_sets['yy'][iE] z = data_sets['zz'][iE] r = (x ** 2 + y ** 2)**0.5 # Appending event if it interacts within the fiducial volume if ( r >= fiducial_rmin and r <= fiducial_rmax ): if ( z >= fiducial_zmin and z <= fiducial_zmax ): for key in iterkeys(data_sets): data_sets_fiducial[key].append(data_sets[key][iE]) first_inserted = True if (data_sets["interaction_type"][iE] == 'cc' and np.abs(data_sets["flavors"][iE]) == 16): Etau = (1 - data_sets["inelasticity"][iE]) * data_sets["energies"][iE] # first calculate if tau decay is still in our fiducial volume x, y, z, decay_energy = get_tau_decay_vertex(data_sets["xx"][iE], data_sets["yy"][iE], data_sets["zz"][iE], Etau, data_sets["zeniths"][iE], data_sets["azimuths"][iE], np.sqrt(4*(full_rmax-full_rmin)**2+(full_zmax-full_zmin)**2), table=table) r = (x ** 2 + y ** 2)**0.5 if( r >= fiducial_rmin and r <= fiducial_rmax ): if(z >= fiducial_zmin and z <= fiducial_zmax): # z coordinate is negative # the tau decay is in our fiducial volume n_taus += 1 # If the tau decays in the fiducial volume but the parent neutrino does not # interact there, we add it to know its properties. if not first_inserted: copies = 2 else: copies = 1 for icopy in range(copies): for key in iterkeys(data_sets): data_sets_fiducial[key].append(data_sets[key][iE]) y_cascade, cascade_type = get_tau_cascade_properties(decay_energy) data_sets_fiducial['n_interaction'][-1] = 2 # specify that new event is a second interaction data_sets_fiducial['energies'][-1] = decay_energy data_sets_fiducial['inelasticity'][-1] = y_cascade data_sets_fiducial['interaction_type'][-1] = cascade_type # TODO: take care of the tau_mu data_sets_fiducial['xx'][-1] = x data_sets_fiducial['yy'][-1] = y data_sets_fiducial['zz'][-1] = z # set flavor to tau data_sets_fiducial['flavors'][-1] = 15 * np.sign(data_sets['flavors'][iE]) # keep particle/anti particle nature logger.info("added {} tau decays to the event list".format(n_taus)) # Transforming every array into a numpy array and copying it back to # data_sets_fiducial for key in iterkeys(data_sets): data_sets_fiducial[key] = np.array(data_sets_fiducial[key]) write_events_to_hdf5(filename, data_sets_fiducial, attributes, n_events_per_file=n_events_per_file, start_file_id=start_file_id) def split_hdf5_input_file(input_filename, output_filename, number_of_events_per_file): """ splits up an existing hdf5 file into multiple subfiles Parameters ---------- input_filename: string the input filename output_filename: string the desired output filename (if multiple files are generated, a 'part000x' is appended to the filename n_events_per_file: int (optional, default None) the number of events per file """ fin = h5py.File(input_filename, 'r') data_sets = {} attributes = {} for key, value in fin.items(): if isinstance(value, h5py.Dataset): # the loop is also over potential subgroupu that we don't want to consider here data_sets[key] = np.array(value) for key, value in fin.attrs.items(): attributes[key] = value fin.close() write_events_to_hdf5(output_filename, data_sets, attributes, n_events_per_file=number_of_events_per_file) PKmN2#NuRadioMC/EvtGen/generator_ASCII.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units # define simulation volume xmin = -3 * units.km xmax = 3 * units.km ymin = -3 * units.km ymax = 3 * units.km fiducial_zmin = -3 * units.km fiducial_zmax = 0 * units.km HEADER = """VERSION=0.2 # standard event list format of NuRadioMC (adapted from ARASim) # the very first line defines the file version, all other lines represent the events # each row specifies one event # all quantities are in the default NuRadioMC units (i.e., meters, radians and eV) # all geometry quantities are in the NuRadioMC default local coordinate system: # coordinate origin is at the surface # x axis is towards Easting, y axis towards Northing, z axis upwards # zenith/theta angle is defined with respect to z axis, i.e. 0deg = upwards, 90deg = towards horizon, 180deg = downwards # azimuth/phi angle counting northwards from East # # the collumns are defined as follows # 1. event id (integer) # 2. neutrino flavor (integer) encoded as using PDF numbering scheme, particles have positive sign, anti-particles have negative sign, relevant for us are: # 12: electron neutrino # 14: muon neutrino # 16: tau neutrino # 3. energy of neutrino (double) # 4. charge or neutral current interaction (string, one of ['cc', 'nc'] # 5./6./7. position of neutrino interaction vertex in cartesian coordinates (x, y, z) (in default NuRadioMC local coordinate system) # 8. zenith/theta angle of neutrino direction (pointing into direction of propagation) # 9. azimuth/phi angle of neutrino direction (pointing into direction of propagation) # 10. inelasticity (the fraction of neutrino energy that goes into the hadronic part) # """ def generate_eventlist(filename, n_events, Emin, Emax, start_event_id=1, flavor=[12, -12, 14, -14, 16, -16]): n_events = int(n_events) event_ids = np.arange(n_events) + start_event_id # generate neutrino flavors randomly flavors = np.array([flavor[i] for i in np.random.randint(0, high=len(flavor), size=n_events)]) # generate energies randomly energies = 10 ** np.random.uniform(np.log10(Emin), np.log10(Emax), n_events) # generate charged/neutral current randomly (ported from ShelfMC) rnd = np.random.uniform(0., 1., n_events) ccncs = np.ones(n_events, dtype='S2') for i, r in enumerate(rnd): if(r <= 0.7064): ccncs[i] = 'cc' else: ccncs[i] = 'nc' # generate neutrino vertices randomly xx = np.random.uniform(xmin, xmax, n_events) yy = np.random.uniform(ymin, ymax, n_events) zz = np.random.uniform(fiducial_zmin, fiducial_zmax, n_events) # generate neutrino direction randomly azimuths = np.random.uniform(0, 360 * units.deg, n_events) u = np.random.uniform(-1, 1, n_events) zeniths = np.arccos(u) # generates distribution that is uniform in cos(theta) # generate inelasticity (ported from ShelfMC) R1 = 0.36787944 R2 = 0.63212056 inelasticity = (-np.log(R1 + np.random.uniform(0., 1., n_events) * R2)) ** 2.5 with open(filename, 'w') as fout: fout.write(HEADER) for i in range(n_events): fout.write("{:08d} {:>+5d} {:.5e} {:s} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f}\n".format(event_ids[i], flavors[i], energies[i], ccncs[i], xx[i], yy[i], zz[i], zeniths[i], azimuths[i], inelasticity[i])) fout.close() if __name__ == '__main__': generate_eventlist('test.txt', 1e5, 1e18, 1e18) PKmN'gg&NuRadioMC/EvtGen/generator_skeleton.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units from six import iterkeys, iteritems from scipy import constants from scipy.integrate import quad from scipy.interpolate import interp1d from scipy.optimize import fsolve import h5py from NuRadioMC.EvtGen.generator import write_events_to_hdf5, split_hdf5_input_file import logging logger = logging.getLogger("EventGen") logging.basicConfig() VERSION_MAJOR = 1 VERSION_MINOR = 1 def generate_my_events(filename, n_events): """ Event generator skeleton Parameters ---------- filename: string the output filename of the hdf5 file n_events: int number of events to generate """ # first set the meta attributes attributes = {} n_events = int(n_events) attributes['n_events'] = n_events attributes['start_event_id'] = 0 attributes['fiducial_rmin'] = 0 attributes['fiducial_rmax'] = 1 * units.km attributes['fiducial_zmin'] = 0 * units.m attributes['fiducial_zmax'] = -2 * units.km attributes['rmin'] = 0 attributes['rmax'] = 1 * units.km attributes['zmin'] = 0 * units.m attributes['zmax'] = -2 * units.km attributes['Emin'] = 1 * units.EeV attributes['Emax'] = 1 * units.EeV # now generate the events and fill all required data sets # here we fill all data sets with dummy values data_sets = {} data_sets["azimuths"] = np.ones(n_events) data_sets["zeniths"] = np.ones(n_events) data_sets["xx"] = np.ones(n_events) data_sets["yy"] = np.ones(n_events) data_sets["zz"] = np.ones(n_events) data_sets["event_ids"] = np.arange(n_events) data_sets["n_interaction"] = np.ones(n_events, dtype=np.int) # generate neutrino flavors randomly data_sets["flavors"] = np.array([12 for i in range(n_events)]) data_sets["energies"] = np.ones(n_events) * 1 * units.EeV data_sets["interaction_type"] = np.ones(n_events, dtype='S2') data_sets["inelasticity"] = np.ones(n_events) * 0.5 # write events to file write_events_to_hdf5(filename, data_sets, attributes) PKmN{=pp!NuRadioMC/EvtGen/hdf5_to_ASCII.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units import argparse import h5py parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('hdf5input', type=str, help='path to NuRadioMC hdf5 input event list') parser.add_argument('ASCIIoutput', type=str, help='path to ASCII output file') args = parser.parse_args() fin = h5py.File(args.hdf5input, 'r') event_ids = fin['event_ids'] flavors = fin['flavors'] energies = fin['energies'] ccncs = fin['interaction_type'] xx = fin['xx'] yy = fin['yy'] zz = fin['zz'] zeniths = fin['zeniths'] azimuths = fin['azimuths'] inelasticity = fin['inelasticity'] n_events = len(event_ids) with open(args.ASCIIoutput, 'w') as fout: fout.write(fin.attrs['header']) for i in range(n_events): fout.write("{:08d} {:>+5d} {:.5e} {:s} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f}\n".format(event_ids[i], flavors[i], energies[i], ccncs[i], xx[i], yy[i], zz[i], zeniths[i], azimuths[i], inelasticity[i])) fout.close() PKmNM/K K $NuRadioMC/EvtGen/readARAEventList.pyfrom __future__ import absolute_import, division, print_function import numpy as np import argparse from radiotools import helper as hp from NuRadioMC.utilities import units from io import BytesIO import logging logger = logging.getLogger("readARAEventList") VERSION = 0.1 def read_ARA_eventlist(filename): ara_version = 0 event_number = 0 with open(filename, 'r') as fin: lines = fin.readlines() data = "" for i, line in enumerate(lines): if line.startswith("VERSION"): ara_version = float(line.split("=")[1]) elif line.startswith("EVENT_NUM"): event_number = int(line.split("=")[1]) else: data += "{}".format(line) if(ara_version != 0.1): print("file version is {}. version != 0.1 not supported".format(ara_version)) import sys sys.exit(-1) data = np.genfromtxt(BytesIO(data), comments='//', skip_header=3, dtype=[('eventId', int), ('nuflavorint', int), ('nu_nubar', int), ('pnu', float), ('currentint', float), ('posnu_r', float), ('posnu_theta', float), ('posnu_phi', float), ('nnu_theta', float), ('nnu_phi', float), ('elast_y', float)]) # convert angles into NuRadioMC coordinate convention for i in xrange(len(data)): data[i][3] = 10**(data[i][3] + 18.) * units.eV data[i][4] = data[i][4] * units.m data[i][6] = hp.get_normalized_angle(0.5 * np.pi - data[i][6]) # convert theta angle into NuRadioMC coordinate convention data[i][8] = hp.get_normalized_angle(0.5 * np.pi - data[i][8]) # convert theta angle into NuRadioMC coordinate convention return data def convert_to_hdf5(araeventlist_filename, hdf5_filename): import h5py data = read_ARA_eventlist(araeventlist_filename) print(data) fout = h5py.File(hdf5_filename, 'w') fout['eventlist'] = data fout.attrs['VERSION'] = VERSION print(np.array(fout['eventlist'])) fout.close() if __name__ == "__main__": parser = argparse.ArgumentParser(description='Parse ARA event list.') parser.add_argument('filename', type=str, help='path to ARA event list') parser.add_argument('output_filename', type=str, help='name of hdf5 output filename') args = parser.parse_args() convert_to_hdf5(args.filename, args.output_filename) PKmN( 'NuRadioMC/EvtGen/readEventList_ASCII.pyfrom __future__ import absolute_import, division, print_function import numpy as np import argparse from radiotools import helper as hp from NuRadioMC.utilities import units from io import BytesIO import logging logger = logging.getLogger("readEventList") VERSION = 0.2 def read_eventlist(filename): version = 0 with open(filename, 'r') as fin: lines = fin.readlines() for i, line in enumerate(lines): if line.startswith("VERSION"): version = float(line.split("=")[1]) break if(version != VERSION): print("file version is {}. version != {} not supported".format(version, VERSION)) raise NotImplementedError fin.seek(0) # reset file to beginning data = np.genfromtxt(fin, comments='#', skip_header=1, dtype=[('eventId', int), ('nuflavor', int), ('pnu', float), ('currentint', '|S2'), ('x', float), ('y', float), ('z', float), ('theta', float), ('phi', float), ('inelasticity', float)]) return data if __name__ == "__main__": parser = argparse.ArgumentParser(description='Parse NuRadioMC event list.') parser.add_argument('filename', type=str, help='path to NuRadioMC event list') args = parser.parse_args() events = read_eventlist(args.filename) PKmN|q9NuRadioMC/EvtGen/tests/T01test_additional_interactions.pyimport numpy as np import h5py from NuRadioMC.EvtGen import generator datasets = {} datasets['event_ids'] = np.arange(100, dtype=np.int) datasets['zeniths'] = np.random.uniform(size=100) additional_datasets = {} additional_datasets['event_ids'] = np.array([0, 1, 10, 10, 10]) additional_datasets['zeniths'] = np.random.uniform(size=5) generator.write_events_to_hdf5("T01.hdf5", data_sets=datasets, attributes={}, additional_interactions=additional_datasets) generator.write_events_to_hdf5("T01_split10.hdf5", data_sets=datasets, attributes={}, additional_interactions=additional_datasets, n_events_per_file=10) generator.split_hdf5_input_file("T01.hdf5", "T01_split10_later.hdf5", number_of_events_per_file=10)PKmNi0NuRadioMC/EvtGen/tests/T02_create_tau_dataset.pyimport numpy as np import h5py from NuRadioMC.EvtGen import generator from NuRadioMC.utilities import units import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger("testtaueventgen") # define simulation volume fiducial_zmin = -2.7 * units.km fiducial_zmax = 0 * units.km generator.generate_eventlist_cylinder('tau.hdf5', 1e4, 1e18 * units.eV, 1e19 * units.eV, 0, 3*units.km, fiducial_zmin, fiducial_zmax, add_tau_second_bang=True) print("writing many subfiles") generator.generate_eventlist_cylinder('tau2.hdf5', 1e4, 1e16 * units.eV, 1e19 * units.eV, 0, 3*units.km, fiducial_zmin, fiducial_zmax, add_tau_second_bang=True, n_events_per_file=10) PKmN (NuRadioMC/EvtGen/tests/T03_tau_length.pyfrom NuRadioMC.EvtGen.generator import * import matplotlib.pyplot as plt plt.tight_layout() def get_p(p): return -tau_rest_lifetime * np.log(1-p) def make_dict(keylist, valuelist): outdict = {} for key, value in zip(keylist, valuelist): outdict[key] = value return outdict #user_times = np.array([])*units.fs ps = [0.1, 0.5, 1-1/np.e, 0.9] user_times = get_p(np.array(ps)) colourlist = ['orange', 'blue', 'red', 'black'] colours = make_dict(user_times, colourlist) linestylelist = ['-','-','-.','-'] linestyles = make_dict(user_times, linestylelist) labels = make_dict(user_times, [r'10%', 'Median', 'Mean', r'90%']) energies = np.linspace(15.1, 20, 40) energies = 10**energies print(energies) lengths = {} lengths_nolosses = {} tau_energies = {} for user_time in user_times: lengths[user_time] = [] lengths_nolosses[user_time] = [] tau_energies[user_time] = [] for energy in energies: print(energy) times = get_decay_time_losses(energy, 1000*units.km, average=True, compare=True, user_time=user_time) lengths[user_time].append(times[0]*cspeed) lengths_nolosses[user_time].append(times[1]*cspeed) tau_energies[user_time].append(times[2]) lengths[user_time] = np.array(lengths[user_time]) lengths_nolosses[user_time] = np.array(lengths_nolosses[user_time]) plt.loglog(energies, lengths[user_times[2]]/units.km, linestyle='-', color=colours[user_times[2]], label='Mean, with PN losses') plt.loglog(energies, lengths_nolosses[user_times[2]]/units.km, linestyle='--', color=colours[user_times[2]], label='Mean, without losses') plt.gcf().subplots_adjust(bottom=0.13) fontsize=16 plt.tick_params(labelsize=12) plt.fill_between(energies, lengths[user_times[0]]/units.km, lengths[user_times[-1]]/units.km, facecolor='0.75', interpolate=True, label=r'10% to 90% quantiles') #plt.loglog([],[], linestyle='', label='P.N. losses - Solid\nNo losses - Dashed') #plt.loglog([],[], linestyle='', label='No losses - Dashed') plt.xlabel('Tau energy [eV]', size=fontsize) plt.ylabel('Tau track length [km]', size=fontsize) plt.legend(fontsize=12) plt.savefig('tau_decay_length.png', format='png') plt.show() plt.gcf().subplots_adjust(bottom=0.13) plt.tick_params(labelsize=12) #for user_time in user_times: # plt.loglog(energies, tau_energies[user_time], linestyle='-', color=colours[user_time], label=labels[user_time]) # if (user_time == user_times[2]): # plt.loglog(energies, tau_energies[user_time], linestyle=linestyles[user_time], color=colours[user_time], label='Mean, with PN losses') plt.loglog(energies, tau_energies[user_times[2]], linestyle='-', color=colours[user_times[2]], label='Mean, with PN losses') plt.loglog(energies, energies, linestyle='--', color=colours[user_times[2]], label="Mean, without losses") plt.fill_between(energies, tau_energies[user_times[0]], tau_energies[user_times[-1]], facecolor='0.75', interpolate=True, label=r'10% to 90% quantiles') #plt.loglog([],[], linestyle='', label='P.N. losses - Solid\nNo losses - Dashed') #plt.loglog([],[], linestyle='', label='No losses - Dashed') plt.xlabel('Tau initial energy [eV]', size=fontsize) plt.ylabel('Tau decay energy [eV]', size=fontsize) plt.legend(fontsize=12) plt.savefig('tau_decay_energy.png', format='png') plt.show() PKmNmY+NuRadioMC/EvtGen/tests/T04_tau_branching.pyfrom NuRadioMC.EvtGen.generator import * import matplotlib.pyplot as plt tau_energy = 1.e19 * units.eV branch = 'tau_pi' def f_1(y,r): return -(2*y+1+r)*(1-2*r)/(1-r)**2/(1+2*r) def f_0(y,r): return 1/(1-r) def f(y,r): if ( y < 0 or y > 1-r**2 ): return 0 else: return f_1(y,r)+f_0(y,r) def f_pi(y,r): if ( y < 0 or y > 1-r**2 ): return 0 else: return f_0(y,r)-(2*y-1+r)/(1-r**2)**2 r = rho770_mass/tau_mass print(r) x = np.linspace(0,1,100) distr = [f(x0,r) for x0 in x] plt.plot(x, distr) plt.show() energies = [] for i in range(10000): products = products_from_tau_decay(tau_energy, branch) energies.append(products[16]) plt.hist(energies) plt.show() PKmNlL&NuRadioMC/EvtGen/tests/T07_read_tab.pyfrom NuRadioMC.EvtGen.generator import * import matplotlib.pyplot as plt def get_p(p): return -tau_rest_lifetime * np.log(1-p) table = create_interp('../decay_library.hdf5') time = tau_rest_lifetime times = np.linspace(0, 10*tau_rest_lifetime, 50) energies = np.linspace(15,20,50) energies = 10**energies ps = [0.1, 0.5, 1-1/np.e, 0.9] #ps = np.linspace(0.5,0.6,7) times = get_p(np.array(ps)) exact = True if exact: decay_times = [] decay_energies = [] for time in times: row_times = [] row_energies = [] for energy in energies: res = get_decay_time_losses(energy, 1000*units.km, average=False, compare=False, user_time=time) row_times.append(res[0]) row_energies.append(res[1]) decay_times.append(row_times) decay_energies.append(row_energies) for itime, time in enumerate(times): plt.loglog(energies, table[0](time, energies)[0]) if exact: plt.loglog(energies, decay_times[itime], linestyle='--') plt.show() for itime, time in enumerate(times): plt.loglog(energies, table[1](time, energies)[0]) if exact: plt.loglog(energies, decay_energies[itime], linestyle='--') plt.show() PKmNP//NuRadioMC/SignalGen/HCRB2017.pyimport numpy as np from NuRadioMC.utilities import units, fft from scipy import constants from scipy.optimize import curve_fit import logging logger = logging.getLogger("HCRB2017") logger.setLevel(logging.INFO) """ Implementation of J. Hanson and A. Conolly "Complex analysis of Askaryan radiation: A fully analytic treatment including the LPM effect and Cascade Form Factor." Astropart. Phys. 91, 75-89 (2017) which is based on Buniy, R. V., Ralston, J. P. "Radio detection of high energy particles: Coherence versus multiple scales" Physical Review D, 65 016003 (2001) This module uses a Gaisser Hillas shower profile for hadronic showers and a Greisen profile for EM showers. When the LPM effect is activated (default) instead of a Greisen profile, a parameterization from [1] is used. Please not that these two parameterization (with/without LPM) do not give consistent results at energies where the LPM effect is negligible. Use the model prediction with caution. Please also note that the timing is not properly implemented (see https://github.com/nu-radio/NuRadioMC/issues/19). """ speed_of_light = constants.c * units.m / units.s _strictLowFreqLimit = True NORM = 1.0 ICE_DENSITY = 0.9167 * units.g / units.cm**3 ICE_RAD_LENGTH = 36.08 * units.g / units.cm**2 def get_time_trace(energy, theta, N, dt, is_em_shower, n_index, R, LPM=True, a=None): """ returns the Askaryan pulse in the time domain Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate is_em_shower: bool true if EM shower, false otherwise n: float index of refraction at interaction vertex R: float distance from vertex to observer LPM: bool (default True) enable/disable LPD effect a: float or None (default Nont) if variable set, the shower width is manually set to this value """ freqs = np.fft.rfftfreq(N, dt) eR, eTheta = _get_E_omega(freqs, energy, R, theta, n_index, is_em_shower, LPM, a=a) traceR = np.fft.irfft(eR) / dt traceTheta = np.fft.irfft(eTheta) / dt return np.array([traceR, traceTheta, np.zeros_like(traceTheta)]) def get_frequency_spectrum(energy, theta, N, dt, is_em_shower, n, R, LPM=True, a=None): """ returns the complex amplitudes of the frequency spectrum of the neutrino radio signal Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate is_em_shower: bool true if EM shower, false otherwise n: float index of refraction at interaction vertex R: float distance from vertex to observer LPM: bool (default True) enable/disable LPD effect a: float or None (default Nont) if variable set, the shower width is manually set to this value """ eR, eTheta, ePhi = get_time_trace(energy, theta, N, dt, is_em_shower, n, R, LPM, a=a) return np.array([fft.time2freq(eR), fft.time2freq(eTheta), fft.time2freq(ePhi)]) def _get_k(ff, n_index): return 2 * np.pi * ff / speed_of_light * n_index def _get_eta(k, _askaryanDepthA, _askaryanR, _askaryanTheta): return k * _askaryanDepthA**2 / _askaryanR * np.sin(_askaryanTheta)**2 def _get_Iff(ff, n_index, _askaryanDepthA, _askaryanR, _askaryanTheta): COS_THETA_C = 1. / n_index k = _get_k(ff, n_index) eta = _get_eta(k, _askaryanDepthA, _askaryanR, _askaryanTheta) re_d = 1 - 3 * eta**2 * np.cos(_askaryanTheta) / np.sin(_askaryanTheta)**2 * \ (np.cos(_askaryanTheta) - COS_THETA_C) / (1 + eta**2) im_d = -eta - 3 * eta**3 * np.cos(_askaryanTheta) / np.sin(_askaryanTheta)**2 * \ (np.cos(_askaryanTheta) - COS_THETA_C) / (1 + eta**2) denom = re_d + 1j * im_d re_power = -0.5 * (k * _askaryanDepthA)**2 * (np.cos(_askaryanTheta) - COS_THETA_C)**2 / (1 + eta**2) im_power = -eta * 0.5 * (k * _askaryanDepthA)**2 * (np.cos(_askaryanTheta) - COS_THETA_C)**2 / (1 + eta**2) power = re_power + 1j * im_power return np.exp(power) / denom**0.5 def _get_E_omega(ff, E, R, theta, n_index, EM=True, LPM=True, use_form_factor=True, _rho0=1. / (np.sqrt(2.0 * np.pi) * 0.03 * units.m), a=None, fudge_LPM=False): """ calculates the frequncy spectrum of an Askaryan pulse. Do not use this function directly, use get_frequency_spectrum() instead Parameters ----------- ff: np.array of floats array of frequencies E: float shower energy R: float distance from vertex to observer theta: float viewing angle n_index: float index of refraction at the shower EM: bool (default True) switch between EM and had. showers LPM: bool (default True) enable/disable LPD effect use_form_factor: bool (default True) use form factor _rho0: float the value of rho0 a: float or None (default Nont) if variable set, the shower width is manually set to this value fudge_LPM: bool (default False) if True, the shower width parameterization of LPM showers is rescaled to match the Greisen parameterization at energies below the E_LPM, i.e., at energies where the LPM effect is negligible Returns: eR, eTheta component of electric field in frequency domain """ _Nmax, _askaryanDepthA = get_N_AskDepthA(E, EM, LPM, fudge_LPM=fudge_LPM) if(a is not None): _askaryanDepthA = a COS_THETA_C = 1. / n_index k = _get_k(ff, n_index) eta = _get_eta(k, _askaryanDepthA, R, theta) I_FF = _get_Iff(ff, n_index, _askaryanDepthA, R, theta) nu = speed_of_light * k / (2.0 * np.pi) logger.debug("a {}, nmax {}, R {}".format(_askaryanDepthA, _Nmax, R)) norm = 2.52e-7 * 1e3 * _askaryanDepthA * _Nmax * nu / R / NORM # the additional *1e3 comes from putting all the units in the constant of Eq. (10). The left side of the equation is in MHz, whereas the right side is in GHz # Kinematic factor, psi...checked JCH March 8th, 2016...fixed missing sin(theta) psi = np.sin(theta) * np.sin(k * R) + 1j * (-np.sin(theta) * np.cos(k * R)) # radial component (imaginary part is zero)...checked JCH March 8th, 2016 rComp_num = -(np.cos(theta) - COS_THETA_C) / np.sin(theta) rComp = I_FF * norm * psi * rComp_num # theta component (has real and imaginary parts)...checked JCH March 8th, 2016 thetaComp_num = 1 + eta**2 / (1 + eta)**2 * COS_THETA_C / np.sin(theta)**2 * (np.cos(theta) - COS_THETA_C) + \ 1j * (-eta / (1 + eta)**2 * COS_THETA_C / np.sin(theta)**2 * (np.cos(theta) - COS_THETA_C)) thetaComp = I_FF * norm * psi * thetaComp_num logger.debug("IFF[0] {:.2g}, norm {:.2g}, psi[0] {:.2g}, thetaComp_num {:.2g}".format(I_FF[1], norm[1], psi[1], thetaComp_num[1])) if use_form_factor: a = k / _rho0 b = np.sin(theta) / (2.0 * np.pi)**0.5 atten = (1 + a**2 * b**2)**-1.5 rComp *= atten thetaComp *= atten return rComp, thetaComp def gauss(x, A, mu, sigma): return A * np.exp(-(x-mu)**2/2/sigma**2) def get_N_AskDepthA(E, EM=True, LPM=True, fudge_LPM=False): """ calculates the Gaussian width (sigma) of the shower profile using the Greisen profile for EM showers and the Gaisser-Hillas profile for HAD showers. If the LPM flag is activated, for EM shower of the shower width of 10.1103/PhysRevD.82.074017 is used. Please note that the parameterization of the shower width for LPM showers is not compatible with the Greisen parameterization event at regimes where the LPM effect is negligible!!! Parameters ---------- E: float the energy of the shower EM: bool (default True) switch between EM and had. showers LPM: bool (default True) enable/disable LPD effect fudge_LPM: bool (default False) if True, the shower width parameterization of LPM showers is rescaled to match the Greisen parameterization at energies below the E_LPM, i.e., at energies where the LPM effect is negligible """ if EM: E_CRIT = 0.073 * units.GeV # GeV max_x = 5000.0 # maximum number of radiation lengths dx = 0.01 # small enough bin in depth for our purposes. x_start = 0.01 # starting radiation length # Greissen EM shower profile from Energy E in GeV. x = np.arange(x_start, max_x, dx) a = 0.31 / (np.log(E / E_CRIT))**0.5 b = x c = 1.5 * x d = np.log((3 * x) / (x + 2 * np.log(E / E_CRIT))) nx = a * np.exp(b - c * d) else: # hadronic shower profile # Gaisser-Hillas hadronic shower parameterization max_x = 200000.0 * units.g /units.cm**2 # maximum depth in g/cm^2 dx = 1.0 * units.g /units.cm**2 # small enough bin in depth for our purposes. x_start = dx # depth in g/cm^2 S0 = 0.11842 X0 = 39.562 * units.g /units.cm**2 # g/cm^2 l = 113.03 * units.g /units.cm**2# g/cm^2 Ec = 0.17006 * units.GeV # GeV Xmax = X0 * np.log(E / Ec) x = np.arange(x_start, max_x, dx) a = S0 * E / Ec * (Xmax - l) / Xmax * np.exp(Xmax / l - 1) b = pow(x / (Xmax - l), Xmax / l) c = np.exp(-x / l) nx = a * b * c # find location of maximum, and charge excess from Fig. 5.9, compare in cm not m. n_max_position = np.argmax(nx) n_max = np.max(nx) if EM: excess = 0.09 + dx * n_max_position * ICE_RAD_LENGTH / ICE_DENSITY / 100. else: excess = 0.09 + dx * n_max_position / ICE_DENSITY * 1.0e-2 Nmax = excess * n_max / 1000.0 logger.debug("Nmax {}, excess {}, n_max {}".format(Nmax, excess, n_max)) # We want to perform a fit for the regions with an excess charge 10% close to the maximum fit_region_cut = 0.95 cut_left = np.argwhere((nx[:n_max_position] / nx[n_max_position]) > fit_region_cut)[0][0] cut_right = np.argwhere((nx[n_max_position:] / nx[n_max_position]) < fit_region_cut)[0][0]+n_max_position fit_width = cut_right-cut_left max_vicinity = nx[n_max_position-fit_width:n_max_position+fit_width]/nx[n_max_position] x_fit = np.arange(0, len(max_vicinity), 1) sigma = curve_fit(gauss, x_fit, max_vicinity)[0] if EM: _askaryanDepthA = dx * sigma[2] / ICE_DENSITY * ICE_RAD_LENGTH else: _askaryanDepthA = dx * sigma[2]/ ICE_DENSITY logger.debug("a (before LPM = {}".format(_askaryanDepthA)) E_LPM = 3e14 * units.eV if(EM and LPM): if((E > E_LPM) or not fudge_LPM): # only apply LPM correction in regimes where it is relevant p1 = -2.8564e2 p2 = 7.8140e1 p3 = -8.3893 p4 = 4.4175e-1 p5 = -1.1382e-2 p6 = 1.1493e-4 e = np.log10(E/units.eV) # log_10 of Energy in eV log10_shower_depth = p1 + p2 * e + p3 * e**2 + p4 * e**3 + p5 * e**4 + p6 * e**5 a = 10.0**log10_shower_depth * 0.5 # adjust shower wiedth to be just the sigma parameter of a Gaussian if(fudge_LPM): # normalize to Greisen parameterization at LPM energy a_Greisen = get_N_AskDepthA(E_LPM, EM=True, LPM=False)[1] a /= a_Greisen # Right here, record the reduction in n_max_position that I don't believe in. if _strictLowFreqLimit: logger.debug("strict_lowfeq Nmax = {:.2g}, a= {} priora = {}".format(Nmax, a, _askaryanDepthA/units.m, Nmax)) Nmax = Nmax / (a / _askaryanDepthA) _askaryanDepthA = a logger.debug("a = {:.2f}m, Nmax = {}".format(_askaryanDepthA/units.m, Nmax)) return Nmax, _askaryanDepthA PKmNNuRadioMC/SignalGen/__init__.pyPKmNnggNuRadioMC/SignalGen/askaryan.py# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units, fft from NuRadioMC.SignalGen import parametrizations as par import logging logger = logging.getLogger("SignalGen.askaryan") gARZ = None def set_log_level(level): logger.setLevel(level) par.set_log_level(level) def get_time_trace(energy, theta, N, dt, shower_type, n_index, R, model, interp_factor=None, interp_factor2=None, same_shower=False, **kwargs): """ returns the Askaryan pulse in the time domain of the eTheta component We implement only the time-domain solution and obtain the frequency spectrum via FFT (with the standard normalization of NuRadioMC). This approach assures that the units are interpreted correctly. In the time domain, the amplitudes are well defined and not details about fourier transform normalizations needs to be known by the user. Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) or "TAU" (tau lepton induced) note that TAU showers are currently only implemented in the ARZ2019 model n_index: float index of refraction at interaction vertex R: float distance from vertex to observer model: string specifies the signal model * ZHS1992: the original ZHS parametrization from E. Zas, F. Halzen, and T. Stanev, Phys. Rev. D 45, 362 (1992), doi:10.1103/PhysRevD.45.362, this parametrization does not contain any phase information * Alvarez2000: parameterization based on ZHS mainly based on J. Alvarez-Muniz, R. A. V ́azquez, and E. Zas, Calculation methods for radio pulses from high energyshowers, Physical Review D62 (2000) https://doi.org/10.1103/PhysRevD.84.103003 * Alvarez2009: parameterization based on ZHS from J. Alvarez-Muniz, W. R. Carvalho, M. Tueros, and E. Zas, Coherent cherenkov radio pulses fromhadronic showers up to EeV energies, Astroparticle Physics 35 (2012), no. 6 287 – 299 and J. Alvarez-Muniz, C. James, R. Protheroe, and E. Zas, Thinned simulations of extremely energeticshowers in dense media for radio applications, Astroparticle Physics 32 (2009), no. 2 100 – 111 * HCRB2017: analytic model from J. Hanson, A. Connolly Astroparticle Physics 91 (2017) 75-89 * ARZ2019 semi MC time domain model from Alvarez-Muñiz, J., Romero-Wolf, A., & Zas, E. (2011). Practical and accurate calculations of Askaryan radiation. Physical Review D - Particles, Fields, Gravitation and Cosmology, 84(10). https://doi.org/10.1103/PhysRevD.84.103003 interp_factor: float or None controls the interpolation of the charge-excess profiles in the ARZ model interp_Factor2: float or None controls the second interpolation of the charge-excess profiles in the ARZ model same_shower: bool (default False) controls the random behviour of picking a shower from the library in the ARZ model, see description there for more details Returns ------- spectrum: array the complex amplitudes for the given frequencies """ if model in par.get_parametrizations(): return par.get_time_trace(energy, theta, N, dt, shower_type, n_index, R, model) elif(model == 'HCRB2017'): from NuRadioMC.SignalGen import HCRB2017 is_em_shower = None if(shower_type == "HAD"): is_em_shower = False elif(shower_type == "EM"): is_em_shower = True else: raise NotImplementedError("shower type {} not implemented in {} Askaryan module".format(shower_type, model)) LPM = True a = None if('LPM' in kwargs): LPM = kwargs['LPM'] if('a' in kwargs): a = kwargs['a'] return HCRB2017.get_time_trace(energy, theta, N, dt, is_em_shower, n_index, R, LPM, a)[1] elif(model == 'ARZ2019'): from NuRadioMC.SignalGen.ARZ import ARZ global gARZ if(gARZ is None): gARZ = ARZ.ARZ() if(interp_factor is not None): gARZ.set_interpolation_factor(interp_factor) if(interp_factor2 is not None): gARZ.set_interpolation_factor2(interp_factor2) return gARZ.get_time_trace(energy, theta, N, dt, shower_type, n_index, R, same_shower=same_shower, **kwargs)[1] elif(model == 'spherical'): amplitude = 1. * energy / R trace = np.zeros(N) trace[N//2] = amplitude return trace else: raise NotImplementedError("model {} unknown".format(model)) def get_frequency_spectrum(energy, theta, N, dt, is_em_shower, n_index, R, model, **kwargs): """ returns the complex amplitudes of the frequency spectrum of the neutrino radio signal Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate is_em_shower: bool true if EM shower, false otherwise n_index: float index of refraction at interaction vertex R: float distance from vertex to observer model: string specifies the signal model * ZHS1992: the original ZHS parametrization from E. Zas, F. Halzen, and T. Stanev, Phys. Rev. D 45, 362 (1992), doi:10.1103/PhysRevD.45.362, this parametrization does not contain any phase information * Alvarez2000: parameterization based on ZHS mainly based on J. Alvarez-Muniz, R. A. V ́azquez, and E. Zas, Calculation methods for radio pulses from high energyshowers, Physical Review D62 (2000) https://doi.org/10.1103/PhysRevD.84.103003 * Alvarez2009: parameterization based on ZHS from J. Alvarez-Muniz, W. R. Carvalho, M. Tueros, and E. Zas, Coherent cherenkov radio pulses fromhadronic showers up to EeV energies, Astroparticle Physics 35 (2012), no. 6 287 – 299 and J. Alvarez-Muniz, C. James, R. Protheroe, and E. Zas, Thinned simulations of extremely energeticshowers in dense media for radio applications, Astroparticle Physics 32 (2009), no. 2 100 – 111 * HCRB2017: analytic model from J. Hanson, A. Connolly Astroparticle Physics 91 (2017) 75-89 * ARZ2019 semi MC time domain model from Alvarez-Muñiz, J., Romero-Wolf, A., & Zas, E. (2011). Practical and accurate calculations of Askaryan radiation. Physical Review D - Particles, Fields, Gravitation and Cosmology, 84(10). https://doi.org/10.1103/PhysRevD.84.103003 Returns ------- spectrum: array the complex amplitudes for the given frequencies """ return fft.time2freq(get_time_trace(energy, theta, N, dt, is_em_shower, n_index, R, model, **kwargs)) PKmNMc&&'NuRadioMC/SignalGen/parametrizations.py# -*- coding: utf-8 -*- from __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units, fft from scipy import constants import logging logger = logging.getLogger("SignalGen.parametrizations") def set_log_level(level): logger.setLevel(level) """ Analytic parametrizations of the radio pulse produced by an in-ice particle shower. Generic functions to provide the frequency spectrum and the pulse in the time domain are defined. All models/parametrizations should be added to each of these functions, such that different parametrizations can be exchanged by just modifying the 'model' argument of the respective function. """ def get_parametrizations(): """ returns a list of all implemented parametrizations """ return ['ZHS1992', 'Alvarez2000', 'Alvarez2009', 'Alvarez2012'] def get_time_trace(energy, theta, N, dt, shower_type, n_index, R, model): """ returns the Askaryan pulse in the time domain of the eTheta component We implement only the time-domain solution and obtain the frequency spectrum via FFT (with the standard normalization of NuRadioMC). This approach assures that the units are interpreted correctly. In the time domain, the amplitudes are well defined and not details about fourier transform normalizations needs to be known by the user. Parameters ---------- energy : float energy of the shower theta: float viewangle: angle between shower axis (neutrino direction) and the line of sight between interaction and detector N : int number of samples in the time domain dt: float time bin width, i.e. the inverse of the sampling rate shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) n_index: float index of refraction at interaction vertex R: float distance from vertex to observer model: string specifies the signal model * ZHS1992: the original ZHS parametrization from E. Zas, F. Halzen, and T. Stanev, Phys. Rev. D 45, 362 (1992), doi:10.1103/PhysRevD.45.362, this parametrization does not contain any phase information * Alvarez2000: parameterization based on ZHS mainly based on J. Alvarez-Muniz, R. A. Vazquez, and E. Zas, Calculation methods for radio pulses from high energyshowers,Physical Review D62 (2000) https://doi.org/10.1103/PhysRevD.84.103003 * Alvarez2009: parameterization based on ZHS from J. Alvarez-Muniz, W. R. Carvalho, M. Tueros, and E. Zas, Coherent cherenkov radio pulses fromhadronic showers up to eev energies,Astroparticle Physics35(2012), no. 6 287 – 299 and J. Alvarez-Muniz, C. James, R. Protheroe, and E. Zas, Thinned simulations of extremely energeticshowers in dense media for radio applications, Astroparticle Physics 32 (2009), no. 2 100 – 111 Returns ------- spectrum: array the complex amplitudes for the given frequencies """ if(model == 'ZHS1992'): """ Parametrization from E. Zas, F. Halzen, and T. Stanev, Phys. Rev. D 45, 362 (1992).""" freqs = np.fft.rfftfreq(N, dt) vv0 = freqs / (0.5 * units.GHz) cherenkov_angle = np.arccos(1. / n_index) domega = (theta - cherenkov_angle) tmp = np.exp(+0.5j * np.pi) # set phases to 90deg tmp *= 1.1e-7 * energy / units.TeV * vv0 * 1. / \ (1 + 0.4 * (vv0) ** 2) * np.exp(-0.5 * (domega / (2.4 * units.deg / vv0)) ** 2) * \ units.V / units.m / (R / units.m) / units.MHz # the factor 0.5 is introduced to compensate the unusual fourier transform normalization used in the ZHS code trace = 0.5 * np.fft.irfft(tmp) / dt trace = np.roll(trace, int(2 * units.ns / dt)) return trace elif(model == 'Alvarez2009'): # This parameterisation is not very accurate for energies above 10 EeV # The ARZ model should be used instead freqs = np.fft.rfftfreq(N, dt)[1:] # exclude zero frequency E_C = 73.1 * units.MeV rho = 0.924 * units.g / units.cm**3 X_0 = 36.08 * units.g / units.cm**2 R_M = 10.57 * units.g / units.cm**2 c = constants.c * units.m / units.s def A(E_0, theta, freq): if (shower_type == 'HAD'): k_E_0 = 4.13e-16 * units.V / units.cm / units.MHz**2 k_E_1 = 2.54 log10_E_E = 10.60 k_E_bar = k_E_0 * np.tanh( (np.log10(E_0/units.eV)-log10_E_E)/k_E_1 ) elif (shower_type == 'EM'): k_E_bar = 4.65e-16 * units.V / units.cm / units.MHz**2 return k_E_bar * E_0/E_C * X_0/rho * np.sin(theta) * freq def nu_L(E_0, theta): if (shower_type == 'HAD'): k_L_0 = 31.25 gamma = 3.01e-2 E_L = 1.e15 * units.eV k_L = k_L_0 * (E_0/E_L)**gamma elif (shower_type == 'EM'): sigma_0 = 3.39e-2 log10_E_sigma = 14.99 delta_0 = 0 delta_1 = 2.25e-2 log10_E_0 = np.log10(E_0/units.eV) if ( log10_E_0 < log10_E_sigma ): sigma_k_L = sigma_0 + delta_0 * (log10_E_0-log10_E_sigma) else: sigma_k_L = sigma_0 + delta_1 * (log10_E_0-log10_E_sigma) log10_k_0 = 1.52 log10_E_LPM = 16.61 gamma_0 = 5.59e-2 gamma_1 = 0.39 if ( log10_E_0 < log10_E_LPM ): log10_k_L_bar = log10_k_0 + gamma_0 * ( log10_E_0 - log10_E_LPM ) else: log10_k_L_bar = log10_k_0 + gamma_1 * ( log10_E_0 - log10_E_LPM ) k_L = 10**np.random.normal(log10_k_L_bar, sigma_k_L) nu_L = rho/k_L/X_0 cher_cut = 1.e-8 if ( np.abs(1-n_index*np.cos(theta)) < cher_cut): nu_L *= c/cher_cut else: nu_L *= c/np.abs(1-n_index*np.cos(theta)) return nu_L def d_L(E_0, theta, freq): if (shower_type == "HAD"): beta = 2.57 elif (shower_type == "EM"): beta = 2.74 return 1/(1+(freq/nu_L(E_0, theta))**beta) def d_R(E_0, theta, freq): if (shower_type == "HAD"): k_R_0 = 2.73 k_R_1 = 1.72 log10_E_R = 12.92 k_R_bar = k_R_0 + np.tanh( (log10_E_R-np.log10(E_0/units.eV))/k_R_1 ) elif (shower_type == "EM"): k_R_bar = 1.54 nu_R = rho/k_R_bar/R_M * c/np.sqrt(n_index**2-1) alpha = 1.27 return 1/(1+(freq/nu_R)**alpha) spectrum = A(energy, theta, freqs) * d_L(energy, theta, freqs) * d_R(energy, theta, freqs) spectrum *= 0.5 # ZHS Fourier transform normalisation spectrum /= R spectrum = np.insert(spectrum, 0, 0) trace = np.fft.irfft(spectrum * np.exp(0.5j * np.pi)) / dt # set phases to 90deg trace = np.roll(trace, int(50 * units.ns / dt)) return trace elif(model == 'Alvarez2000'): freqs = np.fft.rfftfreq(N, dt)[1:] # exclude zero frequency cherenkov_angle = np.arccos(1. / n_index) Elpm = 2e15 * units.eV dThetaEM = 2.7 * units.deg * 500 * units.MHz / freqs * (Elpm / (0.14 * energy + Elpm)) ** 0.3 # logger.debug("dThetaEM = {}".format(dThetaEM)) epsilon = np.log10(energy / units.TeV) dThetaHad = 0 if (epsilon >= 0 and epsilon <= 2): dThetaHad = 500 * units.MHz / freqs * (2.07 - 0.33 * epsilon + 7.5e-2 * epsilon ** 2) * units.deg elif (epsilon > 2 and epsilon <= 5): dThetaHad = 500 * units.MHz / freqs * (1.74 - 1.21e-2 * epsilon) * units.deg elif(epsilon > 5 and epsilon <= 7): dThetaHad = 500 * units.MHz / freqs * (4.23 - 0.785 * epsilon + 5.5e-2 * epsilon ** 2) * units.deg elif(epsilon > 7): dThetaHad = 500 * units.MHz / freqs * (4.23 - 0.785 * 7 + 5.5e-2 * 7 ** 2) * \ (1 + (epsilon - 7) * 0.075) * units.deg f0 = 1.15 * units.GHz E = 2.53e-7 * energy / units.TeV * freqs / f0 / (1 + (freqs / f0) ** 1.44) E *= units.V / units.m / units.MHz E *= np.sin(theta) / np.sin(cherenkov_angle) tmp = np.zeros(len(freqs) + 1) if(shower_type == "EM"): tmp[1:] = E * np.exp(-np.log(2) * ((theta - cherenkov_angle) / dThetaEM) ** 2) / R elif(shower_type == "HAD"): if(np.any(dThetaHad != 0)): tmp[1:] = E * np.exp(-np.log(2) * ((theta - cherenkov_angle) / dThetaHad) ** 2) / R def missing_energy_factor(E_0): # Missing energy factor for hadronic cascades # Taken from DOI: 10.1016/S0370-2693(98)00905-8 epsilon = np.log10(E_0/units.TeV) f_epsilon = -1.27e-2 - 4.76e-2*(epsilon+3) f_epsilon += -2.07e-3*(epsilon+3)**2 + 0.52*np.sqrt(epsilon+3) return f_epsilon tmp[1:] *= missing_energy_factor(energy) else: pass # energy is below a TeV, setting Askaryan pulse to zero else: raise NotImplementedError("shower type {} not implemented in {} Askaryan module".format(shower_type, model)) tmp *= 0.5 # the factor 0.5 is introduced to compensate the unusual fourier transform normalization used in the ZHS code # df = np.mean(freqs[1:] - freqs[:-1]) trace = np.fft.irfft(tmp * np.exp(0.5j * np.pi)) / dt # set phases to 90deg trace = np.roll(trace, int(50 * units.ns / dt)) return trace else: raise NotImplementedError("model {} unknown".format(model)) PKmN~_$o"NuRadioMC/SignalGen/ARZ/.gitignore*.pkl PKmN;y4 7NuRadioMC/SignalGen/ARZ/A01preprocess_shower_library.pyimport numpy as np from NuRadioMC.utilities import units import os from scipy import interpolate as intp import glob import pickle import sys rho = 0.924 * units.g / units.cm**3 # density g cm^-3 if __name__ == "__main__": print("usage: python A01preprocess_shower_library.py /path/to/library/ outputfilename") path = sys.argv[1] out = sys.argv[2] library = {} for subfolder in ["HAD", "EM"]: if(subfolder not in library): library[subfolder] = {} for file_e in sorted(glob.glob(os.path.join(path, subfolder, "*.t1005"))): filename = os.path.splitext(os.path.basename(file_e))[0] file_p = file_e[:-1] + "6" if(subfolder == "EM"): estr = filename.split("E")[1][1:] if(estr.startswith("0")): E = float("0.{}".format(estr[1:])) * units.EeV else: E = float("{}".format(estr)) * units.EeV else: estr = filename.split("Enu")[1].split("Esh") e1 = estr[0].split("EeV")[0] e2 = estr[1].split("EeV")[0] if(e2.startswith("0")): E = float("0.{}".format(e2[1:])) * units.EeV else: E = float("{}".format(e2)) * units.EeV depth_e, N_e = np.loadtxt(file_e, unpack=True, usecols=(1, 2)) depth_p, N_p = np.loadtxt(file_p, unpack=True, usecols=(1, 2)) depth_e *= units.g / units.cm**2 depth_p *= units.g / units.cm**2 depth_e -= 1000 * units.g/units.cm**2 # all simulations have an artificial offset of 1000 g/cm^2 depth_p -= 1000 * units.g/units.cm**2 ce = N_e - N_p # sanity check if files electron and positron profiles are compatible if (not np.all(depth_e == depth_p)): raise ImportError("electron and positron profile have different depths") if(E not in library[subfolder]): library[subfolder][E] = {} library[subfolder][E]['depth'] = depth_e library[subfolder][E]['charge_excess'] = [] library[subfolder][E]['charge_excess'].append(ce) if 0: from matplotlib import pyplot as plt fig, ax = plt.subplots(1, 1) ax.plot(depth_e / units.g * units.cm**2, ce) ax.set_title("{} E = {:.2g}eV".format(subfolder, E)) ax.semilogy(True) ax.set_ylabel("charge excess") ax.set_ylim(10) ax.set_xlabel(r"shower depth [g/cm$^2$]") fig.tight_layout() fig.savefig(os.path.join(path, "plots", subfolder, "{}.png".format(filename))) plt.close(fig) continue # plt.show() # length = depth_e / rho # zmax = length.max() # xnep = intp.interp1d(length, N_e - N_p, bounds_error=False, fill_value=0) with open(os.path.join(path, out), 'wb') as fout: pickle.dump(library, fout, protocol=2)PKmN5f[ [ <NuRadioMC/SignalGen/ARZ/A01preprocess_shower_library_v1.2.pyimport numpy as np from NuRadioMC.utilities import units import os from scipy import interpolate as intp import glob import pickle import sys rho = 0.924 * units.g / units.cm**3 # density g cm^-3 if __name__ == "__main__": print("usage: python A01preprocess_shower_library.py /path/to/library/ outputfilename") path = sys.argv[1] out = sys.argv[2] library = {} for subfolder in ["HAD", "EM"]: if(subfolder not in library): library[subfolder] = {} for file_e in sorted(glob.glob(os.path.join(path, subfolder, "*/*.t1005"))): filename = os.path.splitext(os.path.basename(file_e))[0] file_p = file_e[:-1] + "6" estr = filename.split("eV")[0][2:] E = 10**float(estr) * units.eV depth_e, N_e = np.loadtxt(file_e, unpack=True, usecols=(1, 2)) depth_p, N_p = np.loadtxt(file_p, unpack=True, usecols=(1, 2)) depth_e *= units.g / units.cm**2 depth_p *= units.g / units.cm**2 depth_e -= 1000 * units.g/units.cm**2 # all simulations have an artificial offset of 1000 g/cm^2 depth_p -= 1000 * units.g/units.cm**2 ce = N_e - N_p # sanity check if files electron and positron profiles are compatible if (not np.all(depth_e == depth_p)): raise ImportError("electron and positron profile have different depths") if(E not in library[subfolder]): library[subfolder][E] = {} library[subfolder][E]['depth'] = depth_e library[subfolder][E]['charge_excess'] = [] library[subfolder][E]['charge_excess'].append(ce) if 0: from matplotlib import pyplot as plt fig, ax = plt.subplots(1, 1) ax.plot(depth_e / units.g * units.cm**2, ce) ax.set_title("{} E = {:.2g}eV".format(subfolder, E)) ax.semilogy(True) ax.set_ylabel("charge excess") ax.set_ylim(10) ax.set_xlabel(r"shower depth [g/cm$^2$]") fig.tight_layout() # fig.savefig(os.path.join(path, "plots", subfolder, "{}.png".format(filename))) plt.show() plt.close(fig) continue # length = depth_e / rho # zmax = length.max() # xnep = intp.interp1d(length, N_e - N_p, bounds_error=False, fill_value=0) with open(os.path.join(path, out), 'wb') as fout: pickle.dump(library, fout, protocol=2)PKmN[̲0NuRadioMC/SignalGen/ARZ/A02plot_library_stats.pyimport numpy as np from NuRadioMC.utilities import units import os from scipy import interpolate as intp import glob import pickle import sys from matplotlib import pyplot as plt if __name__ == "__main__": library_path = sys.argv[1] with open(library_path, 'rb') as fin: lib = pickle.load(fin) f, ax = plt.subplots(1, len(lib), sharey=True) for iS, shower_type in enumerate(lib): b = [] nb = [] for E in lib[shower_type]: nE = len(lib[shower_type][E]['charge_excess']) b.append(E) nb.append(nE) ax[iS].bar(np.log10(b), nE, linewidth=1, edgecolor='k', width=0.05) ax[iS].set_xlabel("log10(shower energy [eV])") ax[iS].set_title(shower_type) ax[0].set_ylabel('number of showers') f.tight_layout() plt.show() PKmNË>>NuRadioMC/SignalGen/ARZ/ARZ.py#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import division, print_function import numpy as np from NuRadioReco.utilities import units from scipy import interpolate as intp from scipy import integrate as int from scipy import constants from matplotlib import pyplot as plt from radiotools import coordinatesystems as cstrafo import os import copy import pickle import logging logger = logging.getLogger("SignalGen.ARZ") logging.basicConfig() ###################### ###################### # This code is based on "J. Alvarez-Muniz, P. Hansen, A. Romero-Wolf, E. Zas in preparation" which is an extension of # Alvarez-Muñiz, J., Romero-Wolf, A., & Zas, E. (2011). Practical and accurate calculations of Askaryan radiation. Physical Review D - Particles, Fields, Gravitation and Cosmology, 84(10). https://doi.org/10.1103/PhysRevD.84.103003 # to hadronic showers. Thanks a lot to Jaime Alvarez-Muñiz for providing us with this unpublished work! ##################### ##################### # define constants # x0 = 36.08 * units.g / units.cm**2 # radiation length g cm^-2 rho = 0.924 * units.g / units.cm ** 3 # density g cm^-3 xmu = 12.566370e-7 * units.newton / units.ampere ** 2 c = 2.99792458e8 * units.m / units.s # e = 1.602177e-19 * units.coulomb def thetaprime_to_theta(thetaprime, xmax, R): """ convertes a viewing angle relative to the shower maximum to a viewing angle relative to the start of the shower. """ L = xmax / rho return thetaprime - np.arcsin((L * np.sin(np.pi - thetaprime)) / R) def theta_to_thetaprime(theta, xmax, R): """ converts a viewing angle relative to the start of the shower to a viewing angle relative to the shower maximum """ L = xmax / rho b = R * np.sin(theta) a = R * np.cos(theta) - L return np.arctan2(b, a) class ARZ(object): __instance = None def __new__(cls, seed=1234, interp_factor=1, interp_factor2=100, library=None): if ARZ.__instance is None: ARZ.__instance = object.__new__(cls, seed, interp_factor, interp_factor2, library) return ARZ.__instance def __init__(self, seed=1234, interp_factor=1, interp_factor2=100, library=None): logger.warning("setting seed to {}".format(seed, interp_factor)) np.random.seed(seed) self._interp_factor = interp_factor self._interp_factor2 = interp_factor2 self._random_numbers = {} self._version = (1, 2) # # load shower library into memory if(library is None): library = os.path.join(os.path.dirname(__file__), "shower_library/library_v{:d}.{:d}.pkl".format(*self._version)) else: if(not os.path.exists(library)): logger.error("user specified shower library {} not found.".format(library)) raise FileNotFoundError("user specified shower library {} not found.".format(library)) self.__check_and_get_library() with open(library) as fin: logger.warning("loading shower library into memory") self._library = pickle.load(fin) def __check_and_get_library(self): """ checks if shower library exists and is up to date by comparing the sha1sum. If the library does not exist or changes on the server, a new library will be downloaded. """ path = os.path.join(os.path.dirname(__file__), "shower_library/library_v{:d}.{:d}.pkl".format(*self._version)) download_file = False if(not os.path.exists(path)): logger.warning("shower library version {} does not exist on the local file system yet. It will be downloaded to {}".format(self._version, path)) download_file = True if(os.path.exists(path)): BUF_SIZE = 65536 * 2 ** 4 # lets read stuff in 64kb chunks! import hashlib import json sha1 = hashlib.sha1() with open(path, 'rb') as f: while True: data = f.read(BUF_SIZE) if not data: break sha1.update(data) shower_directory = os.path.join(os.path.dirname(__file__), "shower_library/") with open(os.path.join(shower_directory, 'shower_lib_hash.json'), 'r') as fin: lib_hashs = json.load(fin) if("{:d}.{:d}".format(*self._version) in lib_hashs.keys()): if(sha1.hexdigest() != lib_hashs["{:d}.{:d}".format(*self._version)]): logger.warning("shower library {} has changed on the server. downloading newest version...".format(self._version)) download_file = True else: logger.warning("no hash sum of {} available, skipping up-to-date check".format(os.path.basename(path))) if not download_file: return True else: import requests URL = 'http://arianna.ps.uci.edu/~arianna/data/ce_shower_library/library_v{:d}.{:d}.pkl'.format(*self._version) logger.info("downloading shower library {} from {}. This can take a while...".format(self._version, URL)) r = requests.get(URL) if (r.status_code != requests.codes.ok): logger.error("error in download of antenna model") raise IOError("error in download of antenna model") with open(path, "wb") as code: code.write(r.content) logger.info("...download finished.") def set_seed(self, seed): """ allow to set a new random seed """ np.random.seed(seed) def set_interpolation_factor(self, interp_factor): """ set interpolation factor of charge-excess profiles """ self._interp_factor = interp_factor def set_interpolation_factor2(self, interp_factor): """ set interpolation factor around peak of form factor """ self._interp_factor2 = interp_factor def get_time_trace(self, shower_energy, theta, N, dt, shower_type, n_index, R, shift_for_xmax=False, same_shower=False, iN=None, output_mode='trace', theta_reference='X0'): """ calculates the electric-field Askaryan pulse from a charge-excess profile Parameters ---------- shower_energy: float the energy of the shower theta: float viewing angle, i.e., the angle between shower axis and launch angle of the signal (the ray path) N: int number of samples in the time domain dt: float size of one time bin in units of time profile_depth: array of floats shower depth values of the charge excess profile profile_ce: array of floats charge-excess values of the charge excess profile shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) or "TAU" (tau lepton induced) n_index: float (default 1.78) index of refraction where the shower development takes place R: float (default 1km) observation distance, the signal amplitude will be scaled according to 1/R interp_factor: int (default 10) interpolation factor of charge-excess profile. Results in a more precise numerical integration which might be beneficial for small vertex distances but also slows down the calculation proportional to the interpolation factor. shift_for_xmax: bool (default True) if True the observer position is placed relative to the position of the shower maximum, if False it is placed with respect to (0,0,0) which is the start of the charge-excess profile same_shower: bool (default False) if False, for each request a new random shower realization is choosen. if True, the shower from the last request of the same shower type is used. This is needed to get the Askaryan signal for both ray tracing solutions from the same shower. iN: int or None (default None) specify shower number output_mode: string * 'trace' (default): return only the electric field trace * 'Xmax': return trace and position of xmax in units of length * 'full' return trace, depth and charge_excess profile theta_reference: string (default: X0) * 'X0': viewing angle relativ to start of the shower * 'Xmax': viewing angle is relativ to Xmax, internally it will be converted to be relative to X0 Returns: array of floats array of electric-field time trace in 'on-sky' coordinate system eR, eTheta, ePhi """ if not shower_type in self._library.keys(): raise KeyError("shower type {} not present in library. Available shower types are {}".format(shower_type, *self._library.keys())) # determine closes available energy in shower library energies = np.array(self._library[shower_type].keys()) iE = np.argmin(np.abs(energies - shower_energy)) rescaling_factor = shower_energy / energies[iE] logger.info("shower energy of {:.3g}eV requested, closest available energy is {:.3g}eV. The amplitude of the charge-excess profile will be rescaled accordingly by a factor of {:.2f}".format(shower_energy / units.eV, energies[iE] / units.eV, rescaling_factor)) profiles = self._library[shower_type][energies[iE]] N_profiles = len(profiles['charge_excess']) if(iN is None): if(same_shower): if(shower_type in self._random_numbers): iN = self._random_numbers[shower_type] logger.info("using previously used shower {}/{}".format(iN, N_profiles)) else: logger.warning("no previous random number for shower type {} exists. Generating a new random number.".format(shower_type)) iN = np.random.randint(N_profiles) self._random_numbers[shower_type] = iN logger.info("picking profile {}/{} randomly".format(iN, N_profiles)) else: iN = np.random.randint(N_profiles) self._random_numbers[shower_type] = iN logger.info("picking profile {}/{} randomly".format(iN, N_profiles)) else: logger.info("using shower {}/{} as specified by user".format(iN, N_profiles)) profile_depth = profiles['depth'] profile_ce = profiles['charge_excess'][iN] * rescaling_factor xmax = profile_depth[np.argmax(profile_ce)] if(theta_reference == 'Xmax'): thetat = copy.copy(theta) theta = thetaprime_to_theta(theta, xmax, R) logger.info("transforming viewing angle from {:.2f} to {:.2f}".format(thetat / units.deg, theta / units.deg)) elif(theta_reference != 'X0'): raise NotImplementedError("theta_reference = '{}' is not implemented".format(theta_reference)) vp = get_vector_potential_fast(shower_energy, theta, N, dt, profile_depth, profile_ce, shower_type, n_index, R, self._interp_factor, self._interp_factor2, shift_for_xmax) trace = -np.diff(vp, axis=0) / dt # trace = -np.gradient(vp, axis=0) / dt # use viewing angle relative to shower maximum for rotation into spherical coordinate system (that reduced eR component) thetaprime = theta_to_thetaprime(theta, xmax, R) cs = cstrafo.cstrafo(zenith=thetaprime, azimuth=0) trace_onsky = cs.transform_from_ground_to_onsky(trace.T) if(output_mode == 'full'): return trace_onsky, profile_depth, profile_ce elif(output_mode == 'Xmax'): xmax = profile_depth[np.argmax(profile_ce)] Lmax = xmax / rho return trace_onsky, Lmax return trace_onsky def get_vector_potential_fast(shower_energy, theta, N, dt, profile_depth, profile_ce, shower_type="HAD", n_index=1.78, distance=1 * units.m, interp_factor=1., interp_factor2=100., shift_for_xmax=False): """ fast interpolation of time-domain calculation of vector potential of the Askaryan pulse from a charge-excess profile Note that the returned array has N+1 samples so that the derivative (the efield) will have N samples. The numerical integration was replaces by a sum using the trapeoiz rule using vectorized numpy operations Parameters ---------- shower_energy: float the energy of the shower theta: float viewing angle, i.e., the angle between shower axis and launch angle of the signal (the ray path) N: int number of samples in the time domain dt: float size of one time bin in units of time profile_depth: array of floats shower depth values of the charge excess profile profile_ce: array of floats charge-excess values of the charge excess profile shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) or "TAU" (tau lepton induced) n_index: float (default 1.78) index of refraction where the shower development takes place distance: float (default 1km) observation distance, the signal amplitude will be scaled according to 1/R interp_factor: int (default 1) interpolation factor of charge-excess profile. Results in a more precise numerical integration which might be beneficial for small vertex distances but also slows down the calculation proportional to the interpolation factor. if None, the interpolation factor will be calculated from the distance interp_factor2: int (default 100) interpolation just around the peak of the form factor shift_for_xmax: bool (default True) if True the observer position is placed relative to the position of the shower maximum, if False it is placed with respect to (0,0,0) which is the start of the charge-excess profile """ ttt = np.arange(0, (N + 1) * dt, dt) ttt = ttt + 0.5 * dt - ttt.mean() if(len(ttt) != N + 1): ttt = ttt[:-1] N = len(ttt) xn = n_index cher = np.arccos(1. / n_index) beta = 1. profile_dense = profile_depth profile_ce_interp = profile_ce if(interp_factor != 1): profile_dense = np.linspace(min(profile_depth), max(profile_depth), interp_factor * len(profile_depth)) profile_ce_interp = np.interp(profile_dense, profile_depth, profile_ce) length = profile_dense / rho dxmax = length[np.argmax(profile_ce_interp)] # theta2 = np.arctan(R * np.sin(theta)/(R * np.cos(theta) - dxmax)) # logger.warning("theta changes from {:.2f} to {:.2f}".format(theta/units.deg, theta2/units.deg)) # calculate antenna position in ARZ reference frame # coordinate system is with respect to an origin which is located # at the position where the primary particle is injected in the medium. The reference frame # is z = along shower axis, and x,y are two arbitray directions perpendicular to z # and perpendicular among themselves of course. # For instance to place an observer at a distance R and angle theta w.r.t. shower axis in the x,z plane # it can be simply done by putting in the input file the numerical values: X = np.array([distance * np.sin(theta), 0., distance * np.cos(theta)]) if(shift_for_xmax): logger.info("shower maximum at z = {:.1f}m, shifting observer position accordingly.".format(dxmax / units.m)) X = np.array([distance * np.sin(theta), 0., distance * np.cos(theta) + dxmax]) logger.info("setting observer position to {}".format(X)) def get_dist_shower(X, z): """ Distance from position in shower depth z' to each antenna. Denominator in Eq. (22) PRD paper Parameters ---------- X: 3dim np. array position of antenna in ARZ reference frame z: shower depth """ return (X[0] ** 2 + X[1] ** 2 + (X[2] - z) ** 2) ** 0.5 # calculate total charged track length xntot = np.sum(profile_ce_interp) * (length[1] - length[0]) factor = -xmu / (4. * np.pi) fc = 4. * np.pi / (xmu * np.sin(cher)) vp = np.zeros((N, 3)) for it, t in enumerate(ttt): tobs = t + (get_dist_shower(X, 0) / c * xn) z = length R = get_dist_shower(X, z) arg = z - (beta * c * tobs - xn * R) # Note that Acher peaks at tt=0 which corresponds to the observer time. # The shift from tobs to tt=0 is done when defining argument tt = (-arg / (c * beta)) # Parameterisation of A_Cherenkov with t in ns mask = abs(tt) < 20. * units.ns if(np.sum(mask) == 0): # vp[it] = 0 continue profile_dense2 = profile_dense profile_ce_interp2 = profile_ce_interp abc = False if(interp_factor2 != 1): # we only need to interpolate between +- 1ns to achieve a better precision in the numerical integration # the following code finds the indices sourrounding the bins fulfilling these condition # please not that we often have two distinct intervals having -1 < tt < 1 tmask = (tt < 1 * units.ns) & (tt > -1 * units.ns) gaps = (tmask[1:] ^ tmask[:-1]) # xor indices = np.arange(len(gaps))[gaps] # the indices in between tt is within -+ 1ns if(len(indices) != 0): # only interpolate if we have time within +- 1 ns of the observer time # now we add the corner cases of having the tt array start or end with an entry fulfilling the condition if(len(indices) % 2 != 0): if((tt[0] < 1 * units.ns) and (tt[0] > -1 * units.ns) and indices[0] != 0): indices = np.append(0, indices) else: if(indices[-1] != (len(tt) - 1)): indices = np.append(indices, len(tt) - 1) if(len(indices) % 2 == 0): # this rejects the cases where only the first or the last entry fulfills the -1 < tt < 1 condition dt = tt[1] - tt[0] dp = profile_dense2[1] - profile_dense2[0] if(len(indices) == 2): # we have only one interval i_start = indices[0] i_stop = indices[1] profile_dense2 = np.arange(profile_dense[i_start], profile_dense[i_stop], dp / interp_factor2) profile_ce_interp2 = np.interp(profile_dense2, profile_dense[i_start:i_stop], profile_ce_interp[i_start:i_stop]) profile_dense2 = np.append(np.append(profile_dense[:i_start], profile_dense2), profile_dense[i_stop:]) profile_ce_interp2 = np.append(np.append(profile_ce_interp[:i_start], profile_ce_interp2), profile_ce_interp[i_stop:]) elif(len(indices) == 4): # we have two intervals, hence, we need to upsample two distinct intervals and put the full array back together. i_start = indices[0] i_stop = indices[1] profile_dense2 = np.arange(profile_dense[i_start], profile_dense[i_stop], dp / interp_factor2) profile_ce_interp2 = np.interp(profile_dense2, profile_dense[i_start:i_stop], profile_ce_interp[i_start:i_stop]) i_start3 = indices[2] i_stop3 = indices[3] profile_dense3 = np.arange(profile_dense[i_start3], profile_dense[i_stop3], dp / interp_factor2) profile_ce_interp3 = np.interp(profile_dense3, profile_dense[i_start3:i_stop3], profile_ce_interp[i_start3:i_stop3]) profile_dense2 = np.append(np.append(np.append(np.append( profile_dense[:i_start], profile_dense2), profile_dense[i_stop:i_start3]), profile_dense3), profile_dense[i_stop3:]) profile_ce_interp2 = np.append(np.append(np.append(np.append( profile_ce_interp[:i_start], profile_ce_interp2), profile_ce_interp[i_stop:i_start3]), profile_ce_interp3), profile_ce_interp[i_stop3:]) else: raise NotImplementedError("length of indices is not 2 nor 4") # this should never happen if 0: abc = True i_stop = len(profile_dense) - 1 from matplotlib import pyplot as plt fig, ax = plt.subplots(1, 1) ax.plot(tt, color='0.5') ax.plot(np.arange(len(tmask))[tmask], tt[tmask], 'o') ax.plot(indices, np.ones_like(indices), 'd') # ax.plot(np.arange(len(tmask))[gaps], tt[gaps], 'd') plt.show() # recalculate parameters for interpolated values z = profile_dense2 / rho R = get_dist_shower(X, z) arg = z - (beta * c * tobs - xn * R) tt = (-arg / (c * beta)) mask = abs(tt) < 20. * units.ns tmask = (tt < 1 * units.ns) & (tt > -1 * units.ns) F_p = np.zeros_like(tt) # Cut fit above +/-5 ns u_x = X[0] / R u_y = X[1] / R u_z = (X[2] - z) / R beta_z = 1. vperp_x = u_x * u_z * beta_z vperp_y = u_y * u_z * beta_z vperp_z = -(u_x * u_x + u_y * u_y) * beta_z v = np.array([vperp_x, vperp_y, vperp_z]) """ Function F_p Eq.(15) PRD paper. """ # Factor accompanying the F_p in Eq.(15) in PRD paper beta = 1. if(np.sum(mask)): # Choose Acher between purely electromagnetic, purely hadronic or mixed shower # Eq.(16) PRD paper. # Refit of ZHAireS results => factor 0.88 in Af_e Af_e = -4.5e-14 * 0.88 * units.V * units.s Af_p = -3.2e-14 * units.V * units.s # V s E_TeV = shower_energy / units.TeV Acher = np.zeros_like(tt) if(shower_type == "HAD"): mask2 = tt > 0 & mask if(np.sum(mask2)): Acher[mask2] = Af_p * E_TeV * (np.exp(-np.abs(tt[mask2]) / (0.065 * units.ns)) + (1. + 3.00 / units.ns * np.abs(tt[mask2])) ** (-2.65)) # hadronic mask2 = tt <= 0 & mask if(np.sum(mask2)): Acher[mask2] = Af_p * E_TeV * (np.exp(-np.abs(tt[mask2]) / (0.043 * units.ns)) + (1. + 2.92 / units.ns * np.abs(tt[mask2])) ** (-3.21)) # hadronic elif(shower_type == "EM"): mask2 = tt > 0 & mask if(np.sum(mask2)): Acher[mask2] = Af_e * E_TeV * (np.exp(-np.abs(tt[mask2]) / (0.057 * units.ns)) + (1. + 2.87 / units.ns * np.abs(tt[mask2])) ** (-3.00)) # electromagnetic mask2 = tt <= 0 & mask if(np.sum(mask2)): Acher[mask2] = Af_e * E_TeV * (np.exp(-np.abs(tt[mask2]) / (0.030 * units.ns)) + (1. + 3.05 / units.ns * np.abs(tt[mask2])) ** (-3.50)) # electromagnetic elif(shower_type == "TAU"): logger.error("Tau showers are not yet implemented") raise NotImplementedError("Tau showers are not yet implemented") else: msg = "showers of type {} are not implemented. Use 'HAD', 'EM' or 'TAU'".format(shower_type) logger.error(msg) raise NotImplementedError(msg) # Obtain "shape" of Lambda-function from vp at Cherenkov angle # xntot = LQ_tot in PRD paper F_p[mask] = Acher[mask] * fc / xntot # F_p[~mask] = 1.e-30 * fc / xntot F_p[~mask] = 0 vp[it] = np.trapz(-v * profile_ce_interp2 * F_p / R, z) if 0: import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) inte = -v * profile_ce_interp2 * F_p / R ax.plot(tt, inte[0], '-') ax.plot(tt, inte[1], '-') ax.plot(tt, inte[2], '-') ax.plot(tt[tmask], inte[0][tmask], 'o') ax.plot(tt[tmask], inte[1][tmask], 'o') ax.plot(tt[tmask], inte[2][tmask], 'o') ax.set_title("{}".format(vp[it])) plt.show() vp *= factor if 0: import matplotlib.pyplot as plt fig, (ax, ax2) = plt.subplots(1, 2) ax.plot(vp) print(vp.shape) t0 = -np.gradient(vp.T[0]) / dt t1 = -np.gradient(vp.T[1]) / dt t2 = -np.gradient(vp.T[2]) / dt trace2 = -np.diff(vp, axis=0) / dt # print(trace.shape) ax2.plot(t0) ax2.plot(t1) ax2.plot(t2) ax2.plot(trace2.T[0], '--') ax2.plot(trace2.T[1], '--') ax2.plot(trace2.T[2], '--') plt.show() return vp def get_vector_potential(energy, theta, N, dt, y=1, ccnc='cc', flavor=12, n_index=1.78, R=1 * units.m, profile_depth=None, profile_ce=None): """ python transcription of original FORTRAN code """ tt = np.arange(0, (N + 1) * dt, dt) tt = tt + 0.5 * dt - tt.mean() # tmin = tt.min() # tmax = tt.max() # tmin = -100 * units.ns # tmax = 100 * units.ns # tt = np.arange(tmin, tmax, dt) # tt += 0.5 * dt N = len(tt) xn = n_index cher = np.arccos(1. / n_index) beta = 1. # calculate antenna position in ARZ reference frame # coordinate system is with respect to an origin which is located # at the position where the primary particle is injected in the medium. The reference frame # is z = along shower axis, and x,y are two arbitray directions perpendicular to z # and perpendicular among themselves of course. # For instance to place an observer at a distance R and angle theta w.r.t. shower axis in the x,z plane # it can be simply done by putting in the input file the numerical values: X = np.array([R * np.sin(theta), 0., R * np.cos(theta)]) def get_dist_shower(X, z): """ Distance from position in shower depth z' to each antenna. Denominator in Eq. (22) PRD paper Parameters ---------- X: 3dim np. array position of antenna in ARZ reference frame z: shower depth """ return (X[0] ** 2 + X[1] ** 2 + (X[2] - z) ** 2) ** 0.5 length = profile_depth / rho xnep = intp.interp1d(length, profile_ce, bounds_error=False, fill_value=0) # calculate total charged track length xntot = np.sum(profile_ce) * (length[1] - length[0]) # print("{:.5g}".format(xntot)) # res = int.quad(xnep, length.min(), length.max()) # print("{:.5g} {:.5g}".format(*res)) if 0: # debug plot ll = np.linspace(length.min(), length.max(), 10000) plt.plot(ll, xnep(ll)) plt.plot(length, N_e - N_p, 'o') plt.show() factor = -xmu / (4. * np.pi) def xintegrand(z, index, tobs): R = get_dist_shower(X, z) arg = z - (beta * c * tobs - xn * R) u_x = X[0] / R u_y = X[1] / R u_z = (X[2] - z) / R beta_z = 1. vperp_x = u_x * u_z * beta_z vperp_y = u_y * u_z * beta_z vperp_z = -(u_x * u_x + u_y * u_y) * beta_z v = np.array([vperp_x, vperp_y, vperp_z])[index] return -v * xnep(z) * F_p(arg) / R def F_p(arg): """ Function F_p Eq.(15) PRD paper. """ # Factor accompanying the F_p in Eq.(15) in PRD paper fc = 4. * np.pi / (xmu * np.sin(cher)) beta = 1. # Note that Acher peaks at tt=0 which corresponds to the observer time. # The shift from tobs to tt=0 is done when defining argument tt = (-arg / (c * beta)) # Parameterisation of A_Cherenkov with t in ns # Cut fit above +/-5 ns if (abs(tt) > 5. * units.ns): return 1.e-30 * fc / xntot # Choose Acher between purely electromagnetic, purely hadronic or mixed shower # Eq.(16) PRD paper. # Refit of ZHAireS results => factor 0.88 in Af_e Af_e = -4.5e-14 * 0.88 * units.V * units.s Af_p = -3.2e-14 * units.V * units.s # V s E_TeV = energy / units.TeV if (tt > 0): A_e = Af_e * E_TeV * (np.exp(-np.abs(tt) / (0.057 * units.ns)) + (1. + 2.87 / units.ns * np.abs(tt)) ** (-3.00)) # electromagnetic A_p = Af_p * E_TeV * (np.exp(-np.abs(tt) / (0.065 * units.ns)) + (1. + 3.00 / units.ns * np.abs(tt)) ** (-2.65)) # hadronic else: A_e = Af_e * E_TeV * (np.exp(-np.abs(tt) / (0.030 * units.ns)) + (1. + 3.05 / units.ns * np.abs(tt)) ** (-3.50)) # electromagnetic A_p = Af_p * E_TeV * (np.exp(-np.abs(tt) / (0.043 * units.ns)) + (1. + 2.92 / units.ns * np.abs(tt)) ** (-3.21)) # hadronic if(ccnc == 'nc'): Acher = y * A_p else: if(np.abs(flavor) == 12): Acher = (1. - y) * A_e + y * A_p else: Acher = 0 # Obtain "shape" of Lambda-function from vp at Cherenkov angle # xntot = LQ_tot in PRD paper return Acher * fc / xntot vp = np.zeros((N, 3)) for it, t in enumerate(tt): tobs = t + (get_dist_shower(X, 0) / c * xn) xmin = length.min() xmax = length.max() if(X[0] != 0): vp[it][0] = int.quad(xintegrand, xmin, xmax, args=(0, tobs))[0] if(X[1] != 0): vp[it][1] = int.quad(xintegrand, xmin, xmax, args=(1, tobs))[0] if(X[2] != 0): vp[it][2] = int.quad(xintegrand, xmin, xmax, args=(2, tobs))[0] vp *= factor return vp class ARZ_tabulated(object): __instance = None def __new__(cls, seed=1234, library=None): if ARZ_tabulated.__instance is None: ARZ_tabulated.__instance = object.__new__(cls, seed, library) return ARZ_tabulated.__instance def __init__(self, seed=1234, library=None): logger.warning("setting seed to {}".format(seed)) np.random.seed(seed) self._random_numbers = {} self._version = (1, 1) # # load shower library into memory if(library is None): library = os.path.join(os.path.dirname(__file__), "shower_library/ARZ_library_v{:d}.{:d}.pkl".format(*self._version)) else: if(not os.path.exists(library)): logger.error("user specified pulse library {} not found.".format(library)) raise FileNotFoundError("user specified pulse library {} not found.".format(library)) self.__check_and_get_library() with open(library) as fin: logger.warning("loading pulse library into memory") self._library = pickle.load(fin) def __check_and_get_library(self): """ checks if pulse library exists and is up to date by comparing the sha1sum. If the library does not exist or changes on the server, a new library will be downloaded. """ path = os.path.join(os.path.dirname(__file__), "shower_library/ARZ_library_v{:d}.{:d}.pkl".format(*self._version)) download_file = False if(not os.path.exists(path)): logger.warning("ARZ library version {} does not exist on the local file system yet. It will be downloaded to {}".format(self._version, path)) download_file = True if(os.path.exists(path)): BUF_SIZE = 65536 * 2 ** 4 # lets read stuff in 64kb chunks! import hashlib import json sha1 = hashlib.sha1() with open(path, 'rb') as f: while True: data = f.read(BUF_SIZE) if not data: break sha1.update(data) shower_directory = os.path.join(os.path.dirname(__file__), "shower_library/") with open(os.path.join(shower_directory, 'shower_lib_hash.json'), 'r') as fin: lib_hashs = json.load(fin) if("ARZ_{:d}.{:d}".format(*self._version) in lib_hashs.keys()): if(sha1.hexdigest() != lib_hashs["{:d}.{:d}".format(*self._version)]): logger.warning("pulse library {} has changed on the server. downloading newest version...".format(self._version)) download_file = True else: logger.warning("no hash sum of {} available, skipping up-to-date check".format(os.path.basename(path))) if not download_file: return True else: import requests URL = 'http://arianna.ps.uci.edu/~arianna/data/ce_shower_library/ARZ_library_v{:d}.{:d}.pkl'.format(*self._version) logger.info("downloading pulse library {} from {}. This can take a while...".format(self._version, URL)) r = requests.get(URL) if (r.status_code != requests.codes.ok): logger.error("error in download of antenna model") raise IOError("error in download of antenna model") with open(path, "wb") as code: code.write(r.content) logger.info("...download finished.") def set_seed(self, seed): """ allow to set a new random seed """ np.random.seed(seed) def get_time_trace(self, shower_energy, theta, N, dt, shower_type, n_index, R, same_shower=False, iN=None, output_mode='trace', theta_reference='X0'): """ calculates the electric-field Askaryan pulse from a charge-excess profile Parameters ---------- shower_energy: float the energy of the shower theta: float viewing angle, i.e., the angle between shower axis and launch angle of the signal (the ray path) N: int number of samples in the time domain dt: float size of one time bin in units of time shower_type: string (default "HAD") type of shower, either "HAD" (hadronic), "EM" (electromagnetic) or "TAU" (tau lepton induced) n_index: float (default 1.78) index of refraction where the shower development takes place R: float (default 1km) observation distance, the signal amplitude will be scaled according to 1/R same_shower: bool (default False) if False, for each request a new random shower realization is choosen. if True, the shower from the last request of the same shower type is used. This is needed to get the Askaryan signal for both ray tracing solutions from the same shower. iN: int or None (default None) specify shower number output_mode: string * 'trace' (default): return only the electric field trace * 'Xmax': return trace and position of xmax in units of length theta_reference: string (default: X0) * 'X0': viewing angle relativ to start of the shower * 'Xmax': viewing angle is relativ to Xmax, internally it will be converted to be relative to X0 Returns: array of floats array of electric-field time trace in 'on-sky' coordinate system eR, eTheta, ePhi """ if not shower_type in self._library.keys(): raise KeyError("shower type {} not present in library. Available shower types are {}".format(shower_type, *self._library.keys())) # determine closes available energy in shower library energies = np.array(list(self._library[shower_type].keys())) iE = np.argmin(np.abs(energies - shower_energy)) rescaling_factor = shower_energy / energies[iE] logger.info("shower energy of {:.3g}eV requested, closest available energy is {:.3g}eV. The pulse amplitude will be rescaled accordingly by a factor of {:.2f}".format(shower_energy / units.eV, energies[iE] / units.eV, rescaling_factor)) profiles = self._library[shower_type][energies[iE]] N_profiles = len(profiles.keys()) if(iN is None): if(same_shower): if(shower_type in self._random_numbers): iN = self._random_numbers[shower_type] logger.info("using previously used shower {}/{}".format(iN, N_profiles)) else: logger.warning("no previous random number for shower type {} exists. Generating a new random number.".format(shower_type)) iN = np.random.randint(N_profiles) self._random_numbers[shower_type] = iN logger.info("picking profile {}/{} randomly".format(iN, N_profiles)) else: iN = np.random.randint(N_profiles) self._random_numbers[shower_type] = iN logger.info("picking profile {}/{} randomly".format(iN, N_profiles)) else: logger.info("using shower {}/{} as specified by user".format(iN, N_profiles)) thetas = profiles[iN].keys() iT = np.argmin(np.abs(thetas - theta)) logger.info("selecting theta = {:.2f} ({:.2f} requested)".format(thetas[iT] / units.deg, theta)) trace = profiles[iT]['trace'] t0 = profiles[iT]['t0'] Lmax = profiles[iT]['Lmax'] trace2 = np.zeros(N) tcenter = N // 2 * dt tstart = t0 + tcenter i0 = np.int(np.round(tstart / dt)) trace2[i0:(i0 + len(trace))] = trace trace2 *= self._library['meta']['R'] / R * rescaling_factor if(output_mode == 'Xmax'): return trace2, Lmax return trace2 if __name__ == "__main__": energy = 1.e6 * units.TeV theta = 55 * units.deg R = 1 * units.km N = 512 dt = 0.5 * units.ns n_index = 1.78 y = 0.60146725 ccnc = 'cc' flavor = 12 # e = 12, mu = 14, tau = 16 cdir = os.path.dirname(__file__) bins, depth_e, N_e = np.loadtxt(os.path.join(cdir, "shower_library/nue_1EeV_CC_1_s0001.t1005"), unpack=True) bins, depth_p, N_p = np.loadtxt(os.path.join(cdir, "shower_library/nue_1EeV_CC_1_s0001.t1006"), unpack=True) depth_e *= units.g / units.cm ** 2 depth_p *= units.g / units.cm ** 2 depth_e -= 1000 * units.g / units.cm ** 2 # all simulations have an artificial offset of 1000 g/cm^2 depth_p -= 1000 * units.g / units.cm ** 2 # sanity check if files electron and positron profiles are compatible if (not np.all(depth_e == depth_p)): raise ImportError("electron and positron profile have different depths") vp = get_vector_potential(energy, theta, N, dt, y, ccnc, flavor, n_index, R, profile_depth=depth_e, profile_ce=(N_e - N_p)) vp2 = get_vector_potential(energy, theta, N, dt, y, "EM", n_index, R, profile_depth=depth_e, profile_ce=(N_e - N_p)) # generate time array tt = np.arange(0, (N + 1) * dt, dt) tt = tt + 0.5 * dt - tt.mean() t, Ax, Ay, Az = np.loadtxt("fortran_reference.dat", unpack=True) fig, ax = plt.subplots(1, 1) ax.plot(tt, vp[:, 0] / units.V / units.s) ax.plot(tt, vp[:, 1] / units.V / units.s) ax.plot(tt, vp[:, 2] / units.V / units.s) ax.plot(t, Ax, "C0--") ax.plot(t, Az, "C2--") ax.set_xlim(-2, 2) ax.set_xlabel("time [ns]") ax.set_ylabel("vector potential") mask = np.array([x in t for x in tt]) fig, ax = plt.subplots(1, 1) ax.plot(t, vp[:, 0][mask] / units.V / units.s / Ax) ax.plot(t, vp[:, 2][mask] / units.V / units.s / Az) ax.set_xlim(-2, 2) ax.set_xlabel("time [ns]") ax.set_ylabel("python/fortran implementation") ax.set_ylim(0.8, 1.2) trace = get_time_trace(energy, theta, N, dt, y, ccnc, flavor, n_index, R) tt = np.arange(0, dt * N, dt) fig, ax = plt.subplots(1, 1) ax.plot(tt, trace[:, 0]) ax.plot(tt, trace[:, 1]) ax.plot(tt, trace[:, 2]) fig.tight_layout() plt.show() PKmNO<++2NuRadioMC/SignalGen/ARZ/B01create_pulse_library.pyfrom __future__ import print_function, division import numpy as np from NuRadioMC.utilities import units import os from scipy import interpolate as intp import glob import pickle import sys from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.SignalGen.ARZ import ARZ import logging from scipy import signal import matplotlib.gridspec as gridspec logger = logging.getLogger("test") logging.basicConfig(level=logging.WARNING) rho = 0.924 * units.g / units.cm ** 3 # density g cm^-3 plot=False if __name__ == "__main__": sampling_rate = 5 * units.GHz dt = 1. / sampling_rate T2 = 50 * units.ns N2 = np.int(np.round(T2 / dt)) n_index = 1.78 theta = np.arccos(1. / n_index) R = 5 * units.km T = 600 * units.ns N = np.int(np.round(T / dt)) tt = np.arange(0, dt * N, dt) dCs = np.append(np.arange(-20, -5, 1), np.append(np.arange(-5,-1,0.2), np.arange(-1, 0, .05))) dCs = np.append(np.append(dCs, [0]), -1 * dCs) dCs = np.sort(dCs) * units.deg print('generating Askaryan pulses for the following viewing angles') print(dCs/units.deg) lib_path = "/Users/cglaser/work/ARIANNA/data/ARZ/v1.1/library_v1.1.pkl" a = ARZ.ARZ(library=lib_path, interp_factor=100) showers = {} showers['meta'] = {'dt': dt, 'n_index': n_index, 'R': R} with open(lib_path, 'rb') as fin: lib = pickle.load(fin) for iS, shower_type in enumerate(lib): # loop through shower types if(shower_type not in showers): showers[shower_type] = {} print("shower type {}".format(shower_type)) b = [] nb = [] for iE, E in enumerate(lib[shower_type]): # loop through energies print('E = {:.2g}eV'.format(E)) nE = len(lib[shower_type][E]['charge_excess']) if(E not in showers[shower_type]): showers[shower_type][E] = {} for iN in range(nE): # loop through shower realizations if(iN not in showers[shower_type][E]): showers[shower_type][E][iN] = {} if plot: fig, ax = plt.subplots(1, 1) fig2, ax2 = plt.subplots(1, 1) for dC in dCs: # loop through different cherenkov angles theta1 = theta + dC trace, Lmax = a.get_time_trace(E, theta1, N, dt, shower_type, n_index, R, iN=iN, output_mode='Xmax') iMax = np.argmax(np.abs(trace[1])) i1 = iMax - N2 // 2 if((i1 + N2) >= N) or (i1 < 0): print("tracelength to short, i1 = {}".format(i1)) # raise IndexError("tracelength to short, i1 = {}".format(i1)) t0 = tt[i1] - tt.mean() showers[shower_type][E][iN][theta1] = {} showers[shower_type][E][iN][theta1]['t0'] = t0 showers[shower_type][E][iN][theta1]['Lmax'] = Lmax showers[shower_type][E][iN][theta1]['trace'] = trace[1][i1:(i1 + N2)] if(plot): ax.plot(tt[i1:(i1 + N2)], trace[1][i1:(i1 + N2)] / np.abs(trace[1]).max()) ax2.plot(tt[i1:(i1 + N2)], np.abs(signal.hilbert(trace[1][i1:(i1 + N2)]))) if(plot): ax.set_title("{} E = {:.2g}eV i = {:d}".format(shower_type, E / units.eV, iN)) ax2.set_title("{} E = {:.2g}eV i = {:d}".format(shower_type, E / units.eV, iN)) ax.set_xlabel('time [ns]') ax2.set_xlabel('time [ns]') ax.set_ylabel('normalized amplitude') ax2.semilogy(True) fig.tight_layout() fig2.tight_layout() # plt.show() fig.savefig("plots/{}_{:.2g}eV_{:03d}.png".format(shower_type, E / units.eV, iN)) fig2.savefig("plots/{}_{:.2g}eV_{:03d}_log.png".format(shower_type, E / units.eV, iN)) plt.close("all") with open("ARZ_library_v1.1.pkl", 'wb') as fout: pickle.dump(showers, fout, protocol=2) PKmNd&=NuRadioMC/SignalGen/ARZ/B02create_pulse_library_per_energy.pyfrom __future__ import print_function, division import numpy as np from NuRadioMC.utilities import units import os from scipy import interpolate as intp import glob import pickle import sys from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.SignalGen.ARZ import ARZ import logging from multiprocessing import Process, Pool from scipy import signal import matplotlib.gridspec as gridspec logger = logging.getLogger("test") logging.basicConfig(level=logging.WARNING) rho = 0.924 * units.g / units.cm ** 3 # density g cm^-3 sampling_rate = 5 * units.GHz dt = 1. / sampling_rate T2 = 50 * units.ns N2 = np.int(np.round(T2 / dt)) n_index = 1.78 theta = np.arccos(1. / n_index) R = 5 * units.km T = 600 * units.ns N = np.int(np.round(T / dt)) tt = np.arange(0, dt * N, dt) dCs = np.append(np.arange(-20, -5, 1), np.append(np.arange(-5,-1,0.2), np.arange(-1, 0, .05))) dCs = np.append(np.append(dCs, [0]), -1 * dCs) dCs = np.sort(dCs) * units.deg plot=False def calculate(shower_type, E, nE): lib_path = "/Users/cglaser/work/ARIANNA/data/ARZ/v1.1/library_v1.1.pkl" a = ARZ.ARZ(library=lib_path, interp_factor=100) showers['meta'] = {'dt': dt, 'n_index': n_index, 'R': R} showers[shower_type] = {} if(E not in showers[shower_type]): showers[shower_type][E] = {} for iN in range(nE): # loop through shower realizations print("{} {:.2g} {:d}".format(shower_type, E, iN)) if(iN not in showers[shower_type][E]): showers[shower_type][E][iN] = {} if plot: fig, ax = plt.subplots(1, 1) fig2, ax2 = plt.subplots(1, 1) for dC in dCs: # loop through different cherenkov angles theta1 = theta + dC trace, Lmax = a.get_time_trace(E, theta1, N, dt, shower_type, n_index, R, iN=iN, output_mode='Xmax') iMax = np.argmax(np.abs(trace[1])) i1 = iMax - N2 // 2 if((i1 + N2) >= N) or (i1 < 0): print("tracelength to short, i1 = {}".format(i1)) # raise IndexError("tracelength to short, i1 = {}".format(i1)) t0 = tt[i1] - tt.mean() showers[shower_type][E][iN][theta1] = {} showers[shower_type][E][iN][theta1]['t0'] = t0 showers[shower_type][E][iN][theta1]['Lmax'] = Lmax showers[shower_type][E][iN][theta1]['trace'] = trace[1][i1:(i1 + N2)] if(plot): ax.plot(tt[i1:(i1 + N2)], trace[1][i1:(i1 + N2)] / np.abs(trace[1]).max()) ax2.plot(tt[i1:(i1 + N2)], np.abs(signal.hilbert(trace[1][i1:(i1 + N2)]))) if(plot): ax.set_title("{} E = {:.2g}eV i = {:d}".format(shower_type, E / units.eV, iN)) ax2.set_title("{} E = {:.2g}eV i = {:d}".format(shower_type, E / units.eV, iN)) ax.set_xlabel('time [ns]') ax2.set_xlabel('time [ns]') ax.set_ylabel('normalized amplitude') ax2.semilogy(True) fig.tight_layout() fig2.tight_layout() # plt.show() fig.savefig("plots/{}_{:.2g}eV_{:03d}.png".format(shower_type, E / units.eV, iN)) fig2.savefig("plots/{}_{:.2g}eV_{:03d}_log.png".format(shower_type, E / units.eV, iN)) plt.close("all") print("finished with {} {:.3g}".format(shower_type, E)) with open("ARZ_library_v1.1_{}_{:.1f}.pkl".format(shower_type, np.log10(E)), 'wb') as fout: pickle.dump(showers, fout, protocol=2) if __name__ == "__main__": print('generating Askaryan pulses for the following viewing angles') print(dCs/units.deg) ps = [] showers = {} lib_path = "/Users/cglaser/work/ARIANNA/data/ARZ/v1.1/library_v1.1.pkl" pool = Pool(processes=4) with open(lib_path, 'rb') as fin: lib = pickle.load(fin) for iS, shower_type in enumerate(lib): # loop through shower types if(shower_type not in showers): showers[shower_type] = {} print("shower type {}".format(shower_type)) b = [] nb = [] for iE, E in enumerate(lib[shower_type]): # loop through energies print('E = {:.2g}eV'.format(E)) # p = Process(target=calculate, args=(shower_type, E, len(lib[shower_type][E]['charge_excess']))) # p.start() # ps.append(p) r = pool.apply_async(calculate, args=(shower_type, E, len(lib[shower_type][E]['charge_excess']))) ps.append(r) for res in ps: print(res.get()) PKmN#NuRadioMC/SignalGen/ARZ/__init__.pyPKmNE1-NuRadioMC/SignalGen/ARZ/fortran_reference.dat # Time [ns] Vector potential [Vs] antenna position (x,y,z) m 819.15204429000005 0.0000000000000000 573.57643634999999 -99.750000000000000 -1.5318647405783685E-019 -0.0000000000000000 2.2390498816624766E-019 -99.250000000000000 -1.5570850644322290E-019 -0.0000000000000000 2.2759090901836965E-019 -98.750000000000000 -1.5828488317082313E-019 -0.0000000000000000 2.3135556204493873E-019 -98.250000000000000 -1.6091737475996994E-019 -0.0000000000000000 2.3520267281348503E-019 -97.750000000000000 -1.6360750920393226E-019 -0.0000000000000000 2.3913464380902895E-019 -97.250000000000000 -1.6635687422762200E-019 -0.0000000000000000 2.4315273637320376E-019 -96.750000000000000 -1.6916693022185291E-019 -0.0000000000000000 2.4726004421496368E-019 -96.250000000000000 -1.7203956309299255E-019 -0.0000000000000000 2.5145836529455393E-019 -95.750000000000000 -1.7497649847004130E-019 -0.0000000000000000 2.5575040261250734E-019 -95.250000000000000 -1.7797919472523615E-019 -0.0000000000000000 2.6013879059701518E-019 -94.750000000000000 -1.8104973919746712E-019 -0.0000000000000000 2.6462666720180661E-019 -94.250000000000000 -1.8419010682693608E-019 -0.0000000000000000 2.6921597505209006E-019 -93.750000000000000 -1.8740199574067181E-019 -0.0000000000000000 2.7391031694229205E-019 -93.250000000000000 -1.9068776000314068E-019 -0.0000000000000000 2.7871212708814516E-019 -92.750000000000000 -1.9404940231340097E-019 -0.0000000000000000 2.8362518594797800E-019 -92.250000000000000 -1.9748871656756385E-019 -0.0000000000000000 2.8865207081637952E-019 -91.750000000000000 -2.0100882594514667E-019 -0.0000000000000000 2.9379597941438189E-019 -91.250000000000000 -2.0461082667352484E-019 -0.0000000000000000 2.9906123260916658E-019 -90.750000000000000 -2.0829820944158286E-019 -0.0000000000000000 3.0444958190955758E-019 -90.250000000000000 -2.1207278930060498E-019 -0.0000000000000000 3.0996680154022969E-019 -89.750000000000000 -2.1593726005932497E-019 -0.0000000000000000 3.1561416583033123E-019 -89.250000000000000 -2.1989488073557892E-019 -0.0000000000000000 3.2139762553879463E-019 -88.750000000000000 -2.2394795757657390E-019 -0.0000000000000000 3.2732134253366697E-019 -88.250000000000000 -2.2809921719008578E-019 -0.0000000000000000 3.3338853686476103E-019 -87.750000000000000 -2.3235204736789319E-019 -0.0000000000000000 3.3960336251231834E-019 -87.250000000000000 -2.3670929710026295E-019 -0.0000000000000000 3.4597090414463822E-019 -86.750000000000000 -2.4117391773866457E-019 -0.0000000000000000 3.5249571528970851E-019 -86.250000000000000 -2.4574902070193054E-019 -0.0000000000000000 3.5918244082449273E-019 -85.750000000000000 -2.5043895427644024E-019 -0.0000000000000000 3.6603598615795849E-019 -85.250000000000000 -2.5524658319824533E-019 -0.0000000000000000 3.7306164136472604E-019 -84.750000000000000 -2.6017557800265224E-019 -0.0000000000000000 3.8026515504005023E-019 -84.250000000000000 -2.6523004396661634E-019 -0.0000000000000000 3.8765326739582376E-019 -83.750000000000000 -2.7041382536085752E-019 -0.0000000000000000 3.9522798488908979E-019 -83.250000000000000 -2.7573118247842366E-019 -0.0000000000000000 4.0299831829754694E-019 -82.750000000000000 -2.8118628491720120E-019 -0.0000000000000000 4.1097034270437633E-019 -82.250000000000000 -2.8678315235342341E-019 -0.0000000000000000 4.1914922985897225E-019 -81.750000000000000 -2.9252684972000431E-019 -0.0000000000000000 4.2754310723661986E-019 -81.250000000000000 -2.9842136766203772E-019 -0.0000000000000000 4.3615811641286633E-019 -80.750000000000000 -3.0447329173700945E-019 -0.0000000000000000 4.4500165846416486E-019 -80.250000000000000 -3.1068676701717444E-019 -0.0000000000000000 4.5408215515109736E-019 -79.750000000000000 -3.1706708205916498E-019 -0.0000000000000000 4.6340679503745907E-019 -79.250000000000000 -3.2362020636176485E-019 -0.0000000000000000 4.7298274363502952E-019 -78.750000000000000 -3.3035126481817476E-019 -0.0000000000000000 4.8281873954701700E-019 -78.250000000000000 -3.3726726738472407E-019 -0.0000000000000000 4.9292623558330078E-019 -77.750000000000000 -3.4437323486786070E-019 -0.0000000000000000 5.0331191799355829E-019 -77.250000000000000 -3.5167747954387167E-019 -0.0000000000000000 5.1398412534109757E-019 -76.750000000000000 -3.5918558112098690E-019 -0.0000000000000000 5.2495689902114425E-019 -76.250000000000000 -3.6690433902670500E-019 -0.0000000000000000 5.3623630014036709E-019 -75.750000000000000 -3.7484277083490037E-019 -0.0000000000000000 5.4783598872720476E-019 -75.250000000000000 -3.8300611446436625E-019 -0.0000000000000000 5.5976889292499551E-019 -74.750000000000000 -3.9140408220773642E-019 -0.0000000000000000 5.7203994531625251E-019 -74.250000000000000 -4.0004503250618637E-019 -0.0000000000000000 5.8466577960290740E-019 -73.750000000000000 -4.0893741071004346E-019 -0.0000000000000000 5.9765900042986447E-019 -73.250000000000000 -4.1808997774289265E-019 -0.0000000000000000 6.1103448679373426E-019 -72.750000000000000 -4.2751196033855313E-019 -0.0000000000000000 6.2480467259576286E-019 -72.250000000000000 -4.3721448539995845E-019 -0.0000000000000000 6.3898217734506209E-019 -71.750000000000000 -4.4720792255603712E-019 -0.0000000000000000 6.5358595475253645E-019 -71.250000000000000 -4.5750160165325913E-019 -0.0000000000000000 6.6862694128188940E-019 -70.750000000000000 -4.6810733837968318E-019 -0.0000000000000000 6.8412888346662121E-019 -70.250000000000000 -4.7903849981842515E-019 -0.0000000000000000 7.0009841360505288E-019 -69.750000000000000 -4.9030541299799285E-019 -0.0000000000000000 7.1656401361128489E-019 -69.250000000000000 -5.0192093035177917E-019 -0.0000000000000000 7.3353899456983707E-019 -68.750000000000000 -5.1390037973090364E-019 -0.0000000000000000 7.5104218270896375E-019 -68.250000000000000 -5.2625607492460434E-019 -0.0000000000000000 7.6909834362211171E-019 -67.750000000000000 -5.3900395417801501E-019 -0.0000000000000000 7.8772613683629100E-019 -67.250000000000000 -5.5215917112602338E-019 -0.0000000000000000 8.0694875624469294E-019 -66.750000000000000 -5.6573654016531444E-019 -0.0000000000000000 8.2678923669220017E-019 -66.250000000000000 -5.7975582316771796E-019 -0.0000000000000000 8.4727257488575015E-019 -65.750000000000000 -5.9423237007225649E-019 -0.0000000000000000 8.6842736149913408E-019 -65.250000000000000 -6.0918517637605986E-019 -0.0000000000000000 8.9027758543840521E-019 -64.750000000000000 -6.2463448700589188E-019 -0.0000000000000000 9.1285286567181211E-019 -64.250000000000000 -6.4060137616439171E-019 -0.0000000000000000 9.3618428335162145E-019 -63.750000000000000 -6.5710627595308697E-019 -0.0000000000000000 9.6030146346312876E-019 -63.250000000000000 -6.7417302448981985E-019 -0.0000000000000000 9.8523828207286744E-019 -62.750000000000000 -6.9182353167993504E-019 -0.0000000000000000 1.0110288418997394E-018 -62.250000000000000 -7.1008450949876057E-019 -0.0000000000000000 1.0377101331579058E-018 -61.750000000000000 -7.2898028532007418E-019 -0.0000000000000000 1.0653233690188188E-018 -61.250000000000000 -7.4854040185787648E-019 -0.0000000000000000 1.0939021409697548E-018 -60.750000000000000 -7.6879291645172588E-019 -0.0000000000000000 1.1234947752688146E-018 -60.250000000000000 -7.8976835672084055E-019 -0.0000000000000000 1.1541422837621198E-018 -59.750000000000000 -8.1149966492926974E-019 -0.0000000000000000 1.1859004244781629E-018 -59.250000000000000 -8.3401887212281357E-019 -0.0000000000000000 1.2188023810709545E-018 -58.750000000000000 -8.5736441351881991E-019 -0.0000000000000000 1.2529111642593197E-018 -58.250000000000000 -8.8157293450902542E-019 -0.0000000000000000 1.2882823321427101E-018 -57.750000000000000 -9.0668260619472503E-019 -0.0000000000000000 1.3249661825202184E-018 -57.250000000000000 -9.3273616485636075E-019 -0.0000000000000000 1.3630307472242773E-018 -56.750000000000000 -9.5977834491621030E-019 -0.0000000000000000 1.4025456567264097E-018 -56.250000000000000 -9.8785570374789836E-019 -0.0000000000000000 1.4435750141520738E-018 -55.750000000000000 -1.0170186978014323E-018 -0.0000000000000000 1.4861860391401097E-018 -55.250000000000000 -1.0473194713411817E-018 -0.0000000000000000 1.5304553476768175E-018 -54.750000000000000 -1.0788116903963931E-018 -0.0000000000000000 1.5764628606688123E-018 -54.250000000000000 -1.1115538736903429E-018 -0.0000000000000000 1.6243086625805030E-018 -53.750000000000000 -1.1456095409180692E-018 -0.0000000000000000 1.6740637636649396E-018 -53.250000000000000 -1.1810415941069622E-018 -0.0000000000000000 1.7258354708740156E-018 -52.750000000000000 -1.2179253255518531E-018 -0.0000000000000000 1.7797114366450223E-018 -52.250000000000000 -1.2563277622898360E-018 -0.0000000000000000 1.8358205050263161E-018 -51.750000000000000 -1.2963321541276550E-018 -0.0000000000000000 1.8942696365897657E-018 -51.250000000000000 -1.3380208230663401E-018 -0.0000000000000000 1.9551774891667743E-018 -50.750000000000000 -1.3814782102386110E-018 -0.0000000000000000 2.0186728048840797E-018 -50.250000000000000 -1.4268040709963159E-018 -0.0000000000000000 2.0848857661333680E-018 -49.750000000000000 -1.4740955656863027E-018 -0.0000000000000000 2.1539795103969751E-018 -49.250000000000000 -1.5234578541289543E-018 -0.0000000000000000 2.2260909213538143E-018 -48.750000000000000 -1.5750035241270230E-018 -0.0000000000000000 2.3014005016178983E-018 -48.250000000000000 -1.6288556374312468E-018 -0.0000000000000000 2.3800760099902985E-018 -47.750000000000000 -1.6851450341368904E-018 -0.0000000000000000 2.4623045089331819E-018 -47.250000000000000 -1.7440104031829663E-018 -0.0000000000000000 2.5483116110509324E-018 -46.750000000000000 -1.8055934407711511E-018 -0.0000000000000000 2.6382584497517693E-018 -46.250000000000000 -1.8700515769641900E-018 -0.0000000000000000 2.7324452292835328E-018 -45.750000000000000 -1.9375561010268996E-018 -0.0000000000000000 2.8310479266414727E-018 -45.250000000000000 -2.0082856124320917E-018 -0.0000000000000000 2.9343793115923879E-018 -44.750000000000000 -2.0824253196666972E-018 -0.0000000000000000 3.0426839185680490E-018 -44.250000000000000 -2.1601937926814778E-018 -0.0000000000000000 3.1562902785363885E-018 -43.750000000000000 -2.2418042796473431E-018 -0.0000000000000000 3.2755112204635955E-018 -43.250000000000000 -2.3274973362535263E-018 -0.0000000000000000 3.4006902570900111E-018 -42.750000000000000 -2.4175298924315487E-018 -0.0000000000000000 3.5322005295630964E-018 -42.250000000000000 -2.5121693213402616E-018 -0.0000000000000000 3.6704634477544340E-018 -41.750000000000000 -2.6117168173572054E-018 -0.0000000000000000 3.8158663210044423E-018 -41.250000000000000 -2.7164904100581851E-018 -0.0000000000000000 3.9689259326306887E-018 -40.750000000000000 -2.8268273320573507E-018 -0.0000000000000000 4.1300800951546540E-018 -40.250000000000000 -2.9431058927603780E-018 -0.0000000000000000 4.2999272619316521E-018 -39.750000000000000 -3.0657242771506802E-018 -0.0000000000000000 4.4790420030253849E-018 -39.250000000000000 -3.1951128951725047E-018 -0.0000000000000000 4.6680252520795950E-018 -38.750000000000000 -3.3317414021800948E-018 -0.0000000000000000 4.8676102208750014E-018 -38.250000000000000 -3.4761133164356194E-018 -0.0000000000000000 5.0784512034514310E-018 -37.750000000000000 -3.6287821811254188E-018 -0.0000000000000000 5.3014777652193713E-018 -37.250000000000000 -3.7903430393011593E-018 -0.0000000000000000 5.5374605820259403E-018 -36.750000000000000 -3.9614483927729257E-018 -0.0000000000000000 5.7873608565515395E-018 -36.250000000000000 -4.1427928737091696E-018 -0.0000000000000000 6.0522116124647745E-018 -35.750000000000000 -4.3351631098446365E-018 -0.0000000000000000 6.3331545918535650E-018 -35.250000000000000 -4.5393805323771929E-018 -0.0000000000000000 6.6314400004478247E-018 -34.750000000000000 -4.7563751593427694E-018 -0.0000000000000000 6.9483880250586878E-018 -34.250000000000000 -4.9871459424753985E-018 -0.0000000000000000 7.2853945154169415E-018 -33.750000000000000 -5.2327818836717544E-018 -0.0000000000000000 7.6441117096026527E-018 -33.250000000000000 -5.4944897617083694E-018 -0.0000000000000000 8.0263025241605151E-018 -32.750000000000000 -5.7735810735294044E-018 -0.0000000000000000 8.4338836144623744E-018 -32.250000000000000 -6.0715029965780382E-018 -0.0000000000000000 8.8689918194302384E-018 -31.750000000000000 -6.3898777659194918E-018 -0.0000000000000000 9.3339083212650165E-018 -31.250000000000000 -6.7304498532446200E-018 -0.0000000000000000 9.8312266281286501E-018 -30.750000000000000 -7.0951568632097302E-018 -0.0000000000000000 1.0363855941304121E-017 -30.250000000000000 -7.4861678215674375E-018 -0.0000000000000000 1.0934775360396543E-017 -29.750000000000000 -7.9058242451804705E-018 -0.0000000000000000 1.1547657036580683E-017 -29.250000000000000 -8.3568272911458842E-018 -0.0000000000000000 1.2206150040367028E-017 -28.750000000000000 -8.8420643265731113E-018 -0.0000000000000000 1.2914666519809688E-017 -28.250000000000000 -9.3648323741688432E-018 -0.0000000000000000 1.3678002139875503E-017 -27.750000000000000 -9.9287941886846237E-018 -0.0000000000000000 1.4501413192148191E-017 -27.250000000000000 -1.0537994608418349E-017 -0.0000000000000000 1.5390880811939103E-017 -26.750000000000000 -1.1197039033054122E-017 -0.0000000000000000 1.6353046867448777E-017 -26.250000000000000 -1.1911052335002867E-017 -0.0000000000000000 1.7395543424617573E-017 -25.750000000000000 -1.2685802483564923E-017 -0.0000000000000000 1.8526586176664591E-017 -25.250000000000000 -1.3527835492314859E-017 -0.0000000000000000 1.9755886628369063E-017 -24.750000000000000 -1.4444470937409570E-017 -0.0000000000000000 2.1093941140220499E-017 -24.250000000000000 -1.5444046076748439E-017 -0.0000000000000000 2.2553226478258579E-017 -23.750000000000000 -1.6536052511456647E-017 -0.0000000000000000 2.4147350063137935E-017 -23.250000000000000 -1.7731312275249197E-017 -0.0000000000000000 2.5892081545251940E-017 -22.750000000000000 -1.9042158917568407E-017 -0.0000000000000000 2.7805305524349758E-017 -22.250000000000000 -2.0482693384724883E-017 -0.0000000000000000 2.9907900550619271E-017 -21.750000000000000 -2.2069110061557975E-017 -0.0000000000000000 3.2223273191926933E-017 -21.250000000000000 -2.3820137626747420E-017 -0.0000000000000000 3.4778929164782210E-017 -20.750000000000000 -2.5757428317567356E-017 -0.0000000000000000 3.7606379831023672E-017 -20.250000000000000 -2.7905934506075340E-017 -0.0000000000000000 4.0741831087605495E-017 -19.750000000000000 -3.0295077737515658E-017 -0.0000000000000000 4.4228234908348387E-017 -19.250000000000000 -3.2958913580091479E-017 -0.0000000000000000 4.8115310609167198E-017 -18.750000000000000 -3.5937469304083861E-017 -0.0000000000000000 5.2461116462429188E-017 -18.250000000000000 -3.9278198115531905E-017 -0.0000000000000000 5.7335446719027400E-017 -17.750000000000000 -4.3036775924504897E-017 -0.0000000000000000 6.2819093296463164E-017 -17.250000000000000 -4.7279933579639331E-017 -0.0000000000000000 6.9009373666482495E-017 -16.750000000000000 -5.2087224165519768E-017 -0.0000000000000000 7.6022529879727852E-017 -16.250000000000000 -5.7554083924083320E-017 -0.0000000000000000 8.3996427151367261E-017 -15.750000000000000 -6.3796008081849198E-017 -0.0000000000000000 9.3100843455938201E-017 -15.250000000000000 -7.0953625936191501E-017 -0.0000000000000000 1.0353953139570585E-016 -14.750000000000000 -7.9198445617711486E-017 -0.0000000000000000 1.1556413284843017E-016 -14.250000000000000 -8.8742128550386266E-017 -0.0000000000000000 1.2948054561144590E-016 -13.750000000000000 -9.9847073167812487E-017 -0.0000000000000000 1.4567287045456281E-016 -13.250000000000000 -1.1284070982306848E-016 -0.0000000000000000 1.6461575132757528E-016 -12.750000000000000 -1.2813662129224943E-016 -0.0000000000000000 1.8691405788342838E-016 -12.250000000000000 -1.4626044129314650E-016 -0.0000000000000000 2.1333337029390639E-016 -11.750000000000000 -1.6788658478948174E-016 -0.0000000000000000 2.4485020482591683E-016 -11.250000000000000 -1.9389022485428727E-016 -0.0000000000000000 2.8274422510766064E-016 -10.750000000000000 -2.2541929958923327E-016 -0.0000000000000000 3.2868384714225266E-016 -10.250000000000000 -2.6400020790728855E-016 -0.0000000000000000 3.8488592233078990E-016 -9.7500000000000000 -3.1168712726494136E-016 -0.0000000000000000 4.5434034779279572E-016 -9.2500000000000000 -3.7128699464183320E-016 -0.0000000000000000 5.4112135253007222E-016 -8.7500000000000000 -4.4670211038747788E-016 -0.0000000000000000 6.5092734937896717E-016 -8.2500000000000000 -5.4345374121238909E-016 -0.0000000000000000 7.9174623359113839E-016 -7.7500000000000000 -6.6951868822385593E-016 -0.0000000000000000 9.7516671005623279E-016 -7.2500000000000000 -8.3669237727559940E-016 -0.0000000000000000 1.2183552858065511E-015 -6.7500000000000000 -1.0628769237858778E-015 -0.0000000000000000 1.5472376060065243E-015 -6.2500000000000000 -1.3760717932623883E-015 -0.0000000000000000 2.0024256890427643E-015 -5.7500000000000000 -1.8216276323999795E-015 -0.0000000000000000 2.6496994799402045E-015 -5.2500000000000000 -2.4760559014915922E-015 -0.0000000000000000 3.5998241306804180E-015 -4.7500000000000000 -3.4748339741609456E-015 -0.0000000000000000 5.0489740523546864E-015 -4.2500000000000000 -5.0723055586309814E-015 -0.0000000000000000 7.3644460751227561E-015 -3.7500000000000000 -7.7818094162366383E-015 -0.0000000000000000 1.1287908569315413E-014 -3.2500000000000000 -1.2738579236315384E-014 -0.0000000000000000 1.8454957089720694E-014 -2.7500000000000000 -2.2773847745754405E-014 -0.0000000000000000 3.2936066947286425E-014 -2.2500000000000000 -4.6221076995279039E-014 -0.0000000000000000 6.6680444617328524E-014 -1.7500000000000000 -1.1443609608652374E-013 -0.0000000000000000 1.6439217763583282E-013 -1.2500000000000000 -4.0556965748054290E-013 -0.0000000000000000 5.7800763318993344E-013 -0.75000000000000000 -3.5603224174414369E-012 -0.0000000000000000 4.9598969599628995E-012 -0.25000000000000000 -7.2278016498417925E-012 -0.0000000000000000 1.1046310829791426E-011 0.25000000000000000 -8.5440575671637766E-013 -0.0000000000000000 1.2839854718460226E-012 0.75000000000000000 -2.8440057760306116E-013 -0.0000000000000000 4.2334107807989186E-013 1.2500000000000000 -1.3092103077234538E-013 -0.0000000000000000 1.9398836662453014E-013 1.7500000000000000 -7.1668575047060182E-014 -0.0000000000000000 1.0597034166591832E-013 2.2500000000000000 -4.3779587255234939E-014 -0.0000000000000000 6.4576172102493071E-014 2.7500000000000000 -2.8851205289794411E-014 -0.0000000000000000 4.2514475954318014E-014 3.2500000000000000 -2.0103129038059237E-014 -0.0000000000000000 2.9590695959125403E-014 3.7500000000000000 -1.4611079682005261E-014 -0.0000000000000000 2.1490894358127665E-014 4.2500000000000000 -1.0992303906852380E-014 -0.0000000000000000 1.6164172447967694E-014 4.7500000000000000 -8.4922661866700849E-015 -0.0000000000000000 1.2484462468022642E-014 5.2500000000000000 -6.8468601361611450E-015 -0.0000000000000000 1.0090100317612278E-014 5.7500000000000000 -5.4054747519098328E-015 -0.0000000000000000 7.9423001930245571E-015 6.2500000000000000 -4.4154630101186956E-015 -0.0000000000000000 6.4831229027263788E-015 6.7500000000000000 -3.6614628119025333E-015 -0.0000000000000000 5.3755486330982368E-015 7.2500000000000000 -3.0738360279460726E-015 -0.0000000000000000 4.5105909498311298E-015 7.7500000000000000 -2.6074846578728846E-015 -0.0000000000000000 3.8257087911693394E-015 8.2500000000000000 -2.2345081692488976E-015 -0.0000000000000000 3.2776641904775686E-015 8.7500000000000000 -1.9288605094596830E-015 -0.0000000000000000 2.8287896045139067E-015 9.2500000000000000 -1.6787299073391601E-015 -0.0000000000000000 2.4612528546642551E-015 9.7500000000000000 -1.4755944882480572E-015 -0.0000000000000000 2.1647738779303110E-015 10.250000000000000 -1.2983154416849037E-015 -0.0000000000000000 1.9038168995164105E-015 10.750000000000000 -1.1499360522064491E-015 -0.0000000000000000 1.6856212742742662E-015 11.250000000000000 -1.0256008749009043E-015 -0.0000000000000000 1.5037185955870827E-015 11.750000000000000 -9.1767593570651497E-016 -0.0000000000000000 1.3449473124022189E-015 12.250000000000000 -8.2720538800353783E-016 -0.0000000000000000 1.2126788203769121E-015 12.750000000000000 -7.9069345802693325E-016 -0.0000000000000000 1.1703932166000794E-015 13.250000000000000 -6.8674013234210354E-016 -0.0000000000000000 1.0096400723914724E-015 13.750000000000000 -6.1590501537179832E-016 -0.0000000000000000 9.0293304270325643E-016 14.250000000000000 -5.6056212913401659E-016 -0.0000000000000000 8.2134294406813519E-016 14.750000000000000 -5.1254950503576775E-016 -0.0000000000000000 7.5080651976729363E-016 15.250000000000000 -4.7017928220762923E-016 -0.0000000000000000 6.8865589265652576E-016 15.750000000000000 -4.3252941973760091E-016 -0.0000000000000000 6.3345325337853740E-016 16.250000000000000 -3.9891729106116783E-016 -0.0000000000000000 5.8418024948171978E-016 16.750000000000000 -3.6879635427038473E-016 -0.0000000000000000 5.4004080491319084E-016 17.250000000000000 -3.4171404213409224E-016 -0.0000000000000000 5.0035446866132002E-016 17.750000000000000 -3.1728923030355749E-016 -0.0000000000000000 4.6456875938829931E-016 18.250000000000000 -2.9519721262898276E-016 -0.0000000000000000 4.3220270572955805E-016 18.750000000000000 -2.7516225019912290E-016 -0.0000000000000000 4.0284956804521047E-016 19.250000000000000 -2.5694621140503637E-016 -0.0000000000000000 3.7616821465405238E-016 19.750000000000000 -2.4034410933035291E-016 -0.0000000000000000 3.5185008915541275E-016 20.250000000000000 -2.2517821641839594E-016 -0.0000000000000000 3.2963760893986522E-016 20.750000000000000 -2.1129477203150195E-016 -0.0000000000000000 3.0930340445657748E-016 21.250000000000000 -1.9855883916669583E-016 -0.0000000000000000 2.9065039813787670E-016 21.750000000000000 -1.8685249763176261E-016 -0.0000000000000000 2.7350697317040632E-016 22.250000000000000 -1.7607250642592610E-016 -0.0000000000000000 2.5772088350425909E-016 22.750000000000000 -1.6612721965651291E-016 -0.0000000000000000 2.4315873433382444E-016 23.250000000000000 -1.5693662346879013E-016 -0.0000000000000000 2.2969975562903178E-016 23.750000000000000 -1.4842908138581007E-016 -0.0000000000000000 2.1724259872082374E-016 24.250000000000000 -1.4054145278535810E-016 -0.0000000000000000 2.0569346998931928E-016 24.750000000000000 -1.3321738917875017E-016 -0.0000000000000000 1.9497024346901109E-016 25.250000000000000 -1.2640694271815840E-016 -0.0000000000000000 1.8499986216203049E-016 25.750000000000000 -1.2006530440766035E-016 -0.0000000000000000 1.7571488036733159E-016 26.250000000000000 -1.1415182188653163E-016 -0.0000000000000000 1.6705773706528665E-016 26.750000000000000 -1.0863075518701781E-016 -0.0000000000000000 1.5897455357814829E-016 27.250000000000000 -1.0346938368498294E-016 -0.0000000000000000 1.5141869122564115E-016 27.750000000000000 -9.8638559611829553E-017 -0.0000000000000000 1.4434665950378061E-016 28.250000000000000 -9.4111817324494801E-017 -0.0000000000000000 1.3772024635946796E-016 28.750000000000000 -8.9865021606485753E-017 -0.0000000000000000 1.3150366591987216E-016 29.250000000000000 -8.5877008678966698E-017 -0.0000000000000000 1.2566591043925321E-016 29.750000000000000 -8.2127831415523749E-017 -0.0000000000000000 1.2017779533148136E-016 30.250000000000000 -7.8599452467338827E-017 -0.0000000000000000 1.1501334353776312E-016 30.750000000000000 -7.5275917694436755E-017 -0.0000000000000000 1.1014838088822092E-016 31.250000000000000 -7.2141939184802870E-017 -0.0000000000000000 1.0556154329227529E-016 31.750000000000000 -6.9184405335847576E-017 -0.0000000000000000 1.0123263511844842E-016 32.250000000000000 -6.6390635159357004E-017 -0.0000000000000000 9.7143644954764629E-017 32.750000000000000 -6.3749425938111249E-017 -0.0000000000000000 9.3277411708354447E-017 33.250000000000000 -6.1250081886452381E-017 -0.0000000000000000 8.9619450001969283E-017 33.750000000000000 -5.8883278501374779E-017 -0.0000000000000000 8.6155364240279493E-017 34.250000000000000 -5.6640284354006912E-017 -0.0000000000000000 8.2872642609365885E-017 34.750000000000000 -5.4512825553115599E-017 -0.0000000000000000 7.9759663203077101E-017 35.250000000000000 -5.2493545520048201E-017 -0.0000000000000000 7.6803948405810634E-017 35.750000000000000 -5.0575309594604498E-017 -0.0000000000000000 7.3997138154015332E-017 36.250000000000000 -4.8752104210680853E-017 -0.0000000000000000 7.1328772509755588E-017 36.750000000000000 -4.7017941479726432E-017 -0.0000000000000000 6.8790848117839287E-017 37.250000000000000 -4.5367196067978577E-017 -0.0000000000000000 6.6374831292189661E-017 37.750000000000000 -4.3794980256579625E-017 -0.0000000000000000 6.4074114780355903E-017 38.250000000000000 -4.2296577959479243E-017 -0.0000000000000000 6.1881463484265784E-017 38.750000000000000 -4.0867599138529175E-017 -0.0000000000000000 5.9790416654474802E-017 39.250000000000000 -3.9504220448019936E-017 -0.0000000000000000 5.7794961241968366E-017 39.750000000000000 -3.8202228848543650E-017 -0.0000000000000000 5.5890083710018229E-017 40.250000000000000 -3.6958555048799030E-017 -0.0000000000000000 5.4070157582223643E-017 40.750000000000000 -3.5769716518815436E-017 -0.0000000000000000 5.2330508490558525E-017 41.250000000000000 -3.4632773900395981E-017 -0.0000000000000000 5.0666694012830424E-017 41.750000000000000 -3.3544761153446511E-017 -0.0000000000000000 4.9074653423868048E-017 42.250000000000000 -3.2503183516178797E-017 -0.0000000000000000 4.7550503231180689E-017 42.750000000000000 -3.1505494012529240E-017 -0.0000000000000000 4.6090776717700620E-017 43.250000000000000 -3.0549362912143636E-017 -0.0000000000000000 4.4691562876736008E-017 43.750000000000000 -2.9632565030438180E-017 -0.0000000000000000 4.3350162498909498E-017 44.250000000000000 -2.8753125741934402E-017 -0.0000000000000000 4.2063350090556419E-017 44.750000000000000 -2.7909091723973329E-017 -0.0000000000000000 4.0828246510813338E-017 45.250000000000000 -2.7098705759449522E-017 -0.0000000000000000 3.9642460604058340E-017 45.750000000000000 -2.6320273852736035E-017 -0.0000000000000000 3.8503550250005858E-017 46.250000000000000 -2.5572213879631381E-017 -0.0000000000000000 3.7409036738510468E-017 46.750000000000000 -2.4853037619006719E-017 -0.0000000000000000 3.6356755282910603E-017 47.250000000000000 -2.4161303371099951E-017 -0.0000000000000000 3.5344693750857946E-017 47.750000000000000 -2.3495745004266926E-017 -0.0000000000000000 3.4370843460612596E-017 48.250000000000000 -2.2855084931520005E-017 -0.0000000000000000 3.3433532721536234E-017 48.750000000000000 -2.2238184301024663E-017 -0.0000000000000000 3.2530773004884653E-017 49.250000000000000 -2.1643841499427567E-017 -0.0000000000000000 3.1661314623159004E-017 49.750000000000000 -2.1071087421409169E-017 -0.0000000000000000 3.0823335983654844E-017 50.250000000000000 -2.0518994873175949E-017 -0.0000000000000000 3.0015550307984682E-017 50.750000000000000 -1.9986530658968592E-017 -0.0000000000000000 2.9236569420041403E-017 51.250000000000000 -1.9472856901845931E-017 -0.0000000000000000 2.8485032903863376E-017 51.750000000000000 -1.8977163597341038E-017 -0.0000000000000000 2.7759769328220072E-017 52.250000000000000 -1.8498583278341628E-017 -0.0000000000000000 2.7059644514670037E-017 52.750000000000000 -1.8036448696905863E-017 -0.0000000000000000 2.6383468852773539E-017 53.250000000000000 -1.7589966266632531E-017 -0.0000000000000000 2.5730248998017637E-017 53.750000000000000 -1.7158575724140512E-017 -0.0000000000000000 2.5099128067805757E-017 54.250000000000000 -1.6741546939694092E-017 -0.0000000000000000 2.4488965715224345E-017 54.750000000000000 -1.6338294727450677E-017 -0.0000000000000000 2.3899050836800077E-017 55.250000000000000 -1.5948309814051478E-017 -0.0000000000000000 2.3328453995946637E-017 55.750000000000000 -1.5570908825699628E-017 -0.0000000000000000 2.2776432387425779E-017 56.250000000000000 -1.5205709125204480E-017 -0.0000000000000000 2.2242134645465186E-017 56.750000000000000 -1.4852180226926972E-017 -0.0000000000000000 2.1724898945510428E-017 57.250000000000000 -1.4509826849910816E-017 -0.0000000000000000 2.1223980986663073E-017 57.750000000000000 -1.4178192586666356E-017 -0.0000000000000000 2.0738828559748065E-017 58.250000000000000 -1.3856870584047981E-017 -0.0000000000000000 2.0268818004990881E-017 58.750000000000000 -1.3545462381433634E-017 -0.0000000000000000 1.9813183251913278E-017 59.250000000000000 -1.3243623279273424E-017 -0.0000000000000000 1.9371677841150773E-017 59.750000000000000 -1.2950924540650732E-017 -0.0000000000000000 1.8943394924212624E-017 60.250000000000000 -1.2667021289378831E-017 -0.0000000000000000 1.8528126908814237E-017 60.750000000000000 -1.2391594070556119E-017 -0.0000000000000000 1.8125165489999373E-017 61.250000000000000 -1.2124329905004862E-017 -0.0000000000000000 1.7734184793642084E-017 61.750000000000000 -1.1864900702068528E-017 -0.0000000000000000 1.7354665923184050E-017 62.250000000000000 -1.1613053640061151E-017 -0.0000000000000000 1.6986211767095767E-017 62.750000000000000 -1.1368474049569953E-017 -0.0000000000000000 1.6628443711797289E-017 63.250000000000000 -1.1130912778215590E-017 -0.0000000000000000 1.6280953980508044E-017 63.750000000000000 -1.0900132022056106E-017 -0.0000000000000000 1.5943323241112267E-017 64.250000000000000 -1.0675849478441815E-017 -0.0000000000000000 1.5615218831196852E-017 64.750000000000000 -1.0457858987794476E-017 -0.0000000000000000 1.5296330602417058E-017 65.250000000000000 -1.0245935416677859E-017 -0.0000000000000000 1.4986304313684619E-017 65.750000000000000 -1.0039849668826508E-017 -0.0000000000000000 1.4684837335662444E-017 66.250000000000000 -9.8394307432832872E-018 -0.0000000000000000 1.4391627087626870E-017 66.750000000000000 -9.6444468729093354E-018 -0.0000000000000000 1.4106443711979849E-017 67.250000000000000 -9.4547560220100711E-018 -0.0000000000000000 1.3828914328980429E-017 67.750000000000000 -9.2701300986782829E-018 -0.0000000000000000 1.3558872299848810E-017 68.250000000000000 -9.0904274787518361E-018 -0.0000000000000000 1.3295976549545581E-017 68.750000000000000 -8.9154717095249301E-018 -0.0000000000000000 1.3040057376484842E-017 69.250000000000000 -8.7450937067035257E-018 -0.0000000000000000 1.2790850164418163E-017 69.750000000000000 -8.5791671233962672E-018 -0.0000000000000000 1.2548094263329952E-017 70.250000000000000 -8.4175362897463189E-018 -0.0000000000000000 1.2311690721581765E-017 70.750000000000000 -8.2600535409731951E-018 -0.0000000000000000 1.2081287281497445E-017 71.250000000000000 -8.1065817010882886E-018 -0.0000000000000000 1.1856833513846179E-017 71.750000000000000 -7.9570041569640759E-018 -0.0000000000000000 1.1638016486289754E-017 72.250000000000000 -7.8112004173578340E-018 -0.0000000000000000 1.1424727293851460E-017 72.750000000000000 -7.6690297846363959E-018 -0.0000000000000000 1.1216762676543318E-017 73.250000000000000 -7.5303816663063589E-018 -0.0000000000000000 1.1013946523304288E-017 73.750000000000000 -7.3951565051493183E-018 -0.0000000000000000 1.0816164755696600E-017 74.250000000000000 -7.2632348332512812E-018 -0.0000000000000000 1.0623163896250970E-017 74.750000000000000 -7.1345376503639400E-018 -0.0000000000000000 1.0434914889379798E-017 75.250000000000000 -7.0089516623515879E-018 -0.0000000000000000 1.0251206421067373E-017 75.750000000000000 -6.8863799463977716E-018 -0.0000000000000000 1.0071925971178504E-017 76.250000000000000 -6.7667309346821937E-018 -0.0000000000000000 9.8968992099027310E-018 76.750000000000000 -6.6499051995023469E-018 -0.0000000000000000 9.7260244589033668E-018 77.250000000000000 -6.5358486789435458E-018 -0.0000000000000000 9.5592165403508497E-018 77.750000000000000 -6.4244562201049044E-018 -0.0000000000000000 9.3962426397290827E-018 78.250000000000000 -6.3156580797224209E-018 -0.0000000000000000 9.2370886581975868E-018 78.750000000000000 -6.2093708031459516E-018 -0.0000000000000000 9.0816040032592026E-018 79.250000000000000 -6.1055173911471440E-018 -0.0000000000000000 8.9297308943203796E-018 79.750000000000000 -6.0040472199975577E-018 -0.0000000000000000 8.7813041417469502E-018 80.250000000000000 -5.9048720895955035E-018 -0.0000000000000000 8.6362517603404096E-018 80.750000000000000 -5.8079257266727458E-018 -0.0000000000000000 8.4944476796426062E-018 81.250000000000000 -5.7131728728317878E-018 -0.0000000000000000 8.3558145387551105E-018 81.750000000000000 -5.6205147854401674E-018 -0.0000000000000000 8.2202771287312342E-018 82.250000000000000 -5.5299023154394736E-018 -0.0000000000000000 8.0877553449711263E-018 82.750000000000000 -5.4412836438318410E-018 -0.0000000000000000 7.9581340095526876E-018 83.250000000000000 -5.3546092282127054E-018 -0.0000000000000000 7.8313643555456393E-018 83.750000000000000 -5.2698267163963481E-018 -0.0000000000000000 7.7073376741054767E-018 84.250000000000000 -5.1868643239221369E-018 -0.0000000000000000 7.5860010633050236E-018 84.750000000000000 -5.1056983387896678E-018 -0.0000000000000000 7.4672668157715977E-018 85.250000000000000 -5.0262629780011202E-018 -0.0000000000000000 7.3510908009327801E-018 85.750000000000000 -4.9485176637911522E-018 -0.0000000000000000 7.2373586692999279E-018 86.250000000000000 -4.8723940130835464E-018 -0.0000000000000000 7.1260434252307450E-018 86.750000000000000 -4.7978866774393764E-018 -0.0000000000000000 7.0170336154003005E-018 87.250000000000000 -4.7249378946604953E-018 -0.0000000000000000 6.9103388568476521E-018 87.750000000000000 -4.6534971472977520E-018 -0.0000000000000000 6.8058353809154552E-018 88.250000000000000 -4.5835387397350463E-018 -0.0000000000000000 6.7035084782063457E-018 88.750000000000000 -4.5150093849942430E-018 -0.0000000000000000 6.6033004013528405E-018 89.250000000000000 -4.4478748008000281E-018 -0.0000000000000000 6.5050925518631394E-018 89.750000000000000 -4.3821147649055423E-018 -0.0000000000000000 6.4089054121945160E-018 90.250000000000000 -4.3176755323007489E-018 -0.0000000000000000 6.3146521981494028E-018 90.750000000000000 -4.2545258453756324E-018 -0.0000000000000000 6.2222872761849914E-018 91.250000000000000 -4.1926441618293932E-018 -0.0000000000000000 6.1317715458187108E-018 91.750000000000000 -4.1319923190215655E-018 -0.0000000000000000 6.0430776345406080E-018 92.250000000000000 -4.0725426559662178E-018 -0.0000000000000000 5.9561173087988622E-018 92.750000000000000 -4.0142607352621552E-018 -0.0000000000000000 5.8708673067658340E-018 93.250000000000000 -3.9571110301024371E-018 -0.0000000000000000 5.7872833344668278E-018 93.750000000000000 -3.9010779225032314E-018 -0.0000000000000000 5.7053186723298512E-018 94.250000000000000 -3.8461272542077664E-018 -0.0000000000000000 5.6249407327996905E-018 94.750000000000000 -3.7922396296019016E-018 -0.0000000000000000 5.5461181393270367E-018 95.250000000000000 -3.7393773417850597E-018 -0.0000000000000000 5.4688034451024774E-018 95.750000000000000 -3.6875223524515407E-018 -0.0000000000000000 5.3929643953384496E-018 96.250000000000000 -3.6366484428254499E-018 -0.0000000000000000 5.3185549702201118E-018 96.750000000000000 -3.5867407900024063E-018 -0.0000000000000000 5.2455557908061858E-018 97.250000000000000 -3.5377653139156092E-018 -0.0000000000000000 5.1739353302979127E-018 97.750000000000000 -3.4897009196152651E-018 -0.0000000000000000 5.1036215333190640E-018 98.250000000000000 -3.4425309168258802E-018 -0.0000000000000000 5.0346420470593745E-018 98.750000000000000 -3.3962229922328108E-018 -0.0000000000000000 4.9669101931895742E-018 99.250000000000000 -3.3507766991383616E-018 -0.0000000000000000 4.9004363905044212E-018 99.750000000000000 -3.3061602006556202E-018 -0.0000000000000000 4.8351918223475792E-018 PKmN~_$o1NuRadioMC/SignalGen/ARZ/shower_library/.gitignore*.pkl PKmNMrvEHEH@NuRadioMC/SignalGen/ARZ/shower_library/nue_1EeV_CC_1_s0001.t1005# # AIRES Export file (single shower data) # # DATE: 14/Dec/2011 13:22:14; AIRES version 2.8.4a # USER: jaime; HOST: fpastroj # # Task name : nue_1EeV_CC_1 # # Task starting date: 14/Dec/2011 12:52:10 # Number of showers : 1 # # # TABLE 1005: Longitudinal development: Electrons. # # SHOWER NUMBER 1 # # # Units used: # # Depth --- g/cm2 # Length --- m # Time --- ns # Angle --- deg # Energy --- GeV # # Columns: # # 1 Bin #, 2 Depth of obs. level, 3 Observable # # >>>>>>>> # # # GRD 924876. 0.00000 # 1 1000.00 3232.93 2 1017.68 1472.34 3 1035.36 1464.48 4 1053.05 32285.6 5 1070.73 33648.4 6 1088.41 28408.9 7 1106.09 114113. 8 1123.77 223239. 9 1141.45 530092. 10 1159.14 977671. 11 1176.82 2.066595E+06 12 1194.50 3.639884E+06 13 1212.18 6.297081E+06 14 1229.86 8.891962E+06 15 1247.54 1.273030E+07 16 1265.23 1.726550E+07 17 1282.91 2.180347E+07 18 1300.59 2.734213E+07 19 1318.27 3.645856E+07 20 1335.95 4.726941E+07 21 1353.63 5.789914E+07 22 1371.32 7.125759E+07 23 1389.00 8.297473E+07 24 1406.68 9.785503E+07 25 1424.36 1.102297E+08 26 1442.04 1.236063E+08 27 1459.72 1.399705E+08 28 1477.41 1.548110E+08 29 1495.09 1.735514E+08 30 1512.77 1.829977E+08 31 1530.45 1.981181E+08 32 1548.13 2.126882E+08 33 1565.82 2.268591E+08 34 1583.50 2.368766E+08 35 1601.18 2.465559E+08 36 1618.86 2.546711E+08 37 1636.54 2.568927E+08 38 1654.22 2.639516E+08 39 1671.91 2.713868E+08 40 1689.59 2.707491E+08 41 1707.27 2.717492E+08 42 1724.95 2.713205E+08 43 1742.63 2.637991E+08 44 1760.31 2.550935E+08 45 1778.00 2.493948E+08 46 1795.68 2.422170E+08 47 1813.36 2.333280E+08 48 1831.04 2.244496E+08 49 1848.72 2.156548E+08 50 1866.40 2.042478E+08 51 1884.09 1.955786E+08 52 1901.77 1.882844E+08 53 1919.45 1.777685E+08 54 1937.13 1.664675E+08 55 1954.81 1.567522E+08 56 1972.50 1.490752E+08 57 1990.18 1.384912E+08 58 2007.86 1.303294E+08 59 2025.54 1.224982E+08 60 2043.22 1.198870E+08 61 2060.90 1.111910E+08 62 2078.59 1.071663E+08 63 2096.27 1.021912E+08 64 2113.95 9.663968E+07 65 2131.63 9.248051E+07 66 2149.31 9.139354E+07 67 2166.99 8.735896E+07 68 2184.68 8.617166E+07 69 2202.36 8.367901E+07 70 2220.04 8.115464E+07 71 2237.72 7.998487E+07 72 2255.40 8.285463E+07 73 2273.08 8.007518E+07 74 2290.77 8.426219E+07 75 2308.45 8.674350E+07 76 2326.13 8.618626E+07 77 2343.81 9.047092E+07 78 2361.49 9.355506E+07 79 2379.17 9.233883E+07 80 2396.86 9.740773E+07 81 2414.54 9.699176E+07 82 2432.22 9.979528E+07 83 2449.90 1.017573E+08 84 2467.58 1.015144E+08 85 2485.27 1.016279E+08 86 2502.95 1.053750E+08 87 2520.63 1.095567E+08 88 2538.31 1.126936E+08 89 2555.99 1.121615E+08 90 2573.67 1.153448E+08 91 2591.36 1.186480E+08 92 2609.04 1.177704E+08 93 2626.72 1.177208E+08 94 2644.40 1.182560E+08 95 2662.08 1.193112E+08 96 2679.76 1.165966E+08 97 2697.45 1.152866E+08 98 2715.13 1.174866E+08 99 2732.81 1.162229E+08 100 2750.49 1.133640E+08 101 2768.17 1.130365E+08 102 2785.85 1.127482E+08 103 2803.54 1.099621E+08 104 2821.22 1.077106E+08 105 2838.90 1.043017E+08 106 2856.58 9.976524E+07 107 2874.26 9.796946E+07 108 2891.94 9.211427E+07 109 2909.63 9.025018E+07 110 2927.31 8.720373E+07 111 2944.99 8.466138E+07 112 2962.67 8.399015E+07 113 2980.35 8.065030E+07 114 2998.04 7.909138E+07 115 3015.72 7.664591E+07 116 3033.40 7.451456E+07 117 3051.08 7.441262E+07 118 3068.76 7.440226E+07 119 3086.44 7.096869E+07 120 3104.13 7.028913E+07 121 3121.81 6.840230E+07 122 3139.49 6.704798E+07 123 3157.17 6.571106E+07 124 3174.85 6.412268E+07 125 3192.53 6.218954E+07 126 3210.22 6.201738E+07 127 3227.90 6.088978E+07 128 3245.58 5.961550E+07 129 3263.26 5.880330E+07 130 3280.94 5.662224E+07 131 3298.62 5.585691E+07 132 3316.31 5.523559E+07 133 3333.99 5.330232E+07 134 3351.67 5.210990E+07 135 3369.35 4.993058E+07 136 3387.03 4.606396E+07 137 3404.72 4.253954E+07 138 3422.40 4.135208E+07 139 3440.08 3.916921E+07 140 3457.76 3.603118E+07 141 3475.44 3.369080E+07 142 3493.12 3.084575E+07 143 3510.81 3.095197E+07 144 3528.49 2.953925E+07 145 3546.17 2.772430E+07 146 3563.85 2.488192E+07 147 3581.53 2.379425E+07 148 3599.21 2.205581E+07 149 3616.90 2.017305E+07 150 3634.58 1.886678E+07 151 3652.26 1.793024E+07 152 3669.94 1.668677E+07 153 3687.62 1.479541E+07 154 3705.30 1.368695E+07 155 3722.99 1.231419E+07 156 3740.67 1.180468E+07 157 3758.35 1.114293E+07 158 3776.03 1.057310E+07 159 3793.71 9.439083E+06 160 3811.39 7.959293E+06 161 3829.08 7.370622E+06 162 3846.76 6.426467E+06 163 3864.44 6.551154E+06 164 3882.12 5.929840E+06 165 3899.80 4.347108E+06 166 3917.49 4.349442E+06 167 3935.17 3.815584E+06 168 3952.85 2.974529E+06 169 3970.53 2.377652E+06 170 3988.21 2.162060E+06 171 4005.89 2.346045E+06 172 4023.58 1.958755E+06 173 4041.26 1.712700E+06 174 4058.94 1.669228E+06 175 4076.62 1.209242E+06 176 4094.30 1.072411E+06 177 4111.98 752670. 178 4129.67 968199. 179 4147.35 907136. 180 4165.03 687722. 181 4182.71 590164. 182 4200.39 719114. 183 4218.07 555010. 184 4235.76 587191. 185 4253.44 499485. 186 4271.12 405798. 187 4288.80 419900. 188 4306.48 336568. 189 4324.17 349819. 190 4341.85 188877. 191 4359.53 195610. 192 4377.21 107688. 193 4394.89 113477. 194 4412.57 48421.7 195 4430.26 126549. 196 4447.94 61923.8 197 4465.62 96564.5 198 4483.30 14388.5 199 4500.98 43424.7 200 4518.66 18446.9 201 4536.35 19215.8 202 4554.03 8807.57 203 4571.71 1214.28 204 4589.39 891.583 205 4607.07 9454.90 206 4624.75 23189.6 207 4642.44 0.00000 208 4660.12 3897.69 209 4677.80 8712.53 210 4695.48 8822.12 211 4713.16 0.00000 212 4730.84 131.760 213 4748.53 223.415 214 4766.21 0.00000 215 4783.89 99.8805 216 4801.57 1091.11 217 4819.25 610.350 218 4836.94 425.736 219 4854.62 469.789 220 4872.30 0.00000 221 4889.98 1054.15 222 4907.66 1417.53 223 4925.34 0.00000 224 4943.03 0.00000 225 4960.71 0.00000 226 4978.39 0.00000 227 4996.07 374.597 228 5013.75 154.131 229 5031.43 0.00000 230 5049.12 0.00000 231 5066.80 0.00000 232 5084.48 132.195 233 5102.16 377.204 234 5119.84 331.946 235 5137.52 1755.45 236 5155.21 0.00000 237 5172.89 122.207 238 5190.57 0.00000 239 5208.25 180.063 240 5225.93 0.00000 241 5243.61 929.527 242 5261.30 320.488 243 5278.98 0.00000 244 5296.66 873.665 245 5314.34 0.00000 246 5332.02 473.299 247 5349.71 1372.57 248 5367.39 0.00000 249 5385.07 0.00000 250 5402.75 1078.01 251 5420.43 0.00000 252 5438.11 0.00000 253 5455.80 2750.26 254 5473.48 1031.82 255 5491.16 0.00000 256 5508.84 13099.4 257 5526.52 0.00000 258 5544.20 0.00000 259 5561.89 0.00000 260 5579.57 0.00000 261 5597.25 944.097 262 5614.93 0.00000 263 5632.61 508.984 264 5650.29 0.00000 265 5667.98 542.201 266 5685.66 890.162 267 5703.34 0.00000 268 5721.02 319.310 269 5738.70 846.767 270 5756.39 173.289 271 5774.07 0.00000 272 5791.75 476.643 273 5809.43 1098.27 274 5827.11 0.00000 275 5844.79 0.00000 276 5862.48 0.00000 277 5880.16 0.00000 278 5897.84 0.00000 279 5915.52 0.00000 280 5933.20 0.00000 281 5950.88 0.00000 282 5968.57 341.519 283 5986.25 0.00000 284 6003.93 0.00000 285 6021.61 0.00000 286 6039.29 1180.81 287 6056.97 334.883 288 6074.66 1492.69 289 6092.34 162.370 290 6110.02 0.00000 291 6127.70 0.00000 292 6145.38 917.791 293 6163.06 0.00000 294 6180.75 0.00000 295 6198.43 0.00000 296 6216.11 153.317 297 6233.79 319.250 298 6251.47 0.00000 299 6269.16 658.706 300 6286.84 345.805 301 6304.52 163.681 302 6322.20 412.293 303 6339.88 58.5008 304 6357.56 1352.61 305 6375.25 0.00000 306 6392.93 704.733 307 6410.61 0.00000 308 6428.29 0.00000 309 6445.97 1031.83 310 6463.65 229.281 311 6481.34 1968.12 312 6499.02 0.00000 313 6516.70 0.00000 314 6534.38 308.254 315 6552.06 0.00000 316 6569.74 713.063 317 6587.43 322.872 318 6605.11 0.00000 319 6622.79 0.00000 320 6640.47 0.00000 321 6658.15 0.00000 322 6675.83 0.00000 323 6693.52 0.00000 324 6711.20 0.00000 325 6728.88 0.00000 326 6746.56 0.00000 327 6764.24 0.00000 328 6781.93 242.994 329 6799.61 0.00000 330 6817.29 161.507 331 6834.97 0.00000 332 6852.65 161.115 333 6870.33 0.00000 334 6888.02 202.191 335 6905.70 908.782 336 6923.38 333.424 337 6941.06 0.00000 338 6958.74 0.00000 339 6976.42 0.00000 340 6994.11 0.00000 341 7011.79 0.00000 342 7029.47 0.00000 343 7047.15 989.473 344 7064.83 0.00000 345 7082.51 0.00000 346 7100.20 0.00000 347 7117.88 2880.91 348 7135.56 254.902 349 7153.24 748.373 350 7170.92 0.00000 351 7188.61 960.170 352 7206.29 0.00000 353 7223.97 1819.60 354 7241.65 0.00000 355 7259.33 258.324 356 7277.01 0.00000 357 7294.70 38849.0 358 7312.38 0.00000 359 7330.06 0.00000 360 7347.74 0.00000 361 7365.42 0.00000 362 7383.10 0.00000 363 7400.79 0.00000 364 7418.47 0.00000 365 7436.15 0.00000 366 7453.83 24873.9 367 7471.51 14886.7 368 7489.19 0.00000 369 7506.88 0.00000 370 7524.56 441.621 371 7542.24 267.841 372 7559.92 300.579 373 7577.60 0.00000 374 7595.28 153.204 375 7612.97 321.587 376 7630.65 0.00000 377 7648.33 0.00000 378 7666.01 0.00000 379 7683.69 0.00000 380 7701.38 0.00000 381 7719.06 865.565 382 7736.74 0.00000 383 7754.42 0.00000 384 7772.10 0.00000 385 7789.78 0.00000 386 7807.47 153.204 387 7825.15 0.00000 388 7842.83 0.00000 389 7860.51 270.298 390 7878.19 0.00000 391 7895.87 0.00000 392 7913.56 0.00000 393 7931.24 0.00000 394 7948.92 325.175 395 7966.60 0.00000 396 7984.28 0.00000 397 8001.96 0.00000 398 8019.65 683.514 399 8037.33 0.00000 400 8055.01 0.00000 401 8072.69 441.988 402 8090.37 0.00000 403 8108.06 0.00000 404 8125.74 153.789 405 8143.42 0.00000 406 8161.10 0.00000 407 8178.78 153.789 408 8196.46 42.4543 409 8214.15 0.00000 410 8231.83 0.00000 411 8249.51 0.00000 412 8267.19 232.983 413 8284.87 0.00000 414 8302.55 0.00000 415 8320.24 0.00000 416 8337.92 0.00000 417 8355.60 0.00000 418 8373.28 0.00000 419 8390.96 325.175 420 8408.64 0.00000 421 8426.33 0.00000 422 8444.01 0.00000 423 8461.69 153.789 424 8479.37 0.00000 425 8497.05 296.628 426 8514.73 548.136 427 8532.42 0.00000 428 8550.10 0.00000 429 8567.78 0.00000 430 8585.46 228.181 431 8603.14 231.672 432 8620.83 0.00000 433 8638.51 0.00000 434 8656.19 569.294 435 8673.87 0.00000 436 8691.55 0.00000 437 8709.23 53.4415 438 8726.92 0.00000 439 8744.60 0.00000 440 8762.28 287.100 441 8779.96 0.00000 442 8797.64 0.00000 443 8815.32 0.00000 444 8833.01 0.00000 445 8850.69 0.00000 446 8868.37 0.00000 447 8886.05 307.993 448 8903.73 0.00000 449 8921.41 0.00000 450 8939.10 0.00000 451 8956.78 0.00000 452 8974.46 0.00000 453 8992.14 0.00000 454 9009.82 435.165 455 9027.50 577.938 456 9045.19 410.204 457 9062.87 228.181 458 9080.55 49.5408 459 9098.23 0.00000 460 9115.91 256.345 461 9133.60 0.00000 462 9151.28 0.00000 463 9168.96 0.00000 464 9186.64 0.00000 465 9204.32 0.00000 466 9222.00 167.131 467 9239.69 0.00000 468 9257.37 0.00000 469 9275.05 0.00000 470 9292.73 410.555 471 9310.41 0.00000 472 9328.09 0.00000 473 9345.78 0.00000 474 9363.46 0.00000 475 9381.14 0.00000 476 9398.82 0.00000 477 9416.50 0.00000 478 9434.18 228.181 479 9451.87 0.00000 480 9469.55 0.00000 481 9487.23 0.00000 482 9504.91 0.00000 483 9522.59 0.00000 484 9540.28 0.00000 485 9557.96 0.00000 486 9575.64 0.00000 487 9593.32 0.00000 488 9611.00 0.00000 489 9628.68 0.00000 490 9646.37 0.00000 491 9664.05 0.00000 492 9681.73 229.298 493 9699.41 0.00000 494 9717.09 0.00000 495 9734.77 0.00000 496 9752.46 0.00000 497 9770.14 0.00000 498 9787.82 0.00000 499 9805.50 0.00000 500 9823.18 0.00000 501 9840.86 0.00000 502 9858.55 0.00000 503 9876.23 0.00000 504 9893.91 0.00000 505 9911.59 6443.59 506 9929.27 6443.59 507 9946.95 6443.59 508 9964.64 6443.59 509 9982.32 0.00000 510 10000.0 0.00000 # PKmN|-EHEH@NuRadioMC/SignalGen/ARZ/shower_library/nue_1EeV_CC_1_s0001.t1006# # AIRES Export file (single shower data) # # DATE: 14/Dec/2011 13:22:14; AIRES version 2.8.4a # USER: jaime; HOST: fpastroj # # Task name : nue_1EeV_CC_1 # # Task starting date: 14/Dec/2011 12:52:10 # Number of showers : 1 # # # TABLE 1006: Longitudinal development: Positrons. # # SHOWER NUMBER 1 # # # Units used: # # Depth --- g/cm2 # Length --- m # Time --- ns # Angle --- deg # Energy --- GeV # # Columns: # # 1 Bin #, 2 Depth of obs. level, 3 Observable # # >>>>>>>> # # # GRD 924876. 0.00000 # 1 1000.00 3049.78 2 1017.68 17.0926 3 1035.36 10034.8 4 1053.05 10674.9 5 1070.73 14094.0 6 1088.41 22288.4 7 1106.09 56720.6 8 1123.77 165444. 9 1141.45 378367. 10 1159.14 695268. 11 1176.82 1.408973E+06 12 1194.50 2.306829E+06 13 1212.18 3.656368E+06 14 1229.86 5.483575E+06 15 1247.54 8.166568E+06 16 1265.23 1.074778E+07 17 1282.91 1.332673E+07 18 1300.59 1.717365E+07 19 1318.27 2.270720E+07 20 1335.95 2.834893E+07 21 1353.63 3.488920E+07 22 1371.32 4.247121E+07 23 1389.00 5.017654E+07 24 1406.68 5.787421E+07 25 1424.36 6.553268E+07 26 1442.04 7.343178E+07 27 1459.72 8.109074E+07 28 1477.41 8.945844E+07 29 1495.09 9.725092E+07 30 1512.77 1.045567E+08 31 1530.45 1.122654E+08 32 1548.13 1.212032E+08 33 1565.82 1.273931E+08 34 1583.50 1.347476E+08 35 1601.18 1.382782E+08 36 1618.86 1.443199E+08 37 1636.54 1.451629E+08 38 1654.22 1.475658E+08 39 1671.91 1.500075E+08 40 1689.59 1.518481E+08 41 1707.27 1.500670E+08 42 1724.95 1.510382E+08 43 1742.63 1.458257E+08 44 1760.31 1.432269E+08 45 1778.00 1.355518E+08 46 1795.68 1.314164E+08 47 1813.36 1.264088E+08 48 1831.04 1.197919E+08 49 1848.72 1.172436E+08 50 1866.40 1.102669E+08 51 1884.09 1.045284E+08 52 1901.77 9.887447E+07 53 1919.45 9.230206E+07 54 1937.13 8.902969E+07 55 1954.81 8.539241E+07 56 1972.50 7.828865E+07 57 1990.18 7.379574E+07 58 2007.86 7.064050E+07 59 2025.54 6.615466E+07 60 2043.22 6.244678E+07 61 2060.90 6.084618E+07 62 2078.59 5.570074E+07 63 2096.27 5.417382E+07 64 2113.95 5.129673E+07 65 2131.63 5.008583E+07 66 2149.31 4.818046E+07 67 2166.99 4.682100E+07 68 2184.68 4.543031E+07 69 2202.36 4.528879E+07 70 2220.04 4.386018E+07 71 2237.72 4.378445E+07 72 2255.40 4.438564E+07 73 2273.08 4.529736E+07 74 2290.77 4.561576E+07 75 2308.45 4.846655E+07 76 2326.13 4.895286E+07 77 2343.81 5.068341E+07 78 2361.49 5.162146E+07 79 2379.17 5.164246E+07 80 2396.86 5.379879E+07 81 2414.54 5.312834E+07 82 2432.22 5.499221E+07 83 2449.90 5.617274E+07 84 2467.58 5.525334E+07 85 2485.27 5.822199E+07 86 2502.95 5.873933E+07 87 2520.63 6.026534E+07 88 2538.31 6.151157E+07 89 2555.99 6.116230E+07 90 2573.67 6.240741E+07 91 2591.36 6.360710E+07 92 2609.04 6.418831E+07 93 2626.72 6.511786E+07 94 2644.40 6.349806E+07 95 2662.08 6.570875E+07 96 2679.76 6.329024E+07 97 2697.45 6.402012E+07 98 2715.13 6.702386E+07 99 2732.81 6.383798E+07 100 2750.49 6.339288E+07 101 2768.17 6.306080E+07 102 2785.85 6.325948E+07 103 2803.54 5.996106E+07 104 2821.22 5.794678E+07 105 2838.90 5.659445E+07 106 2856.58 5.509344E+07 107 2874.26 5.315511E+07 108 2891.94 4.814630E+07 109 2909.63 4.851825E+07 110 2927.31 4.729888E+07 111 2944.99 4.595258E+07 112 2962.67 4.539954E+07 113 2980.35 4.329255E+07 114 2998.04 4.352320E+07 115 3015.72 4.212608E+07 116 3033.40 4.076036E+07 117 3051.08 4.110784E+07 118 3068.76 4.029425E+07 119 3086.44 3.996725E+07 120 3104.13 3.964744E+07 121 3121.81 3.824348E+07 122 3139.49 3.753435E+07 123 3157.17 3.628941E+07 124 3174.85 3.549219E+07 125 3192.53 3.539946E+07 126 3210.22 3.364908E+07 127 3227.90 3.340557E+07 128 3245.58 3.285957E+07 129 3263.26 3.142868E+07 130 3280.94 3.087398E+07 131 3298.62 3.108580E+07 132 3316.31 3.034989E+07 133 3333.99 2.930117E+07 134 3351.67 2.656532E+07 135 3369.35 2.581682E+07 136 3387.03 2.389779E+07 137 3404.72 2.195282E+07 138 3422.40 2.080148E+07 139 3440.08 2.058486E+07 140 3457.76 1.895712E+07 141 3475.44 1.742791E+07 142 3493.12 1.667611E+07 143 3510.81 1.668356E+07 144 3528.49 1.506365E+07 145 3546.17 1.409020E+07 146 3563.85 1.371797E+07 147 3581.53 1.276311E+07 148 3599.21 1.169752E+07 149 3616.90 1.024766E+07 150 3634.58 9.537581E+06 151 3652.26 9.295473E+06 152 3669.94 8.432446E+06 153 3687.62 7.741677E+06 154 3705.30 7.299386E+06 155 3722.99 6.654746E+06 156 3740.67 6.137488E+06 157 3758.35 5.638358E+06 158 3776.03 5.737257E+06 159 3793.71 4.792094E+06 160 3811.39 3.804271E+06 161 3829.08 3.563441E+06 162 3846.76 2.894593E+06 163 3864.44 3.116024E+06 164 3882.12 2.701908E+06 165 3899.80 2.365477E+06 166 3917.49 2.436202E+06 167 3935.17 1.883884E+06 168 3952.85 1.269142E+06 169 3970.53 1.271346E+06 170 3988.21 1.210368E+06 171 4005.89 1.237600E+06 172 4023.58 1.093715E+06 173 4041.26 745655. 174 4058.94 685592. 175 4076.62 613016. 176 4094.30 516314. 177 4111.98 513463. 178 4129.67 358676. 179 4147.35 563791. 180 4165.03 294192. 181 4182.71 290204. 182 4200.39 344642. 183 4218.07 269352. 184 4235.76 176062. 185 4253.44 225299. 186 4271.12 138411. 187 4288.80 169790. 188 4306.48 149799. 189 4324.17 149252. 190 4341.85 156468. 191 4359.53 95774.4 192 4377.21 28911.5 193 4394.89 60643.7 194 4412.57 20550.9 195 4430.26 26213.3 196 4447.94 10254.8 197 4465.62 51553.2 198 4483.30 51553.2 199 4500.98 18939.9 200 4518.66 10062.6 201 4536.35 8788.61 202 4554.03 233.154 203 4571.71 0.00000 204 4589.39 0.00000 205 4607.07 9166.15 206 4624.75 9166.15 207 4642.44 9166.15 208 4660.12 9166.15 209 4677.80 0.00000 210 4695.48 265.420 211 4713.16 857.668 212 4730.84 0.00000 213 4748.53 0.00000 214 4766.21 0.00000 215 4783.89 263.812 216 4801.57 0.00000 217 4819.25 0.00000 218 4836.94 0.00000 219 4854.62 0.00000 220 4872.30 0.00000 221 4889.98 0.00000 222 4907.66 0.00000 223 4925.34 740.722 224 4943.03 331.937 225 4960.71 0.00000 226 4978.39 0.00000 227 4996.07 0.00000 228 5013.75 0.00000 229 5031.43 0.00000 230 5049.12 0.00000 231 5066.80 0.00000 232 5084.48 0.00000 233 5102.16 0.00000 234 5119.84 0.00000 235 5137.52 0.00000 236 5155.21 0.00000 237 5172.89 0.00000 238 5190.57 0.00000 239 5208.25 0.00000 240 5225.93 0.00000 241 5243.61 0.00000 242 5261.30 0.00000 243 5278.98 0.00000 244 5296.66 0.00000 245 5314.34 0.00000 246 5332.02 0.00000 247 5349.71 0.00000 248 5367.39 428.999 249 5385.07 0.00000 250 5402.75 0.00000 251 5420.43 0.00000 252 5438.11 0.00000 253 5455.80 0.00000 254 5473.48 0.00000 255 5491.16 0.00000 256 5508.84 0.00000 257 5526.52 0.00000 258 5544.20 0.00000 259 5561.89 0.00000 260 5579.57 0.00000 261 5597.25 0.00000 262 5614.93 0.00000 263 5632.61 0.00000 264 5650.29 0.00000 265 5667.98 0.00000 266 5685.66 0.00000 267 5703.34 0.00000 268 5721.02 0.00000 269 5738.70 0.00000 270 5756.39 0.00000 271 5774.07 0.00000 272 5791.75 0.00000 273 5809.43 0.00000 274 5827.11 0.00000 275 5844.79 0.00000 276 5862.48 0.00000 277 5880.16 0.00000 278 5897.84 0.00000 279 5915.52 0.00000 280 5933.20 0.00000 281 5950.88 0.00000 282 5968.57 0.00000 283 5986.25 0.00000 284 6003.93 0.00000 285 6021.61 0.00000 286 6039.29 0.00000 287 6056.97 0.00000 288 6074.66 0.00000 289 6092.34 0.00000 290 6110.02 0.00000 291 6127.70 0.00000 292 6145.38 0.00000 293 6163.06 0.00000 294 6180.75 0.00000 295 6198.43 0.00000 296 6216.11 0.00000 297 6233.79 0.00000 298 6251.47 0.00000 299 6269.16 0.00000 300 6286.84 0.00000 301 6304.52 126.796 302 6322.20 0.00000 303 6339.88 0.00000 304 6357.56 0.00000 305 6375.25 0.00000 306 6392.93 0.00000 307 6410.61 0.00000 308 6428.29 0.00000 309 6445.97 1262.65 310 6463.65 234.477 311 6481.34 0.00000 312 6499.02 0.00000 313 6516.70 0.00000 314 6534.38 0.00000 315 6552.06 0.00000 316 6569.74 0.00000 317 6587.43 0.00000 318 6605.11 0.00000 319 6622.79 0.00000 320 6640.47 0.00000 321 6658.15 0.00000 322 6675.83 0.00000 323 6693.52 0.00000 324 6711.20 0.00000 325 6728.88 0.00000 326 6746.56 0.00000 327 6764.24 0.00000 328 6781.93 0.00000 329 6799.61 0.00000 330 6817.29 0.00000 331 6834.97 0.00000 332 6852.65 0.00000 333 6870.33 0.00000 334 6888.02 0.00000 335 6905.70 0.00000 336 6923.38 0.00000 337 6941.06 0.00000 338 6958.74 0.00000 339 6976.42 0.00000 340 6994.11 0.00000 341 7011.79 0.00000 342 7029.47 0.00000 343 7047.15 0.00000 344 7064.83 0.00000 345 7082.51 0.00000 346 7100.20 0.00000 347 7117.88 0.00000 348 7135.56 0.00000 349 7153.24 0.00000 350 7170.92 0.00000 351 7188.61 0.00000 352 7206.29 0.00000 353 7223.97 0.00000 354 7241.65 0.00000 355 7259.33 0.00000 356 7277.01 0.00000 357 7294.70 0.00000 358 7312.38 0.00000 359 7330.06 0.00000 360 7347.74 0.00000 361 7365.42 0.00000 362 7383.10 0.00000 363 7400.79 0.00000 364 7418.47 0.00000 365 7436.15 0.00000 366 7453.83 0.00000 367 7471.51 0.00000 368 7489.19 0.00000 369 7506.88 0.00000 370 7524.56 0.00000 371 7542.24 0.00000 372 7559.92 0.00000 373 7577.60 0.00000 374 7595.28 1352.55 375 7612.97 0.00000 376 7630.65 0.00000 377 7648.33 0.00000 378 7666.01 0.00000 379 7683.69 0.00000 380 7701.38 0.00000 381 7719.06 0.00000 382 7736.74 0.00000 383 7754.42 0.00000 384 7772.10 837.664 385 7789.78 0.00000 386 7807.47 0.00000 387 7825.15 0.00000 388 7842.83 0.00000 389 7860.51 0.00000 390 7878.19 0.00000 391 7895.87 0.00000 392 7913.56 0.00000 393 7931.24 0.00000 394 7948.92 0.00000 395 7966.60 0.00000 396 7984.28 0.00000 397 8001.96 0.00000 398 8019.65 0.00000 399 8037.33 0.00000 400 8055.01 0.00000 401 8072.69 0.00000 402 8090.37 0.00000 403 8108.06 0.00000 404 8125.74 0.00000 405 8143.42 0.00000 406 8161.10 0.00000 407 8178.78 0.00000 408 8196.46 0.00000 409 8214.15 0.00000 410 8231.83 0.00000 411 8249.51 0.00000 412 8267.19 0.00000 413 8284.87 0.00000 414 8302.55 0.00000 415 8320.24 0.00000 416 8337.92 0.00000 417 8355.60 0.00000 418 8373.28 0.00000 419 8390.96 0.00000 420 8408.64 0.00000 421 8426.33 0.00000 422 8444.01 0.00000 423 8461.69 0.00000 424 8479.37 0.00000 425 8497.05 0.00000 426 8514.73 0.00000 427 8532.42 0.00000 428 8550.10 0.00000 429 8567.78 0.00000 430 8585.46 0.00000 431 8603.14 0.00000 432 8620.83 0.00000 433 8638.51 0.00000 434 8656.19 0.00000 435 8673.87 0.00000 436 8691.55 0.00000 437 8709.23 44.3981 438 8726.92 0.00000 439 8744.60 0.00000 440 8762.28 0.00000 441 8779.96 0.00000 442 8797.64 0.00000 443 8815.32 0.00000 444 8833.01 0.00000 445 8850.69 0.00000 446 8868.37 0.00000 447 8886.05 0.00000 448 8903.73 0.00000 449 8921.41 0.00000 450 8939.10 0.00000 451 8956.78 0.00000 452 8974.46 0.00000 453 8992.14 0.00000 454 9009.82 0.00000 455 9027.50 0.00000 456 9045.19 0.00000 457 9062.87 0.00000 458 9080.55 0.00000 459 9098.23 0.00000 460 9115.91 0.00000 461 9133.60 0.00000 462 9151.28 0.00000 463 9168.96 0.00000 464 9186.64 0.00000 465 9204.32 0.00000 466 9222.00 0.00000 467 9239.69 0.00000 468 9257.37 0.00000 469 9275.05 0.00000 470 9292.73 0.00000 471 9310.41 0.00000 472 9328.09 0.00000 473 9345.78 0.00000 474 9363.46 0.00000 475 9381.14 0.00000 476 9398.82 0.00000 477 9416.50 0.00000 478 9434.18 0.00000 479 9451.87 0.00000 480 9469.55 0.00000 481 9487.23 0.00000 482 9504.91 0.00000 483 9522.59 0.00000 484 9540.28 0.00000 485 9557.96 0.00000 486 9575.64 0.00000 487 9593.32 0.00000 488 9611.00 0.00000 489 9628.68 0.00000 490 9646.37 0.00000 491 9664.05 0.00000 492 9681.73 0.00000 493 9699.41 0.00000 494 9717.09 0.00000 495 9734.77 0.00000 496 9752.46 0.00000 497 9770.14 0.00000 498 9787.82 0.00000 499 9805.50 0.00000 500 9823.18 0.00000 501 9840.86 0.00000 502 9858.55 0.00000 503 9876.23 0.00000 504 9893.91 0.00000 505 9911.59 0.00000 506 9929.27 0.00000 507 9946.95 0.00000 508 9964.64 0.00000 509 9982.32 0.00000 510 10000.0 0.00000 # PKmNsjj;NuRadioMC/SignalGen/ARZ/shower_library/shower_lib_hash.json{ "1.1": "c3d6cf106207e98f3df327b5172f61e9e857f856", "1.2": "dca0809a94c0ae2feed1f4307be8dae10f93d8d2" }PKmNh3$p3NuRadioMC/SignalGen/ARZ/tests/T01CompareWithFast.py#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np from NuRadioReco.utilities import units from scipy import interpolate as intp from scipy import integrate as int from scipy import constants from matplotlib import pyplot as plt import os import pickle from time import time from NuRadioMC.SignalGen.ARZ.ARZ import * energy = 1.e6 * units.TeV theta = 55 * units.deg R = 1 * units.km N = 512 dt = 0.1 * units.ns n_index = 1.78 y = 0 ccnc = 'cc' flavor = 12 # e = 12, mu = 14, tau = 16 cdir = os.path.dirname(__file__) bins, depth_e, N_e = np.loadtxt(os.path.join(cdir, "../shower_library/nue_1EeV_CC_1_s0001.t1005"), unpack=True) bins, depth_p, N_p = np.loadtxt(os.path.join(cdir, "../shower_library/nue_1EeV_CC_1_s0001.t1006"), unpack=True) depth_e *= units.g / units.cm**2 depth_p *= units.g / units.cm**2 depth_e -= 1000 * units.g/units.cm**2 # all simulations have an artificial offset of 1000 g/cm^2 depth_p -= 1000 * units.g/units.cm**2 # sanity check if files electron and positron profiles are compatible if (not np.all(depth_e == depth_p)): raise ImportError("electron and positron profile have different depths") t0 = time() vp2 = get_vector_potential_fast(energy, theta, N, dt, "EM", n_index, R, profile_depth=depth_e, profile_ce=(N_e-N_p)) print("fast calculation took {:.1f} ms".format((time() -t0)*1e3)) t0 = time() vp = get_vector_potential(energy, theta, N, dt, y, ccnc, flavor, n_index, R, profile_depth=depth_e, profile_ce=(N_e-N_p)) print("slow calculation took {:.4f}s".format(time() -t0)) # generate time array tt = np.arange(0, (N + 1) * dt, dt) tt = tt + 0.5 * dt - tt.mean() fig, ax = plt.subplots(1, 1) ax.plot(tt, vp[:, 0] / units.V / units.s) ax.plot(tt, vp[:, 1] / units.V / units.s) ax.plot(tt, vp[:, 2] / units.V / units.s) ax.plot(tt, vp2[:, 0] / units.V / units.s, "C0--") ax.plot(tt, vp2[:, 1] / units.V / units.s, "C1--") ax.plot(tt, vp2[:, 2] / units.V / units.s, "C2--") ax.set_xlim(-2, 2) ax.set_xlabel("time [ns]") ax.set_ylabel("vector potential") fig, ax = plt.subplots(1, 1) ax.plot(tt, vp[:, 0]/vp2[:, 0]) ax.plot(tt, vp[:, 2]/ vp2[:, 0]) ax.set_xlim(-2, 2) ax.set_xlabel("time [ns]") ax.set_ylabel("python/fortran implementation") ax.set_ylim(0.8, 1.2) plt.show()PKmNhG'+NuRadioMC/SignalGen/ARZ/tests/T02TestARZ.py#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np from NuRadioReco.utilities import units from scipy import interpolate as intp from scipy import integrate as int from scipy import constants from matplotlib import pyplot as plt import os import pickle from time import time from NuRadioMC.SignalGen.ARZ import ARZ from radiotools import coordinatesystems as cstrafo import logging logging.basicConfig(level=logging.INFO) shower_energy = 1.24e18 *units.eV theta = 56 * units.deg R = 50000 * units.km N = 512 dt = 0.1 * units.ns n_index = 1.78 shower_type = "EM" tt = np.arange(0, dt*N, dt) cARZ = ARZ.ARZ() cARZ.set_seed(100) trace = cARZ.get_time_trace(shower_energy, theta, N, dt, shower_type, n_index, R, shift_for_xmax=False) fig, ax = plt.subplots(1, 1) ax.plot(tt, trace[1]/units.V * units.m / units.milli, label='eTheta') ax.plot(tt, trace[2]/units.V * units.m / units.milli, label='ePhi') ax.plot(tt, trace[0]/units.V * units.m / units.milli, label='eR') ax.set_xlabel("time [ns]") ax.set_ylabel("amplitude [mV/m]") ax.legend() fig.tight_layout() cARZ.set_seed(100) trace = cARZ.get_time_trace(shower_energy, theta, N, dt, shower_type, n_index, R, shift_for_xmax=False) fig, ax = plt.subplots(1, 1) ax.plot(tt, trace[1]/units.V * units.m / units.milli, label='eTheta') ax.plot(tt, trace[2]/units.V * units.m / units.milli, label='ePhi') ax.plot(tt, trace[0]/units.V * units.m / units.milli, label='eR') ax.set_xlabel("time [ns]") ax.set_ylabel("amplitude [mV/m]") ax.set_title("2") ax.legend() fig.tight_layout() cARZ.set_seed(100) trace2 = cARZ.get_time_trace(shower_energy, theta, N, dt, shower_type, n_index, R) fig, ax = plt.subplots(1, 1) ax.plot(tt, trace2[1]/units.V * units.m / units.milli, label='eTheta') ax.plot(tt, trace2[2]/units.V * units.m / units.milli, label='ePhi') ax.plot(tt, trace2[0]/units.V * units.m / units.milli, label='eR') ax.set_title("shifted for xmax") ax.set_xlabel("time [ns]") ax.set_ylabel("amplitude [mV/m]") ax.legend() fig.tight_layout() plt.show() PKmN'0 0 /NuRadioMC/SignalGen/ARZ/tests/T03TestSpeedup.pyfrom __future__ import print_function, division import time import numpy as np from NuRadioMC.utilities import units import os from scipy import interpolate as intp import glob import pickle import sys from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.SignalGen.ARZ import ARZ import logging import matplotlib.gridspec as gridspec logger = logging.getLogger("test") logging.basicConfig(level=logging.WARNING) rho = 0.924 * units.g / units.cm ** 3 # density g cm^-3 if __name__ == "__main__": T=100 * units.ns dt = 0.1*units.ns N = np.int(np.round(T/dt)) tt = np.arange(0, dt*N, dt) n_index = 1.78 theta = np.arccos(1./n_index) R = 1 * units.km a = ARZ.ARZ(library="/Users/cglaser/work/ARIANNA/data/ARZ/v1.1/library_v1.1.pkl", interp_factor=1, interp_factor2=1) # HAD 1e19 shower_energy = 10*units.EeV shower_type = "HAD" n = 10 thetas = np.linspace(theta - 2 * units.deg, theta + 10 *units.deg, n) a.set_interpolation_factor(0.1) a.set_interpolation_factor2(1000) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("0.1x interpolation, 1000x interpolation2, 10 showers = {:.2f}s".format(time.time() - t0)) a.set_interpolation_factor(0.1) a.set_interpolation_factor2(100) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("0.1x interpolation, 100x interpolation2, 10 showers = {:.2f}s".format(time.time() - t0)) a.set_interpolation_factor(1) a.set_interpolation_factor2(1) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("no interpolation, 10 showers = {:.2f}s".format(time.time() - t0)) a.set_interpolation_factor(10) a.set_interpolation_factor2(1) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("10x interpolation, 10 showers = {:.2f}s".format(time.time() - t0)) a.set_interpolation_factor(100) a.set_interpolation_factor2(1) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("100x interpolation, 10 showers = {:.2f}s".format(time.time() - t0)) a.set_interpolation_factor(1) a.set_interpolation_factor2(10) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("10x interpolation2, 10 showers = {:.2f}s".format(time.time() - t0)) a.set_interpolation_factor(1) a.set_interpolation_factor2(100) t0 = time.time() for i in range(n): trace = a.get_time_trace(shower_energy, thetas[i], N, dt, shower_type, n_index, R, iN=i) print("100x interpolation2, 10 showers = {:.2f}s".format(time.time() - t0)) PKmN`U8NuRadioMC/SignalGen/ARZ/tests/T04InterpolationFactors.py#!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np from NuRadioReco.utilities import units from scipy import interpolate as intp from scipy import constants from matplotlib import pyplot as plt import os import pickle from time import time from NuRadioMC.SignalGen.ARZ.ARZ import get_vector_potential_fast import json plot = True outfile = 'interp_1e-3.json' energy = 1.e6 * units.TeV N = 1000 dt = 0.1 * units.ns times = np.arange(0, N * dt, dt) times = times + 0.5 * dt - times.mean() #limits = ( int(N/2-25*units.ns/dt), int(N/2+25*units.ns/dt) ) n_index = 1.78 y = 0 ccnc = 'cc' flavor = 12 # e = 12, mu = 14, tau = 16 cdir = os.path.dirname(__file__) bins, depth_e, N_e = np.loadtxt(os.path.join(cdir, "../shower_library/nue_1EeV_CC_1_s0001.t1005"), unpack=True) bins, depth_p, N_p = np.loadtxt(os.path.join(cdir, "../shower_library/nue_1EeV_CC_1_s0001.t1006"), unpack=True) depth_e *= units.g / units.cm**2 depth_p *= units.g / units.cm**2 depth_e -= 1000 * units.g/units.cm**2 # all simulations have an artificial offset of 1000 g/cm^2 depth_p -= 1000 * units.g/units.cm**2 # sanity check if files electron and positron profiles are compatible if (not np.all(depth_e == depth_p)): raise ImportError("electron and positron profile have different depths") max_interp = 100 Rs = np.linspace(100, 1000, 10) Rs = [100, 200, 500, 1000] thetas = np.linspace(45, 65, 10)*units.deg interp_factors_2 = np.linspace(1,100,100) interp_factors_1 = np.linspace(1,100,100) max_prod = 500 tol = 1.e-3 cut = 1.e-2 check_interp = False res_dict = {} for R in Rs: interp_results = {} for theta in thetas[:]: fields = [] diffs = [] vp_prec = get_vector_potential_fast(energy, theta, N, dt, depth_e, N_e-N_p, "EM", n_index, R, \ interp_factor=max_interp, interp_factor2=max_interp, shift_for_xmax=True) field_prec = -np.array([np.diff(vp_prec[:,0]),np.diff(vp_prec[:,1]),np.diff(vp_prec[:,2])])/dt max_field_x = np.max(np.abs(field_prec[0])) max_field_z = np.max(np.abs(field_prec[2])) mean_field_x = np.max(np.abs(field_prec[0])) mean_field_z = np.max(np.abs(field_prec[2])) index_max_field_x = np.where(np.abs(field_prec[0]) == max_field_x)[0][0] index_max_field_z = np.where(np.abs(field_prec[2]) == max_field_z)[0][0] print(index_max_field_x, index_max_field_z) for interp_factor_1 in interp_factors_1: found = False tol1 = 0 tol2 = 1 for interp_factor_2 in interp_factors_2: if (interp_factor_1*interp_factor_2 > max_prod): break prev_tol1 = tol1 prev_tol2 = tol2 print("R: ", R, ", theta: ", theta/units.deg, ", interpolation", interp_factor_1, interp_factor_2) vp = get_vector_potential_fast(energy, theta, N, dt, depth_e, N_e-N_p, "EM", n_index, R, \ interp_factor=interp_factor_1, interp_factor2=interp_factor_2, shift_for_xmax=True) field = -np.array([np.diff(vp[:,0]),np.diff(vp[:,1]),np.diff(vp[:,2])])/dt #fields.append(field) diff = np.abs(field_prec-field)/np.abs(mean_field_x+mean_field_z)/2 diff = np.nan_to_num(diff) #diffs.append(diff) #print(np.mean(diff[0]),np.mean(diff[2])) #plt.yscale('log') limits_x = [0,0] limits_x[0] = np.where( np.abs(field[0])[0:index_max_field_x] > cut*max_field_x )[0][0] limits_x[1] = np.where( np.abs(field[0])[index_max_field_x:] > cut*max_field_x )[0][-1] + index_max_field_x print("Time limits x: ", times[limits_x[0]], times[limits_x[1]]) limits_z = [0,0] limits_z[0] = np.where( np.abs(field[2])[0:index_max_field_z] > cut*max_field_z )[0][0] limits_z[1] = np.where( np.abs(field[2])[index_max_field_z:] > cut*max_field_z )[0][-1] + index_max_field_z print("Time limits z: ", times[limits_z[0]], times[limits_z[1]]) tol1 = np.sqrt(np.mean(diff[0][limits_x[0]:limits_x[1]]**2)) tol2 = np.sqrt(np.mean(diff[2][limits_z[0]:limits_z[1]]**2)) print(tol1, tol2) #if ( np.abs(prev_tol1-tol1) < tol/1e2 and np.abs(prev_tol2-tol2) < tol/1e2): #and np.abs(tol1-tol) > 0.1*tol and np.abs(tol2-tol) > 0.1*tol ): #break #if (np.mean(diff[0][diff[0]>0]) < tol and np.mean(diff[2][diff[2]>0]) < tol ): #if (np.min(diff[0][diff[0]>0]) < tol and np.min(diff[2][diff[2]>0]) < tol ): if ( (tol1 < tol and tol2 < tol) or check_interp == True or interp_factor_2 == 100 ): interp_results[theta/units.deg] = (interp_factor_1, interp_factor_2) found = True print('found!') if plot: plt.plot(times,field_prec[0]) plt.plot(times[limits_x[0]:limits_x[1]],field[0][limits_x[0]:limits_x[1]]) plt.show() plt.plot(times,field_prec[2]) plt.plot(times[limits_z[0]:limits_z[1]],field[2][limits_z[0]:limits_z[1]]) plt.show() plt.plot(times, diff[0]) plt.yscale('log') plt.show() break plt.clf() if found: break else: print("Tolerance not achieved! Larger interp_factor_1 needed!") print("R: ", R) print("interp results", interp_results) res_dict[R] = dict(interp_results) with open(outfile, 'w') as fout: json.dump(res_dict, fout, sort_keys=True, indent=4) PKmNUPP.NuRadioMC/SignalGen/ARZ/tests/T05PlotInterp.pyimport json import numpy as np import matplotlib.pyplot as plt with open('interp_1e-3.json', 'r') as f: interp = json.load(f) colours = ['red', 'black', 'blue', 'orange', 'cadetblue'] colour_dict = {} for iR, R in enumerate(interp): colour_dict[R] = colours[iR] for R in interp: thetas = interp[R].keys().sort() thetas = [ float(theta) for theta in interp[R].keys() ] thetas = np.sort(np.array(thetas)) thetas_plot = np.array(thetas) interp_factors = [ interp[R][theta] for theta in interp[R].keys() ] interp_factors = np.array(interp_factors) plt.subplot(2,1,1) plt.plot(thetas_plot, interp_factors[:,0], label=R+' m, interp 1', color = colour_dict[R], linestyle = '-', marker='o') plt.subplot(2,1,2) plt.plot(thetas_plot, interp_factors[:,1], label=R+' m, interp 2', color = colour_dict[R], linestyle = '--', marker='o') plt.subplot(2,1,1) plt.ylabel('Interp factor 1') plt.legend() plt.subplot(2,1,2) plt.ylabel('Interp factor 2') plt.xlabel('Angle [deg]') plt.savefig('interpolation_plot.png', format='png') plt.show() PKmNB}/NuRadioMC/SignalGen/tests/T01parmetrizations.pyimport NuRadioMC.SignalGen.RalstonBuniy.askaryan_module as AskaryanModule import NuRadioMC.SignalGen.parametrizations as param from NuRadioMC.utilities import units, fft import numpy as np import matplotlib.pyplot as plt E = 1e17 * units.eV n_index = 1.78 domega = 2.5 * units.deg theta = np.arccos(1. / n_index) + domega dt = .1 * units.ns n_samples = 2048 ff = np.fft.rfftfreq(n_samples, dt) tt = np.arange(0, n_samples * dt, dt) R = 5 * units.km em = False df = ff[1] # width of a frequency bin spec1 = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, True) spec1_noLPM = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, False) spec2 = param.get_frequency_spectrum(E, theta, ff, em, n_index, R, model='Alvarez2012') spec3 = param.get_frequency_spectrum(E, theta, ff, em, n_index, R, model='Alvarez2000') spec4 = param.get_frequency_spectrum(E, theta, ff, em, n_index, R, model='ZHS1992') fig, ax = plt.subplots(1, 1) # ax.plot(ff / units.MHz, np.abs(spec1[0]) / units.V * units.m, 'o', label='Askaryan module eR (without LPM)') ax.plot(ff / units.MHz, np.abs(spec1[1]) / units.V * units.m, 'o', label='Askaryan module eTheta (with LPM)') ax.plot(ff / units.MHz, np.abs(spec1_noLPM[1]) / units.V * units.m, 'o', label='Askaryan module eTheta (without LPM)') ax.plot(ff / units.MHz, np.abs(spec2) / units.V * units.m, 'd', label='pyrex Alvarez2012') ax.plot(ff / units.MHz, np.abs(spec3) / units.V * units.m, 's', label='shelfmc Alvarez2000') ax.plot(ff / units.MHz, np.abs(spec4) / units.V * units.m, '>', label='ZHS1992') ax.semilogx(True) ax.semilogy(True) ax.set_xlim(10, 2e3) ax.set_ylim(1e-9, 1e-3) ax.set_xlabel("frequency [MHz]") ax.set_ylabel("amplitude [V/m] per {:.1f}MHz".format(df / units.MHz)) ax.legend(fontsize='small') ax.set_title("E = {:.1e}eV, $\Delta\Omega$ = {:.1f}deg, R = {:.1f}km, EM={}".format(E/units.eV, domega / units.deg, R / units.km, em)) fig.tight_layout() if(em): fig.savefig("comparison_em.png") else: fig.savefig("comparison_had.png") plt.show() # test if different models are normalized such that they give the same time trace # independent of the bin width # 1st askaryan module fig, ax = plt.subplots(1, 1) n_trace = 2 ** 10 # samples of trace dt = 0.1 * units.ns tt = np.arange(0, n_trace * dt, dt) ff = np.fft.rfftfreq(n_trace, dt) trace = AskaryanModule.get_time_trace(E, theta, ff, 0, n=1.78, R=R) ax.plot(tt / units.ns, np.abs(trace[0]), label="eR dt = {:.2f}ns, n={}".format(dt / units.ns, n_trace)) ax.plot(tt / units.ns, np.abs(trace[1]), label="dt = {:.2f}ns, n={}".format(dt / units.ns, n_trace)) print('maximum amplitude for {:d} samples is: {:4g}V/m'.format(n_trace, np.abs(trace).max())) n_trace = 2 ** 12 # samples of trace dt = 0.1 * units.ns tt = np.arange(0, n_trace * dt, dt) ff = np.fft.rfftfreq(n_trace, dt) trace = AskaryanModule.get_time_trace(E, theta, ff, 0, n=1.78, R=R) ax.plot(tt / units.ns, np.abs(trace[0]), label="eR dt = {:.2f}ns, n={}".format(dt / units.ns, n_trace)) ax.plot(tt / units.ns, np.abs(trace[1]), label="dt = {:.2f}ns, n={}".format(dt / units.ns, n_trace)) print('maximum amplitude for {:d} samples is: {:4g}V/m'.format(n_trace, np.abs(trace).max())) ax.legend() ax.set_title("askaryan module") plt.show() a = 1 / 0 # 2nd pyrex fig, ax = plt.subplots(1, 1) n_trace = 2 ** 10 # samples of trace dt = 0.1 * units.ns tt = np.arange(0, n_trace * dt, dt) ff = np.fft.rfftfreq(n_trace, dt) trace = fft.freq2time(param.get_frequency_spectrum(E, theta, ff, 0, n_index, R, model='Alvarez2012')) ax.plot(tt / units.ns, trace, label="dt = {:.2f}ns, n={}".format(dt / units.ns, n_trace)) n_trace = 2 ** 12 # samples of trace dt = 0.1 * units.ns tt = np.arange(0, n_trace * dt, dt) ff = np.fft.rfftfreq(n_trace, dt) trace = fft.freq2time(param.get_frequency_spectrum(E, theta, ff, 0, n_index, R, model='Alvarez2012')) ax.plot(tt / units.ns, trace, '--', label="dt = {:.2f}ns, n={}".format(dt / units.ns, n_trace)) ax.legend() ax.set_title("pyrex") plt.show() PKmN4 +NuRadioMC/SignalGen/tests/T02plot_models.pyimport NuRadioMC.SignalGen.RalstonBuniy.askaryan_module as AskaryanModule import NuRadioMC.SignalGen.parametrizations as param from NuRadioMC.utilities import units, fft import numpy as np import matplotlib.pyplot as plt from radiotools import plthelpers as php model = 'Alvarez2000' dt = .1 * units.ns n_samples = 2048 ff = np.fft.rfftfreq(n_samples, dt) tt = np.arange(0, n_samples * dt, dt) df = ff[1] # width of a frequency bin if(model == 'Alvarez2000'): from NuRadioMC.SignalGen.RalstonBuniy.askaryan_module import get_frequency_spectrum # plot dependence on cherenkov cone E = 1e18 * units.eV n_index = 1.78 R = 1 * units.km domegas = np.array([0, 1, 2, 3, 4, 5, 7.5, 10]) * units.deg emstr = ['EM', 'had.'] em = np.array([True, False]) # lpm = np.array([False, True, False]) for i in range(2): # loop over EM/EM+LPM/HAD fig, ax = plt.subplots(1, 1) for iOmega, domega in enumerate(domegas): theta = np.arccos(1. / n_index) + domega spec1 = param.get_frequency_spectrum(E, theta, n_samples, dt, em[i], n_index, R, model=model) ax.plot(ff / units.MHz, np.abs(spec1) / units.V * units.m, php.get_color_linestyle(iOmega), label='$\Delta \Omega$ = {:.1f}deg'.format(domega / units.deg)) ax.semilogx(True) ax.semilogy(True) ax.set_xlim(10, 2e3) ax.set_ylim(1e-7, 1e-1) ax.set_xlabel("frequency [MHz]") ax.set_ylabel("amplitude [V/m] per {:.1f}MHz".format(df / units.MHz)) ax.legend(fontsize='small') ax.set_title("{} E = {:.1e}eV, R = {:.1f}km, {}".format(model, E / units.eV, R / units.km, emstr[i])) fig.tight_layout() fig.savefig("plots/{}_E{:.1e}eV_R{:.0f}m_EM{}.png".format(model, E / units.eV, R / units.m, em[i])) plt.show() plt.close('all') # plot distance dependence for domegas E = 1e16 * units.eV n_index = 1.78 domegas = np.array([0, 2.5, 5]) * units.deg em = np.array([True, True, False]) lpm = np.array([False, True, False]) Rs = np.array([100, 200, 500, 1000, 2000]) * units.m for i in range(3): # loop over EM/EM+LPM/HAD for iOmega, domega in enumerate(domegas): theta = np.arccos(1. / n_index) + domega fig, ax = plt.subplots(1, 1) for iR, R in enumerate(Rs): spec1 = get_frequency_spectrum(E, theta, ff, em[i], n_index, R, lpm[i]) * R ax.plot(ff / units.MHz, np.abs(spec1[1]) / units.V * units.m, php.get_color_linestyle(iR), label='R = {:.0f}m'.format(R / units.m)) ax.semilogx(True) ax.semilogy(True) ax.set_xlim(10, 2e3) ax.set_ylim(1e-6, 1e-0) ax.set_xlabel("frequency [MHz]") ax.set_ylabel("amplitude [V/m] * R [m] per {:.1f}MHz".format(df / units.MHz)) ax.legend(fontsize='small') ax.set_title("{} E = {:.1e}eV, $\Delta \Omega$ = {:.1f}deg, {}".format(model, E / units.eV, domega / units.deg, emstr[i])) fig.tight_layout() fig.savefig("plots/{}_E{:.1e}eV_dOmega{:.1f}_EM{}_LPM{}.png".format(model, E / units.eV, domega / units.deg, em[i], lpm[i])) plt.close('all') PKmNj63NuRadioMC/SignalGen/tests/T03AskaryanModuleVsZHS.pyimport NuRadioMC.SignalGen.RalstonBuniy.askaryan_module as AskaryanModule import NuRadioMC.SignalGen.parametrizations as param from NuRadioMC.utilities import units, fft import numpy as np from radiotools import plthelpers as php import matplotlib.pyplot as plt E = 1e17 * units.eV n_index = 1.78 domega = 2.5 * units.deg theta = np.arccos(1. / n_index) + domega dt = .1 * units.ns n_samples = 2048 ff = np.fft.rfftfreq(n_samples, dt) df = ff[1] # width of a frequency bin tt = np.arange(0, n_samples * dt, dt) R = 5 * units.km em = True a = 1.5 * units.m fig, ax = plt.subplots(1, 1) domegas = np.array([0, 2.5, 5, 7.5, 10]) * units.deg for iOmega, domega in enumerate(domegas): theta = np.arccos(1. / n_index) + domega spec1 = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, True, a) spec1_anoLPM = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, False) spec1_aLPM = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, True) spec4 = param.get_frequency_spectrum(E, theta, ff, em, n_index, R, model='ZHS1992') ax.plot(ff / units.MHz, np.abs(spec1[1]) / units.V * units.m, php.get_color(iOmega) + "-", label=r'JCH/AC a=1.5m $\Delta \Omega$ = {:.1f}deg'.format(domega / units.deg)) # ax.plot(ff / units.MHz, np.abs(spec1_noLPM[1]) / units.V * units.m, php.get_color_linestyle(1), label='Askaryan module eTheta (without LPM)') ax.plot(ff / units.MHz, np.abs(spec4) / units.V * units.m, php.get_color(iOmega) + "--", label=r'ZHS $\Delta \Omega$ = {:.1f}deg'.format(domega / units.deg)) ax.semilogx(True) ax.semilogy(True) ax.set_xlim(10, 2e3) ax.set_ylim(1e-9, 1e-3) ax.set_xlabel("frequency [MHz]") ax.set_ylabel("amplitude [V/m] per {:.1f}MHz".format(df / units.MHz)) ax.legend(fontsize='small') ax.set_title("E = {:.1e}eV, R = {:.1f}km, EM={}".format(E / units.eV, R / units.km, em)) fig.tight_layout() fig.savefig("plots/AskaryanZHS.png") domegas = np.array([0, 1, 2.5, 5, 7.5, 10]) * units.deg for iOmega, domega in enumerate(domegas): fig, ax = plt.subplots(1, 1) theta = np.arccos(1. / n_index) + domega spec1 = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, True, a) spec1_anoLPM = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, False) spec1_aLPM = AskaryanModule.get_frequency_spectrum(E, theta, ff, em, n_index, R, True) spec4 = param.get_frequency_spectrum(E, theta, ff, em, n_index, R, model='ZHS1992') ax.plot(ff / units.MHz, np.abs(spec1[1]) / units.V * units.m, php.get_color(0) + "-", label=r'JCH/AC a=1.5m') # ax.plot(ff / units.MHz, np.abs(spec1_noLPM[1]) / units.V * units.m, php.get_color_linestyle(1), label='Askaryan module eTheta (without LPM)') ax.plot(ff / units.MHz, np.abs(spec4) / units.V * units.m, php.get_color(1) + "--", label=r'ZHS') ax.plot(ff / units.MHz, np.abs(spec1_anoLPM[1]) / units.V * units.m, php.get_color(2) + ":", label=r'JCH/AC without LPM') ax.plot(ff / units.MHz, np.abs(spec1_aLPM[1]) / units.V * units.m, php.get_color(3) + "-.", label='JCH/AC with LPM') ax.semilogx(True) ax.semilogy(True) ax.set_xlim(10, 2e3) ax.set_ylim(1e-9, 1e-3) ax.set_xlabel("frequency [MHz]") ax.set_ylabel("amplitude [V/m] per {:.1f}MHz".format(df / units.MHz)) ax.legend(fontsize='small') ax.set_title("E = {:.1e}eV, $\Delta\Omega$ = {:.1f}deg, R = {:.1f}km, EM={}".format(E / units.eV, domega / units.deg, R / units.km, em)) fig.tight_layout() fig.savefig("plots/AskaryanZHS_{:.1f}deg.png".format(domega / units.deg)) plt.close('all') PKmN ~ ~ -NuRadioMC/SignalGen/tests/T04CompareModels.pyimport NuRadioMC.SignalGen.askaryan as ask from NuRadioMC.utilities import units, fft import numpy as np import matplotlib.pyplot as plt from radiotools import plthelpers as php import logging logging.basicConfig(level=logging.INFO) interp_factor = 20 # HAD for different viewing angles E = 1 * units.EeV shower_type = "HAD" n_index = 1.78 theta_C = np.arccos(1. / n_index) N = 512*2 dt = 0.1 * units.ns R = 1 * units.km tt = np.arange(0, dt * N, dt) thetas = theta_C + np.array([0, 1, 2, 3, 4, 5]) * units.deg fig, ax = plt.subplots(2, 3, sharex=True) ax = ax.flatten() for iTheta, theta in enumerate(thetas): trace = ask.get_time_trace(E, theta, N, dt, shower_type, n_index, R, "ARZ2019", interp_factor=interp_factor) ax[iTheta].plot(tt, trace[1], '-C0'.format(iTheta), label="$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) trace = ask.get_time_trace(E, theta, N, dt, shower_type, n_index, R, "Alvarez2000") trace = np.roll(trace, int(-1 * units.ns/dt)) ax[iTheta].plot(tt, trace, '--C1'.format(iTheta), label="$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) ax[iTheta].set_title("$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) ax[iTheta].set_xlim(45, 60) # ax.legend() fig.tight_layout() fig.suptitle("HAD, Esh = {:.1f}EeV".format(E/units.EeV)) fig.subplots_adjust(top=0.9) fig.savefig("plots/04_1EeV_HAD.png") shower_type = "EM" fig, ax = plt.subplots(2, 3, sharex=True) ax = ax.flatten() for iTheta, theta in enumerate(thetas): trace = ask.get_time_trace(E, theta, N, dt, shower_type, n_index, R, "ARZ2019", interp_factor=interp_factor) ax[iTheta].plot(tt, trace[1], '-C0'.format(iTheta), label="$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) trace = ask.get_time_trace(E, theta, N, dt, shower_type, n_index, R, "Alvarez2000") trace = np.roll(trace, int(-1 * units.ns/dt)) ax[iTheta].plot(tt, trace, '--C1'.format(iTheta), label="$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) ax[iTheta].set_title("$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) ax[iTheta].set_xlim(45, 70) # ax.legend() fig.tight_layout() fig.suptitle("EM, Esh = {:.1f}EeV".format(E/units.EeV)) fig.subplots_adjust(top=0.9) fig.savefig("plots/04_1EeV_EM.png") shower_type = "EM" E = 0.01 * units.EeV fig, ax = plt.subplots(2, 3, sharex=True) ax = ax.flatten() for iTheta, theta in enumerate(thetas): trace = ask.get_time_trace(E, theta, N, dt, shower_type, n_index, R, "ARZ2019", interp_factor=interp_factor) ax[iTheta].plot(tt, trace[1], '-C0'.format(iTheta), label="$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) trace = ask.get_time_trace(E, theta, N, dt, shower_type, n_index, R, "Alvarez2000") trace = np.roll(trace, int(-1 * units.ns/dt)) ax[iTheta].plot(tt, trace, '--C1'.format(iTheta), label="$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) ax[iTheta].set_title("$\Delta \Theta$ = {:.1f}".format((theta-theta_C)/units.deg)) ax[iTheta].set_xlim(45, 70) # ax.legend() fig.tight_layout() fig.suptitle("EM, Esh = {:.1f}PeV".format(E/units.PeV)) fig.subplots_adjust(top=0.9) fig.savefig("plots/04_10PeV_EM.png") plt.show()PKmNN?v1NuRadioMC/SignalGen/tests/T05parameterisations.pyfrom NuRadioMC.SignalGen.askaryan import get_time_trace, get_frequency_spectrum from NuRadioMC.utilities import units, fft import numpy as np import matplotlib.pyplot as plt E = 1e20 * units.eV n_index = 1.78 domega = 0.05 * units.deg theta = np.arccos(1. / n_index) + domega dt = 0.1 * units.ns n_samples = 2048 ff = np.fft.rfftfreq(n_samples, dt) tt = np.arange(0, n_samples * dt, dt) R = 10 * units.km models = ['Alvarez2009', 'ARZ2019', 'Alvarez2000'] colours = ['blue', 'orange', 'red', 'black'] col_dict = {} linestyle = {'Alvarez2009': '-', 'ARZ2019': '--', 'Alvarez2000': '-.'} shower_type = 'EM' Es = 10**np.linspace(15,17,3) * units.eV domegas = np.linspace(-5,5,5) * units.deg thetas = np.arccos(1./n_index) + domegas for iE, E in enumerate(Es): col_dict[E] = colours[iE] for model in models: for E in Es: spectrum = get_frequency_spectrum(E, theta, n_samples, dt, shower_type, n_index, R, model) spectrum *= R freqs = np.fft.rfftfreq(n_samples, dt) if (model=='Alvarez2009'): label = str(E/units.EeV)+' EeV' else: label = '' #plt.plot(tt, trace, color=col_dict[E], label=label, linestyle=linestyle[model]) plt.loglog(freqs, np.abs(spectrum) / units.V * units.MHz, color=col_dict[E], label=label, linestyle=linestyle[model]) #plt.xlabel('Time [ns]') plt.xlabel('Frequency [GHz]') plt.ylabel('Electric field [V/MHz]') plt.legend() plt.show() PKmNUV[V[7NuRadioMC/SignalGen/tests/frequency_normalization.ipynb{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Test of correct frequency normalization\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "from NuRadioMC.utilities import fft\n", "from NuRadioMC.utilities import units\n", "import NuRadioMC.SignalGen.RalstonBuniy.askaryan_module as AskaryanModule" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the fft utility module implements a real fft with a normalization so that\n", "Plancherel theorem is valid. This means that the fourier transform must be unitary,\n", "which is achieved by normalizing both transforms with 1/sqrt(n) and an additional\n", "factor of sqrt(2) because negative frequencies are omitted in the real FFT.\n", "This means that the power calculated in the time domain is the same as the\n", "power calculated in the frequency domain." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One test of a correct frequency normalization of the signal generation modules is that the amplitude in the time domain should not depend on the frequency resolution, i.e., the number of samples in the time domain. \n", "\n", "We first implement a simple toy model with a constant amplitude for all frequencies of 1 / MHz. " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "number of samples = 1024 with a sampling of 10.0GHz result in a frequency bin width of 9.8MHz\n", "-> max amplitude with sqrt(df) normalization = 71\n", "-> max amplitude with df normalization = 2.2e+02\n" ] } ], "source": [ "# we first calculate the maximum amplitude in the time domain for a\n", "# normalization with (df/1MHz)**0.5 and (df/1MHz)\n", "# for a 2**10 number of samples\n", "dt = 0.1 * units.ns\n", "n_trace = 2 ** 10 # samples of trace\n", "tt = np.arange(0, n_trace * dt, dt)\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "df = ff[1] - ff[0]\n", "print('number of samples = {} with a sampling of {:.1f}GHz result in a frequency bin width of {:.1f}MHz'.format(n_trace, 1./dt/units.GHz, df/units.MHz))\n", "\n", "spectrum = np.ones(len(ff), dtype=np.complex)\n", "spectrum[0] = 0 # set zero frequency bin to zero (no dc offset)\n", "spectrum *= (df / units.MHz) ** 0.5\n", "trace = fft.freq2time(spectrum)\n", "print(\"-> max amplitude with sqrt(df) normalization = {:.2g}\".format(np.abs(trace).max()))\n", "\n", "spectrum = np.ones(len(ff), dtype=np.complex)\n", "spectrum[0] = 0 # set zero frequency bin to zero (no dc offset)\n", "spectrum *= (df / units.MHz)\n", "trace = fft.freq2time(spectrum)\n", "print(\"-> max amplitude with df normalization = {:.2g}\".format(np.abs(trace).max()))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "number of samples = 16384 with a sampling of 10.0GHz result in a frequency bin width of 0.6MHz\n", "-> max amplitude with sqrt(df) normalization = 71\n", "-> max amplitude with df normalization = 55\n" ] } ], "source": [ "# now we repeat the above calculation but with 2**14 number of samples. The maximum \n", "# amplitude in the time domain shoud remain the same for the correct frequency normalization. \n", "\n", "dt = 0.1 * units.ns\n", "n_trace = 2 ** 14 # samples of trace\n", "tt = np.arange(0, n_trace * dt, dt)\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "df = ff[1] - ff[0]\n", "print('number of samples = {} with a sampling of {:.1f}GHz result in a frequency bin width of {:.1f}MHz'.format(n_trace, 1./dt/units.GHz, df/units.MHz))\n", "\n", "spectrum = np.ones(len(ff), dtype=np.complex)\n", "spectrum[0] = 0 # set zero frequency bin to zero (no dc offset)\n", "spectrum *= (df / units.MHz) ** 0.5\n", "trace = fft.freq2time(spectrum)\n", "print(\"-> max amplitude with sqrt(df) normalization = {:.2g}\".format(np.abs(trace).max()))\n", "\n", "spectrum = np.ones(len(ff), dtype=np.complex)\n", "spectrum[0] = 0 # set zero frequency bin to zero (no dc offset)\n", "spectrum *= (df / units.MHz)\n", "trace = fft.freq2time(spectrum)\n", "print(\"-> max amplitude with df normalization = {:.2g}\".format(np.abs(trace).max()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This small test showed that the correct normalization should be using the square root of the frequency bin width, i.e. (df/1MHz)**0.5\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## test of wrapper around Askaryan module\n", "In the NuRadioMC implementation we only interface the function to generate the frequency spectrum. We obtain the time domain representation by normalizing the frequency spectrum correctly and applying an inverse FFT with a proper normalization. The following code checks that the amplitudes in the time domain do not depend on the number of samples:\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Askaryan modules: maximum amplitude for 1024 samples is: 1.51874e-06V/m\n" ] } ], "source": [ "E = 1e17 * units.eV\n", "n_index = 1.78\n", "theta = np.arccos(1. / n_index) + 2.5 * units.deg\n", "R = 5 * units.km\n", "dt = 0.1 * units.ns\n", "\n", "\n", "n_trace = 2 ** 10 # samples of trace\n", "tt = np.arange(0, n_trace * dt, dt)\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "\n", "trace = AskaryanModule.get_time_trace(E, theta, ff, 0, n=1.78, R=R)\n", "print('Askaryan modules: maximum amplitude for {:d} samples is: {:4g}V/m'.format(n_trace, np.abs(trace).max()/units.V*units.m))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Askaryan modules: maximum amplitude for 4096 samples is: 1.51873e-06V/m\n" ] } ], "source": [ "n_trace = 2 ** 12 # samples of trace\n", "tt = np.arange(0, n_trace * dt, dt)\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "\n", "trace = AskaryanModule.get_time_trace(E, theta, ff, 0, n=1.78, R=R)\n", "print('Askaryan modules: maximum amplitude for {:d} samples is: {:4g}V/m'.format(n_trace, np.abs(trace).max()/units.V*units.m))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "the amplidues agree and thus do not depend on the frequency resolution, which shows that the frequency spectrum was normalized correctly to the frequency bin width. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## test how amplitudes in frequency domain change with tracelength" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWgAAAEKCAYAAAA/2c+EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzt3X10VdW57/HvzN4hO80m2SERD0Jr6MUXkIQEoYhBS0AoKEdprAJDKr1YezxK5eUqhp7bcz0dpSAjdSjUUcY50mqrp1ItVoXT6ynlRcHyJqQYAQtIKkEKJiSGjXkhO/P+kWRfNgHyttZek8znM0aG7re1nl+2Pntl7rnmUlprhBBCmCfB6wKEEEJcmDRoIYQwlDRoIYQwlDRoIYQwlDRoIYQwlDRoIYQwlDRoIYQwlDRoIYQwlN/rArpDKTUVuANIBVZprf/b45KEEMIxnhxBK6V+oZQ6qZQqPe/+SUqpj5RSh5RSRe1tR2v9e631g8BDwDS36hVCCC+40qCVUn2VUr3Pu2/QOTdfACad97gPeA6YDAwBZiilhrQ8lq2UWnveT99zXv6/W14rhBA9hltDHF8HHlJK3a61rldKPQgU0tx80Vq/o5TKOu81XwMOaa0/BlBKvQLcBezTWn8ATDl/J0opBSwF/qC13u1SFiGE8IQrDVpr/apSaiCwWin1KjAbmNDOy/oDR8+5XQ6Mauc13wduA9KUUoO01iu7WrMQQpjGtS8JtdbLWo6Cfw78D6112IV9LAeWO71dIYQwgWtfEiqlbgGGAq8D/6cDLzkGfPmc2wNa7hNCCCu59SVhHvDvNI8h/08gQyn143ZethO4Rik1UCnVC5gOvOlGfUIIcTlw6wj6S8C9WuvDWusm4H7gb60PKqV+A/wZuE4pVa6UekBr3QjMAd4G9gO/1Vp/6FJ9QghhPCVXVBFCCDPJqd5CCGEoadBCCGEoR6fZKaW6PF6SkZFBZWWlk+UYTzLbQTLbobuZtdbq/Pscnwfd1THt06dP07t37/af2INIZjtIZjt0J3PzSdFtGTPEYdunLUhmW0hmO7iR2ZgGLYQQIpYxDTolJcXrEuJOMttBMtvBjcxGLNifVbSOAGepI9HrUuJKMttBMtuhNXPZ0jsc26YxR9ChhFqvS4g7yWwHyWwHNzIb06CFEELEcvRUb6WU7ur2Tpw4wZVXXulYLZcDyWwHyWyH7mRWSl1wHrQxR9DBYNDrEuJOMttBMtvBjczGNOiKigqvS4g7yWwHyWwHNzIb06BtXFVPMttBMtvBjczGNOhAIOB1CXEnme0gme3gRmZjGrSMWdlBMttBMjvDmAZdVVXldQlxJ5ntIJnt4EZmYxp0JBLxuoS4k8x2kMx2cCOzMQ26V69eXpcQd5LZDpLZDm5kNqZBp6amel1C3ElmO0hmO7iR2ZgGXV1d7XUJcSeZ7SCZ7eBGZmMadGNjo9clxJ1ktoNktoMbmY1p0H6/ESufxpVktoNktoMbmY1p0KFQyOsS4k4y20Ey28GNzMY06JqaGq9LiDvJbAfJbAc3Mne4QSulfEqpPUqptY5XATQ0NLixWaNJZjtIZju4kbkzR9Bzgf2OV9DC5/O5tWljSWY7SGY7uJG5Qw1aKTUAuAN43vEKWqSnp7u1aWNJZjtIZju4kbmjXzs+AywEel/qSRkZGQwfPpympiaampqad+D3M3PmTAoLC4HmEJFIJDpe0zqw/vHHH9OnTx9SU1Px+XzR89qDwSBJSUlUVlYCzVfOTU5Ojq69mpycTDAYpKKiAq01gUCAYDBIVVUVkUiEXr16kZqaSnV1NY2Njfj9fkKhEDU1NTQ0NODz+UhPTyccDlNXV4dSiszMTMLhMLW1zdcYy8zMpLa2ljNnzkRz1tfXEw6HL5mpdV7kxTIdPHiQPn369KhM7b1PBw8eJD09vUdlau99Onz4MGlpaT0qU3vvU1lZGcFgsEdlau99Onr0KMnJyV3KdDHtXvJKKTUFuF1r/bBSaizwmNZ6ykWe2+VLXpWVlZGVldWl116uJLMdJLMdupO5O5e8ygfuVEqVAa8A45RSL3WpiktQqk1tPZ5ktoNktoMbmTt10Vg3j6DPnDlDSkpKl157uZLMdpDMduhOZuMvGts6VmMTyWwHyWwHNzJ36txErfUmYJPjVUB0sN0mktkOktkObmQ25ghaCCFELGMadGZmptclxJ1ktoNktoMbmY1p0PInkR0ksx0kszOMadCtk9ZtIpntIJnt4EZmYxq0EEKIWMY06IyMDK9LiDvJbAfJbAc3MhvToOvr670uIe4ksx0ksx3cyGxMg5aJ7XaQzHaQzM4wpkELIYSIZUyDlvVj7SCZ7SCZnWFMg45EIl6XEHeS2Q6S2Q5uZDamQctFJu0gme0gmZ1hTIMWQggRy5gG3XoJGJtIZjtIZju4kdmYBi2EECKWMQ26vYsn9kSS2Q6S2Q5uZDamQQshhIhlTINOTU31uoS4k8x2kMx2cCOzMQ3a5/N5XULcSWY7SGY7uJHZmAZdVVXldQlxJ5ntIJnt4EZmYxq0EEKIWMY06GAw6HUJcSeZ7SCZ7eBGZmMadFJSktclxJ1ktoNktoMbmY1p0JWVlV6XEHeS2Q6S2Q5uZDamQQshhIhlTINOSUnxuoS4k8x2kMx2cCOzMQ06OTnZ6xLiTjLbQTLbwY3MxjToiooKr0uIO8lsB8lsBzcyG9OghRBCxDKmQcufRHaQzHaQzM4wpkHLxHY7SGY7SGZnGNOgZczKDpLZDpLZGcY0aK211yXEnWS2g2S2gxuZjWnQgUDA6xLiTjLbQTLbwY3Mfse32FllW2DrcoKNPvBHvK4mriSzHSSzHYKNPvj2S5Dg3LrQ3jfo03+Hg29TRT+CHPe6mriSzHaQzHaooh9Bh4c5jBniiGDfFRgksx0ksx3cyOz9EfTVN8OM1fQ6dQb62HX+vmS2g2S2Q69TZ0A5e8zrfYNOvQpSryI1HAbL5k5KZjtIZjukhsOQ4GyDbndrSqmAUmqHUuovSqkPlVL/5mgFLaqrq93YrNEksx0ksx3cyNyRI+h6YJzWOqyUSgS2KKX+oLXe5mQhjY2NTm7usiCZ7SCZ7eBG5nYbtG6efR1uuZnY8uP4jGy/3/vRlniTzHaQzHZwI7PqyNkvSikf8D4wCHhOa/3EhZ6XmZmpv/KVr9DU1ERTUxPQXPTMmTMpLCwEID09nUgkQk1NDQChUAiA48ePk5ycTGpqKj6fL3oJ82AwSFJSUvRyMikpKSQnJ0dPq0xOTiYYDFJRUYHWmkAgQDAYpKqqikgkQq9evUhNTaW6uprGxkb8fj+hUIiamhoaGhrw+Xykp6cTDoepq6tDKUVmZibhcJja2trWXNTW1nLmzBkAMjIyqK+vJxwOXzJT6588F8tUXl5OcnJyj8rU3vt09OhRAoFAj8rU3vt0/PhxEhMTe1Sm9t6nkydPkpCQ0KMytfc+VVZWRs8m7GymgQMHorVWnKdDDTr6ZKVCwOvA97XWpRd4XHf1dMdPP/2Uq666qkuvvVxJZjtIZjt0J7NS6oINulNfOWqtq4GNwKQuVXEJDQ0NTm/SeJLZDpLZDm5k7sgsjitajpxRSiUDE4ADThfi89k3sV0y20Ey28GNzB0Z1e4HvNgyDp0A/FZrvdbpQtLT053epPEksx0ksx3cyNyRWRx7gTzH93yecDhs3SLfktkOktkObmQ2Zi2Ouro6r0uIO8lsB8lsBzcyG9OglWrzBWaPJ5ntIJnt4EZmYxp0Zmam1yXEnWS2g2S2gxuZjWnQrRO6bSKZ7SCZ7eBGZmMadOsZOTaRzHaQzHZwI7MxDVoIIUQsYxq0jFnZQTLbQTI7w5gGLX8S2UEy20EyO8OYBt26spVNJLMdJLMd3MhsTIMWQggRy5gGnZGR4XUJcSeZ7SCZ7eBGZmMadH19vdclxJ1ktoNktoMbmY1p0DKx3Q6S2Q6S2RnGNGghhBCxjGnQsn6sHSSzHSSzM4xp0JFIxOsS4k4y20Ey28GNzMY06Nar3dpEMttBMtvBjczGNGghhBCxjGnQoVDI6xLiTjLbQTLbwY3MxjRoIYQQsYxp0NXV1V6XEHeS2Q6S2Q5uZDamQQshhIhlTINOTU31uoS4k8x2kMx2cCOzMQ3a5/N5XULcSWY7SGY7uJHZmAZdVVXldQlxJ5ntIJnt4EZmYxq0EEKIWMY06GAw6HUJcSeZ7SCZ7eBGZmMadFJSktclxJ1ktoNktoMbmY1p0JWVlV6XEHeS2Q6S2Q5uZDamQQshhIiltNbObUwp3dntvffpe/y85Ock1iZyNvmsY7VcDiSzHSSzHRJrE/n3b/47/gR/p1+rlEJrrc6/v/Nbclh1XTUln5WQFEmiPmzXdcwksx0ksx2SIj14DDq1wcIzjySzFSSzHdzI7PkQx6m6U/yt5m9UHKsgs3+mY7VcDiSzHSSzHSqOVXBb7m0o1Wakol3GDnH0CfShT6APJ/QJrux7pdflxJVktoNktsMJfaJLzflSjBnikIntdpDMdpDMzjCmQVdUVHhdQtxJZjtIZju4kdmYBu3kWPjlQjLbQTLbwY3MxjToQCDgdQlxJ5ntIJnt4EbmDjVopdSXlVIblVL7lFIfKqXmOl2IjFnZQTLbQTI7o6NH0I3A/9JaDwFuAh5RSg1xshBZP9YOktkOktkZHWrQWuvjWuvdLf9+GtgP9HeykEgk4uTmLguS2Q6S2Q5uZO70PGilVBaQB2w//7GMjAyGDx9OU1MTTU1NzTvw+5k5cyaFhYUApKenE4lEqKmpASAUCgH//xvQ1NRUfD5f9NMoGAySlJQUXSkqJSWF5OTk6POTk5MJBoNUVFSgtSYQCBAMBqmqqiISidCrVy9SU1Oprq6msbERv99PKBSipqaGhoYGfD4f6enphMNh6urqUEqRmZlJOBymtrYWgMzMTGprazlz5kw0Z319PeFw+JKZWq/ye7FMrRl6Uqb23qfWx3tSpo68T2VlZT0u06Xep9OnT1NWVtajMrX3Pp05c4aysrIuZbqYTp1JqJQKApuBxVrrNRd4vNNnErYKh8PWjVtJZjtIZjt0J/PFziTs8CwOpVQi8Dvg5Qs15+5q75OkJ5LMdpDMdnAjc0dncShgFbBfa/2041UAjY2NbmzWaJLZDpLZDm5k7ugRdD7wbWCcUqqk5ed2Jwvx+z1fFiTuJLMdJLMd3MjcoS1qrbcAzq4Ccp7WQXObSGY7SGY7uJHZmDMJW7/dtIlktoNktoMbmY1p0A0NDV6XEHeS2Q6S2Q5uZDamQft8Pq9LiDvJbAfJbAc3MhvToNPT070uIe4ksx0ksx3cyGxMg24948YmktkOktkObmQ2pkHX1dV5XULcSWY7SGY7uJHZmAbt9LW8LgeS2Q6S2Q5uZDamQWdm2nUFYJDMtpDMdnAjszENWsas7CCZ7SCZnWFMg25dts8mktkOktkObmQ2pkELIYSIZUyDljErO0hmO0hmZxjToOVPIjtIZjtIZmcY06BbL39jE8lsB8lsBzcyG9OghRBCxDKmQWdkZHhdQtxJZjtIZju4kdmYBl1fX+91CXEnme0gme3gRmZjGrRMbLeDZLaDZHaGMQ1aCCFELGMatKwfawfJbAfJ7AxjGnQkEvG6hLiTzHaQzHZwI7MxDVouMmkHyWwHyewMYxq0EEKIWMY06FAo5HUJcSeZ7SCZ7eBGZmMatBBCiFjGNOjq6mqvS4g7yWwHyWwHNzIb06CFEELEMqZBp6amel1C3ElmO0hmO7iR2ZgG7fP5vC4h7iSzHSSzHdzIbEyDrqqq8rqEuJPMdpDMdnAjszENWgghRCxjGnQwGPS6hLiTzHaQzHZwI7MxDTopKcnrEuJOMttBMtvBjczGNOjKykqvS4g7yWwHyWwHNzIb06CFEELEMqZBp6SkeF1C3ElmO0hmO7iR2ZgGnZyc7HUJcSeZ7SCZ7eBGZr/jWzzP2bNnKS8vp66u7pLPa2xsxO93vRyjmJI5EAgwYMAAEhMTXd9XRUWFdd/wS2Y7uJHZ9e5QXl5O7969ycrKQil10efV19db982vCZm11lRWVlJeXs7AgQM9rUUIEatDQxxKqV8opU4qpUo7u4O6ujoyMjIu2ZwBEhKMGW2JGxMyK6XIyMho9y8cp8ifvnaQzM7oaId4AZjU1Z2015zBjGYVb6Zk7sj74xTb/uwFyWwLz05U0Vq/A5xyfO/naGxsdG3bs2fPpm/fvgwdOjTm/lOnTjFhwgSuueYaJkyYED2X/uWXXyYnJ4fs7Gxuvvlm/vKXv8S8LhKJkJeXx5QpU7pVlxOZX3jhBebMmdPt7cRLRUWF1yXEnWS2gxuZHR2DzsjIYPjw4TQ1NdHU1ATAM888Q3p6evSS5K0rPrVeAbf19tmzZy/4eEJCAgkJCdFm1tHbkUgErTVKKb797W/zT//0T8yePZuGhgZ8Ph+RSITFixczduxYioqKWLp0KYsXL2bx4sV85StfYf369aSlpfH222/z4IMPsnXr1mimFStWcN1111FTU0N9ff1FM13sdmuNrZm7kqk1w9mzZ4lEItGfcx8/933w+/2XvN3U1ERFRQXhcBhovoR8JBKJXgiz9XI+rYuSp6am4vP5oh9qwWCQpKSk6GT9lJQUkpOTo//RJicnEwwG+fvf/47WmkAgQDAYpKqqikgkQq9evUhNTaW6ujr65WkoFKKmpib6nqWnpxMOh6mrq0MpRWZmJuFwmNraWgAyMzOpra3lzJkz0f8e6+vrXc9UUVFxyUwnT55Ea92jMrX3PlVWVkb/W+wpmdp7n6qqqtBadynTRWmtO/QDZAGl7TxHn2/fvn1t7ruQhoaGDj2vq44cOaJvuOGGmPuuvfZa/emnn2qttf7000/1tdde2+Z1p06d0ldddVX09tGjR/W4ceP0n/70J33HHXdccF/PPvusHjx4sM7OztbTpk3TWmu9fft2fdNNN+nc3Fw9evRofeDAAd3Q0KB/+ctf6rvuukvfdttt+uqrr9YrVqzQP/3pT3Vubq4eNWqUrqys1Fpr/fWvf10/+uijetiwYfqGG27Q27dv11pr/ctf/lI/8sgjWmutT548qQsLC/WIESP0iBEj9JYtW7TWWm/atEkPGzZMDxs2TOfm5uqampo2NXf0fequ48ePx2U/JpHMduhO5pbe2aanejbHK6toXbe3Ubb0jm69/sSJE/Tr1w+Af/iHf+DEiRNtnrNq1SomT54cvT1v3jyWLVvG6dOnL7rdpUuXcuTIEZKSkqKfkNdffz3vvvsufr+f9evX84Mf/IDf/va3AJSWlrJnzx7q6uoYNGgQTz31FHv27GH+/Pn86le/Yt68eQB88cUXlJSU8M477zB79mxKS2O/s507dy7z589nzJgxfPLJJ3zjG99g//79FBcX89xzz5Gfn084HCYQCHTr99YdMjZpB8nsDO8n4RpCKdXmy7KNGzeyatUqtmzZAsDatWvp27cvN954I5s2bbrotnJycrjvvvuYOnUqU6dOBeDzzz9n1qxZHDx4EKVUdGgCoKCggN69e9O7d2/S0tL4x3/8RwCys7PZu3dvdLszZswA4NZbb6WmpqbNn0fr169n37590ds1NTWEw2Hy8/NZsGAB9913H4WFhQwYMKCLv6Xuq6qqsu5/XslsBzcyd3Sa3W+APwPXKaXKlVIPOFqFR6688kqOHz8OwPHjx+nbt2/0sb179/Ld736XN954g4yMDAC2bt3Km2++SVZWFtOnT2fDhg3MnDmzzXbXrVvHI488wu7duxk5ciSNjY388Ic/pKCggNLSUt566y3q6uqi41XnzoVOSEiI3j53HBrazrY4/3ZTUxPbtm2jpKSEkpISjh07RjAYpKioiOeff57a2lry8/M5cOBAd35t3dL6oWQTyWwHNzJ36Ahaaz3D6R2fPzzR0NBAr169nN7NJd155528+OKLFBUV8eKLL3LXXXcB8Mknn1BYWMivf/1rrr322ujzlyxZwpIlSwDYtGkTxcXFvPTSSzHbbGpq4ujRoxQUFDBmzBheeeUVwuEwn3/+Of379weaZ15A56e3rV69moKCArZs2UJaWhppaWkxj0+cOJEVK1bw+OOPA1BSUkJubi6HDx8mOzub7Oxsdu7cyYEDB7j++us7tW+nxPs9NoFktoMbmc2YiIu71zCbMWMGo0eP5qOPPmLAgAGsWrUKgKKiIv74xz9yzTXXsH79eoqKigD40Y9+RGVlJQ8//DC5ubmMGDGiw/uKRCLMnDmT7Oxs8vLyePTRRwmFQixcuJBFixaRl5cXPSrubOZAIEBeXh4PPfRQNMO5li9fzq5du8jJyWHIkCGsXLkSaJ5JM3ToUHJyckhMTIwZU483uZioHSSzM1Trn9mObEwpff729u/fz+DBg9t9rRdH0F7rTOaxY8dSXFzcqQ+Lzujo+9Rd5eXlno6Be0Ey26E7mZVSaK3b/EltzBG0kx8UlwsbM7t5QpKpJLMd3MhszCyOeJ5ubIrOZL7UrJHLiQmr98WbZLaDG5mNOYJ2cwzaVDZmbj2DyiaS2Q5uZDamQcu0HDu0nupqE8lsBzcyG9OgbRyPtTFzQ0OD1yXEnWS2gxuZjWnQMgZtBxuHdSSzHdzIbEyDdusNbT1pZMiQIdxwww08++yz0ccuttxoq507d+L3+3nttdei9y1cuJAbbriBwYMH8+ijj3brKNiJzE8++STFxcXd3k68tK5qaBPJbAc3MhvToFuXvXSa3+/npz/9Kfv27WPbtm0899xz0fUqli5dyvjx4zl48CDjx49n6dKl0ddFIhGeeOIJJk6cGL3vvffeY+vWrezdu5fS0lJ27tzJ5s2bu1ybW5lN1rr8ok0ksx3cyNzjG3S/fv0YPnw4AL1792bw4MEcO3YMgDfeeINZs2YBMGvWLH7/+99HX7dixQruvvvumPU5lFLU1dXR0NBAfX09Z8+e5corr2yzz6KiIoYMGUJOTg6PPfYYAG+99RajRo0iLy+P2267jRMnTtDU1MSTTz7JrFmzuOWWW7j66qtZs2YNCxcuJDs7m0mTJkXXjM7Kyore/7WvfY1Dhw612e/hw4eZNGkSN954I7fcckt0zY1XX32VoUOHMmzYMG699VYnfq1dFq9La5lEMtvBjczeTVZ8MnYdiS5dOvXJzzv19LKyMvbs2cOoUaOAiy83euzYMV5//XU2btzIzp07o68fPXo0BQUF9OvXD601c+bMaXP2XWVlJa+//joHDhxAKRVdcW7MmDFs27YNpRTPP/88y5Yt4yc/+QnQ3Fg3btzIvn37GD16NL/73e9YtmwZ3/zmN1m3bl10Rby0tDQ++OCD6BKka9eujdn39773PVauXMk111zD9u3befjhh9mwYQM/+tGPePvtt+nfv3/7C4S7zMZxd8lsBzcyWzObPBwOc/fdd/PMM89c8Jz5c5cbnTdvHk899VSbawYeOnSI/fv3U15eDsCECRN49913ueWWW6LPSUtLIxAI8MADDzBlypToZbHKy8uZNm0ax48fp6GhgYEDB0Yntk+ePJnExESys7OJRCJMmtR8+cfs7GzKysqi225dbnTGjBnMnz+/Tb733nuPe+65J3pffX09APn5+XznO9/h3nvvpbCwsPO/PAdlZmZ6un8vSGY7uJHZigZ99uxZ7r777uh6yK1alxvt169fzHKju3btYvr06UDzdcb+67/+C7/fz8GDB7npppuia75OnjyZP//5zzEN2u/3s2PHDv70pz/x2muv8bOf/YwNGzbw/e9/nwULFnDnnXeyadMmnnzyyeiwzrnLiyYmJkY/KC613OiFlhoNhUKUlJS0yb9y5Uq2b9/OunXruPHGG3n//fejS6jGWzgcJiUlxZN9e0Uy28GNzB4OccQOT9TX18esi+wUrTUPPPAAgwcPZsGCBTGPXWy50SNHjkSf853vfIcpU6YwdepUVq9ezX/8x3+waNEitNZs3rw5erWTVuFwmC+++ILbb7+d/Px8vvrVrwLELDf64osvAp0fd1+9ejVFRUWsXr2a0aNHxzyWmprKwIEDefXVV7nnnnvQWrN3716GDRvG4cOHGTVqFKNGjeIPf/gDR48e9axBt17DzSaS2Q5uZO7xR9Bbt27l17/+NdnZ2eTm5gLwk5/8hNtvv52ioiLuvfdeVq1axdVXXx29BNXFfOtb32LDhg1kZ2ejlGLSpEnRq5+0On36NHfddVd0Qf6nn34aaJ4Od88995Cens64ceNiPgQ6qqqqipycHJKSkvjNb37T5vGXX36Zf/7nf+bHP/4xZ8+eZfr06QwbNozHH3+cgwcPorVm/PjxDBs2rNP7FkLEnzHLjUYiEesmt3cmc1ZWFrt27XJtbC9ey42Gw2HrLoUkme3QnczGLzdq45xgGzPLn752kMzOkAbtoc5kLisr6xHfjJ85c8brEuJOMtvBjczGNGghhBCxjGnQssC3HbyaPeIlyWwHNzIb06BliMMOrSfP2EQy28GNzNKgPWRjZllExw6S2RnGNGi3RSIR8vLyoqdeQ/MJKaNGjWLQoEFMmzYtuuD23/72N8aPH09OTg5jx46NntoN8MknnzBx4kQGDx7MkCFDYk7F9sILL7zAnDlzPK1BCOEOYxq023Ogn3322TbzfJ944gnmz5/PoUOHSE9PZ9WqVQA89thj3H///ezdu5d//dd/ZdGiRdHX3H///Tz++OPs37+fHTt2xKx211m2zfsGWSfYFpLZGcY0aDeVl5ezbt06vvvd70bv01qzYcMGvvWtbwGxy43u27ePcePGAVBQUMAbb7wRvb+xsZEJEyYAEAwG+dKXvtRmf8uXL48uN9q6pseOHTsYPXo0eXl53HzzzXz00UdA8xHw1KlTmTBhAllZWfzsZz/j6aefJi8vj5tuuolTp04BMHbsWObOnUtubi5Dhw5lx44dbfb72WefcffddzNy5EhGjhzJ1q1bAdi8eTO5ubnk5uaSl5fH6dOnu/9L7SIbr8Mome3gRmbPphFkv5jd7W18MOuDDj1v3rx5LFu2LKYxVVZWEgqFojMpBgwYEF0netiwYaxZs4a5c+fy+uuvc/r0aSorK/nrX/9KKBSisLCQI0eOcNttt7F06dIyonRCAAAHo0lEQVQ2R8JLly7lyJEjJCUlRZf3vP7663n33Xfx+/2sX7+eH/zgB/znf/4nAKWlpezZs4e6ujoGDRrEU089xZ49e5g/f350aVGAL774gpKSEt555x1mz55NaWlpzH7nzp3L/PnzGTNmDJ988gnf+MY32L9/P8XFxTz33HPk5+cTDocJBAJd+G07o6amhj59+ni2fy9IZju4kbnHH0GvXbuWvn37cuONN3b4NcXFxWzevJm8vDw2b95M//798fl8NDY28u6771JcXMzOnTv5+OOPeeGFF9q8Picnh/vuu4+XXnop+gHw+eefc8899zB06FDmz5/Phx9+GH1+QUEBvXv35oorriAtLS26vsfFlhu99dZbqampabO28/r165kzZw65ubnceeed1NTUEA6Hyc/PZ8GCBSxfvpzq6morp/cJcTnq8Q1669atvPnmm2RlZTF9+nQ2bNjAzJkzycjIoLq6OrqcZ3l5eXS1uauuuoo1a9awZ88eFi9eDEAoFGLAgAHk5uby1a9+Fb/fz9SpU9m9e3ebfa5bt45HHnmE3bt3M3LkSBobG/nhD39IQUEBpaWlvPXWW9TV1UWPvM9dxS8hISFm+dGLLTd6odtNTU1s27aNkpISSkpKOHbsGMFgkKKiIp5//nlqa2vJz8+PXmnFC6FQyLN9e0Uy28GNzJ4dSp0/PNHY2OjKkd2SJUtYsmQJAJs2baK4uJiXXnoJaD5yfe2115g+fXrMcqMVFRX06dOHhIQElixZwuzZswEYOXIk1dXVfPbZZ1xxxRVs2LCBESNGxOyvqakpeqHaMWPG8MorrxAOh2OWG73QUXdHrF69moKCArZs2UJaWhppabFXpZk4cSIrVqzg8ccfB6CkpITc3FwOHz5MdnY22dnZ7Ny5kwMHDnD99dd3qQYhRPwYcwTtxZcKTz31FE8//TSDBg2isrKSBx54AGhu5Ndddx3XXnstJ06c4F/+5V+A5lkXxcXFjB8/nuzsbLTWPPjgg21yzJw5k+zsbPLy8nj00UcJhUIsXLiQRYsWkZeXFz0q7mzmQCBAXl4eDz30UHTGybmWL1/Orl27yMnJYciQIaxcuRKAZ555hqFDh5KTk0NiYiKTJ0/u9O/KKV5fcssLktkObmQ2ZrlRtxbsN1lnMo8dO5bi4uI2R+xOiddyo2VlZWRlZbm+H5NIZjt0J7Pxy43aOCfYxswXuh5kTyeZ7eBGZvk6/zKxadMmr0twhI0fSpLZDm5kNuYIWia226GqqsrrEuJOMtvBjcxxadBOjnML58n7I4SZXG/QgUCAysrKdpuAfOJ6Q2tNZWVl3M4uXLNmTVz2YxLJbAc3Mrs+i+Ps2bOUl5dTV1d3ydceP36cfv36OVbL5cCUzIFAgAEDBpCYmOj6voYPH37Bk3t6Mslsh+5kvtgsDte/JExMTGTgwIHtPm/atGns3bvX7XKMYmPmc8+MtIVktoMbmTs0xKGUmqSU+kgpdUgpVeR4FUIIIdpot0ErpXzAc8BkYAgwQyk1xPFCEoyZUBI3ktkOktkObmTuyBa/BhzSWn+stW4AXgHucrwQeUOtIJntIJmd0ZEx6P7A0XNulwOjLvbk81dY64zuvPZyJZntIJnt4HRmR78kvNC3kEIIIbqmI8fkx4Avn3N7QMt9QgghXNSRBr0TuEYpNVAp1QuYDrzpbllCCCHaHeLQWjcqpeYAbwM+4Bda6w/beZkQQohucvRMQiGEEM6xby6MEEJcJqRBCyGEoaRBCyGEoaRBCyGEoTxv0DYuxKSU+oVS6qRSqtTrWuJBKfVlpdRGpdQ+pdSHSqm5XtfkNqVUQCm1Qyn1l5bM/+Z1TfGilPIppfYopdZ6XUs8KKXKlFIfKKVKlFK7HN22l7M4WhZi+iswgeZTyHcCM7TW+zwrKg6UUrcCYeBXWuuhXtfjNqVUP6Cf1nq3Uqo38D4wtSe/z6r5nN8UrXVYKZUIbAHmaq23eVya65RSC4ARQKrWeorX9bhNKVUGjNBaVzi9ba+PoOOyEJNptNbvAKe8riNetNbHtda7W/79NLCf5jVeeizdLNxyM7Hlp8fPaVVKDQDuAJ73upaewOsGfaGFmHr0/7i2U0plAXnAdm8rcV/Ln/olwEngj1rrHp8ZeAZYCDR5XUgcaeC/lVLvK6W+5+SGvW7QwiJKqSDwO2Ce1rrG63rcprWOaK1zaV6/5mtKqR49nKWUmgKc1Fq/73UtcTZGaz2c5jXzH2kZwnSE1w1aFmKyRMs47O+Al7XWVl1RVGtdDWwEJnldi8vygTtbxmRfAcYppV7ytiT3aa2PtfzzJPA6zUO3jvC6QctCTBZo+cJsFbBfa/201/XEg1LqCqVUqOXfk2n+IvyAt1W5S2u9SGs9QGudRfP/yxu01jM9LstVSqmUli++UUqlABMBx2ZnedqgtdaNQOtCTPuB39qwEJNS6jfAn4HrlFLlSqkHvK7JZfnAt2k+oipp+bnd66Jc1g/YqJTaS/OByB+11lZMO7PMlcAWpdRfgB3AOq31/3Vq47JYkhBCGMrrIQ4hhBAXIQ1aCCEMJQ1aCCEMJQ1aCCEMJQ1aCCEMJQ1aCCEMJQ1aCCEMJQ1aCCEM9f8AcQhgExqUedAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "dt = 0.1 * units.ns\n", "n_trace = 2 ** 10 # samples of trace\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "trace_1 = np.zeros(n_trace)\n", "trace_1[n_trace//2] = 1\n", "spectrum_1 = fft.time2freq(trace_1)\n", "\n", "fig, ax = plt.subplots(1, 1)\n", "ax.plot(ff, np.abs(spectrum_1), label='{} samples'.format(n_trace))\n", "\n", "n_trace = 2 ** 11 # samples of trace\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "trace_2 = np.zeros(n_trace)\n", "trace_2[n_trace//2] = 1\n", "spectrum_2 = fft.time2freq(trace_2)\n", "ax.plot(ff, np.abs(spectrum_2), label='{} samples'.format(n_trace))\n", "\n", "n_trace = 2 ** 12 # samples of trace\n", "ff = np.fft.rfftfreq(n_trace, dt)\n", "trace_2 = np.zeros(n_trace)\n", "trace_2[n_trace//2] = 1\n", "spectrum_2 = fft.time2freq(trace_2)\n", "ax.plot(ff, np.abs(spectrum_2), label='{} samples'.format(n_trace))\n", "ax.set_ylim(0)\n", "ax.legend()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above plot shows that the amplitudes A in the frequency domain drop by 1/sqrt(n_samples). As df is proportional to n_samples, A ~ 1/df, i.e. normalizing the frequency spectrum with the square root of the bin width seems to be the right choice. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 } PKmN277UNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_R1000m_EMFalse_LPMFalse.pngPNG  IHDR!wsBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxwX6{  J ްhF-h4$՘bl5Fb A?݅ewrkkf̙ϜyLDDDDDDDDDDDŘ """"""""""z_ vQ`7{ vQ`7{ vQ`7{ vQ`7{ vQ`7{ vQ`7{ vQ`7lȐ!dd7tsZ(>|(d2C7X ի  ߐ!C "*` vW^U9i722Ǐ ,*333TϩSr#͛j9&u.C\H0ݻ3gDΝQbEQhժV 333TT BkKQ#n޼kbرh޼9,,,8{-֯_={nݺ(W,--QfMcҤIػw/>m#?'''ddd仮dž7걥ySf{uA~rJ}PVDDD%@DDP(fL60 R'55F%y5k`hx{{ѣGn ȑ#8p` ϟ?q ̙3˖-C= JXl&L]ϖ-[0vX<{,ký{p1,X ,  =@%6m|{ENU]tKWff&[n?ĉ?_~n^㱉J*L﹞` UDD`wvpJ///I.T):޽{WdIGEpp0\]]ϟׯ_W^ذacgϞx{ĉTstt++ܼyڎQR%1`wrr2l"fffzk.ڶm2\~P$$$?6D3 &""*&"*݋h@ǏΝ;8qZhaRIꊇӸuj׮u]viOm 4t34|􄧧'vZh뎉A`R vZnZ,s9o߆ 2d4huZ;L777xyyO>ł ޻3f۶m3gK%=JFF??VVV^)0`̟?_!..:ճ}v ̍}>>>?fϞLرcѾ}{8;;f $an""N9ɠAпQ.7h ͛C1=ĬY =Ü9s+)"##UI鉣G@VϢ|rf}v QQQW]^ԩSoSFӦMs766F`` ~9-r`:w(k׮ ooo}4Mʕ+KMMҥK تcT va_Ʈ]r*M6!%%PͣR06κlݺuP(˿|RQWjURlٲٳ'\\\ ֆxq :99a֬Yq֭ocQ 00zW >\שkɓ'={65kJ*2 o޼Qi~'j$$$`ӦM5j|||2e ...ҥ .]oJZ!Cu8p}E͚5ann;;;x{{oERRN LjXGFF^9{-Jw^|ᇨSlll`nnt uF޽333TT ~~~S]4-yիWgϞY&aiiի_~ضm^T<޽[-0b KKKq~۶mPH\z@_pa5k|}}Qre|hܸ1&M7ojC9@J*勡r\|Qdbb[S:ֱI'NV}SeSiӦptt)U?ϵAyft*T@2e舐 Bmйsg ҥK_5ڵkjժeʔA -Szz:/_VZB 033CjЩS'lݺUk "*""*<==aժU?|6m$ u7oz,1cF{Ю];k׮\^z%InW޽$* [NV[g\\pqD]oݺRŋsY``ff& {ѺޜCbbngggƍ덊ʵm6m$8P 6޺uKm}<|PкT"i; B־ػwoU^]xJ{]\\Syhm}R߯lu{5mTR;FEEBy)_~zԩ#imۊ4o\kyC3f(j*IݼG\6((HKMMƏ/h„ ޚNSUe)& `nn.m۶s̜G*TR8z|ll;:l0APH|޵j*ŋB֭5Cxzoܸ!TREoA. aaaBzz6߹sGhԨ:۴i#Ĩ-FDE{vQ׮]ùs*=###Y=ƞ!ЦMݻW\׾}бc\eqmq GPP֭+_ +}K۶mRlݺ @bb"r9<<<_(==]-˗/===ѨQ\en޼wމ*UBfЪU+N|-66:už={$LׯEErr?F۶muݹsgqm۶˗qe7tZݻw#GϙP'Oйsgyeѭ[7lڴI|N&Q^Z}**.]]ѣGs+VD-+ϟ9s-ZPیJ$HZFܿG6C<(No^u'%%}^rCPP`ff kNe쏜lmmѹsgq~ڵz={ׯ_z lٹ=} iW&m֭[])]vW Att4ѸqcZjboߢC>RRR,₀xyyi`ʕz }}񁹹Xʕ+ܹ8Ы:*UhԨ5kw) ,YD]!?FVp%E???8::Ⱥ۱K.:g v""Ä }rϖٳgk/,,L,_bE?222rKJJo.t]?ں<}.qrrR9Ǐ'''aʔ)™3gԶ+66V믅2eʈ\r&|RG4Aa…2nnny֟---Mprr_Ԗ>|"YFQ[ȑ#*<׭9/_^ Ԯ][ؿJϠ4a֬Y*#<<Os}ݫraÄѣG ƍ NR)SO,oii)Kܳ;5kL8}J$h;'A8vPZ5a•+W\0vXcƍ۫\& ӦMui&(۱g7Q`7Q۽{w2֭)([zu$CM;w뮮;w4'--Mx6m۶MRJyKrёG*F9֭[%Aіv%[JJЬY3ΥKYVs^zgy?'y9u⧧SSSiɒ%*V\goݺ%ىee*gΝ3+OQ v#KY,n:զC)_RGg͚5SN@vlC[7Saĉ\.׸iMc 666y.<4hzĀaĈ7J5ߪt ?xlҬ M~oOiӴ7砩Ӏ1X傇J0VYll`ccS(dz_4^СX6 r/"(SNg9c˳U vLcBDTx9t VVV۷oX-ڡ:D/E=8qj֬q9JZGn?{L 4)SE^y%(ާO-[Vm9mf333ٳ;wJZ-[%Njӏ=ӧO% d:*) ŋN:iOZt8ݡC :4ϲnnnoHmbKKK*z֩͆fQzuOtpp/OzoSPP^W{(*5$,111W5i27`b0777aÆ*Ǧ(4kL<3ogss<ϻrPjUY_rR>WTiKNM4I$JcE)맒/u놵k"""мy<433CZZ\͚5k9Ν;^gRx{{Ξ=+)~(d{Ĉvݲe /^ \ڹELMu<y8p@O4^d~ʼndaî]yU9 0@ 6lܸC+W_/m޹s'+m۶-nݚƻwp\pGBB޽{2ݻwi J͞]~vRRRO>UnʕbKM>|W^Ell,<Crr2,,,4֩B*U8I(8p K5kֈn1WAӧOfff ҺZn[c<6k׮HSSSU.jJr&&&pssåK˗/KoxgAN^hROI:9e_,VouZ'''>{,>3)grc9r=:V :twɓ'?CoCCC%iͦW=<<`rc?QAM3۷oǣL2UN=U_ϟ@I/C]Ufe+P[2WjHS.t<{d2,Y;v+VV=}TżqZ1`Ȑ!b;** ?J׋AK\^9sFb::6ӪU+9s@V]vObKssrrZFZ>?gsxL6 +WT9i_\|`7Q)`7QD۟F###9PW^gcǎ?>&O,w.]*J]6zÇUR{{+WK,9Н8qB$eРA|~qJ""ƍ*[h|(rAN8/_СCt-̙3nnn6mlPP:%>>x.o&MR tcx"bbbAnj3t|lllлwoq>@ݻwטѣG4h=1yd߿Gbb"222TcQ֣Gƍqe1H ШQ#TC˟,9圗ZR E@qP J. B+hy= VZ|”s+_4Dܳgrf[ckkN:9S\~] &9d2899k׮Uy/ǎy:6=0+̝;+V.zÆ r={ĺup~ZLUa"E܎=f ֬Y)SY+Woȑ#8z(>,򓞞9s 99 .ԸN amJ IDATL<]twp%nիWXl8?o<'&&jW>c^Ž;rR,ZH TT^'NxeaD=7oިjk3m/DlٲJS\P__#)o+LoߖcҤI^oDD[ϋ:;;;#66āy8-:Ci֭2;LTr*o}bÆ ʼ 2Da~m:uJ?0.[,uV m( ?#v?> :um<6iVP&umۆnݺa޽ÇL&ðaxػw8~zG2{HD%DDEDff&֭[DDDh vg322BӦMѴiSL8ؾ};L"~[d Ǝ5Ipp0v؁.] 55/^D6mpAj\СCb'NvR/xxxʕ+HHH͛1x`YFFZ߿_/,>,:sA~ݻ wHJs}I611shK} 8A{|t9rDWW ҥKx8]j\JSfM)SF͐z+gO;w޳y A ޴k֬7 ~w\>}Ŏ9s`Æ x 2331el߾]oؤ]A155ѵkWb[.;;߀n@9ٳgHKK[ LcBDTD߿_111nOfil`i{k۶䁂rjҤ8c<{LrSrT8SKIݣqlKvm۶s!799/_XqtzzŏrJ>)r2Ԥrh޼ںtz/^lHHo.ϟ?5#VJ*?~Vµkd1=LgSd\r7 4kLg[o޼PW7j311wZJ_ʭʩoއL&C6m_T>| <[tENHH]4?`b]vUt=zO:%v͚5/Lߔk.aZTA0X3g[<6iW&M̰c x6LeU]ׯ_5ktrn+;l vo޼Ν;^z\27nTZKɻ]v*s!88j+}QI`7Qa'Qyٳk͛7*D=z___Zo]tm:]vغuSٳyIѣGI?XVm`l9gΜgݻw 1NLL :w6P(_'N(^`Q裏LSvZ,X@r{w.NGFFUvC^зo_q~9s/0k, %_bC|8}YL8QЅ -6mZJcoo2ŬYT.p+|2>CqA%Sw%$$UV8~>}{FTTPBrr2@.]=EرcUR͚5ˀ) }l&;ݺukYC wG?uV\܋/"s&,,LbΝމO>D*1"TiGs 'Eʕ#{^zJĉҥ ʗ/ իWGr吚;w`۶m*Nwu{Сn݊=z -- gΜA۶m~]]]ѵkW18?k,9s q),_ϟ?5:t?#_ʏf͚aÆ*y"i1c "" ٳghܸ1>hxl"oGQU 4@xx8M +mLzYf033í[b ܋?~:r9~7 55Ѿ}{/_?ƍߧOIņ]9h ...K\& @m}eQ2*4qDٳNBZZu놞={{\2^~}aŊ`rk֬sʕ+cÆ h߾=3uԩ`eeD@EBwww9͛7nܸ~ .])BBBHD%@%Ɯ9s; `ff&ԩSG0akQnܸ!KZpX\.>>B\\ 7x`O?RW_}~({NS![@@̪UԖRY^T7uTmعs`bbEcϟʖ-PI]>׸8!$$Dwn3mr~y\xQ(> r ڎM6۸qcիWޟC߂g$e7Tn:Im>zs8ӶѣG:Qً/TuCA1V/_ ⲽzKzl099YhժXHX~}rR{6]Ѥ{GaNʟsTT2ׯ_lmm~ɓ'un&MZ\./_.鿃 >Ha/ġC`իWиqBЍSmddAWʩL [ χ 길Ǒ#GTmʯ;b˖-zO:*Tӧѭ[<ř3gT3*L 4rF&Oʗ/p<ҥ Ξ=+统nݺiӦi3}_ ڟ37pٲeurQq|:0/(*)˶n݊ׯEKA077Ǯ]вeKYwr 8P EQhRn]>}:t6FFFС.]ooo7oTR%u߿_%52Aq2*>  ɻw0b]HDT\|w/ sss8::QFpww/T=‘#G3bŊF/ +}޽{UOZZ;k׮!)) puuE@@GĉFZZ//|׮]ӧ ١z |UaHI`w p@v "b̙35k8矋H'N@Pƍ3ts~)iLq;wΝq]do611?3mۆw۷PG߿InƍCLL q<{ صkiK1 ٳg8PfM\rfffn%TjٹK… ޽;=zg0+A\]]U燵kťMDT=|ժU%eV66r\r (>Dvaðo>>} WXd &OKh ƶm :tPODTRbŊ0`.\@7QVj{v/^D͚5!#G޳GضmXgXX_7ܹ\/A['''DGGK*xxx|s$"""""""" 01cƼw7o>>>`gg%K $$ ssQN9`$V+W>,QqPjyfqzĈy  =z]v!%%*e"## `aa-t˖-,'вeKZ III8<|}} YRRRpYY=5Q(b@¢P$""""""""M$''!>$ڵk+++TZUczׯ_{{߾}HNNF.]TvW^aшj֬X899mDDDDDDDDDDRx:/{xxh t,@RݸqݻwGJЮ];~~~puuŦMPjU]Vr}ְ+WN2 ư Я_?&O kkk8::9ҽеkW@Ϟ=Ѹqcagg[[[L0ШQ# йsg4m * SLu1!44Ю];bȑ#2e૯ԪU C nAAAaÆzd1\]]1|p?D:uӧO9*UѣGޱcG@߾}4iʖ- |gOOOt н{w4i0n8'N4h{t O?+VN [.  ;UV 5kСCdݥ}СC $011AժUŴ=~~~  0uL:X">S7:uݻ8Pĉacc{{{7ФItЭ[7xzz>3888lٲ4i}t>>>ѣGRJ077ud >066Fxx8d2WaÆкuk!CPV-W_}2e#G]vPBה)S`ee *6mΝ;zF&L[[[aƍgϞ] @ɓׯ}h޼9`ԨQR _0h @6m裏PZ5rC.Zj裏hӦ `РApss|033C*U0j(@Ѿ}{ DDDD.d$9ٝOtbbIIIj-<ȫ}DDDTr1"QIs*M'SSSqDǏk-<(- _~x>|x捡FDDD WfO'"""*xC !{D^~]_~KTVMh"C7H/d27o|DDDDy4aC:!C-' k\v-W~qHd2 """s*Mس=S^lYߏ:v2eQW_J*puuUy0MDDD%Eff&fΜLC7JCzеkWɓ'?*k`Ʌ;w.$""M./9h<ҤԦ1{.?\tt8eۋVVV*=8~8bcc/_~(W.]sqơQFM """*p/^ADDTjA ݌REDGGJ*MN&t? zj :Try1INΝC<=z4~"Py-0rH̛7e˖5t Dff&~7 >FFFnQx$&&"##)uA@ll,|\JcccX[[\r:sΎK@RR,--u^7i v@BB~gl۶ w۷oQBbC NMDDDDDDDR$$$ӧnHʕ%we.{rvvVS}ƌ/B?͛3%QHII;ZYYfff-d )) VVVMNPݻwCRRURo}KmnҬvسgecn"""*I ""+>>@V '\.g@N. x S:ݤBWPܹ 8;;LGD%_RR?~ cccԪUKky}%y BafB󜇈 Fifff֔n իW`W*lB&.][[Ddhذ!y r`9 MRH_Xn&_?~DDDTd2ԯ_ """*P2%/ZSLAffADDDT`233򜘊$i IDATJ4As1RnRkɒ%͈J4\0Qh& 1!,,,ѣ\@""""үNDDDT( ^R{9 wwwTVMh"C7H/ 6o Baׯ_ D=I3gڵkFen"""*)ff(L'''C7Pg7մiS8;;U`7 Ofn"""*A@RR,b\]]!paC7DaԪP@DDDTࢣ """";v 2 2 nnn\paaa_>lll`ffU{Xn233 "&&9jժsss#88;v(~^!%o߾DDDDDDDDP(p-@ڵ98}Xr8qhB2޽ѣzj)/[.6ni]v -[˗/HNNcƌ"Y+=z(滍E}%y!z[zDDDDT$''cի5.-[bժU ;y_Ɗ+PJܸq-Zӧ Tt/_;.]$$$oL&ŋjժ"Y? I;w@&DDDDF&VZ!)) gϞ-SjUԭ[ׯ_Gdd$ LOL9cdd2e 22XhXF{[XX 55/_˗F*˥W^عszpС_^\0Mj-_?cg̘or 6f1o=q ӱIAp(uFDD@x{{zzxϟ?x TLvpe˖: ""/^kP~}=q8Ц{qu\~P_`6o L3gbرƳg0aL8&&&jܳgSSSL:#F@Jgb̘18ww .tژ;w.v Lٳg#,, VVVƔ)S0a„<[R̞233իWDDDDE"""n͚54hwww( ueI^OZJ^nՐdzJ^<\TR_S._'''Կ L>]̜PR%[~~~HNNU_ff& VXpq}PbEbn 7 SNŔ)S`eePV\-[]oI`75l08;;U&DDDTR( DDD@P)DDDD=z݃1zZv\evN)$$$H^NNNz888H^faw #>>&&&8qber9N#G\ڴ4`ggvډR^obb"ʔ)?;JZZ^xػ(,@H.l"Qq0APq/|30*WEAP Ȱ (;bf@EA-Hd$$~5@:t>sVݧysK}eggʮ 7ܠ?DDDīѣG5jmҥvԩݶq^hϟ>ׯ?gϞ-SWEtrB2EIIIsmk޼y:>_;pпLӼk=^M2&ҥKK("""Ml6t"""ۗ~0.yW/W~.6㸨Gyddd|rÁ$믿NAA'Oh_ X(,KR'Phܾ-[}2ԩa`&{SNn۹f7i9wX.kǃ@nv{֭[ǟmN<޽{ݻ; ]HKKs[?;..Dn (?p9o7==hm6 *c"HLLt""""Ub5 EDDD<-::4iذU4dƍuy:uD^^.uq㈉f]b!K9rdJo{ǗpBN8Qb1MkO T}^z[o4MNϰ0ڴi?O~~~X U $??3gg[(-nm߾]3DDDīl6nvyDDDZ2M%LtgY fÆ k׎BBBX~=++!C0c l6saW|'m۶dggCk.pix2e ~~~%0 pl;v,SNeԩVRԩS*NбcG\7oЌd(,_an6#330򵯾*&MחFY:t(fͺӨR{!,,0c 22ь5 cǎY3+aÆtR|||&==4&!!zUl ㏓ ?AAAdeeGϞ=.((`РAZDgf?~[z{{p%v;u-wӈ[}7x#_}׻DDDD*fcС[DDD%”~INN&99T+ 3]vkd222*ÕеkWv /@v#88>}|RU}|/^G}-܂?PXd͚5DDD\p:رc vڤwĉٱcGD7 _bg&$$wެ]g}Nu2fvK1_PJ"""-L$++ t8"""^E34q:l6yjÇӾ}{n˻T&jiٲ%mڴ)R[DDD>(6IDDDpH6m4zUnOQ[ܚ6mjWWaر󈈈W3 ͛kVw 1x`VZEZZÇy'F@nݺ 7"""LdϞ=tU2MSvmyj+Vl20MnmkצUV 4 p82Jŗ_~+<@ӦMR TƌCS7o߾Xc*#Edggf###@O$"""R%LtbTDDD9N8@ǎ4߲<̝;縸8zYj{49<< ͳjwתUڵkaܹ3-{UwdŊ 8JY|Ϟ=@PP999֏_5kVݦM*-꨼W^nSnr;GzEDD&P6dBCC>'::FDD{󤧧s9hѢgϞ|U}*I&׏'WxIII[nܹL2332e aɧ~ZQ[ݻVf&|<"""rXlYYYtܙiӦxbrssKoeDFFҹsgk{ =z4;vছn"++Vs9 @JJ k׮^cz9spQXz57tL0gy'RPPP}K)-n#F"""l65P25{Ĉs=lْL/_Ç㏁¤M4aɒ%ԪU'O2sJ2T,X@xx8Z*^0 )4M̙C=[.5O>]L:t~:@PP!!!(Vz淜N'|ro޽Yz5 cz:zŚDDDī9Nl½ޫHu6ƪ;sAJ/쮺8U aӉf%p?>ڷoϰaØ7o| Zn}vMVܹ3{eӦMp8JϦMشiE駟f//¼yظq#7pC xGXre~cbbo*\_jQDDDD\~~C)wy'm۶ gxlڴ'OǕ %88L<$''gϞo>]nJmڶwbϘ1%K`iiiHxx8/"nfx |||4idgg֭[ѣǎcРAB.ӦMcʕoAzz:iii$%%1rHگP[ڸq#'N >>+==ӡT F߾}5[DDD ֭N^ԑ#Gڵ+a[_tt4aTզM2s%:uzזεh/ĉ /X{s8DDD`&QQQL<חP֯_Oٵk5 gϘ13n8h֬s%,,mD#{qok׮\^zBDDDjPDDD۲e Gח!C*_2o޼j;l2/Jdff9:uдi 4iR~n(k[VVن Ϗ_|>6ǻ=^ll,Gs[aÆhYYY3f̘qJ=oVvv6+u-y=H2 ;̳DDDD\s5Ŷ > &pAmFhhA]澊>ߨQ27tPZ꧟~{4lm___.\(@֭[HMMYfJ?~mРBCCj{#%ŭ#GЦMnoa;vt""""ҥKmݺ5={$..bVZ¾}:]weFu*:=''z箒 2%Ub׮VZ4nܘӧOU%??KY$ߋ]QF%&Jv[WȽ7q8?O#"""ynW;.KXt)v:u0p@mFA\\-b֬YԮ]~?m6Μ9Cƍ/իhѢ]tM'%%NJJy]YW.Y沏Wf5c -$"""^f/j#""R5h]u/21baPPPٳ/WBB+V ˒ۢEh֬Y^v[:ud{љVGWqW"ܝ|Ξ=[M^Ҹ],zŭ'"""r;s挧C)U||<@a45/T٩S'Foɏ?X1F K/+\+r.X'Ow^zm}~뭷k.W^7]w7l[zQ۶mzݠdb8NO!"""ReN'_}<"""RmEGGc& 6_~mJoܸDwy;Kq}:iro߾ԫWzԩSF6mx/5kJW3sLL>y %ŭ?P+EDDīOk#"""Ւi̟?(,an/F@@N>:Npp07n]v$$$YYY 2*i;g pϷ"Μ9c(lh 0 '|mےC=Į]sss6mSL/ c0uTNj%O:c=Fll,%fm6>bccZަi~f̘Aǎٹso`` cƌ_7ߴMNNgƍn&RDvv6u][j""""tm6BCCU[DD9N80! IDAT@ǎ ؼysѩS'6l`6Mϓ am*&MחFY:t(fͺӨRe)C^}mx9v5={FJJ PANNU$""9 ҥKIc&$$$m…<OPPYYYf{ѳgO 4hV*/ٳ>}:Ǐg֭UTy$nnݺSwq~ADDDʕVPDDD\ SVILLjbXn(L~-v…b322*7ڵ+w^]vL>}X|D7&/^G}-܂?PXd͚5DDD\p:رc vڤwĉٱcGD7 _bg&$$wެ]g}N5RLe""""""""5fvT?}cۋ_ -Fxxkt:Yp<"""LٳhL6 ^zUySv]G""""W#0޽<"""}QBj*Ҭ>̓O>ITT7tR=ODDDataT)0SÐ+dŊ,[ Ln['OL߾}=^nqkر8O!"""ReӦMӘGDDDi:uJeLj?r 7O-2dL4V--P)Ÿ d6iEPPhdZ0MӉfӘG(-P)Նo 77!T9--5ְat#t:Yh<"""Ν;D%ŭH|||<H<""" àiӦ*a"5mݦYN"""՜N'?<"""L$;;[ TJduuy:*DDDD\~~C"|=TO+VJ"""l6=H2  x: +BLqkzWDDDdҥ󈈈W3MsΩJv[G""" àm۶󈈈׫UC"TD9~8>_>PT""""0 nO!"""R ànݺCnq;k׮\^C3gp8<H1MӧO-n߿_/-"""f??Z[DDD^ƍ=de[&00ӡT"n=8NO!"""ReN's՘GDDDޙ3g<a*#Edgg[v0rs:8p;lH T@e%uBBBpx54ٹs<"""L$''Gcڷox549t<"""Ο?7ڴial޼ӡx%ŭ%K#j6GyDc|at àaÆ;k׮ԯ_ڵkӪU+ Ă p8W *lj'5khӦ j"00]sqJ'551cо}{ԩCƍ۷/+VK^zᇵXx5ʕ+5JttСC?h{49}4FG{ݻSvmN8yG޽;w3|'Nu<|$$$Pvmٻw/t֍ŋ_V?{[n̜9ÇGzz:7ndDDDD\f<HdBCCowӟDtt46+ٝιs爊E۷={W\ ~pBRSS ''XnFrss1bvPyyy<äЭ[7vIff&L20O?Sˤd?^j6;Ccj,[,:w̴iXx13fn݊/˗/'22Ν;[4hѣٱc7tYYY <*?jР;v`ڵ 6ƍ˽ˆ hҤ .\w߭Psѣzjn&0a< 'NrNL.FVDDUUIDDDg֘GDDK'}9ʴ=v2p:z<=bZlIff&˗/w|GL0z&Mdjժɓ'9sf_YիGHHHۛ6m<O?T>,X@xx8Z*^0 )4M̙C=[.5O>]L:t~:@PP!!! ##N'|ro޽Yz5 c*-niJvZRDDoY?]e+Or?3eOEï4 VR5<<0J/e 00^x}oߞaÆ'TNҨQ#.\P}v;۷o KӪU+kMms8 :/Ot:ٴi<fͺhQQQtڕ>Cayyy/L1cK,0 ^{5HKK#11p^|ERSSs͚5<0i$&''[ңG;ƠAJ<8m4V\aFRR#G{z %ŭN2Nٳgk#"""WMpxt im/5e˖e}2aziӦҥKٱcF*N_{sm+>''Ǫ/3qD ,{!''ITT'O%44Ӽysvʕ+}v;3f`7ΚѬY3ΝKXX~ԩSt""""ULJqi#"""ޖ-[8r 2ضÇ3U۹iӦQ>YԩCӦM+jҤIxz)?ZbV<(k[VVن Ϗ_|>6ǻ=^ll,G뮳jذ!*oVV3~a0nܸR[z:tb=!"""Ld޽tҥx§~ @>}km>|8&Ll۶Pk[ HII!5544IOO޻^СC:thWt ٳgi۶-sν1޽; 6t׷D=[JfJÕ?~?l۠AGAAA꣙VHH"""L_~јGDDDl.] vo֭ٳ'PrVZkWvϯʵ^ƍKM6_J+*SX5/vjժEƍK|*OrrrXrq5nq?gΜ9CDDDlRcݟֹqBwHXü%K\)K.nSN͈#cѢE̚5ڵkЯ_?~G~GΝ;WDիhѢ]tB999<|w4i҄Zij"&J]3)) ͛w.\ Nߟ5k\j"ŚDDDī9N֬Y1H5w]un_|ji@@_pͥw-DUs~ᇋ8.GϏ /_n}>b àK+²$)h"5kVmV~~+77e4h ܹsЩS'܋t-׶? ꏻs7m}Uަbeכ(-n-/"""J#"""R &KӨQ#~B:ubԨQ㏥p0j( hذ!/Rbͽh鍋\%8+//7̺u б o`:OhӦ ?ҘGDDD%4?>PX$//^+,,N'}u@,X@vHHH $$[۳2d3ff1g pϷ<#F`ժUԩSZ1 0&۟|IڶmKvv6=gnn.ӦM`ʔ){@@cǎ`ԩL:JJ:u{XJᅬfc۶mw}ZU4ٿ?3f̠cǎܹ7001coZ&''㏳qFzTr)";;@Zl޽{K%"""r3M'NвerգKs:8p;I ؼysѩS'6lPvnn.a[ꫯ2i$|}}-b9tPf͚US2[lVZԯ_O>]h˱cǬEٳ0RRRx999V Æ cҥLzz:ioMBB111ի .'77*6;..XAjժ̞=ӧsqnJhhE*}ԭ[}N#n%''{:*ZHDDDq-LY'11X]lW w)X 퓑QRј.Yvݻyh׮yyyӧO/_^ꢟ>>>,^>[nLɚ5kh:tcBڵIOO'00;'cǎXbg&$$wެ]g}N/J3/( cƌѢM""":&Lለx>LԩS4o\Op}cۋ_ -ƫ?DDDī+h#"""^0 Z%iӦЫW*Ot{VѤfirAyDDDī5!̪UHKK>;|0O>$QQQBHԳgOEDDī֭[i׮f:WԪUab -[@PPibۭ'Oo߾ ifzZ"""l6#GԘGDDDa4nX?~!n ??-Z0dbcc4i#Z{m۶a0 ӧʶ""""t_k#"""^4M233 O_pa233ĉ,Z{U9%Ѕ xꩧ.4[DDDD{ht}]vŨQ*|'"""^f1x50V42'N`ѣHx5ܹs5f&gΜQ22cƌ:͛x504D_O 端bʕDFFҴi:ֱc*)*t""""UVZA䊨3&<<:`0 0/OΝwIƍS_==[l""" gM4I􊈈Ws:k󈈈;uꔧC"j{w;wVʱvAHHH(y||<|gDDD0k֬*}Dv?~ sǛ2e cƌDDDD'Ƅ @x͛{:+FWzYf>N||<ݣGf||Gmٳg3v ލ_wy#GZ)lѢEGDDD:;yCrA䊨ѣGsA҈cǎ>Θ1cHII 22(_oNx뭷صki*RWļimzMbbbcmҤ ~-4hЀMҩSbN>́h׮!!!=vvvBnnݺeKDDDDDDD 8p;vT0KȚݕaɒ%'|v}u$$$W_K:uٴieǓLrrmJCa]s-$"""tr=pZib D+hRamOG1MO?4b1_O?N׮]?] 8+amw%/4bm]﫪+W[IM9O}&&G軯y&G555)YS{W޻{g?on[}tWclΆ  **ǏSPP)S8r &&͛Ǒ#G2e ?~ܺ&qqqlذ?}oéSXjK.jϜ9 Ξ=KdduMVXʕ+k2{lRSS`,^5kwDnn.SN_`ƍV9(p8L249z(@[| СCs >nʺum7?}tINN>`|W,[_~wy4Ν;ǬY//xIII!++3fEvZm9sHLL$//7x`klܹs9vN)St:9vs`˖-|,XoGbb"s`۶m]=B#t^z￟{GG{De#:ĹszѮ3géSϜ9Nt՗>{,yyyV[4)(( 55(,ys8JXXhcEٳnݺ1sL>lܸsUIeȾjժ5\'.>!!zߪU*2իW㋽\+Ҋx""""W,Y@hh(P#::FDDNOOܹsDEEѢE GϞ=T.۝w̙3پ};vv;ɼ˘1c*t<~aRRR֭;w$33LLaDFF駟VPu>~Eݻzߵk*hтnݺq{UHut:Yre<*"""r%,[,:w̴iXxq~oqqq|r"##ܹA=;vpM7#G /УGbƍرc׿EAAA?g=J@@W榛n KO0gy(,\KP>7|Sj;4nݺzU[eٳgǎ+z=HgV)dbxUY#F{e˖dff|r> &e P걛4i’%KU'Od̙t˹sʽ w[ᥗ^0 _Qi2gzAݺuiԨ}aڵeСCh^b(eؾ}{ ƼyOx*<[O]n}vMVܹ3{eӦMp8JϦMشi%+'DEEO[3_~_~a޼ylܸn~<#\X111|7̚5\jQ}u҅?l۶{Ds.z|jШQ#O """R*2GDDD͛iy睴m( i&N3o޼nWmgL,S;00zYԩCӦMܾ&MTh?(7##cK?iۭsmʲ>۰a1?~dwll,Gs[aÆߟsa+ٽag̘1%3 q)-ףG~W>C >Lvv6͚5'(b׮]?~u~ԯ_CQT0ҥKk>SSÙ0ad۶mZ4h@JJJ[SvС :+KppU4M5kgfXO?н{w6lwߍ/.\(xjj*͚5+yq볟Lw(\Ϫj#Gbf_z"88_~{wUudq_qEs+%Ps%U+/.$$0T%ś*iRi]\1@emcebf_<9yg9ϯɓ'E||<_D7PTk͚5ڞW@E!:td7Ukؿ?۴iS@Q)4icu6lXMFaXv-c>MM^;r(HNN.u.߲ʮX[[:}M:͞=?XpV7 Z?0u8DDDTN:ڿ?T*0rHL0ϟǞ={qFK.!::?֙`#G5jmT3gbѢEx!~Gz-0NJJ*uqϤ$@f4 N2G^FLvNXz7YDDDDDP`̙MDDTY7zff#Jӌ=gFFF<___EIիW7o\f_ PT3\tkjL:pqq… g,Q֦)aH*Jny's*Jkcǎ<'117n 0@ߥKEᥥl{Gjqo効SNrm&&L(hDQķ~1U[$ ...}%$ nBpp0ڴi+WmJ%Wg}&w}'Oٯ9$V/bT*ѵkW>}DDDDBEĠsάMDDd`(6mpY'NW_P$Eff&@+WʉaKKK;v,6nXah֬o[[[(JT*={F%*x("""o?ْ$ prr L(00зo_'Mn))) nnne&"""z MC=M9 2F”)SгgO8;;(4GLvN111GDDDfMta [M/|HJ%3:ޯI:͛7jaZ9!"""&Ie^_}F-ZѨQ#3QQQXb#4..PIZ4kժﳌ -I6"""Շ$I(,,%(: """"E۷o瘇ǏMQ`b2&Dd2&otj׮KR999DQ$Iv:t[{lIgϞΎc2{Zt$ hֶ֬aSFDDDd$DDDdrssMQnƍ~&"""sP(0fSADDDdT aU &IÇqppp0u(DDDDF!">aÆ(-I5k =ITS@DDDdtu1uDDDDFgiro:/p5Bݻ: """"JaU f3IPզhj5l15IEd7sf75By999:*=锑af͚,,,LQ`t;w.DQ4uDDDDF#"6n1S@T%{/?7nf̘Qk,^A@dd!ã2dggˋT*ԨQыFEܾ}ЦM #z }yI|gϞ $ QQQvU:TZnTNNNDDDDfA$ܼysْ$ 嘇̞QV$lق!C hֶ֬aSFDDDd$!&&FёZ1u7nnngϞ5u(fŨnSн{wK2ׯ#66ΝkЈ BP`ĉ^(Ν [~  &&~~~h׮`kk&MPU GVK.PkZjժoooDDDT>`28͛7+޾}ݺuc Ѹqcim,aBDDDBE;v T %44T~|e/I1uTt[l7&<1i$oׯ_730#&&`׋'֭[8XYY!=='Oȑ#1gEai,f‘#GPfM4 2_~J6uDDDDFgooo}h'uχBCCP(''SQFy&z_Ob nݺ^^^Fxzzʕ+Dff&>M6aΝ J|7͛ >=\;wYS(x9!"",xxx 00w^<{6p,--qAlڴ qgggL6 111xWQF!--ǐ{=`˖-mۆ{G+hIJe/_JGQe#6m~C߾}B_cРA/`ƌ"̚Zƶm8!""fDϪ&MSM3{„ ݻ77nL|x׮]6$&&bݺuX?~>>>:tAE&MJ_p!A@RRΜ9S$Iضmv5jď?Wwᅬ֭[ر#>cdddNE|ܹp0eUv'N`֬Yؾ};̙3֭~iӦ*á2;v  """2BAqf7Q5JѦL>c-*3!!ANB"((?~|6!!!PP*7oshժƍ0l߾V20Ob޼yP*ظqARpEEҤIxxxƍ|LVW.9caakkkDFF"226l(q{{{իz*pIhB]AAFCi{>}`OuV#{KKK|Xn"..ݻwlj':*ţGLկ_!%,, ${r &"##X&9ޫW/8::Տfftrr2bcc Q}HMMʕ+ѨQ#\͛$ Yyc7n}AZ iiiHKKÇ  55U5=ӧ+VÇ\p]vS@:t O?Ezz:Ґ)S`k.L6eܹAC0-[Q4-9DDDDUAEYc"""z!ڵ СCxzzBExqwr%[j%?׻]hh(Aw?EFF",, ;vٳ+t ]OmРAi??''Gh",_ݻ7rrrJ\OV$!$$rQ~}\vM F,]K,RԫW;v@ukNLzqZV?ӑo^z0uDDDDF-1Uw?޽ KKK3F똦|IXXXvՃ zI@ff1١nݺj׮w?xP(uVT*޾4Dz}'N@FF`m .]zQQQw6l, `Ȑ!r_ʂ5KK,)*٭K۶mqE9ΝرQQ˖-5̑$I{.Zh?""""Sعs'`Sֱcٲe? ///3RRR I󤧧ˏ]]]qر;vW8{֭[<;}pqqyN^`iiB.\^zI˗/:;;l+++9K= IDAT 22SNeݻ7DDDd$I¹s8!""j-;;}6m={(*%R\&M׮]ӻu6lXpĵkװvZԭ[k֬1n/昦L &vY jժUbJ~~>KݲKĦ鷬+Ed`iixxx`Ŭhb;w͛M( L:a(m0hBJg*kPTȑ#u3a?{ƍakk Kp%<}TD#Gn۶ឈ͞=Xr%,--ʎKNJ'x8))=Tls]S͂C ѣG+}QPTϟmb߾}ʡw޸~7'''899(*""""EgΜA~PTBZ)+l#F=z4fϞ  """""""L||<%KA :u*v؁> ÇG׮]u^CVcԩ((( .\XX={rD.J%^{58v~$&&ƍtJZZϟ/Qzo^{M;u$3mjRxZܹsMA( 0 $Ipqq|(߰aڶm<5K,3gP(Zb!2e $IЦ2b y_y+h^<(q<(($Aׯ5kDAA֮][$I߿?sE~~~hoRD~~>֭[MPPP3ٓNSNEƍ榵  QsNCDDDՒ$Iصk&yyyPTn=DQݻ(J|hٲ%бcG?~\>1c 88 ۶mëVPAt&g̘͛#;;Æ |e'|+++=/^ eT4IGaɈ}>_@P ::}ATT\[$ܺu hӦ \"U*^}orr2}]KJB5g/_6dWȬ) ,Yc"""2{3uT kDTzd着iCS~}S@DDDdt=2uDDDDFWPP`5 FZZ/..3f@HH YJ%EQ{$\v,abEǏ瘇^ffC*Çppp@V}v@@@MMi۶m]IDDDf3f̚ ]6u$+9-ZQF3f b Gh\޽{s5QqyՋulIJRɄK`>}0IvJDDD1uDDDDF nرcDDDDfMP`ȨA@͚5MQ`6t8q"#"""&"9!"""&IF R PT%ʘ=(}6M6,F*!Jv+ ׹n=8jQu4Tݻwlj'J&"""2(~kDDDdw!IQF **{P\%txk  RRRL:*QLH~ߺYS(1b """2*A4*EKƘ1c """2Qw^yȬIOr*8utu8Ymڴᘇ̞C LvN׮]?"""2k W^ᘇ̚ 瘧qss 8{C1+LvN ,` """2kj ܹs u=_$_$ 111Cv[[[4i>>>EPJ j vvvUagBd7}v.PIDDDfMP` %44T~|mT*1m4t[l7 [[[2I'KKKS@DDDdtHo999طo v[| 2P(x)BBBШQ#ܼy={įjb07_URaĈHII'\LdffO> شivigDQk G:tP%L4 (: """"EwٳaaaapGVV<<<>}`޽شitqyXZZ>|qgggL6 ÇoWbԨQviUK۶mý{`oo#GI&{{{,[ =_|˗cĉ2qT2ݱcG3nL`Xj """2 ̛7aM3{„ ݻ77n,!?~|_/_^"]\ڵo>oXnK ʉ.\/III8s K۷c۶my&lmmѩS'cȐ!Ν;Xn"## h#GܹsQfMDQ֭[ o߆-:v?Cp۷/L5WZ$"A0ڵ:wן̚fΝ;}U\FJѮZ =z>4 J(+|}}Pj(J̝;}j ƍCXXo&U*.^:1Dig@DDDfM$$$$SNLvUc{hԬS{BL߲hq#,, ${h޼9AAAFi$ǻwGGG:t(XkΰORSSѹsgܾ}аaC~~~h߾}yM9/Yyqnܸ?88 Xr%̙$%%aX`AeO=ӧK.Ō3РAŋ={6.]h ġC V^ ???(J_Xd ϟoV af0yd5 JP%9pve0FPaE0aC_ڵ K.js]EIY}oժ8>>^dwhh(N׹״iSWmNN\'''T*ܹsw;=7hР4NJ@E|rÑӧOZ$IBHHl}KKKxyyĵkp!y>+WDGݻhڴA6z#GDDDdDQ9!""j履~ݻwaii1ch$DJPTB;Ob;F;;;ԭ[B[ڵGAבO";;OFnݠV`|徶JۗzXVVĉȀ,XPB(FTTݻ ,K...r'Nhkkkh'V\Ujfwbb"vލ]vp4l&M¤Inj|@kݺuW_}4CNFtҥ*{ """2B]rCDDDZvv6:g6m={PTJ&MnݺwXqÆ +Y[[c&j*>=''4}~lllPVO5P󑜜\ꖝ]"6Me]./"t͛7#)) rҥK?jCuO6w\|Ȭjlذc"""J;;;9R9:{Annh<~X9hԨڶm[M[n{mqRRRiկ_AgY͸tȐ!rNٳe^ed*5[o᭷“'O7`׮]PDDD"""cܹCJoj*SADDDd4 Ǐn""jCvmגkuqbxl#Fh8.nј={6222pA(J^ؼy3>2JHH@DD$s7n/V><]^066̚Yſ/+I'O_n]떇M2לudٳgҥK~:Q~}ۇǏcxWѾ}{]֘P9:""""1uDDD55ڦ+}(+ @{JwwwL:gҥK^CVcԩ((( .\XX={Vf鍲6M C_nnnjT*k;Dy tvZϟ?_^7@Q-~\1wIx⢣ͺ^7`dwqڵCpp0֭[MPP*U~ϦB!C111h߾}o% Bbb"㵶Ҿ""""zXXX`…sFQU$ vPT$//*ԭ(ؽ{|GGG:u -[DBB:vǏdz0fCP`۶m>|x?HHH@nݰ}vDyaa!зo_\p@ьv]eBCC!AЙl1c7ol 6 ׮]P4=00[l|'c5k`͚5rRѣG}%$ nBpp0ڴi+WmJ%Wg}&w}'Oٯ9*^ԩSZ?,A@eggCTN:HII)q|Ŋ L$\~/@Eܾ}ЦMQgϞ՚1\8q^}UE\dff(amʕXbuƎ7ViE||<5k&Jlh+++aܹ:*xR'߿#sttDNN\6m*NVcܸqؿ?IHOO$Iشi>s$$$̙3۷V.={f{?={]PP>|Dyf?ą U+l}%@RFi~g̘1qqʷ۷op9zׯZ[ioDDDD/Ip \ODDDՒfaʊu>|(NII݀v% jigddT8c[.6mڄq5j@zz:lmmѱcG̛7+j׮_ye˖˃#LtEI{bܹ֭3)9z(wŋѱcG"==Jݺuؼy3:v(;`㏘5k3urrkS]ufw||ÇqeܸqGVVPPP5k M6ūݻc6F8TӧO-DDDdDQDHH}]~ODDDfK$<~jbn2{Mv;wVٳgV c<~wӧ...$IB^^lll8*edwiLtaH?DmnWWWٳ&L*"UP߾}K,,JDDDdN$IBTTVz]FxvTQ'%%Akz'$I­[tqpܹʄIЯ_?.DDDDfME>}c"""zʏܹ%IBJJ N]b˖-qrssakk4iڷoׯFݺu܊ҥKQ(eÉK~++ry1J]z%?NLL@tT~yADDD"c^$999Zw^^^ߺcȑ BNOOӧOF͛ٳ'~Wc?J믿zڵ+<==+OƍPO RڵkC$и4;;;zNݺuǼ:uLYS(8p iӦ!&& 0jԨ2'VwPTR^wQ6ǎ_ܺByyycMo:SLL'"""2k("44c"""zahfqO0{FƍcdddNE|ܹp0fC Ϙ1e3f8p`޽{W~\|7o߾e/F.?3A0bDDDD%z1Q5W4W&[:351d$$$̙3___ 'rK+eZ Ry=VZm߾0fA#F̈Zرc1sL˃(ěo7>$$ڵ֭[q<\zԩVT>>>5k._,{ 6 6m2S6*2e j׮ x!:u`UV!-- iiix!|}}`l{QL>Xb>|l… ڵ+߿j8tA~t!)) SLK\T*moo/ !222xbM436mEɵ~Aʕ+K~ ۷L/#<q@]ʕ+AAAܹ۷SNXv5-Z˗РAw)VV$!$$hР^^^8~8ׯk׮СCr[J`ҥKd(J@zc_gҫ97o<+F$ddd 11ZL$aܹ/x7*"U@`` k""""P(h"y駟p]XZZb̘1ZƏ;v.O`M23=vvv[n6Mz}l>}ݺuZƂ j;q222`ee BҥKu{aÆ\\\'N7++ : `ɒ%z?!.W^… Iၕ+W.z'Nĉ U 9976uDDDDeڹs'ԩulXlDGGK>쌔}Ȁ5j_]t1TwT۷#%%pwwǨQаar]cСEz """zU:@lߦMgϞ8xúCDDDDBT """ףS{Wj d29,-c/+ܰw}K{]oi^Ƙ1c.[ 9ٸ[D3e߿>zXb̙/cڴiٳ'Я_?x/be%țf%"""r0۲ y);;w`K\7'<<r UӧO_]ja6{U֢Mհoɓ|뻒V>~8***.w&`}V3d݆uڷoW:q{ƌqYTTT`ΝHJJjz~i/_UVa1b}QS&FNcǎZ(h4|ӧrrr-[z}Xx1 >CL4ݷjKtƍk2NOkG}=łݻwc̘1z7 O.Oj׮]c6; 8t萫CkԩS@@@@Ky5A0`GjMrΜ9|&vqqqJhxbiTK[ӵ9W_:eX|9^?RRROɓ={J%K:t(T*`cǎŦMVhhڴiĜ9sTVVBkܹsqa5rذaVXqax'4$$jwG+qBA IAژ1cYYY;"h4og| p%yP*ǏǽދӧO';s h4DDD ""UWN:Q[@V(P*TP\q^{&\5=.73#βOOxg߹lƒ%KBPp{Y= kZA\Os0lem ْy=-W6Ν;DT*zT*n(8{,$IBRR|hxR[[ Wh#{vW.nFEEEnݺ]q8Ejeffbԩҥ &LÇ5\ӧOcx7ZZ*++[$JJJ I,\FvZ:u xbzw_59XlQQQ~p1|W{(**` 맧?&}G˃d«*+{;v=pH j"''VOضm7222/֢|_~M_~%N8Xd PRR"r?|0[ paOʠ?6n(NrJFO>?uVݻj*l6cˣܹ;w` l6#77W'{֭[9N> VXr%?7n_^ނNCYY/_. 6[yX%%%’%K'N_~ شi~J~o;~'yjb$ .\ڵ ;v`+dW_dB^^>#?l@ ٳk֬ٳgF#yf'>iٷvطJb`nA6Gvh47'(((hyČ3p5>>Zm%Z-$I{1o޼v{^1t󆣠6~jL+V>"""jJJ2 0q9͛={6.]ЈBP;`n"""j $$Sp}HHBCC:2M7$?߱cGI;wq5׸|LȫIs*=zh;v /"|||P[[sbȐ!矝#ARRu=z4X„$Ip3]\uJW^yˆ# Iq7GEee3v~z""""P(0uTWaaa,cB}F`` DQ}/pV3NN:7E6l9y5IPQQ٨Spj7A0k,:u &L$I(..ƟgL0YYYl\(??!\.]˩T*w@.\rf׮]i&|g$Iضm,;^"""j #F9y5A2&^Gvrw(ťg?N>$qGŅ hb v"""V˗/juw(DDDD-O?A+/I I>T 0!!!Gn0eYCz|w?'"::Z/I駟FBBcÆ W+M R;ٲe {1dgg1c>c@DD# FZ&ϛ7o^r/**=LEdddx'=CO݋QF5;$I̙3zjvy뇵k"99u$6lɓsN38uƎ+$Z-jjj̙3lٲ6u999-Vwhqjv;r-8y$f͚BQj*P 'ODVVViiQ`ݺu#G.dĉBT(//ǪUӧOcԨQؿ7)"##1a̝;y5Q\\ѣBUU,XA|r_ju\\7]^^VSxo>$''C$k׮ѣG)$$ݡ9(x C!"""j z… _~%jkk]橧޽{o˗/G~CCC1c >|^ԩSQQQ&MBqq16oތW^y&Mj~!.\Z~`_xs΅luÇСCXr%͛yguG(Ԍ BT; """"Q*3gyðq 7k׮7|ps>`K^.!u/^[oj֬Y6mu{ ;wluK?Æ C`` q7c-!33=Vj_~Q߳w:tq?1}ְ}Qw5OW0p@'"""&IN:ơnm^%QAiӰh"k̪U`ZhZT6!!{/V^>ӷTWW &8[nׯӱ}v?mZ1m4dRJ۱}v,]1Z =k\Vh4رc8vV^m۶wލ3͸뮻6jwΝرcUo/nKvg!"""V$ĉ߿?DDDSlwk%: E}v\x񍖱'ǯ:?OXz5rk7p@#==]׽xb[ 'f͚V<3xgp6m? ??? xGХKX,cǎuخ'=94qDDDDD^ME>>g/_z&k3~{Zc@@4EFFgf糿m[nN1 ^xܽ{7.\8em ,, zVvz=T*~& ,cB"''BBB⦨5DDD_|͈j}݇_|gϞž}0rHP*i]YY)?orsO:tpXXyF X,F4ۆ=!+vӏ9r-pOĞЁ={6TP(5j˘G3 X~=8۽{w5 HCݺu9seLN:%?kKa˕尿g/#.))p}燈&KL&5; &۽\Jժ 3{rhƌ8~8M-#ZXr%VC!"""jQ]]L<<:k׮E]] Ciii߿Մ&t ^llG!Gei絷z+$Ik׮ˮ#brh֭XlY2&DDDDBP`ҤIMDDf͚[oo6Os]wa̙to0m4$ ٌ+V_l[999ذa[Yl~V]v۴l[ @$:u }u8{kWn{%M&ʚhݭa/s8kד0MjQGO""", {nv$<<r 6n܈իW}bOo`ҤI6luXVL>faaaxZkmm-Zk+F#F`Mx"ƍku_s5Ǐ޽Mu_V1bD2dneeñm1f<Ea(Xx1ycA$%IcOo۶ o6a41uf{ ?عs' Қ y%>`Jg8[Ֆ3_|&/Z$K.n?~}: ++KMu2{/֯_I#(($ ˗/ǒ%Kp۾  JVdӦMHMMlӦMCff&̙^{-ΝÇ7Jt6l+";n8l޼O| {t /^DѣGFDDDMw\Pgᒚ?7|3222S"22]wz Vz?\&]?^ """&",XsBT;""""),,Dll r91Q(Mn7Ӗ%VS+.P([$IE+]1 S>.oIDb 33зo+v02&Ա3TWEv9  'M&Iz=vgnwR9\+ۉZ5Fۣ"ha00YE,"wE VQUl%@?%}[â QZP u-0ܗ`{犆 ,UfË$IBEE@ն[LvC۶mHDDD Ə02YDjͨ3\"?6ZPc`dhwט,1Yݶ 9>R*B jv'ĕϕߦ+ ߯OwtZ$w7(CEE~&kkkq1@AE<<~DDDDQĚ5k?e]# fL1`* &TړrRی:sMWezyj@gG;[sr<4u-n|JQvZ{ؿ?W7o<̟?#"""r2Պ^{ /J!""XETQC:\^ɻ`G T)ąk#BaP>>[e˖f0vXڵ (++c9vbRСCMTMDDDB$FQ&I*j̸XQZ\EIm]unW)@TWYJG?*t [N<  I@$H(YV&h{J0[D^a45YQc ? ?[;\ᶄb<硎c˘|78pA@>}ZǨQk.X,?~_+BfDFF{@DDD^qqq.C$VlJ[2ab;SQ* ( P@?U_ SBAJ oj_%TBOI`'ɂkTՙQUk,8/2ʈYMދwd Di;2QJ&ɫ$ٽn:D7$''Ϟ=dw;4iDLDDDQG-DDn1#܀Il{RhߧjjBԶvc/}@If?%|Q_yˑ$ ufQNWԘQn0ڄrm*3Pn0H=-A^Zm0uV94R@?zGw}4ABPz\H?mZGyyy+TZ+Wŋ(J!Ar;%@A@j_l$I6@jAe-+_QJ[: aONY!q:0 쏾1ZO~ B@(yD%GdlR9DlDDDTVV;"E$TqĀ %dV۞[^! U 681A GL1:z?U^SϚ< u8UP'5+iS2\##ia@;3J| `$Dk8y$qy\p8x<66aQ+lڴ=ȫ) OrwDDdŅDvVJqԀFkGąA hekXJ`ASf@vicy0YA!A/Nhq,*WO `$FkvdwJJ Ο?B9rC iVQ"]iXƄ(Xv-^'NI%W=]bjdPswx*F|hBF\h마@ڰ IDAT?&T{x lUPEvi ΗT\m:_Gv4[j%mT> n!-C >4ȥ\W_y㏭Z^CNNAayȩN8y5As"zVQBny 2ȬO~eqh(-Lna%Br2;,P6Q3 b"%IÑx,[$j\C&y8W/Ðn! uyIrWd2!)) [z!zزe AhR{…;w.DQ XnLm0j9"""""""j UDNY YTj-B&$>njW{y MԞjMVdqPӗsTHbh a=B-L͋Z3.tR|rL<$aժUعs'x ;&Id2ܹsؾ};>>}$AL0n73gU 0JDDDV+/^g}J""̀EvVfg Cp5Gն ajY3=]'@Ġ _$ z#NV%=?+nM^X*i6J=0GC-/Qgݻヒ3g:|ϞA$ 4{APP#WPZ- )DDDDF$zhZ&]#YE 9ed\%=^#XXpj_ DMc zF[e ھJKd'#5em<&Ezl?}II~> t u1OR2-:DF#V^5k0M扈G<6lCfؿT3g+žDDD䵬V+}]<,cBDd"}}bۖθGt](:=#lI^Aψ@ćG$QG&eLBBBDDDD(_1l0(HDmWUgƙB= tHlJ(Gx DiPAH TsQUfJɭ d]r10Z!(1eeH pR5L/CC-bEߘ $Dk[y,VU8U}˰?FSۈ ˝NxC$3ᅦz/qqq3gqWEhX{Ϟ=Mjvy Ip 2-:j#NTd t82$J$FkERL'5~ y7o=XEew a8"J0oF0> _QWWI ZҜ 9r$;*JDyƄ+ؙQ'[1̋ W`zt/^l:>#<o&|I'GIpJ"""""jeF9}b%뜖\h(1 .aːQp@L1N뜲._#\:lA@BBBבh}ԾRRRࢱK<$I8vM"՚q2_c+q>_YnDž`@ %!*ȿ'"r'B!`P|Ň?&⒮;3t+EYlz tuH9i?g#TcA;L|;KHOO`h:.&"""&I2331h #r'R$'u*mo8[b{`[b;\ny\`L FtCي}Eq6ƌayUbX6( c2&gK.!883g-Z___!**a,cBDDDDD-e8]hKl/Gri|]I@ Fr\P}b;jIDD'I -[NtaU3B„1mP s]ؚHIIjٳdɒV-E$'' SNڵk"5۱fh5(1i$(ACt%$!G*) &knn AzGj0.A%Z&<#[N]–Sp(Wqabr,4(t $=fwo駟ҥKh0o޼wNnݺaʕҥKbbb*7pAbJT֘ۥj$cp|10.?|%"xzx^x^(a[z~z)F$%%-܂FNÁvZ|gX,5j>sng,cBDDDDԙ8UP([^.mcP|p``$CԪvitf؎ Ơ!oDDev3,}{ޟn[D\oѣGk.)c"B^Ku>ѣ^NzauA6vK;M؞̀ @R!z2e|$;ɾvmR;2'E0~xw+mM0D!߿QF?ʪ2J+Ib1Mȳ!L fh?LRg[!z}-,ҙ1~_6$M:t<Ǘc򉃹zR)s"ݢ )c"B!giNjA3YıRj+U}G 8젝iqC*ͅAQŸ/qk4o/K>`L}ȘGsY'v(p᰾\7%ycxESf %-B^Kujjj0OPXV"gp{"ǎgRF p# !2ԯw5 jʠ/ oj]0!][ tK\o5syǎ/ ׼ѱd#$Z{Ov NW$' aɴ("ڟ-T yn`/B4Mcʕ<rI9HtO5HFZAG/B\d5^M9TByTXBjWCUn ̺* !gfwo;鎆ј%Ƚ5 KC_5~8>$\*3O?s]J|8Z?2T^6Yq(~22K&˖nDg"B!DwSVmg;Fb*7`R $.2"۽3 iۛj;a?]o߰%C 7s-UC*m2vC@];`!i,AC$ !pu{ !% S#ŔHXG2 >D!$''3|m:'lά=6y$ fR]`{RTg>_v(χ\t2RpO$<ӷ |X,Yfem^5BsyD[[X6+[.!!L>?ӦnE<9UK1(ńz=(nѢ3gJ[!| 6LpC'K؝new=6K=zaL aR܎dz#M<(Ϊ[N4,%FP< vu~^Σ5po;O~2{(]b po܃F_1G1h/EQԘP/|ő7j:9 Wӣ"n0>HݢEo&/BWwC!cTUeҥ] %UNH/Z7mbBD0겶'Fg܃ԔEYPr]v vnT/c1y5WZ2C`#kndk3:A cqEK*| l !|c ݞyDg3azN:!OSe,+7 H rs> 7I[g?LP)B^M4nܹsQU# ҙnX^Go:ۓB9 /#~ G?Lۥ9mf0=-c4=~c4 pwk;>j--ݯ2)3nKBbC2G]EaCF~U1d1|CG >g!DȘGt&EQ`d4䝝mqA|&g29*\͂:v.=~opB!DO%_s4.kt+9U;Ia̠ g`;.2A>moH׍t5͸?zzOO.n~ƶ~}}AO#i KP:w;۶*/;zW6LZa5^ϲY3>A-:Fӌ`siQ4OPZ_(on;:!M3ZBtky ]dZ+ڴVSE3WKvIWLb(=鍊n2&B!4M7dҥt*22xmΰrd 3)Fר$ItߙOQxݒLvs[.(mzcrw\U5~VALc?ƽ wN?(t,18BuP]|ݙ֣yxhL݃g?Ygť'Ocm&?*!WSٳg˘ǃ4M'%(GankO[O$9%:&FF0vm'`}А%``߸ la5Gm,'!1 0pNvQ%duBe=n>oFgť J,IKssP.Bуĸ9YpKU$[ٓn_,lGMa70%؞Axg"ɼFlm׸f IDATvpi,],x nDLsoLc !j&DL=d#`_P. >31w8-z˗K!Bjb |AL&7k6&5h>xMհpv(SC +Ibk IFP.uauԸO2ni`epۮ^y3& 1nW9!ggܞ>A&Bp6?={Mf?sa8)#D d#Z>ܝ;ȵu/FQD]pˆ z#!BĉDEEuu7%s$t#k;>J~j,y39ڞXK>[WGJ!W'?ɽB}Иv}RfD{BebcCkԧ{5Xw 9F;'4#H^E< f٬Xn0i,zc;[N˖-㩧" $Bkq7J& Ug;F|6J;^TBp LC)8jB(Li9STox u 'Ay~u~}'}C!4Yd,Gec;Fhq1X`NQ|87ɘGqIhfEB!_qe-{2$HHrMAZۓCbF:?1ծ| 7aDB5k73~*B uF\R&-5kLP)B^M4[.s")t+ VӬ+i/T1C\e|&G0!"?s+_=Gu~'+8^'l?m9!6Lޝ!Dd @q6$o/!uO eM߬4caUթzҘGh'|k]QsTkRD!eUPW$!JR^s!xIKa*ϴ-ouҗF;u]YPdT8jsw~խ˘,[_ nѽ<#B!z5>_L+i:ˌvtELҏ*F+֣1}0%:)ѡL %8#y. j޾0b:*Z~Dl3̆ K׹}t1gG2?JEAuk6mϯm̞=(ZQ /Nr"BNee%gZƏ$[O'Ê]mP51JctW҈UrPkN},P&G/Ҵw)c,F]]!߃%^ ~C&P,1mm3_~eYfn:BCC=q(!!!!]!Blz53mJf%1FUm'1ujc4bԼV_1N qQz8;acv` !D/ڶm_]{4#lqA@ON6;c!5fRb>=ʕ+ٲe N"$$1cưl2:۹Ѵ B!)4Mcz뭝zIoqe-{2ص]LJ3=VMgFߦ6bk@7 B+F-6}g} `C%pBUOԘG#eL, v)Ssn^?fɒ%GLL 8pyv_eJ!B/+Ib,GrKT:rƪiSR ;]oës ·>};!銲:8r0W0F !Dom˘rԩ6wAzO1c󱪪*=ڦf̘!B!4McΝL> Eħfdo旷svFTc53ogL 4d#Z(<޶v* gUkXg+D ;'H{|礧{yт{x&n&LЦ:{B!ݒj=㺮ZPڎO]TiwZ[Xa"Bq}Os 9`p# q[xG}/~ Ea׮]L<! &&aÆԡB!eMhn iVgiyagr(Cbß'g/Ń+y6wi; R_[!{5|+U/0xN!衺mk^zm۶qmm6 z7|̝;r}]݋lfڴi\{6yuI!BjfϘ"gbO%J &)V2(-2~ 4+9~v /+شiSӡCP B!zY6#VHaZq#]R*xH55Ƅ1<Um8&B֖ ޖ`޽{+hu;UVyC[oW^ˋ0^y̙CVV{/7ndĉٳeB!zZۈ+IrDևT1VI>5!JA/e\o·Oۃv[!D7Q] >ݯ~G?׃ _o{BхmzTUU*vC9ۢݍAAAL8GۦvYp!Nছn$&&㏓?/+WQ܈nwa޼y3O>Ç͛jpxB!RXVMB]uI)Ak%'+Ǚ0B¤tN.BBSn7Ay;_2n5=cf_,s26q8Й}VP9 e):i1E!D/Uݚ#[a RTYuuuWwA#+WR^^(sq{~q裏߶󉊊"## 6PYYomu/&Lfjhӯ!K,qGB! s,ܮ/mEMAcrj2LTv)Qgl_Agi D;= l%N!Dk۶8 6߬i/Գ=iqRDz vo޼y>b8Lڶmܹs[NQΝoAYY{ /Ծ̜9`"""žN86}Y%OB!:SCbӬ$ԕ%)7.&)x5@iw.G _oD2% 7A0xR2hBˤK%3g'Վj*T٫Wd 8˛8Zx MuM׸mmr-.O-N/nK[[l2zO_.8Tpt{o'H9?﮽T!sĿbQimws@\ph7Eb2ӟHɓ(BLLL t:tVˇ=zÇ;=Gsfg7x-[ƕW^v>>>L< ^:tMPYk~M0LlqUU]n:;S~δmg<ϞpNΕ)9'!='$f EͰRQ4t3Jd8 UsPPQ*3hGqu056QL cDx`((VW[:8LF0SwIEiM)%U%ԖPR]BIM r~~OxtUt?;t}RYSIim) Z#yPR]4BuE}f}>7CzI:}l G>#sSΉɹ<~(31VԤ/`NW 9*V7&f5$ytyݻ4is}O9'ڟ[q#5cOT]]M^^zoӖ(/ \p}CeqM7aXxw4٤zQQ555:vY62c25k8x'(--ԩS޽O?u֑UZl6y HHH_yyyƏW`ӦM|deeQSS? @rr2o6[nuf曤:+Vpk~W_}{DZcxGɓܹ/?SOQRRB~~>?<{e|'ݻ0&=-,,~vqIg}F||</999TTTrJ9yfvkFff&z-kkz-RRRXbdff:Ɏ;Wr9r0JUTTK/Xv-駟B{99OX~$Ys!}~ S˦ؿt^\@ֈψ/~,6 ^/ψ 7yTnd@>#6o,ψ^<馛Eufm3m4snΜ9|71I"M|3fƍ?;pu*$0k,n0TQ 8'~9_Ty9y;V;؝V4mʶaKP1cg585j ¦Yj4dkhkwG v<tE9ۗ3+~X:F1h/٭ɜ5s212 c|dlonK~p,ۼfYտ[~?.N/sqfwG>.A>MY~sQgMŮۛ9O0/rT)RJR71{3B>7圜ϳS^SI >@sԞ&g*fKPfݍ#`p:'>\yVVViiz)crUWlx0]&lvbqޯH(=CCu+yF7~3C;[۶_[=Wɹ<4OI䜜SIlħYٕVH|9%4MPt檉d^EKOYXI-m=}pݺu\~m{Neu-NUr.yy֔M VѯO?+:j[9u Vc3mSRSkg @s]7Ag>W{4dv5*[샿ٿIzڱ7;:: p!>/+^Cw9!sr>vps𓿠~jJ]7: }z9[S4֯_s"}<|N`73<éSγ>t___gR]]__KKOOwB!Zrn6ퟨ ^, b,Qg'EQZ5;hhMխ+^iSjohlq}IM[xޮ۩jV]63m*-0AeA V'JO8u;%餗VdBѢ0p=5oe@8i#Do`wXXk֬a<ۗxQ4 KKK]n__}{K!dQ3k{WԂrc@M&NMfRj]r #G? IDATebm_Ð ~uEaҤI|%Ol',e'ɫC5F/ُl_/yyn`wQU[́/c,z|娨(!nsơ9jqPRբ*GO(5jaZKju:݉-vkgM699%_Kқ=v[mDrTQQ[Pb FF5-K sCڶ5'th KuV:W;))@$ׯgv7n[5>82`Ff˘<`[!޾0u߁o>^FtMDkYZ\s~-+R #7B-uR9ɂvF6%0sL * (,|>YYMEE|{n{BC,0x{.݆x\Eҫ4y$]O&wEQ*gf֭lݺK|ӧ\6MBBBYO%[!4M'TfeWjT4+'&LD'I`w@ b˜Pof\0dRCp{6o}  6UjVS;"Z~-w7ΎvhR]LUTB}B eDH3!kV˾}zƄ@_jy!D/e7„%(H~繷oq6s9̺^ 50(1$jԊRa=bE.nq]s$ˀDxYf|lTm-P VV;68ؠX"# 0ZGUUZ(DW 42e6[\v-[7Y. :"A2Z1mcs#j*U-m1v4>K/U^m9cs l:mz1}tG'?!G`u Öp3<>C&y_d#znQ>VʪUXjAAA,XEpB9x VO^K!3 ˪O32wY=IbPoNGu0X%T}P^*#P^Ȫ/HŇl177kte  vMt`4#BGF{{}!ʓ$4xrHMpfo2A]#{;w)`.Aރa󃐽>ٻ?sarݍɘG+:ٝƧ~ʆ omrTm29s3{E!T9mJ-QpIjl׍#|ML aZL(bū ̬dZlݟ~]뫌{֛ K6ylP!E!:0?o? !FuK 'oK7-mf?C!Dphl;e9f~^fO+uF\CJJJشi6l`ƍXֆ4*~?|p/^̢E9s\>Կ?(uBpVTk]v!' KѴj$*%>F-MٛY&xK5?J{eWqSR|->eX0p8x饗ۤyf3|ȏRB+Րq*roap0B~.d#znnL4v ذaCύ!!!,\E` voԬB!\u vQ$`.鯸ű}}¿IfoҼ׍_~VK>_jԯ.uԲDF24x(1A1 JlP,|5u'm*WEǛ5,x †zo%󈞢O |w yyy1k,gOwKMG^^B7NJ~;ָU\jաcSaK[n}y8f Ct]???'irؚ2""ϹY0f[mխ|{""X 1(Xn [8,5m!﷝R1PUMtzw! b:DNc²mjl_?x<hu^L0{*ʕ+^!Z?W_v޿}xWZSLqd\qlH _ _Āa60ynɘG=2ݘ`ά5 nq%h".b4уdJ!9s$Nɥ"}j1E=d5`/KQҸ)X8j6sPB7 B n&_hE-^ǡCu-F`X0c TEVBU{WKV3#!DkJ[@[HVm=>}#G8?֐P^|9ߺ^jĈ[ٛ*88`׳ !=ݡq>p<=k'c쇙&1AIVnmW<8&̌D_s[;ft7ip$Bu9¨Q*B!:\2ҊӚ=64h(7'DoR{I7¢gO 󈞢3:QF1j(> NKJK[Pxbaر/_zwH!ZbvZIJ:w.wfze TEw{TTYTS#3-&iLoXcz[n!#Uo߻u GiZY)Rr2J*j*F*"^&7IY' w3Mݻ#G6‹)ł[wcir)050S` Ԁ\Xc~,@7e.@M@ErlN$__$*vy荺U0nnjkkٶm6l` l8x ϯzB5(bWj'''I Q @QR a#3GfGV@F dZl(b˜JhYܣ';ڬ픢j5MͳO7?z>1A1z#BFΩpV]fs.v Պ.]VZ ~YP{]}p+ح-SmtVU_W6slff)0!W߾x Է/^a}0ߪk.Dwz1'b;N7-ʥN-!#c;&{>ܒ鶫N`g:<>q|ZM#]6FiO>>؈@ =sp@L9Z?ZUU>#Ν,ަqFu2Ӊ>) }r2tzȦw @1>i<,WݰYb4"s \LKMo̳<02LfRGa?¸Kz'aX}AN(O0n8/^̢EHOO؄~x7AR\ȺHr{ˁ&a]pt˸h Qjغ1wLD7@^\fo[g M/y|]Qµkj #auQoY$<IP1ݒqw!"r, D5א_qT}I$p=O†B- I/~5fďa%\wQ߹"B?~x:p\(B#CP1ٵkw}7{/\pK,+(nV^- 7fsi; wHPzֲɕe4ddȷ&#&Uʎ>I k&l ۿuuC  .n܈ss#ܘBo(H,m?hn_>[soGO'B4xgD!߾E#L 'X}AN(mZqK(X+Vǵ^ˍ7ȩz }?2 ×'fcI{Jh iM[.Lw?QB?-EJ4| Tt=OCz,lscj؅i1MtiiJ}=*|?UUI ` z i \[[;!GkU4-NFpCǑ݊Os7;r4x?65kZOEo Bxsߛ˝k%;7۷¶WᲿ@辏m9fGJvk|r>s4MCkRēO>ɓO>IAAA[1?AZ!6Q:ٲnΑ# ϐ )Q'+ФUIpm-c#>!j!Iv;Îl"LHf3لd2#MfKdڌ!--ç-}C@#55 cNNv,sv-`:G/U@z#q?ӱĚvX$\]! BQ5W _t[%G(ahMjxt8nu+z8t> E'<nn˗ /PXXF4v=}ŋ?>&1΀UUU! X/Ħ}U\T5Yo8ElQt n4l F=O61N:6!KǑjMeB&$$5Qn=K2B 8ûoOC NH(P;l Ė%Ę$tqq"xtÁ찣ۑt{d~݁l -i1l)`=:(n7˅rE.pC=Jmzu%P9}?L>IF>䟂CMd3(wwضh"L:R=RdcuqGU<)o2 Hg!5b=ab{{ャ_{W_}6GGt:ʜvi=Cnvq8mЂ M QcyqԚ551U`iǑuizU^}j͎<>) W|EU >o]O&FywSoya4Mz xwxÑJRmeNF[1x<ػhҥ<} 0$ջlٽbXvKuKsĎJh̩K$󒘐D'/Eٝ϶['i'k<9n)b%%Kok:g?| - IDATӢρRv|ekbABE$p}o('\[1++jPUft[oaΏ>;qNmLXgh}LGRI$~:1 kb\?zF11 hJ+|8FvF'ap82/vl>F&TWWK/ٲeKICeYfΜ9,Y 2'Ї*//wyÇJAGmKu+j`]q={ܤ /kEBr f7t`֌:$do<~;m׃9б~vIȁηu+j >%}j Õi߿ѣGO "``&$!1]x!MXj=Xvک]֒Gyr[dr8SOZujsd tns~o=aC# -*};ws6ѣN'w5kV_8lP-Y/ʘ B,]~ճuEth3Q*yl7f6dbɈG.wx%Y9t>a.uicn/vDE21HǐA+͜a 9s7 4U%TYE`5$|(MM9 㱟q&:e x4<<wI66{e?E&BLT,@ sd΀+KGmUU裏X|9o>CYʟ'>T SY̞k]MS}5\u 6sץnw_H2?C$?+TFȬȬ3C90fF/v?½jU7C$Cf&,Y#30g`HG(Fʽz5=zLj:k3vY33{ȦGxf3n:j@G$qiw~>Vg9ìQނ0D^_+˲̼y7o.W_}~uֵ\6g>G* um5$obRȹRG@+.'@#8t$`X.d?ĩFAs0mի#{ȬrQ Sۘ=%$`˜!+uy1Iwg1{l1(do/,|zWĽr%\qXL? t`S~ pFÖaŽp ށO@辋s}a80ݻm۶o߾EA#hFye%[V.^Cj& dJ/zdu&M&1_S[eCBǿ%FŧC 0O&Cw.Q1F㭮}q~8yyQta8yhN1=نwf­ODg%'3c=TdQD8{;{I'"j  "I0z=޾ }zx,yMApIee%/"˗/g׮]kd괼;DAA4P/Ioh YjeP$%ldvDٍ*~Qu^6֏xdhd@NFfFVQo9?z guX2FD߳n=e76]RƼ\0aŘ) Òi**߀wC*/v;qy9YGnp],߹wV;ݖƬ7G[K`rXq[. QDAYo|rV\V*)ŋ:DXd(c"0LhFiQ![?A*[ȡ#uR>Zl2(1:l3Xʠ92XܜԓT4T:ܿ?di̘N݁34n\$ך΍$uNgL1Y$ cf&L\@ ƍxo~Ҳ>vz}\ᅬd=祗b? qIitө?eE<^%{D v۷BQ~&gHtw jRQU UsECS|4$YBzȇ^.CXYz Iha41ZtZӘ1͇oWT ;nMX$[ ~O/B$ Xd=3ق#ɌiF%gµWO|5Z0c%ӦBtpohnth;>f觨A蒪¦g+ X# &٭i+V筷"?2… Yd Ǐ? ЇJNkv/]|A)P}5 ~jiҿ(~#C?:&|  h>KgM47)9)9)9غ.9|B7 2$3d $3d d3Τdѕ 0 ~=x֬哕WBmbұV F1#TARⰄ{ #˙ yfBψ>0X۷ogKTWWF/ŋs2%DFF~a-BfJ~pfF6j2Q稆$sn@cN#55r5km}?oaHC8i$ڒ޶Dv%OP;y1'UeG4~w&x`¥WwD}Fyℒݓ'On>tuH4f̘VD$H/,Ng"0]um/pVo '1F^6ųlD\H˄wpǻ.:zoć$ &f$U-4iګ^և @&uSw [j:H;FR KUUeŊ|@2y3 ]h#TKc:^q$,ZeҤ ]\AN%ԟqD 3~3hJdb7?Lb# ''TDv -Zŋ7n\)1A B 4s`˧x~AB%`6qSNM+*.ϣ%{%Ϯ<ѐ;-II2LoK'qt]uCg!$dYB[m\;bt*ׇ֫뵣+*JX#+ZJhp? 2 i$xRNRr'4Ccߏ{{PE;[k7=.Aݲ,c6ʔ̝;W)}:,{T =Lq`'&~#iJUL$Y9@Z:1Fn5d5HoILΌQ)9 hoNALXgך#KGg>6znOth@;qV(屍~ϼg;|-H{~+JɟO&%d0b3b7a3ogb7 DB4 ;Ώއ·OKW?UxF$9.gE$ۼzlf矡s =lM97d;p0 |]DcG }d0t-ZUu:AacUuE +g{y3acn6=&x*QU2EțHW:-y5qIm$]0|4MKS/^j|j}88yεařƷ&[ؑӈN$%I8XFFu[U5k O}}l !5CB3nA,&!= C7mxL)=bXCz ھ};7tSOӹq饗R\\x r Kp|]6Ml5JI%u- v2?U㱥7'Կ[S1J;u>O-TjܣIS;:Zw)\),[|5fGr Τ22Gr S9op-kșD$ Dya#免4VEMʽMTm1rl<355#I81umo(]t=ٳIƎ脁Hdn U'\Ƥ'ʘ#oҥKy. APu -g@cvlH1r$+T lm홸#igⵦaW4MuF0 ~.g)ĥZL`׫{%i]?nsM ];~]׫y+1q{! Q鍦IGfMRVdF\u>9)iNJBo_BKecI[0[oŐ6nkz?]/qÄ0,AAXeMlpW`O雸a2&Ǚ'ӧvH|Q݂ xMeԩvWX[TϺ [:i(Sǥku̡ێ!᳤%L N[  тrsto#Jm_luMxkm%t2&'lmdwK]mL4VwfXI"9+IƖ(TUe̜99Imq&g?3lQmT6ao(YǨ)LcdAB'xNiT<[{qZ>!魪4w#I㋙0fnts< ")ks:y ;d?Mxh IDAT<0Xw{ҥ=0ӡ €iPsv^~55L8zE6eΤ>}$Ui@SQڇh9osu`dw0dݒ,#t:=Nn]u:,2&1N1ݕKBf>*+555'\ggrL0e;), >buɟ9IQc/GBcѲbE}@;~ą%Kސ-p;1b?C0HYJ\s7::N'˘CSO. k4 *ؽ0M&:dU#.(I{"I,VNDMIYCuz}Rw:]$B~?> %F B0J8ԶN <7~y ':{ҜmQcz~/8S/ʱEj_3%Q˝,H`#ɛN/Fd5a!53U_ļeFwI{12a4{˻E0>q<:Od992A:ᓥQ¢7EnAl0t]s5jML&p\TjwѲsZ WY=܈pPifn 1UZk9FLHeYDU"EIU$Rݓ~wajZ ::҅r&:vu4+6m$fvvvd1v.JUNlq%`ua1Y-ֶesŊdFƭָxr'O}o0;^8"Кc?ǒS;%w;d#>-cHTUU^{od2 ,HPxk{7VPI.+Zk[ƟIgfLh± ~I[)\@>9"ޖհ]~9;~LFpt@#Bv= 0H NK|A\ YQ-.|cG33sFs e$RTE&Y0dW4ߖVF4uyK#Hlp&[:ٟ~Bu%2&)y'`->3^t`@->/QSgફ'Rj%)3;vue%ܷHbIz82Ǝ##i{@_$^HDR ;/Υ͞ٳwc k R6(%{B"'5II:ŵ/NIвb5e/AˠA膾@ ʘ2& )%U߰wǻ/=l3<]UCb w|l EȡőE#'Ѵpn҈Fhv /Ἓnnךy'v'mx2s4g [4UjUW\u4VUPW^|Qϳw'l#2)9yd#s$r&M.Q=ٷj|ML83I0p±h7u{ >}'tR/G' T7w=ɜ˗L-#y`ӳp@'B,Dq(a0DU6رi%oLzeٍ_ad^FEY s0 jã 641O8x=Qڪ &q&Fo$Ip2gr ΔT)#p&LNԣlH}@7//@)ʨ//k+gc=Tg$M9)0"ot5EQߎFJD2&pw)YϞ S)wټqҙr~bB& $^wq]Fc  \} /"F'X:k)w_>^GD[U׿Wg~rNTy/B;s) 'Ǻzճ&7e:/^%Qk=2 &4h ęi1ݪFo滊Mrv.7Q۵4On‘I`'&?w$7z%Na󵸨?PƈQcb(OoU[}B8ȝ<ș< 34Mu[ofߦv~QAMiK ))LMZ7ETa<_>-_ޏz92a sXWmYK*~J`vdw_@zbdHv P%''S\\,݂ tOЃ+Ngmq#kٰ}I1JPR24U,z4iQv~t\o9O}5jR44UE#-?g*ICS;tRsG񏃦iד4`Քع= ]8!wb<0P<{M:l?<xCj wC*,۲wSyH# B/8΃>A.̗esvvB]HǤ_c|C)(]"푴8rpٳ"m[zLmM E&TP%!dtYv3#7-ZYI$!= )v. G x5U{wSYehZe5uu~u=v( _-A_= +:ו4+S.Ȧ`f:}۴`^oyQN'i݋Eb+f ak(c_0a`ÛHv =NLP)B|h_Rū&&=Z#psE㱍:ZPb[`i:Id]Ķ6ѝzڲ!i?%)Nr,;ika5$$!=$*~o CO=TE՞TM!OXo\N4]jUg䔋rpFHzPe%+cjo=_=(Fy V%ko]pZ["zܡմiXj(c"Ýt -P`KހֈHCֶ*q3hg&FQ۪U9vR]O m;jMxIL\2"Č m{O4Uʽ,E鶭ƴ䖿w^wxi͛6mڠ{B|e%V&f\G4t:m-|>Dm(o!2f,aj,Wۺn̄k_`ÇHv =Ї+pwH Ps{#lJl%jx"@P%-5C# m$9Bw{ʹ=39oӵ I|Z:Xbi (޲o6SkJ V8Kn#w?"3&gҔTU7|#RCJXej~RFCeF;S,̸$iȢwR^5|٤WSĨ?K>UwbIeB҄I΄|?n7ej8C# }"-8QD_~zK`{K)z73uh@˙K3#G615MAS@#Ơ* ];UISz t9vnx&fs9E=F]Y Ӷfθ&sĘF7QQ'Gaey9%ULd|;wrۨmu ?9 2aZWLPa[߳sA蔦Çe~ t<$CHv =Їj }x5Fw.l9%xC# -"-Cӧ駟d ڢճ:w|y?%=nMn{l GCESըJ Rk)pIGJV=,7I"9+\RZD !@4t*j쉓|E~:}FCVr~k'e|eJ8,F99걤u)a!U{Q޲ĐǑ IsE/Ur6/_2'%wA =Me+ˆk_{á# "-#?T;wjO|||&BRQo.$XWTO;IWd22Y0Ȧ4UFSjP5hJ 3aq->Q$8Iqjm̷_|DBZ:Yڇi预 aEx>&͙ˤTq7A)~Yϟ9Ƒh膷Fyp^|q?E& M&n6ltSo'ۂ^xgծ-q8iA%ȠKvٳ͛7S[[Kss3Pzꩬ[K}` t*a?fӾZ_Y#d.봩PvzX©=b[CSFjGuDII_)\BBˉ6:{3Rh\Gfb0 7k^^κD"x $7m:S.S0( ˖-[oE\u>6_ؾ 2Sf3mnwB*﹇ 2~J(J_%|n1w `i_厫s=<4(ne˖SQQatL,Z2$I_ⶽ>sCĪU:|nAGw_ofN3hX"HT%izλ9K~Hv:AZ)۷R۸w\q1iX:_4MWˆٳb6`3rڂLX-v٣V ѵ~USytˣ<)NM;ϑ m?זvh]ù# .>ٽqFZWKRe˖ Ix衇{+D(>TN @ AVԒ5x~r=ưʧF[vմG_x1D:Ϛͼ[W`(T  dt"/'" Pe>3әvdk[i. 9l5Tyn16ļOj3K1>0,gxiK<3Fg#j,uɰu6޺u+{.---mI1c0qD֯_Oee1͌1P(ĴiذaCo(tЇ;'A+n_=[wo ʋybP|5#QT:Oڶ"eHkWMW#7 %y X9SFCBHti(Ao*):؄=haa0fEu%Mo?B'!d$}GU;= !T]6ܵvײϺ"e X :LDBf2H&!9ɓsd{yO⽓ ٺɉd Fpar[)X=YLGuԜ1-(?ޚ+?CZ69/JP獈AϑׇGEu8BU7z{ 9mɭ#mO?cX!<&EaԨQ Iƍ_dĉs9|^{./Fe/I!xR Fk%vдnB#ehT*]èuaFSmkV*P<_o9 y8G>YebRM|FqYĦc۲#i.Ņjk2eE$]֭5F{]_]zh2w ;ˤdb~m]4LL^ p0i. {vybv[SF:^ˏ料ů =S/fDQڤ(V+.ׁ"qq$?$AuX Bwh,{ta9Lap艼d ['b ,\wI'xb4Mc˖-viEnnn3 ;Ķ=+VQ5*c4͢),‘ Am6+UY{pv%h6KU* 1N|z&K_<9٭і">#!ݛi_K\U-Լ FsvMzD 3`/mn$%>69[2Y6d>~o0T;i$i4pc*!k( YC9ߐr,]LmI\piϚuVrssŒރrIX>춮tpYNv)+$&Ji?m{wUK#Wi] {7CISC : zGݢ# &~9rdυ"`999"-=@ڰnHU4G.JcX&Mǖihj4{۬mېV'.=03ھ[BNXJBÈLL:,MtJjʐV(jj>EydQ=Tl.dAִn$%q6MsD5qf9lJYBmıYm3fdX6-Ɵ3qgGl^]k~DUܝed6YϨQ:S:)uT免ZƟƄsw5O8:C#n*+mIxAnP ecy0ʧՍj3(EVoB[hJ_! MWϦo87lAmTi KoKn\+㦯n&ǜZϥ!65˥N-y Iyp8p5[um/uK"Yqx -Vݹ7+/3N{Kvn?4z/ s-;7"fn_@$H1so`ۊlYƪWLdY/x?F;`.ʨSYa!6w~?hr?Ur'G'nN?qux_Vw+.-[gƐ} ^%䶕-ٷvWzUUUHDzzQC>svzy睇v#9$Ё|VL<{H 'Jˤ:<°tigIWm4\*$9gKwU+MˊpQ?'u=ٯ:ͪ%Hr! s{3=ʘH~Мfv!${躱A@5#BG0K4"m^OާI'uh*_~%gl{`sxޅ=/&">FSYϻO SvP!ݬx0Ѕ`ƱcGs$xi vܪ,F IDAT+Sgat t)$r/[z@+= Ʉ#UUU%vھAZ}-(k%̔~a@S@ :nIcG,CM|Z&1QCZM$Gdj_!1m,3@ ށώىMۏts|GzO`~%8u^ve=d'顓LM 2mȸt]Ӵ~,̘E48Ph~&{) sWU (ƱǞsq KHhc,3uZټ:- ,{y6| j.ٓOԫtz3Ȟw (u&'_<Ӓ8l=`ГdĿ>9wE_y0$1LqAq0"AzMCs9تvLcۆGWzSLa׮]wqꩧvz… ?i&v-(%a hq5-{qEcإG)ը Twu%~Z9$!QEYt!*V7lEPxDuвs}e׿_LLmfҍdwجtp =ུ$w$I`?uih35Tݫc+x8a~B)C#(4ۺDBbĤ4sNLefd$4㪰u:o\c2:`ڀ.؀r#YffB6jh@ivڍ .<' ^R{1yX$HdY .h_lmaWvyM,zn'ȴ_%:95K$q”rYa!;VwپGOldL YƎ2vl_!#$s{1MuQ2y p\Q*mbW^x!999n:.,X>PKK wy'/r?C}}KRxi56UPV h RTQm˻]Vc+0JhRFaw4{K~ z/ޒn]d ÿK9@\4EC:х 1)8Z߄=m }HaL\BFa¼5YgI\Apl10pb+.zK 6--:fz$Cr_hݾ$hEE$Ǭ3pB3?dFduX +MwCRK+3!nxH0HJ[e^z%ڽY] {ٸ] Z1jIؔ7њznC }1袂)D&u_4JRPNz;^ݢVmnTl={.(7CB(3H3H3p%DMIݜRp{NvLvnEM[V 7d#TU'Cӑ<|$7<k? _|zMUټd1-g 8"['yX$i?}MˊZrsKgbڀqUVR2'a! H$n{ pYuA8Dg^lՙp5SG2IӴ.?+p'9G$ MӘ5k}߅cg iKDXVbBi%,]D Diéx5{މū=4w~ MVXB gGpWv:vVa}/5u٩Ws!^- ݸl8ˬʬ8K[7֯DuxN<@hbem3ˌL)]WAsF)#9# &Q[Z8p.{$gs60A ׁ$$L6`a ±艼d&nܹsٴi% `4;&j COÇhɒg9Rm44Ӫw* Ñ>jű0ɝ"L$' wкI D^DѶ|u*uk(ں^ FW 'cL 줥{Y&'>әtn(k zcqWV ۛAeסK۶wʹϒɰ̢0nOV+l6ÉdQD4UIym2'n4wyFJ-] C1㱚9#T"y uKi#1#1kQ)rǤEW%Dboi:E;GDbNt4Mù :G]9\5G5J_נ9'dLlA}sΛ4UWuMlZg^+IÆn<٭.VS@*mE0Q֤iF] H8 Peޅ%t\1/Tf> 4T i9GZi$J]T=XЫШӃg8S%D_;9eBsv5OJV t49Ǿ_d#[|pm?[=8?I=pRU%K0sns\l |.vk $ٷgĴӏ>bW^++]RG&=E4j_O=e;Ӱa2]g0cJgf<ôi} ~QX~)$p 394|r HAqQD8>Nl4}Ds1x,zZ(\&(S 1.K27ؐFUF }aLH:7֡9R_]%qAJt& A*nEQ:|DDDN~1M0LL&f3fχ~7bO[taF'=o^F.>}fNcLQ֤HD7αk!1E,>!z= V~yiK߇ Yg=QݠuX6\gAлnQD JC7PVja4Vq>D<7 hLAֈhN@NJ8:hdOrO>p*4>.-EnUUiiijp8&'Lgu.2|p.r{lwI{b%/OoPKno/=YT^>ezʪ m϶Cru]&Q֫XoGkiFǐ^ŔȄv;b9A8&Kk 4YsqW,,AEz 7܀v. pVVRJPQꠎhlI@6Xh$-c([I:ZksGjrz=wH5=mQ.t7j iP__j>2ݿ _⾮ivNcccnٮ;wKLL hCC[m+u"KvF2!A Dꫯruӊ\'?2j ENtS.FH]GYEx=o4Qo'27ߤQjjM;ƌ3z2$Ibٲey,gK,k6 hFݞlY6h1LAI%9.(c$x"M D6ijNMk!Xꜰ7rC| AHMӰ^ׇ'M*wR#t:Ǐ͌O %&&XLBttto(^&Ѩv7= wc/GS4C;oFĶTP!9 $1sȲ)SYߗӏzθѧBXbRCToڮ]1ڿwkQ9/zo6JCE^K o<捙'^x?nX t3 V>ږo%Q'WXox7>R\\́:-0piFKA!7q&ZZ$j5R8&5I$ID`hN"M7uԐp1G1nv+/=.Ĉ$jݍX-47%6Ӽ-o6h[[} H۷EB6`ɉA4F'ο~E˦j8lJCx ^Vǟ_hT sh"*Ĭ%,EyYv.—/laʜL&&>'cJ i ߢpF(FR7!@$&EO|]⚜k82AIH\9Rv~w s:eb^rLY>1m4F\䡇 |@Bn7m,֊MDU*Дj@gT^rX$ٌ=:a0Fcnn˫04'3]go[z7px\YFJll,bs$I#[i-+6AG;|}innMӈ3`ԨQDGGc2hnnf޽]ܗ]vg}ц'+Wm63Mq8] 85;vن.` #&B)HcQx"Mlj: 5= $<!a>abeU&Z$'6w+N 0cƩ~B'!ޗ5YnLJJ zNCuÁno~=Y2&G>$22w ͎;: zbbbړ߇@?W W!lDe>괷i(xfξNRiL}%cL,̗/l! 4T2{^.a1bXBC˔vlﱍrQr$?8a3g8B!PN{_AY)/g}&- G;wnϬY%66G}+%gĈ<Gp 233IKKkUVv~]R_D .ܕkWg3{N" FBpgdr.JB冭34.N;כ}0}$BCC XNKK~999jOi_bbbԉw8I-crHll_=~eY&**CPRܟпl|B q Fu#33OcXU*h݇e3+kHD|3mgVQזZy=/l1!X =KW\Nx1>+ #݂00۷oCh+WNK.B222X|9C y]FF-"77￟/ >.K)Od(Kj3%jشh!jZvybx<PH-찘( wXSb,30555@M}- F&M`ĎO!ɒdu_%%I"88.z,FXXaag``0i8NvI{^hXcdwuuubTUjjjر皧,Jvv6YYY$$$2(ǁYC LY#pQn\U-X"MXr%}ٻ!-KH,jk?}70Ĥ79,zfOe^m.>yjgz$b0IF#ɏ?FEh ๑Mhs l Q1~_~L{ tBF7kE$.]ݯvwߑƾ}z:D ֞ZʘEŞF4P^H&Tw۟{G&9H2$xT.1<| cNJ 7 YF=!X]]W"kC˗rNǓ|^_UU?О>4#Wpp(k4M#F0th Qb VX1%VVl+iPE/ִcʎ tz*p1SN褥7p+- ^ Ͻg=hCXF>nHpٌ9#uwIQߩ-dGI9 Lwn;V1cȌE4QDwz"/+3,Xn4nh+wQTTď?'ܓ! >L>U/iFTRSg23LƅiJ XqaDZje>Ѷ_E*ilm_zJ)]vv=1bboIDxx8dggwfc˖-lٲYߩbG[NؙiJvEs)X(Q؀PBb5Q IDAT%qXO?OV]0(ե\,}9wa0` ɞGD/_Js2Uh4ڙvPdY It:xs#U{t:flBhez(3@+}IU*U8+$I"++q"`"r|PU[ *huVC|ϲQt [L#ݚ$3 )$ZQjA )?ZZ3aX{005ፍ8唗c4$++l"##{1#u#qf[[juu8,j|$tZrO'܏M=7^aol}2;HDBb"?bRB|vJ ^ۺk`0챐${A2}UύTһAlZ9ȔY˸yklD%OA<ށeoE!oRbt:7n֭;{|Hw QƤsٽv;TUFJtTOkTs w[7=ɂ$rTDDwqv[cyApNg{zmwzz:FWGY[PI{' IBgyk?)(sn SY(*+cU#qa{hk4꧞72Hy߄~zNA]ΣJ`C0o'DG +. q9pQ TO%{%ٝJii)r}O"I/_}O)xpIu70=Pg'hJ]`}8i!#4&eJ `)ʗ 6d]fOxh#-me-RDMIDtt4 ~vS[[!^]]Mmm-t:ړqqqF?e˫= LyH芪\s5bX[C=߼onv/.ˮB"ia1fλm bƱ4g缶FRibE@VZ˜\*0!8gMl ĠϛWb`Ky6=g $I祮fxgƎfC$֮]˄ z:LCOCayZ-g(--4/)Xs*3x8;(ի6e_k@0 ĴCTT-E={PXXHQQQ&/Bƌczco#ǹ D=Ѕu]Y,Mؽ{7C7Hyb?JE5sw7As95,s'9K1'T?l oԗ^"xF%+[_ O{<a3_`T̨G%BWT Mϙ#wa(]$~~n6au)..F${:D Q$p4M|>6=hiCQk1ftw{$#w7 ggyY(+UJ*5FJd\%+z؉biOd=,,_̨p8ؿ{򻮮E]; P34-/±) D^8'|?izܐh> PdK:zq+NEYǹ!){p $MӨ~ j_~k)(_"e,MOgQy6"G-|  # \L€o3f`Ŋ :>lFEPPP{vZ}]>c4MC4$IbҥL>7B<8z?H MըYƁ;(UOU u!pMĘ6%cu;?U}' %{ 4H-4K*mRd6ؖ֩4C813)LɌ"%2#Nq-btBOr7Ӽs3GqD>n#?_jijg]uzN:ƞu^HV>v3z6z972$': LQPmpZiUa,+ZI. LQ4k}\io1%9 n7_̈L:! #Njj`Pv?%?u;3__s(!m\ ̞=B8JMM%??_$d?54CP;|&gcEDLl^h+\y3l$$0%@n&};PPPܡzG&,8A8577w^ ٳg---_}deu$;Ree%/&ѣG3i$D?TNGMeTLM4M~v<|16[RF2jT;nzi+;oounYp`%Ls$WTTDaa!8ˆ'77ٿZBTzW_^ϗfpkI NBPѦdB m7nP&)V\E9؊Pcf4DfOfrV<'fD7{H:S1cQ/+p8x=OMMDMBl=3&暑H\N߾"ۖ/x~蔩̹^A񳪨,_k. 5yNgAc\[+Wzmc?!l 4 ?_'AX#t_O%`Ȑ! "vgMv)Nna#X (.Was띃: df\3E%^ۭl[e"} $䧞h]c HxG' @y$ fB?%gT^WG -QHG(4tpyTUmJJ *PUiHf ;RUj&$Գ %~}Ɍ;g\ˏDFF b$, #Gy -*izR&zKSSS_pTrg"&5ﯴ46/I$KL#lf.;;7s˼>LO--[c} J=ts=LH3+~ x,eL4M|w9y~@վ=:MD6'|uζ, K09d̚:䓙9sf? Kmm-ׯgƍ\:iԩ̚5˯{Yx@S[\4--º ];' YcU%_>n-)b']t^PDW^@QSO!' 7Mϖgx複x} Ǭh K7xoc _.,UӚBvIuW/ުQ[blwe nSZ2%'r44VSFU[bl90Iڱaq\瓗GII y]ss3O>$ĉ3f Qk56i^yD,(*-/?nʘxiaxmd0\>VΒR\q*/ćB 0Zx`|czYϫ^e|>L^T턷.&eÐ`e=€oݿoz^$ꫯzR9~ vQ*U)]OF*4+ڍXLTMJ͸zb!))WXX*B+ wv8f05j&M"))7BQZjǘF/O@)Yi9rPdW^K_˧O?S`l>V]~-74ʭܾvvt.Ţs ӫ}2xuɷc NMv˲ܣ<p1+ ۟(_Eq;QHyPsg2:%#""D_~GUU~iIJJbҤI`4Rxj=Jm[Dɬ#Ȅ=8(˞>L8;=`1 @WǍ܈[s{oSNabCI{@+-*_d#OE_w}عh?A6+K0}V@ ,}{{{$g68A`&%LOx%|tlssn! zef_*BCC[ne8N$I⢋.bԨQ<=šEUQ(ھ(ݹʽJ EiwЊj ci{kr%5qG^'!!Ì혘ḵpBvݭk"""83}uh. "{i6ܭ(P~h { eĨ>oTwYK{.=I4^0Eoi03mfF&K< _~z~[hUWW/… 3gN_5zR%$${>Ivvn6R+k~4퐌snt<ȭ'fR47M kpKeSb;66vPa(,,$//]vu{Vrr2guCP ս[@*LC#(aQYYI||Nv7ְi<M\0kYƎ.3Έb䮭w$1ad@r).z6Tm 18gf< Q'uX0ϣi߰䁶']z΀Kvs]wիГ귿- linbwY[\DIT_צ&O'?C *ƣ:&hT*%z&}WZ~NI"66Ԕv\\X/  ذaV[׎13<^N8N{87u8.鉿c0DEQx[W/<Kuzν.M99Q;V oIo%s\l`$t3RowuHB/G{D[D@O<߅%pK07΀MvL:5kp'jժgQWncb]G1>ZIi6 U|+)<$s1`bXRSQ&dQLaj!m50 =A8.)Ν;c~_'2&MN#((4-)k}H,9" zm$Iys vz=/%λm ãgGJoGFaT B41[~[$m۶1bĈiP8:$>\v}~NgP4vDղەݿ~;֑AK$hGI-D3 YfLl_/d]=m5 i{f!Uwf=Z5[&!$֯_ɓ'1ݛ[12>p >(.iyطQn?݇>T>͞ՖKyŎ{d;g<jM4/p?B6־ WxKh3։8ݻw|->ܹs5jԿѣǿ8p gnf&1rb3 nTTgېAw&c*w7A* /0.ɜVkCmO#+ ף{@nlݾᄆ2l0Μ9úui3g͛7o'88X5D)L!ej ikMY*˖-NsIb0pOZ `N5erxyYWY>u?}cĿٓw-uw*((Kٗw*/u~ _7y/Qzs`qD7ZՖ]p\xEQXf wqcٵ-[0sLm/^dÆ xyyqŒ3$Ai߾=[lAԞ}DGbB7&/ s2c)0-C+jwy&tmDd@7=4)}T$}Bw\$nТ2.6i y9+c#q/m~)?jv;9 j}"lpdn\x׈+|F$&&ʦVoo2d-ZTn߫Toy^Z1 IDAT+㥤`2J&kС^ 2B{VPPٲeumbٽ{wt"(H )m9 {X r }8ĦB_f"H>qm0l\5p~q TbƁW jdBt ٖt| 2,v[or) K/҅h֬'N`ժU}-~S?WWWܬKU!Gzn'P <8%vZ6mLAD m!233yb%XƔũ{P̬\B}3;;ħ~?щWF;}f][~w?c*+7b~O_اupz ij_Msrii%%n+bpa]iɄpv9QUX ~-~_>Md`ЀxS*NUs*vs΄Ko@|ɪV5r7?)7F/"ՠk 6A2-ҥK_'N\cݻ79ŧ2(jFA6 O%744~Ď?X9r'o)Q G]#\>7kD޲UK79lwK[Ʉpv;41/sa"'ޠs{シ tҥS9 0hРZe>M%?|N"A 恻 @ 6 ]]]dr[!YHHC%&&u֑IHH`ܹ4oޜ{_٨ʹ;$ѩ7tbvTϦv/>Xd_`tq-γ+mDzk϶I:1qϏ0Lyekx 0G&$( y,ts'TߌڱoKiѢuMVTFF{e޽={pԩ?ZQ3ԩSdeeQV-wc=F=Xf2S.\`t ʸqpwwݚ[ S%4$lHm!ׯK׆50udr[!YE6yVN4M#.:*o α9%N_oS,wP~Zt[&{E=e/ct1s8@dESU)s尖XƄmJ70^FCʨcQ0sҫD`#h_.+-cRDFF~3ٽw^W9cǎeԩ^.n:Cƍ9y5=7+Rz[pS ʤ~~MOğa$^W6O׆5h FBvX*رcQS4bCJ16z]qs/e:8"S>{0s2G qhk[_cřMo;c !y,-Z]~n캌zߟH;ƅ ybcc뮻HJJ` 4LJ~ș3g>ҟ<%L~ݏĘo'+Yi4+π:kMޝQ͜Wp~ 4Zk- Y(]_P-gW֑pf Y CV>YI0^=ԿI|Zpڕݟ}!!!tԉƍ( z}ew*yαcǖjOMMk׮yi,r+B)(4TN?Uі)[(Z%'8w,i^k=|q<:uEU/KVJٳN8Y~NkbפVZ5qaK15 _S* *%ރ~甿R}+{Bn'_d{^Ar|||WΪ-[|}Mm?@AA{&$$Ba0p%4M4ʧ.'O&##$OݻY|9QQQ۷SJZZ~)`ٲeX]v_pE&K̚5gϒϻ ɓ'7o[Isr4McĉL&={6[la@ڲ>999$$$0sLo/%K8t貛?t.]޽{駟ػw/PT>%%+W'pA.] ʕ+ٹs'3f 11MPKJ[[0{l)((`ĉ>}o7qF[N> ĉ)(( >>5ٺu+֭`ѢEDGGMbb"3f`Ν\KrA>\BJJ }YkO??&9.]"==?Cd~嗒=3g$!!}?^rKJ͞=8L&'ND4Μ9ܹs[ɓsYf*?d͚5|%~!YYY\x/]vb -[ƁOIKK#55So߾/_ݻ>}:IIIddd0ydi^m۶W_qyx8q ,`Æ l޼oTUeĉJLL | 7ofÆ ,X'N{ꫯضmW3B>#3… (rMwdʔ)>#֯Zˆy+}/444xn"c9R>#>#:w̱c3}F8bmT[CPvHnx5 NaqGrঢ ލwA 9+L6 q}FO8'eGȱ=}F 6oLfffp`≦N}JWϞ=ٲe \rw=5JʴlٲՒ%K~WK>謡{lݺE1dȐzlqmg}zThU(L3,Z3/UٷOqYoqŏ+&s^^yMgĦMؼy3pӵkWW>d寕44kRPP_~SO=`IMOIW9{D*?Oݏj*^sb^{^nNTCֶm{qT@4@Ue #ם5qIE'$Wsq={){yMlʴixKTפ$C6_QZ2GLu=燪APtΦYfV_ ]uLv'''M W^w رcKU84h7/^_<ӧK !(>>9sppaÆ???&sǾ7۶_ tN%DpcN3='BۇlHؑ*۠իzokѳgϪX|}}K8jҤI(!m}݇G@BjO(.v22橄˴KMt[3c*q m<+~6ws !`s'g>s*5;2(O'@0!<gvA'mDؙJW^f ܿ~ӓ``Ȑ!,DצE[1riVLdvhL{-Oq#[tLX?`\U $S: y 3ιֱkN?QUi |};<'U7ndƍ|xz1`+֭[Gll,{onݺDDDI !h4rm~͏I}24\ut[G**VM@y}uLd{^ [b=T7aa~m7ptL$4`"24QẓiE8 `Cp'[Vd={ҳgOڴic-[o߾l۶ifƥ2vXL/kƊ, !p`ݻmš$>LaRцaZه;c? 9_5Ehr佫su:-ŠpǨ0ۮju|9޽ 4bIIq("NN;V G`\[%VhNԩSlݺ}&ML<6R+йsg=z4C ߟ3i$Μ9 /G}dJdee@fff *BGvZm@=[k;rC+[Yq54%MmLXS^v6߽1s1]RaSUY6yjî-kp303"Ԝb$iQ !3`M9Noݞ+U1/鴓se(˵~%Hi׏gZ|SO=Ŵi@M5f&M# !UjY}۷h4(㹲6Fu} ņ|&'xB~UD6L5=ާvl9Ϧ-pOkc"ǒ{_%XBzJTBa?ṛip,6|do**U9 Ό3ԩSdeeQV-u?^j3K{V cݺueT{Bjȑ#`kFx衇d*~w#)e\B= y-F7$i?p_P>w@P4^ߙeS4Mo9vE$\vsIda(l !%N;Qբ;g/r8;rt`01]?*D;Zh4}|M&L0!Ҙ6mZڵk3tP|}}uL4FTrK!i϶Ptsdڕ͗ۛt`mNAe&|vwW9MUQm7Aeγ31&D/_}ze8B،Sy4 ~6_~Bj~ R4,͕U&lcܸqILLd%{qQ 55ëcM?.&hɓ'ZX},*}{h{O?~c"ru3rmp0x<~-@ > eccIDՊKcQ|#&9˹9zs1@wl%,y˰+YdΜ9*%T !pt,[B}<==:t(u1TqxP Zƙ X;zb_x&o1mޗĚ_쩨+VxM~sFݱg ܒ='0.)㭕SA",- rAroMgϞ7BHɱŅӢE  =iƉ'hڴ]ҫ+,|u.mwb) 9lZt#ϛm3( x!uRE"+Wms M1qC2&?Ha'pD2ʉd$ZFu%;(c"W׮]J!^zBA[TQ \j6VH6՞`ePKn' ds}&͗ |s'$/22-̚7o',H!s GVZhƪUذaL`00rH ^w?Kgؽ0^ݪ_.Qi2-&..R˗ek!ݝCҮ]r(kAoY.nyY\m6Zv QP'=|5ǏFÅII\|} n֣t.Uq'] !-π/"TR.oΛoɄ  $BD46nVZ :?rikct^B ()9+Y\=o+ԋu$.`]d?$`޵#-יܢc"SxG[?J]?'=TX8G1ӡr9ؠ“ 6î(>}Z%~S1e&K!vͪUʭ )ΟfI#-${.mYTUUoѣGK K%؅ g^4MٻˬE.imsY+W`9BG< /3, OWnʳd` MPIv"KAVSݕ:iUov, BgЬY3yYu˼y8z׍G[xm]FVrB؋\-X?(X" Ԟ>X๼d YwJ!%ck@rQ2]MTxe^Y,ٳnA0a?#BRRRX`iii(€hժS^\:_B+S _oeg28q":F*C둞 @+gְ! W@H>><4ibUUYx1:&sL-ДZ[uno'oesokmE7-nMD`m=J~e//jv+"'NT3aU2橀jH&YvMB!اEq9&5qNio&c;͚SX$r2,R:.Eu5۞?9FS'AFq1_p|.bЪAL?YgmHBXy32&\@!pT [lۛѣGdUB8X=c._L,u͆d.'͙X!>ӎs"\77IJ  joڢF ݳB\4.F:MUjv?~]vqI._L^^~~~ҡC:w,5mMu7_} 5B8/MXz5;w' ѣGFvNUU6oL=0Ȥ]`S(5޹@yXTۼhL4ΐ낛L q=4MctlzΩ.XY~0< juj*&>22L|̜9/ rww_~⋴kD9iӦM|M&L !N(wInn.?P|2gԨQxyyйh*g3poP'UHT/`㷳̶y):Peq#6 玧Rv?3-?Nq˰6H&D( #[dͶO?F=z:'ºdc%ddD7@F"̹ -76C1tP= AUA`4?~< >rȑ2貲[!(b2Xd Ǐ'<<#Gc2aJ'ea42y-e%#TI=loP#'s\p2?~,B\{6o(!9Mxvl:Ln&^TD=ms ѭƪbeծ]ؽ{7z*5 Add$~;s=zN:[XX|#O#GRn]"""Jd[!(b40`?9t.~t0i,Ɣ~}+TUe޼yn>cɋKl5i6 k@^u,oZpB Q)]^ǵI>}2-yOtd‡Of֙fE<6l ##={n:VXM'!!>В,Z3fX#۷oGQ[B!욫+C !,,b-[d1cܑȥf=f NQt"c;XObm[޲QDյo#=̶'3:'ryO2[VRӻ&w|PP>3>6N&DՓ1t nܮz%XԩSyQ777ΝˠA^::USwdqQ~vфɵ}t{^@՛ݖ1J~yϏ~uR2-o 4!y{{3b-o~~WS9&xui=p2k+gb2xwdczx0%WzF؇ s۷-Xِ [>iC<cuLX:vvi4 .\1BT-Xw}^)߾(%3dw&M9ctcIX}' !Pvm KJԀFM͚KoN(6&{ʊ+dS tAlcM5fT)gRUo4_\`c&yOWM7wf۴lҾ^DBQ5ḍE^/]/z,yr2Vر#MaaŖ8p,a1c T!z1h j׮ѣQ#9$z|FQ~hd̘12 #w>=w e.9ɮQ:4g39ΉGK/aO6J%#cuJ9w_.'aG}4Ν{ݏ/DQnZhQ ſܹ3111Ɩ]|фBjI&<:C3Tdr?dS5­X퇅1xxsh3;VĐc"Z3=0p ׬&`ur sw*Q@ۇ`waO^Nr^\N*Zq :M7n5?6??aÆq)<==ꫯQTڴiC JݦLbhB!D!?9_~ ;`TXȚSI!4 1Vgb'4MT!pP-;hH†6̃??ׇfʉ$Q=ɘ?{9_7} ~YiѣYx1FQF3жm[y9}4AAA,X޽{[# ++ 9WlM!B2R6}a:̴<\w q!D.d]`I_zm`lXBTK`AȺdW0eB Xe{%_\:5k֤uFFF111DGGSPPi(NxxxٳgWu|V2d3g֑BWXXڵk夲MY hŽ,^A*jr6+#>:ϲeIm } n.:zKM*({R²п Q12)a^_RN5w?xx/n`voum19ez)~Snݚm۶Bayyy,^3g?[PB+ϐ=uAƑ#GhժU6iQ&-4Ʋva-u>ΩKO,5vcyLA,B!egg3|Μ9KX|s)#K==]TRQZn-cjHQx<=˴׭O;`P59~܃q16]PB8:W6S$$$H!J-[ơC̶)?LDDV8yWx &pH3233NՔi,{ȾF1Qac[GB{kiyf{ nJ^utNԜR, pr4M57i/mjWiֱn!c{R0z 5u"PeLdaKBBQu.Ξ=˗˴)BjjLvWj _R1۞s(.͗ 1EQ{xܽ08jrpǐfA;qP<}eO4k&$^B%@Q^*GS@0(rurrrdcO\a\r:COjaQU1BŠApq)LJ~:(l^k_q7Rcp3xbTs^~N?]A`Fm.dOuNxr#~Üy Hv &Yf!O-VU;wʘG8t;bNީ"ވ1a6eΉȘ`A?)[QM DGGse#Gb2aNxx#!N`5C;c.["!!#DuE.gGxz} b{s7.?22.y6^>NfZ$##?yWP*N&,2&B!'_"D4oa(;msva[7#ίBAA7BǕsFp5i޼9hVOLL n/˥B!p tR&WqcX=RΟu$]oDvf پΉb0PW-'ONaj`uj[,TSYg>.;g2&.]; %%EQJSkq ;;wҦM2L0A@B!ULQ6lXj*K㬟5KO m`⏦b*(;qdyZ\~6HVyk߾\ks᫩$1ZfdTMeL3|hֱ(EEh4/OVJT/8rH"B Y~=5iӦ#]|vy Rov1VQ&?* )3wޅ]ŅFVV߱.-eI>{;ॿڴ jŢ{aPd/!DH+םZY0x!4E\VbeLVZUٳye7nu!""M&BoeǎDEE*WdO>d2ܗ{"hҫk}lr2uNdz/lŘtNs"JИ'7ɧ Y5D7#:£ scQMևkf % `Cpgr1Lvǣ( 1BXܹs1LBa9s&g]ƘŋϷq`0c0 T. +Se2ݨQ#4M+sP&G}TvB!@ff<Ν;uN8TU囯´\GFPdku^}Xlm T'[Qn`~cx.1w-Zmٳ~9 _E)}BEqax j6F(KUUܼ`"h3~ބu[,2}wp!m!G}hu !z4lbڵkUa4y?b0%+ HT ]>D@-&.r׵:'i3l[a?9cP y1 IDATj8b{GH)?!-w:yK0FƏ/< ~(ߟOO@\v*cǎˋ<>T6樎ڷo/ !v`0п4ʒ%KȐK4#o#}L}GUL&PzK]A@DTU|b"ERI/K bF 9?Db@fΙr=Ly9ϓ[ IYPg`OkQo~ ;dxͥW/#[+MH@M '"% n~ݰ|r,jG"F$\xFcCpk/7s"SAғ vl,[[Nd[ǘ15}F2WR8yxbY1K>1|1|ҤIرct:݋ &iӦpppVN2;2gyΝ;sNBll,(ضmDQ^/|Kh]tj##sEgI/oZkn~b 9.|mUP‰*<0i`d߀CREQoaÆb1tIt#ݿ_DDD$cĈhԨۑ`"WCS1 ZgG|n9p"u&mň9p"k^^IH_XDDD{!+r0m;i eRI%I„ hѢ*d9Μ9[̐&Lgge8s4 wΞdž>ez(+-Q0:A@- -1=I(.(S6kP8{&ܼp"""<6I7=1?P6 L._f lRq\r 5ݺu f͚M̔'Əop=D={VTGcylL8l-7-wp"uwEH_ZIa9IR8uк/xW"R.r2R{nYoCL0:<<QQQ?<֭[ǵ-DAA\]]x ek:oׯp*!IRSSѠAnDicҒ$U[ *$SVQ^)IWi0{QdM*-͑P"LpITrnl÷1bɠ%h^Dd'w:v?p\R0p~LL ˖-@W;=A޽ѴiS3~o|:hlGXp"u8٣s\ʶ.{{Ιm7 !5IȔH>:/b~|cbcc\We0yE tIKKK!:vwwwS<جYᘈi4;:NӧO+r Ժ)Kb rMcK)pt#pŝy 'nÇñ}{ZS(8uJDWW0,}#}.5FʪkCbW=$k7Md>ܾ}UnjG#""GxyyaDzz,V7h/!su/Eib.w%8!;zMl~x2H60(sТۨ *օ =k`EQ2#)y)8zNչ'Eն!f& vw $!>>O F۶mT6>/"""27]tA``l[nL$ʕ+Op$ 1p(|8/w&""0aaah֬lMc֭!"vĞGil ÏSTƙRnxD*fgxvm7A]-VmN9to? ݤ3W_=5gvɴhтYwww1`=** wU0$ ׯ_gC$I_ā0'GN41o0TD֡3!88~~ݻ9v,m(ؓcŜ9v$ByVW`7{Cev޽{$HDDd%ڷo֭[ly9Ip <%r6D"nueZG: n"[+/#zoz؝Ea۶mH L#<|S 4[lڑH._M6A SGE:t Ft<%zE /6P{ >mTRIv}D}#r;Z$vJDDJL9Qĭ 8J֎r #hg&i~˗M6/puIj}#z#m!!!5Ilr9c|$ i/!pJn(~Rg?t2\V w(H^v]goKDCRRK/ '"kAnz*-W >FgW̙3QXXX9h GNJKA@@@ I&@ӦMM<YA0rH8;;W9::o߾i(3AkF;oAs>vdkgwlFqA‰ggE5\DuVF`LR*FyƹwAᆏ@`20ɻ<33o6gō7$$$ ==8p^|EbQtt4LW^(rS """kQFUe˖x7ZًQrJ<Ν|k"[yj!gw[0z4llݦp"upv7QyaLt<sE#W_Ֆ1{qM@k$+V@~~>A!Cyf4k0`֭[G~ػw/_,x"##m.- AvcbҤI6O 7J#hxpjAsw_[Qp"iu >f O%nLO>}~z?Έ$d̞v@Ϸ~T vSdʕ+???tq.֭&NIrJ8-DDDVjP(mԞcx\5_[Ch配 GWŽ"?+SD4<1q!"cj<}T gN3EC0q=S;I%-_~cg_c<\K2??FH7w\n\@DDDVM7jcA8OO삮cd֧P^Z3[7*H!S~vը(psp<3ҫ2,׫)zJf2I9::V=:߿dƍn߾v 4Fn)qkwED89woZib"rQ8Yyٚ6oP8:nhpv3d $.?@DuЉ_,7ӘdE$ j?߿c:tg'[|9RRRX喝v4"""R(Q;Ih4kj%tp] a/[uEy 'oyYpt״i޿~hUNGj%aiRbC F ly (7a&9gv«ZYkҤ ={ //ݻwٳѥK(,\\v11믿յkqΝ;g=Y3%yкyk1goBNj=~;v=z eiyX~V+/s(=̲9qzx󖿊l$I8r/.F\VÃ{SR! le˛Tuq AC޽U~u$U~a$V;wbСƎHTpEDDDDIpQ;v eeURGGGp§VVI(v^7u'wAY. yL2ĉ;7n`޼y1bڵkVZ!""׿pML4T Ξ=[m=YN~&q~e, ڵ"=O ϥ|,NEكB??FEDwmU8:󇃳9#` Jo"SO$[%^VDdydM&mtwX3$˘2&DDDt>|!!!2d𨃂'Q8c圙UvrsGȱ8tldٟ3;n쯉>ZDd^"!'ZM+h=sS!S{aP@\P*<f Y>z=ga٢^zUŴi0a;w"=s~#ŦN3iZtS1S^k WlfB7'C_jK\qFtS(=VN-LMU<T&"""rUl߾ @XXǬg$IBQQ0& ?V~Ψ7MO_^+Ѧ_Ԏq@lHDDOD<9Ⱦs?M}^ DtCDU6nvS5j8v(IP\\,$ wEF',{m}Gx S ?xe+)O@, /4|MQe&&chEFCѡO{S!"`kwq2cr^"""&Ut(ضmb=>4Zw{x>~/*x8M/9p3Z~mN9Iu I^F>>7WXdbt@7=5{9tè˙T7$"""2Ir sN IDATa?NAn u #w^dXkת|́UJFDDd\{3tzoȪ'N(nZNhٵl-=%e):HeeHjv-ĒR%Q!1Az_ |6ɪ_L.33SDV Lb=4NN7elM_*,{2{nsNh4|{ѓN4 FŞ!"Ԏar^\-[K<Yz/> VBNDD=Iĉyy =VVV~',Zjǩ5QavZ!!!y$|x?Vv-wRpav{l(R8uˀl-cw͑$ K_B|VqL![n˓ UsU,\GEyyyΝCjjjOeSZ8i߸gb}^Yey_ Ֆ 4X~nIs0EDAר/6ĢrYQc!T8mE]QWzM'[t8eaX^3^1X~IH-Ds沵={p")$kA@Zjj*]l:EׯWtZ8wI;z[Dd ~hճlލ8ܹvEDʳi_~vwQ^NW8up!!mPp"RF`fLٚ(8rDDd̥!RIjՎADDDfH :`=22">LiZ̞=,zs}~‰gvvf]? /H$Z wc^/OIg F3fU׸֏X۽N(2[IV.],C*aÆhӦl--- /_V8Q퉢sΙEϣu=14d# lVY''*H.:n([N-Dҕ Ya`#[Hi5Z:0j \>UNFȜz"S`7jDrC"""o MIIQ;B%׾и켝Pk`skgwlQ0z: lA#bϿAK"ۣɲ4٣p"Rða4z ov2sI/]z|}}Ѯ];Zff&bccNT;><;x פhN\A3lTwMuoPlGp"wBp'YȷB|Y&@pte^m:FV^ԎAz"S⻜d7EDD@gl9rĬgw-[U| ΂%#/[zDڦp"uthјCmXvcZk(<{VDDḏ!2vD\Fhhl-++ /^T8Q >>tѣYZv-7. ""ׯѣ(3Á+w[BLZL9%9t}HM= v[{{{x⮺ |/'44zm2ǏDDIy"8 N+feJ6T]hYKO#])A޲+~٧uQoDlG?W8 Kɿ#[(՛UV KyVuӧ{*k"..#F`w֭y$""ZsssCndkEEE8u‰ $ qqqfMDa@49 9*y$žʆQIAUB.Gկ?kNDjpw ^=(|7mCUYJCd 69؝#G/ĤIвeKh4AXѣGx{{ AAAx饗pwUǪU#FG?~<:w_~ƍúuj?3w%"":ݻwgtI)HF ̾q00( 0|DMuw*iht6ZP k֮b1]^/oT Y9VL l}ZRa)=1仼_~_lذuv+::۷ǻヒӧO###HLLڵk~ߞ <N>͛7… A^=z47. "":qqqAek8y‰䉢۷}c -:D=F*S XVZTgRNd[S0ZΎgg+䍱VW^X9t%>JHMMv?:၈q1|p$%%^yݻOƒ%KЬY3 {'VB߾}ѷo_Ƣӧ}]eL()ق^zA~V٩SPXhkFWݭqǨfkB"zZmzGw_/GQE~5kٵ\kdbdoE4NcAMa X:x)u}^_d,!zZd7|t͛7 #G  |ټnݺY~Mg"77WDUyxpHm6$; v>>p7ec(IHP8= vѕ+Whڴc իF2zh?[Vm޼?#4Mr&5쌮]m۶5˵<\^C$HTy(>XIgS0ccV5ksMt:z 9刊R5)++_ ^ ݫ4jz ] ATwPZ\fs1&O(N(xaWf=_&{WoI <쮃xLm6.]`Μ9E>,:uqơSN?~#@||<֬Y8tP,իW֭[$ s΅^GRRVXT|OPTTwbҥSNa׮]/HKK\=::۶mlݺ*6=@NN+Ki&Ν;+gw g]ۇcǎVXdaܹ7o>||y&`ܹ(++Crrrkr1۷~z\v g÷~ ;w6mڄK.+ ##|Mkm۶U& ,@ZZrss_bcc?vڅSN.]wrI8#?XIII;w.$I­[zjWr:tf>#"%%˗/8q{lذ ?HMMŋThܱc/bbbCVV233_.\POq9E/PeO?ؽ{7N< Xlܹ|ׯcݺuѣ+W"!!(bܹE Xr%ѣ8p`ݺu~:?FII ܹe˖N<ݻw9#lY?=9/ws*# =uy$C}DN:"OopGw nVyyHKI9g?GhZt:9y#^y< Az8to"""p@BB @+̆޽#F̚5mڴ K.Ett4rrr.]`֬Y9rdᮧ!!!8y$!"A ߰V[c>s:a>s;V^[{wׄ ݛ59sL?ܹ3y_^ׯWNszܽ~ DKAgooկIYv E7O @ |}RgM?F I@4ĉ&B#_8mDIDdJ$힆)`ArdeL{"C.Gg;=YϚaÆU^B@DDDd ;vl-&&JϤQgy3- 6ţ$>[HT(-*vb̍gg4n]Ovl* NdNEy<ڑH%ɹm,fѕKo?L͚z'`w888@Œ&O覔5 )) UnDDDDucgggpv^IIr՝!%IXw8;+;?YkR0z ./wiN;V KKC6m@aY/zXzCTS쮣vٝc~ m۶5i.c9y$ڷo*,X ^v]Eh4Ϣ/?zE3?ZR4 5GdkWBINBa/[|!z :SCrJrˍ_NDJ.ʟ:d8Ipa LMK.!!!mjG#""" jѣG*j ӧONj/h^e˖A+𚻜m:%{YqFa-4Z B4eN\‰s{J4kyju4~ʟ-[f}!110jԨ*[Ç#((Un$"""Io&M/h4:tErt_~Т0BqliZ'wŽ>4nTIt\]|ݯ;-JԬ!)($$cǎP… Yf8{f|S;Y)GGG̙3GY6l?-Adgwko2_v:"[˼WcNSܺu 0gtD#{K/m(O@ժΜ{#gWļR8?;Bco'[apݶTW4iB*e[Ӫ/#THEd|}qp;6)3^E꧟B IDAT*:DȚz'_~$fhVCxwqidddXnÕKYnݐX햝v4""""$ QQQGf)}GkH{p 'R^ z]X{pwK%'i;tXtDd yȖ`7=Ѿ}{U͟?_hDDDDFh0}th4l : ]gO*Hy:4%]@~V‰y#Y?mP>{%|}"66 UngV;و|n0KEblI&%)L=v,NVyzz\zz:v؁y̙3j!R+_19"[`o`s];~Kĉk7* "Knu!^BDDDyOʏ? 8}4LaFY0xZ!-B,FʵLYvҦvvp:WlZ,މ|+/T; {%|ӧ"""RLtt4V^* 66$)"VZe3=XGYj14kߠ`6Qe~ 5nTY7 ބ:̙ܵH-$g:^"'ǺkP/U;=%[yȶqdEEEAJ""""ckӦ t:lĉ&p&k=Oyv rv''g$.`qB0'?N#[KIGAN‰Qh|a#mˌø7q.\E؝[dd &nܸ ):uƍFNAмysyJs~yGnC**Gyzgjup9ڨriah)QI_.p5 ~.~Gmᬽ!z_duܲՎFDDDVGLn^LJ~^oV>iKbPt)ädѺ:ʉ. })Ͽe=x8֮+]ϺO+ɚ{?`7/*ڴ}4???7gF۶m|߬r&=yJQPDB 5XKzY$47M+^@ԦLnR8 5wQg& @ a ;(TVzն*^_{fojrT -! @$}\b@sfμG; Ϝ)׫?5O^G)S&+~VjFP\Hӵ85zfcBavPy/)5" EN 3J5V|яA=<cc UjO>3]{E 9CS*yxkUU-y]rM1&678RA&WO6];XM9j薤^!B̓PBnݪB8{@kjj޽{  ФI3G4)Wi!,9YW\aVj:sD 5B n:tƌK.;Q555㏵tR\Ryyyz<04j(~А)3];Ft㍦}xkitj0ko 2o[NUO?z<W?OSrmB;:)ְ)M D;s5:}E `Ax㏕{&(h#j6D _ ɓ'eŊ:p}ݧ=SMMbbb8 Ata7|7)Zfsw2B+ivWkʵirO-S`rnj8Ƣzqߋrb$iѰE̟ٜ mA̓`6vG$͘1;`lPņ:4K޺&㠝v^ھfus[N6&FxgKO弮H\H ;J +\qF$u-2#?Xz̓AnFvaׯڮ]ءzZjU<>OuϪ:VU[jW>Yoq.eLcvUaCŎ9RQFU B33{KKR @` f7L8p@V;^{mcÇd5ISG(a"쎆;l]dw!L2o\dzql~ ^}bOKl\ 솩ݻwP->Ξ=kw4Fhӵ21 CǏ_ OQG)*#Y+Nb߳?9,Nd^ԣ_! ^+(_4:*k05sL=Z->.]jw45aӵ"8Goj#_ddQa>=tLqN83%'+~\ӵʵk孩6  ݫ{*??ǃ>hw4&Ow-3ջ\.}lGSi&c5;niw͌2į`z[S߷8 A(YS4hZ|$%% ^z)--tmϞ=oc555uQ*~F4*wg^lRaMَJ||> k 땃_B̓PB&MĎ `iĉk***c|>m߾2L|^iIM׎-U]Uʼn!rHEfd^hXQc쎅sP 솩4^@@;F۷o|>9roG5;Oǜ㠒:$C}di1b(ǧܬSq0eq"&oVXW_}=m*$Iɧls:f7LZ]z@@ѣlw^֞].-ZDsϧr<ܢUwXh04rݧXʼnwH{FZlqH\@3*CpVk缮C5B rW ۨQw>z^\qqqkmM9`NSZx2y*lHJ읪#F߸AhvdL3e"INGۨ[Q#]7:%F&|efj 0- nM4tԩS}riʔ)<3|S?y N93gBbI~5C[iuP˕`VxCQtXnvc}<6—Q ,|PS_[ |<.]JOgq L ks_wz L/_l~v83"#0Z'DU.å0#Ly/h•Z Q >9, oSNNNn[jJIIaV x#-b3Mƹ2d_ȘX}Rrg$;u0C9@M6ӵޏz.^lm w>;UB5}IIRlll`NGiJJJRRRMM2Ŵxk.͘1"##;ZPfPԈ[Q#zRql'؁3rECri1hiV7hvg#pP TPرc5fXtZ:t̑4z?Qج’iQӋF7Q&5 *:غ 3 C7\oVss-NByJcν\ ;;% Ն aӵ;C`&il1#UW1ʆTHW\i;Q8 b iرc5p@ դIΡܾ}{c>Ow6=3DD)}|/ӵ;N:"EOlV[q(PyJhvѣyA%!!AkSUUUc>O.c(: vX9.4=XT;,N|yJhvԊ+reʔ)ǽ^v׿ujꡨpӵm'-N ͿoiqC̓P³,X 2ص۷o^z-ja. tHvk-N $͞mVλ54XD ח#$Q 솩R#d?sdϜ9zaE, UWisbaS6Q&pqOy6n8 5o?믧Ou>=v,U}RjONY9R ~u 8-R|ӗlqP ,3g4%9СCͷ|N>oVcQU'mJqɥO!5'IĔhӵL劌;P6tmͭFA S٥-˥q59,,Lcƌmݦ>?'9R jShq"tư/笾B`a=Dn*,N8G|xzbj,NڨyJ _(\6V\\$J6'ӧOk͚5?~F(#gU=kI +'BgP&=i\j[Lf.W8\>OU٥r.]62:VMK&LuE_3ajĈ!18WJJ/^'6}>8@sr')]bqtֈLϔhiף_z3]c е Нc]cһ˖5B n:u*/|>mFsP̤"%(+C#mJ:uƅ(I6Ӆ:{4]vuҿo\_4jƘƘOר) Kf$L0{_)g맭G\.wX SQR?tmtM.D@b e]|8{ڵk٬ Sb_')a0Q&uU:gi+Z}Lr1ʤyU[Q ؈f7L>|XcǎUzzzK ˰i%BQ 6] Q&}L)Q*8Zo߻Wf@u{ i<ξ> VXXlĴ8dS"r4gc ЩӵrmVcC#7%u{k9ƹOg?M,q~>Oǿ*?PkkVر6%B5B gvw߭(--n^Wӟ!(ƺZgm8b#o6bF!OeeF$U|A( S ð;@9}mwrNTT\ځOCcɽM)Qj8Gµךo:yRYYA e*< 4aرcvGrg޽{ecs)KLwlWc]ʼn7xba$+dUi|>vک}#=!8E]dw4a'? Gٱc|I]VŒ>?رc*++9`3gojWގLX/61R2eI;~}'ՆD4Սz+͛t;ͼ7pUr]wz/I!f7Lg?8E]ԪyşcG$GT7SzN/E#(:!tQ&gO֨Q&Q&^Jv z% =6's Ƕ IDATt+Cg5ɧVژ\.~ӟAHYSvGR)))۷ڮ]8MqJ%W'~E r5l ӵX Lz' qsj /h؆ J3i l/.7zj4Z(ts pǛ/++SQQiW}aJ_Eg~PuH^j%$c,MQ&1 ꗑl(s(v2n 3n6]++X(4|>}G!$솩/\g̘12tpB˦TSޠ=%җޚ&垵):bO0];yioIZ8 | ,PLXGhvw˥;3>Brظ8N\\ ={jܹ6m/^ɓ'+**xA#zDH36kw8 :Q&3M򲶆( )ejᱺnu6dhVYZv2ؘ̹^֭[G!!Ln.7uM7)22R>O֭;NP2݊S5;Z7k+z2XdLgwxORY2 ÓuVkOi[]sn~>,P_Uݔq9:4* {pjIks"ڃe*VɑuhRG ǣܥ>(c, 4M1#*"mAӵW5YY*/3g*yH@HA( S.cw nx<$IR$?}&rRGno򔔨|! *#""TZZ<i|>N$I~]'r[?N_49C~3/.oMNH>By,ؠݦO>vGv'OluZ;wgަKtTi#kU:k!ʬf7L]wu ߖUcc/'իuq#s%)oi 8K tw-N`tz75t1A ]q@|Zf٣kӦMӵFBLMY556(N:UPxAjC"g8U׿^` QTkWd$/ESSBcLmf͚;~Ѽ^6mڤVnIڻw/9!U>koz;g+_;%L2?ԑJUZ9]cب D+M?mntKC+mL ^W7nσ@***4~xӵZ9|^ +T(h۷h?6'ȖUnyC s%FtF KM5]xwih Б#llu +솩wyG.O\.K^{Fp޽T>ξqXŏo?ٷh;TV*+Tt ۆDJLVqkhvwr)ᚫMת7nuk_3=m߰8|QA(YSvGzz饗QF#NКA'~EۣO_'f6n"#Mr}fq{;8\gyMk1fYFECf7Lm߾]*((hq,g0 CǏa7n}cq䎋+ ڽ4IxdO6]ݺ9$NvKR. ֧Z,N@va_mu|RI{hvԹ5t4a3f[|,]h]0 =Za(==y/۷oɂWn8 :cش+KOdg'*oZNe\(O>D4_U #Q?:Z8d.ֹ5t4aꡇݻ;@x<-#˥#G/''G ̜n1RݾRkàS'MmXi1xYM%̻AU7X'56U_>ڇhp`#9¹5t4aOӕ#))h]riɒ%͛5ب\#Ar'πF`Ӏ}rGx>˛7=qzDXiNUgt/<,)8I94H111cI1d5z2\~:]=FQvC; 6xc*=v4K 7FtyG|n1? WFFǘ jT &C&2iՙ^Bh(tfw_}qOIjw9L.t?ӺOgTz_.TNB&N%.|>:4ʤFGh5fkLˠ $$&iWKѯoɱCgPdq爛=[M+c >é?ԢacwӖp 05d^|>坷6l2F+ҭLSc@NK):""*ZWun/|lJAc{]7ʤn^5?nqcǴl2]5{:wݱR[k 솩Ѽ^?7ʤ\i |>+ԖկDAtHNK0]9W]wFb/4|=99||ujy}3ޚf#=O~bw nv裏Ç2Eq߾}߿WQ}:Eo \CۜS-W]ubmH" Pȑ߿_NJRܹ Μis:A LUiˉ-oʼnW{k qf7L3q|>ݻ5Ottl(6xTTgVL8,2kV77%)/+3$~y}*.8$rz,^A_԰VWcw4(e~9[&nY~͛dhZlY/U;v,/|>Ӯ(3gΨ Q*kN|J_ܧj:]rhzI8zS\H5FtN׿>bN0\nA:[wD#5hv;?+B|sѣzo|]/j/2Gs\[U >\a:me*_e5H#5x! t})<<\k֬ѕW~ӧ5|XB^{n6=^\\G=z_bcc?f͚mnv{< 0: UW]ٳ=Lݞ:5Qxj 6S]UlHeÒVc}ߟwpiłڅF;v$͙3ڌ3={ȑ#mzZ^Ĵ۷/NCsv-LISM^β8. md+]|\4ۦ#5x;Duu$G/.KIII]v񒓓98ޙ3gyl WĠ S̤dh^)mG8%u*;Qmq0G̓PcL*++Leffjm~=??_iiizgyFVRnnٳg뮻ҥ^M_羘YXXjVO6]YY;~yl;5U="&p1;hZ۹]^G.ۆd4 C2;`wzs("d^zΝGyD+VPNNN/1رcooڲeJKKUWW-_\s<Э͞=[|Vk˗/oxB&\ GIH; 4x]esYzqJb!^ֳy޺@PAfD͝;W~͟?;Sk׮Ֆ-[je˖G&o_~ڸqn̙3Z|y}~[ٳ^oٳgcٳvG?or~N!]{KJJy5*,oԪUsɒ%-4}triǎ7n\IKKkIӧ[۶m,XSN8>}t 2D;ǭV?wLRlll3v(((PzzzGor~N!]{G-I*p>L;Z7S[yʆDĨ]93fws&3SzHӭϒۊLODʎ G39ّʿܾdvvFٙ<@͍3fjtKol2͛7O^W?^zV2dw1\SNUNN^z%ܹS.K\rn͟?_$`px |2 h1xTf8CcS*nwP Tl+ͷ5h 9rDojkk>~adJHHwjjjyfimzhjjj&СCe] 0xT}gLwdjܕ,Nd-06v;j2y=^!;ESRR=njwjVI~ԖoUPQ-;mNذaC/ _QUUo߮YfYs=t=(&&]^^ZvEiouui or!N!]{^T[L̶Vnn:|566J4uT~D ׄq*O_n۲ICf̶!UI_\>Ch|ffǎGVQX/kG3}v3v5m] СC6lX?1&TYY|;>>?>Qp IDAT~nWZx^~eرCׯ^G?Rzɓ'%I111\z |?:8fw;(""l?ZWuw1\.zEm:>Aͷ.x$>4;cIL?y4;(22yѣG/x#G48p`PDƌ#3 {}5=ztPC̙|{ݺu~~zIRll&O ns=~ $I ,h%hvw¨Qt 7H>3=ӭSVV%KH\.}QK3@(;]rssqNJo\Rzjs\\\3Ojƍ*))ђ%KczJLLΝ;+//OCi„ @2|>vxo4hP(/ԢEtQ駟a =+M2E{3St|3f(22X]]-_\?/ژh3ѭvܩ'rf7p'0L^~evm?tEi*,,;Ќ@;ktK%IǏ*n$)""$@K4.'IJMM9 @kllc=&I?a/afTVV*++Kە/&+--]3hժUUuuRSS5{lu]K+/Xje˖I.\ء+P띇zHOVyytq͚5K?;e݆0qDܹz{^h"9r},Y| ]%k//ѿ˿hV\\\? P띴3{l-_\ jS*1qs߯HLLܹs;tlAAϟuwjڵڲe}Y } gϞnH^}s]}|Mv{65ϙ3g4o<?~ NVxbbb$I%%%H tݐ#F.r3 yJ۷oh]+kZ-\P{wUo X㩭նm$IC XP$);;[Fjo߾nЕijj7߬M6iz;|1@Wzgڵzz[/--ŋU\\3fhС]0~:y$]EbWs=z%I555,M>>۩ѕ5ϲe[oI"""xbhw߯zH}ĉ'NhΝ|N UVV6ߎϽϹcǎi˖-sw$*@ueS^^| VzkՉ'~zeeeL=z.\%K(!!]f7Zl@qGFF6s=czǺ$@Wʚzw222`f7|?/vt<whvcIs5p::Pddz-I:zm PA IҘ1c$}_aayo߾ۣG\]8BnH̙|{ݺu~~zIRll&O 5p:2ݐ$tMͷ{9{TPP IZ`A5p:2ݐ$5J7p$>O?>eeeZd$rG4#@gQA( ;:/77W7nlqʕ+իW?ŵx O>6nܨ-YD;vЭުDܹS?$I=&LM_@k<w1|>^xA|A5_eZhyw{O0F0jt;@pf7Z2eݫgyFVRnnYfn@0NGPęGhvn@У z4Af7 =Ghvn@У z4Af7.I5|OQQQ2 Ca())x@}|6ذaΝ;= 4p^UUU={.:qoݮǨWrrrYzIKKkŋ{UU{y"P^GE)1Hcb$$FZL9"|t8A:`F- q`"5Lq~gpy~r}9K]^'"""l,""""piĨQ`kk ҈}Fӥ={KkO~}}=222,""""1MDDDDjnnF||[/>>:[JKݯ~_ȑ#_XXÇ[pEDDDt?b""""PAA666l^ ٳGјk׮ѣDDDD=LvQnݺ%nnnt .JNLLDss3 "",""""`:$\ Q_ >>>,c7LQ1MDDDD2PTPT6m8~qOaaY`8zj$IHMMEhh(0p@T*+[lO?Ç /cǎud= 3Ə7xCvݛ\|駊ĘtEc.]7|SLСCѯ_?8;;c„ XlΟ?h7oƔ)SZaÆ!((R4ݎ9^z ?0\\\`kk GGG;HJJB]]lLXXX[ppp'ƾZEFFvBBB}z=`9rYU+r,DDDd)ܠƍ5رc/_6窫QPP;vh4F|j*ٛuuu(++C^^׿bxӜb lڴIf(++CYYrssqF+X~=rY̝;.]/..FJJ RRRs!!!66ːE_WsUUUHHH#***$%%:ׯ5dff/htLO Cll,gaڵPTm$'"""ad4 |Iw LZS߿444`Μ9oC QayX_^vLBբϟuď9___dffv^fx˼NNCyy9z=jkkGG)555 1+++3^۷O?wEQQvڥhJ7\]]QVV^]{RSS"{c> :\xQ|xQYY)ooo;wMMMDzeˌ,ڿ1~xEon5k>+W ==]D_Vcܹ=TZP̙3(//7j:&HZh|dd8p@1btaEORaalmXRHHtyYLss, 2DuLIRXooo믿K>@rqq;uTsNE$IՊ1iiiƅ8[[[iʕRii,Vz뭷$w8=9;;KpիBWZ[[K?cKvvv"Az6rJٹ͹79:^FU1FظI$i؂ wzg)22RzM5%+++1ˍ|^L5,SN_VZVjx^wѣesZYY!88ppp۷_ukXd $I >'Oo~YكPܼyn8p[[[5k,C\\>3qlʕ5z[n^CBB &;j 777@sssu,X vvvFFF.]XfMu###V)O=;3y /%Lz=͛'~# ֭𪈈n""""2/"qڙM6ɓjժN㽼o-[Ĝ>} ...ΧRyf 4Zɰ˲e0sNCCC1{l@EE(љQF𼃃uG$8qBV{˖-7n۷96h <쳢oX=CBBaY۷Ov 777̚5랮M$\rO@MM ]ODDDdJW ꫯ*&چ[NC@@@i4ٜ=DVV;oP4n޼ys[TTM'L"Νk7ưF1cttth'''64TTT$t…t]s1|[-nγkllpںGf  IСC8pWFDDD?gܠ3TB'''TTT())8VSO=>@Qeff hhK{ ˛tzi̔)SC!??HLL/&nǎdC=I&a9r$.^4\zL_?pƜ""""S`bĈzh[YYua͛dŋE0!q`h\}}h+9h1҂~Ays*?*;-Iv)Vz\---ϱb ;wN?~|9s&>.t.en:oclݺݚȔ&""""PZ֭["+Qwoq`JKK~y<ƟnLDDbccQ__\={VH?v_~7u%""V$INJ+Ɣ)))zK.ETTWDDDDMDDDDftZ\EVׯIx hs2|鞛UhLr]sj:u*… [ rss.Ϟz)lذ«""""?&ȢE $u?.AEi\w477wz9v9'''Y$#&&FD[na\o/a혘MF|Ov~ߊe{>&ݿ&""""ruuk׮,l8˗t钢87ś16\oAA9-NVƔ4ic]UU{N=?~auR ۷o#00W^h4:tHQod7Yĉe%ON8ay'L gΜQ4Fiah|aa!jjj:yD;77WVû72\oFFI玎%|8pBT*^\$;6h XhE]l-o@KDDDԓ&""""rrr£>*[l1ɼ~~~}qk.EskZm4ްFGV)ym6EkYfvJJ nܸaagg8uv܉|wj]/Xd wb]vZŦM0m4 cLvŽꫢ_")) 㦦&^#G 33S܆orFtttDTT;8XBTT(Ѐ&!!!K/O? 777]'<[nINN,YDVSa,.88'O۶m3baa!^{5_9''',^X7oތ?y0|3g]QQKW^^@)1qqqΝ &`РAǍ7'Oۯz]T.^ǼyjQQQ/| ={]F / ݾ}; NJ|7ؾ};JKK1}t\ph{СصkfϞ&3f@@@`ooj!''GgX'!##_};u>cҤIpvvF]].^ N$ȣ>q!//O􄿿.1gEc]]]oun""""ݑ@||Zs㫯JJJGѣGĎ;}d7[tzz:;yEΘ1ǏGpp0n޼ 8v;h|Od@II 6l`cbbd%LyfsN>8ְ=QO:t(}v3~aƌ㏱|Fns^V#::YYYpttTV'''\R"""2& 0;UUU/AAAf=n"""2&""""^g֭"=l0<3=vHo lذAVRҥK\ sM IDATݯ&""""^̙3x7EOS%##C֏k߯Ȕ&"""""q!IJJJpYQbȑXhWHDDDD}DDDDDdQuuu8p@ @RRj5~x>c"""2޳m;Y[[GNN&Nh%Q:q|<&c<&c<&c<&c<&c<&c/qV#IENDB`PKmNsPPTNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_R1000m_EMTrue_LPMFalse.pngPNG  IHDR!wsBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxwX6{)ҥ( T,ƊXnQQcK$% j4v1V{Kl((ҥoYX3g 3g#AQ)fT """"""""""*(cJ=cJ=cJ=cJ=cJ=cJ=c ݰa ^!2#GǷ{/""{T&ws&"*]vnllǏwR *_戏׫ӧOG&͛7r*J}^q#8b޽3gz聪U5kY[/CQ___|7xenºu0an`Æ  A `kk +++ԩS~~~:u*݋dO쌬|וܰi&4oZ9&&&ppp@UV!%%HVDװa$ۢE ۷`\4k֬[MDIq7 / Bkb̙ *w`̘1Yvm!tAV]M=zux9N:w6/7n 33@D|bsiKƍ* H* Q`7Qw^5jD<~wɓ'ѦMbn!uxΜ9۷o^z:ٽ{D}C\&##7nXZZ2 Q9`7Qk޽`dd0͛V\ͣrb01~xlP(Z˿|RTF rbŊ [!!!?8?q<Θ;w8cܾ}XA#Gϝ͛guB zsSӧ狳WǏ^DaСⴔ<^~ .]da ٸqX?W yG߱c^ufdd`Æ  AڵaccؠVZܹ3ϟ .@oCff&(355źu4t.\={nݺ);`8w>zHmv'O`޼yhٲ%\\\`bbL7oިSߞ#~~~}2ؼy3ƌT\*T5гgO,_)))9l0qĀPNXXXZW_}d cDEEi-#++ @vڻw/}ԯ_vvvu놟z׹o>nnn077 ڶm~zեz|Iy6cӱfN:jժPl߾ g*#怖d5j 8}vIqYdd$] {/YP̝;VPR%4oSNŭ[t֡VJfT-blMTT&]N< {{{MI8,Z-Z@ʕaff5k?ărGlٲݺuC*UPBT\AAAz_ϗVݻwșH՛nr"*g""*3a~~N$ Zpz*={vKIIt"vޝܫWׯu[>| u GMMMIju]t)Wŋ 撶Qu7!))I ZpMFEE77ouMeo߾>m=z$kN~^$b~WV-ҥKjuss˳Ne>| IM~OMjѢvJe z7Pq=חLΝeZn|qg.zjIݼ_\6 KOO&M$j&&&ɓ\g]_ef̘! 6 4ĦExw8pl$ _%XXXe;w3G UTfee%;vL\>..N1bP($CGz6m* ;V|oʕy.KVzuA.k>&"*#_,,,z@v'O/&&۷Wekk oootmڴA:uѕBxt {׵~t-WTܹsG777Gƍ燀4h@^ ;}KΝRl۶  BRRиqcQF6effJ~~ЬY\enݺoߊ...hٲ%:t S{%o\.GHH6l 7v6m [[[Ǐѹsg{xCly.\rЪU+xxx赞{G߳PJ'OG:fffwؼyL&'Qvmٽ";t TR,_zBtt^ժUѦMjժgϞE6m46MI˨qj^ڮ]dt~-233dnذ! sss_~jcdoo=zܹ֭sq8_S()sE0xҭM_zSwV=ɕ+Wy@͚52)))x!00P|2 ڵ&VZepK:ڮ7l  $i0K"*9NDD2yd€r}ڳe޼y:7nXjժŸ)dee*,رC-Z.]=O>}*xzze5vVz,L>]8{v _|PB޼z B^=ƍ^|V6::ZA,Y".gJ?ȑ# aڵBll2GU$$%%nտCJBz Ν?7أG[fe'N(駟֗Sff;/D\.v%TZU,gaa!ܺu+ɹݻwʜ?^(-=/d2lǎs*w!N:b-[ :۫ {v+ޓj/Rr֭Sk\qgݻwՖ=~ paт`ii)TXQF!8p@r=MMM?\S+"̛7O011.[,:٣H򶶶BZZm0}{ by??"hePMR.]T5zhO=֧s}ݫ#Ğ͛7N>VӧB۶mVVVBBB}aHEٳ[ISL&6-Wp(~ff733^~{rVʳoIJy=2sg=1+OI v#t=KU,~zեː)_Rh]Vri=Taiv <}T2e`dd ЙJkΝbySSSA7dȐ!ZQFi)D`W_}V^ I<7;k,gΜs9: 3LLL###qj7U vvvEr>KQϟ/_Z?oѢlsDDe}ssݻ8";w?hS55vҥKhӦ8p'N<:uh]fffѻwoϞ=<`e&M0}tѷo_q^5E&+VXN#J7o8k.I+ҡ4i$q:::O>\72-ɑ#GR/d@L{"{ÇϳKqR[f> K᧟~ҫeڵ9VZzoF ަt֬Yc6Pn9^UMkMsAJqXҨ011_~ŋi<<<MвeK… SSNZ2`1ʛ7oĴW9cРAm۴_mgIOa?3g߫[.FY* ܔB1cƈ2 K.UA5kViqP(/*RJjמ'NЫ=ARV5x`v\72dHJ?ES SD޽n:[γNsssddd5زeKѣѣUVxJѪU+s$y|%5j_n݊e˖.W'O`| ~]Zj%NK ׫WڵZvڨZy&UWۆ YfA[NǞ|RܼyS- t.3|pL> ;wħ~VfǎtHHZoMk׮<>`رn HMMř3g"&LI֢E 1'!YXX3H)u_~Myyꖐ Ngee7Zn+VQFϟ?ĉi&7%[8u%',,L"222a)))ضm['@˅-((Hm^.#..ׯ_7jcMI 4[l}iժU\k *iӦjÆ u~/Zl_@5QYWzuoq 3\. {_08JD%DD\||}`ȑpww^՞at'''#(('Ok9jmʓ!C`ڴiHKK˗q[mٲyF6J 2C7N"""S&z/&}z8::9{眗ZoIAB>7R vj3ؒouՙF]v֭[ǎUFu}sн' ==]L]5c 2)L:tիݎ¢?N|w/ 6@P`Νڵ+"##v)s&@7r n@k.}˗0 ի;w"(('k<8DTqJ"R͛jWRPСCZ2e \Çkۘ?><<<0sLIـ1uJBBk}6SNU t~åK4 fϞW$VC~UkM!CӦMÁ$%%!++KmK>}?.7mڄ+W)D4if͚]j@_es9/^mCyӋ6B4F(!WyCa^/WY^ !WijgϞj=w.Ls 7PR$ ___[Nm[? *:7i0]`V\)i]TT;HDDD`ӦM.,,7{vji1* ]ӧOϳ'VZ_.\ѣGq19rD'33Gjj*,Yu~~~6mz쉷oر#:$)Wb q~…:uetk~xÆ o`iiW^aΝb9])L.]*^תU 'OԚv/ЧODDD͛7j}_lAD+VŅӫ_}%ɐRf,ˏS5x=/舸8'iǏ2 j8Aj}$>>^-0`6nXVmذab;wbaՀqŊѻwBiCa4h× IDATE0dԯ_`I:7i}v{ 9r$d2FƓ=\1 )1MDTJr_DDDh v+EhѢLtرӧO{}0aΔ&عs'zt\t :u¡C`oouÇA@wwwL2EgۥJYP>>>hܸ1^DlٲCڵkj׮3O>Lg~ھ:tP566U8Cݿ_c@>mjj*9Ж&pJuAK|tY=zJ}4hذ ˒t8]F\yJSNTPA!5VΞ9o$wy B*U޴k׮EVP(ᅨ_nv̟?7ně7o 1}tر`ܤ[a4133Î;ЫW/۷O x'L!C`Μ9y&ߥ> CDeӘR466FllǸA'O d"9}733À~A\HIw;wS@\x:uS%n6N&C5j8L]|ͪۨmQ%},{ܹ2szwǏٳgSOYT\...jNmS/%urQNǿ~GϜ9,?~\J<1118/fM?33\ǔ abllAsM+C;;;Lt#m8qWd1ws)d2YA9 i˖-rjKy$֭[j M?zU۴i:g< d2:u$/:#G$%uҠgϞtbb"vޭ pmqW^8O>ӧ%J:x8ݲe\;2rZ:0CS?ݻw֭v R7N-֜9s V7MƹIsssܹ#FPh^ڵn IA"*&"*޼y]v}ջeTw]۪t><jSNiՓO>D-/Ώ;V̪֭ۨ#I?CmΒlܹj?U*Vq~…׺jnw'''#W՞A.]se޼ys7o\H?}8q8}M,X`uSƍ_}ѥKxJӯ_?IT|wZ޽׮]5lmm /Xn2PL'?ݼOLL&WxŊ1~xq?N Mژc׮]:BÇcݺuzU\Jǐ?.^Or'&"*6n(466 O!!!bϯ7oި/O._\1vݖ.]`۶mbOsVɓ'yJJJB>} e']>CqZ&)Tszϙ3'Ϟ{)׃%}b XCc[PO?U O2E*00P-H䙦dݺuXxӑjkU]z}1hWooo 0@5k̙ ̝;W-HI5v_~)N;wSLx#tɒ%jygΜg.f8::G1w\ܪ\_wrrRKjƌS`СN8=gΜA~%yTjQQQHMM"7aTs-֔ }nEر#aÆ$"*TӎhOjժGf ɓ'ѳgOTT ]v7jժ[[[ݻؾ}ڣhРAömЧOdddٳܹ38+ѫW/18?w\={ piox9lll{?We˖hڴ)\"ꊠ Iˏ?Ϟ=CGM6033Ctt4n*oGUTM4Axx8fΜ ;mLÆ e˖077۷rJ?^\&MX~W == СCѵkWTT ?ƦM߿I)O)2d:$~bbbo>[2dA_qu\z `Xj GGGddd ..W^ɓ'q1(BynnnK\]vۤL *gOSMe#iʔ)qidddw App0Uׯ_cXr8֮]|ժUƍѵkWdffٳgh۶-:vݻHJJ“'OpE߿_W]0|'b۔ڷoWWWD;v,.\رc^㸬*&],,,{BСC!V׸J:#"7ʌ ݺu+++\_0yd!..GDrM]ג%Kz'O >T[q=C͞=[kv-TPA,ߪU+!!!A777m277v)̞=[|oСכs T?kJ~޾}Ç5֩A]v2WX&**JmyR[ߌ3$›7ota׮]^777^pAXz„H:& AAAzsץK ܎@o+ jvlGZZЩS'Im޼+IW\ǡgI7o.>sssa|1I6 [[[uOF-4~%K=;#cǎe˖?\2.]]-[KkYiK.ҥK *ͱo>|7y1c >}ZrO}8::̙3 .###Νm۶}6fΜ0 0j+V5˱cJ*ü899,۶mnܸQ-*_ $vލ~cE>JAQȨ:r|||Ԃo߾ŨQn: <#Gqܽ{/^@jj*,,,Pre4k *::Gųg`ffUUVpww/61c?~s޽'##Ǐבʕ+ڵUɓ' 899qqzu9s/^jժk׮ԩSj׮"x'OhҤZ !*r9N8w"66Y&uՅǡnYYY8qݻXXYYڵ+P O\rW^Ell,`mm 4h 6Q0a-[ {>XC%Ka~\$'"*QjU 4/^d۞˖-PNd2ѣӧo.9n8_~VZݻ022¥KФI\썭3bbb$}!7nJ*ݻn@q?~|u| B aÆ\j׮WNW'''ek֬VZ!22W^Ż+yY"""""""""Ҡ a˖-Q,777DGGcHKKZBk'XZZ u=DDDDDDDDDDŁ8r8ݾ}QJuM]tA~жm[cͨQ֭['>XYYlmmA-!`bb{{{L6 666\#zyI&s@ݺu1l0@ǎ1bjժLp#G!000x`ԯ_0k,XXXcǎý[nqSbŊprr?z ;8q"agg)S4i~wVZ>cTZ1cA4h ((m۶rF055Exx8N:>|8O* >\ASSSԨQCLӶm[  f̘KKKTZ1UV޽;_~@SL1qD;#`@޽'''TXSN4n t >>>c5k~}:QJ1-УG@߾}ѬY3ɓaooL4 мyszoooT\6666m]u1cƠz077g}!C:u?>@͚5addpf͚ԩ`Ȑ!|g077G1f@֭ѵkW}:lmmy9@?GL@5!8z(Çpwwϳl\\8Hd˖-qiuݻW<7˖-3L;w`ʕBtt4^~ +++ԯ_ݻwǸqPbE$''2 Ϟ=  d2d2rs\P `dddв @r*lr9me>)/ɿ= sp= sp}R^iiiZ* ε`|JKK133g  .,p=/?DDDDeB#G/^|5B5Q]!TXXX:˧Ӗ&C266.&:4QYk*/س;lll餤$哓5.[R:twL322s U|233G}RJвÇx͛74""""P(Xf {:Qk*O.(IIIq8ݨQBm!߿7F͚5^K.-L&C֭45'LcRڵÇưa4QQQ+++E|{5_+]1Ȱd2<<<DDDDsT^j/3gryq7 aÆիԩSry5ƍ {@iӦik4###|駼!""2\ry7771INϟGpp0?~cǎ?PC)))ѣpBTXQiiiHHH@RR DT"=QNr+F ccnQ5ʸ$$''J:H[O?awRRRPJbȑh׮Z]TԔ;11O>-6QSZ5nb NyPj>{l&=͙ S(x-㑜 pwwgo"*U nݚ-DDDTfJ CmnҮ^zLISفիT-DTpFFFDTd24mڔ)؈L5'Mݸq'A"""*d25jT """*T]qIӧC.w3 \.W_}k"""*xC $5Dx' n߾ WSC<Qi%RRR`ee'ڈ5iLH#KKKDGG:`ggWL""""2^D&H#wwwxzzf͚jKwӈ BP`˖-P("""Bk*OƄԨ>.puXZZ}g7DDDDDDDTPHcˆiԢE ]&DqwwL&Ñ#G)DDB3gˉ4^Py`7iTJnBwqd2d2xxxŋ1n84jvvv077G5חccc'nݺ#sRQ?L111"""Bk*/ƄVO86mh]۷;v,֬YW HHH5h6mBƍ vuo/_ 55U ڏ?}]шX<@DDDDDDD4&Th[Qjj*lYF2 իaddqƍx-޼yׯ_cʕ^:n޼6m̙3)=z˗˗D|嗐dXlV^]"'"5Qyk*O&޽ LV(mۆ$4h F,~ IDAT,l޼iiiy.3i$?~&&&رc-[ cĈx"6m$ >>з VX{AӦM9s&Ǝ 5k233K\DDTrd2ԭ[cO?fpqqѶm[O.cܸq+WDxx`Z*_7}3f`HUTUо}{%"ܔ7=2^Py`7i4b]e&ٱcp}_~j)ӗDDDZNYBlbb,,,윯ف]%K˼{+?KJJ*8bʔ)122Œ34wQo}ZM(W֬YA $ɋ2~AӒ%KаaC#$$$ӧOGTTf͚\a2l0I74=z׺Twƍxq-ZA₀oEff&\ J:?<<*: v( 8p<uԛQQ(J$\xc "l `_פMy=O?OSuNSMK.C8!!!lڴnݺFXX7o3j(bccl,XaÆ]'x]RPP>Ⱦ}111;̜9 0 0<AAAL4 Yf1k,kP̙3w#))^wfORR4M:Dll,={d޽V`&N믿nc=֭[=+""l6wybjyėK9O3⶿EniN'gϞq^Pd˖-qֶ"0 JG/3}tiݺUg̝;P8@DDYYY4k֌B+EHtt4qqq&$$0~xN8aͨ;ƌêUYf`&qqq曤/[{" !??mwrr2\ZZʈ#Xn]v͛ٳ9y$;w$<<W> "*3<_}wGDDDN(kk\nӴijC#ч~ȭM7zk^J=tdffZ/@7r/^t[>\ }e """""""WJ TJypx5󈈈WS#DQNNN}wADDDεhѢ """RΝ;@DDDf :G|F3ţz Q3_1x5}:3f̰t:9|0={ObD|"""""""rʏKv6mZcv;|ͬ]—E#e&?=z0HP#DQԩ!!!:a&_~%ݻwDDDk)_4&⦺?P}@DDDDDDDTm1шx_Z Ws:lٲE1x5xйsHS#B_ر00 =zT={o߾hтƍөS'FҥKq8uڗ?OЮ];ٳg8q"ݻwI&iӆH֬YSkmHt:9sbjyėi i8 fKpp%;N> @Ϟ=e-zXpd:.\駟&!!_FѸqcrssr{fr-uZfq_bbb,q""" $$BGΝ[cw҅ZkC\Ltb^ZyZ4mڴЈxԯBV\ @xx8 SRRBdd$-fp999?x:vO/TjE۶m2dӦM㣏>cCEhh({%//W^vv!C<ԩ{l۶Hk **J9G`` ۶mc۶mۗl?>>zʚ1Dqq1~-~-/f֭|nJKKyYv[|g5/."kN'۷oDDDk)_oxP]Y/4Mnv ضmOP58>`5kVv~ɁjלWhhh\<=66+Wb dggNTT/gϞx 6IOOBvI~8q#FtaڵkFNNddd0n8?Wڮ+)).9<+4-mݺSNɩy%K[ tZ;v={r;ݻwާV^BBaեK*s59sz 7TZε|B+K/Ĵi /]PXXXxhL$>>3fXm͛ٷo5f0e&OlTܾ}{.\HDDvEDĝf#22R3DDDī)_oxt뭷ҷo_n&2ȕپ};ǎߟQFs/YxqzήAϪ(_6//4iBvjj۶m۹v>((r}ֶ-[K@@/B:6)Sx<^RRǏCjՊCZmo7??@&NXaLOw׮ +wJ JSX9/u5jD6mݶҡy~OIjRiWiݺuvEDĝaJ&"""r-R#DWX=ݬ6].cժUv4i=;v,,_sҸqc ݻIIIܹsU~z:vH>}jD!322*믯v0s:t(6l㉈H8^{5L_}wGDDDN(_Qll_e{UNᜐC=Ti~rssYz}رAii)ͻl[iiiY(KKR2-_uwTW^ֹs} =)))ܹskmVƕަbUmWDDl6^x-$"""^M1}ţ6mw|Jjj*III@ueZno~}^z1abbbؽ{wp8?RZjŋ/XY+GC̝w Mg>}0h k/KWi ,W_}U>-w~ """R`x4l0{%$$`&ZbȐ!, ߺu+z>}P\\ȑ#+qE,Gܹskz u98p۶Ə'8ph֬V h*s83UVeDf4Mx7IKKطe˖cQTT@`` !!!NNN֟KKK1b֭.y={6'OdΝWՔ"rr:{x-~;@Y 6}v8r&M",,ƍCpp0wuӦMcϞ=nP63|͚5̛70AqFy3eKloG|fv>AьNѣtޝ@v[\): DQ111 8EDeNe˖)G|ţW9O\}#Gdݺudgg[ێ=O{("9bbb󈈈Wt IDATS#D TW"222t"\L$??MDDDbVhJ3M4.ԹHS#Bј1cJx5󈈈WS#DiLMu."\)1:sw艟x5W_}GDDDb%:tP]s:G|}w@5k(x5ƿw7DDDDb%FWs:ZJ1x5P6(;lذJݶm[V\IF8}4s̩ז͛Vv_רKEN*1 +7M Я_?6mJ֭>App0?e޽;cƌ>ד֭[pj׵ڵ (KIN۶msp8=z4O>$_58Nm<ܹs/~||<}e9r0(..oeƌرcꕖ2byD|A}-DD|k_G|n.ŋc&w}7]vfxC`ӧ+q 0f͚Udffrzp\ v4/[ߵncccYr%a+Mvv6DEE /pYܰa?8~~~L>t (,,dΝ׏'N0bĈ OcbbXv-akCvv67?ϕ+"" """"uN1 vGZ,Y7Jhh(N_koϞ=NݭUa5zuҥTŪUسgǏv3gXoJ˹/_XXhS饗6m!!!VK2` +pi3c ټy3_=cڵV]Nll,SLaVҾ}{.\HDDvEDĝd޼yyDDDī)_nh֬Yw7|9v5m#<9Wn<-_6//4iBvjj۶m۹T?oo!` k_~~m˖- /Pfcʔ)С\V:tVv dĉɓ+=???&OGDDDb%icwgѢE <뮻m#<ԩSHII!<<ײeKήr[999{W=z4Grða8w]ve…W1oZj̽ދ|;wٳo߾6\'O}7V-[X/<<JKKx6""4M}0 #"""R'/n(,,LWYAAV8۷sPeNؿ+Cn :n[V:|9g_*k+M `ľԵkԨmڴݕJ_jRiWCDWɷ~GDDDb%-}G,Xશ?6yަIBOwND lUS\-VnӤIرcINNf̝;ƍ0dvMJJ Ν@ر#}C/m۶|"5Q~8##=322݆`µСCٰaODDjfUNJDDD[(_СC;x|5kT_t+VRfk?C~  77իW[ǎa2o޼˶ƚ5k$i߾}^wqG" iٲ%[lw5>@^s/?\?pw {RRR¹s*lo׮e۬+M2ڮs:lذA5WS#DQ \Wu7ի&L &&ݻwWz )--UVkQQ%So\JQ] >>f͚i&jt򂃃;ش/ N>4h%4Wzrrr|sPV_Xϻ^^JJuTQe&yWh[ f;0sL=((I&0k,f͚e J9sw$%%T̀}]l6)))$%%YLСCҳgOk fĉ꫼V>ZRDD<3M~A1x56nȾ}ʢ뮻{gyER-JIIfa=\<Y=GGqq1NbWu[DZt:O󈈈WS#D^ŋc8ZꍈHå_/P#Bt/oo>Ə_c$&&F("""^fGDDDb%{SN1c }Q PL0A?ot:YpbjyėhDGGOll? """ W#"""^M1ԞO>kGvX'N^4\7tS}wADDD)_3IJJ7$**=z`0 0HMMfϞwM6mhҤ 7tؾ}{ݜMXXO?oyx5+GDDDb%>9c޽r={0bܶʇ~Htt4sέӟ̘1'Ol2x3gdĉ3f1uT-$"""^M1io޼9}>Njj*C'L͛/?>]v`޼yL4v:w}[oŸqcvرV#"""Ґ>} """R &G?Mbb"={q&NHVVqqqɝwɓO>ɮ]޽;ox.]X)T*?0o& _׿Coc&[nU#"""^M17-إKK?t{ <<;wz,yf @TT}Q2 "==}m۶-;v ''-[Ү];zVtЁnݺo}c niӦ,t:9|0={ObD|"""""""r;.O +W?sΤ'PTTD&Ml۶Iff}LZ@DDDdǎ 0@DDDk)_ox }Ja|׵ڏ-Z`עExg1Mӭϗ_swҷoKnv8@QQv] eZlC>wM\pe_iY4ʺUYW\e]/UW>{&.\5=BI=^_9O}&}M kɕ>`w 8p`:utɲ}N:EII *Gaɒ%|gփ„?i̜9AZZر[J2k,/ذa+V`qY͛={Xv-k֬aϞ=@ZΝ#779so>VZuꫯx9s Zk˖-$''ɓ')--e̙;vŋHbb"/رc̜9RN7nj '-- ̙31MǏ=Xd GW_SNsN6mw+.={6dff{k.>>c[z-96uن֟P*?{\~RݲVU\_9O]kw܁f5~&TkkRIzyMN+湖>9φ|M\5e|9W˖oԨޕzj7niVyVwy"retaʙ/""WaK1x5g}HDD Ɵ'<"""/ѷ5ju]S.[>--zߩS:Wmj޼9iiirrrk>+W~{RRRBdd$-fm vpyر#=/Sbw}7sa׮]a۱dffkGRR'N񋋋y衇"44{G^^3g0 R IDATXhQ-4:G|k(44(}K=xo߾uگұcGBCC馛^5-O޽`ŊnO;vߟիWG޽-[d„ ٳn|F7n?W^Zv =Lr*ή]2d2:uw}Bh֬Yo @ff&_5:tS @tt4aT8=iJMk_D\0xW&;;tx8{cnذ???ONzz:sNlj'1bDcbbXv-akCvv67?ϕ+""j kb>9ѣ$''mVM6֟9rd̙3d~'oyݻ??OXXXQ[nՓ%K[ cɒ%L2ŭαcٳg޽>55?~|)s/+''-[VOtttf9sz 7TZε|B+K/Ĵi/]LiјI||l}ټy3۷k2bl6kʔ)L<٪۾}{.\ș3gؼys/l< :G|Ov'''_r^psΝ=vtMlܸ#Fp).\… +{駭kŘ1cpA=ؾ};ǎߟQF{G2e /0\ʗ˫r&MЮ]*/m۶5e8… Att4/"տv}PPP\m[l!77 WLq;))ǏӡCiiZjСCYp![llB~~>L8B=0}މ\eO>$/lܸr.__,ϵСCٰaODDjpo2qD;""""uB1 vG };^[kkC=TuHnn.W&** (W)--e޼y̘1mf,-Iu._g}˻ٵkWVqƴnݚ kΪիa`&W^˹f(?sU=^~v}U۔_,튈;ƓO>ܕ"""/ѷ\}P\\ȑ#+qz.[SNU?{lLnW=22͛SZZoQi̚5ct{JWZZj-Tj788̙ٳ+=䣏>R#"""^M1 vGo8]%id,Iqq1vWDDAAA8N>C8!!!lڴnݺFXX7o3j(bccl,XaÆ?<.z  "嚒亡i_ܗ44T%[KI%Q Sve1'&Fg^6c.v'N_~Ҿ\qYuvݺuRbRmI&a˖-} :H\.Gaa!=z$5j݋ƍWFdd$fΜ HMMfTW#;;bIPPnZBɓqrss!"n݊?鈍Z fBII (((P}Y 8Psyy9wUΝw ~wVJ ݻ7d1桧*/ TՔy~I#WWW#--MmF0՟ja~:޽V[VJjm=Cjժ݋sW^pttDnn.,,,iӦرcҽ{w$%%aѢEܹ3JKKCСC@ey߾}ؾ};z kkkeJ=Z ͛7b 666ͅ\.Gf$$$%ʙFxx8z);d|7owXυh*aEDDDdjnRS&k׮Eppg$z򤤤(,,T+b """""""]qf7ѣTm…=FHHn"RX4B͛73!"""Ƙ $5BM6Ejjc˘pa:"=DQă'ڈd1桧$0 ҒU1!sd7i4{lKDDD&MTbΝyȤ1!s2& |wt2&|4޽;Ҫ}hQ(HLL3#cApicFE$$$:=191hQF~ @JJ!$=IJJBrr2RSSն {hf̙3 K.uj tAvh( a( G|uxbM6>$ꫯ4Blݺv艈Icggg!c2 /xtPQQ O}9Su>bD_5 鉐}PRRRc7|gΜ%:[S:@$$$gEAAƏ}zQ\\m۶Fرo߆9g}@e zj5k֠\!/2!"""ƘI}=<<믿@eq> Æ {m`Μ9T(g)yG5{ԩA۶mCi{2d9 ciCP`ǎ|ADDD&1ˆ 'NysN@ll,o 9űcœRYo>t5]o84m>ӥj@@A@@@BCC)STkB\E=wwwL<QQQعs'֯_o>ĢE ˱e\ϟPY^vW^ELL c R X[[#&&111裏j?""?vvv(--ŕ+WpDEEɓԩZrL0|Z8u>""S'0l0r""""ƘI---gaӦM? 0'NhP ݻg!(HN AFFF6丏G53:++ A書>֭[6m׮](//Sz0߿ `ANN޽,]xͣGbٰڵkq]ΝC߾} jwCBB7@{ENN2331c ,Y~H]˖-=""""cCht.\oyyy5jg$>!V^UzdJp3<///(JxUn:=.NKKӺ]dd$Au?U ** ={u MiժU穎U=X|rYAqqq) AEDDD 88X8~8ZlDi7P9=,, j*\rТE |Ν` o&fϞ2c0;?#nݺKKKL8Q혪|ITTTvΪ6u;[[[kk֬ŋ=z􀳳s^xXZZBmsG-jCߥ}.]urrVVVR-p""LEܺu :u A0!sDTwvvFLL fΜLJ }۷o,%RUvIIIZWNw֭:>ظqޯ_uv{me?TTeJH5k5jMVۯ*RVVjcS[[kk: "2W(̙3yȤ1!sbudiixzzbŊ#ddvBxxA;5´wɝ5X_@aa!lmm1n8L:gϞ޽{e, tZ%:9hӦ u릿7GGEE֭[KKK#_3eeeұr0̬qqL[Coj#Fѣ:_G&a̙A1!sbdwjj*ھudt |||Z-qGGG!iݿ#J5[{ر5&l'L#//B@@$ P^^pWzz:> ,I]cڻw/,XUmϟ|™sܹsk{lz믿z̽z՘؏gn"""""""2;C!99j… =4 QÇz*~Iܽ{Wڿyft ?~|3W\Xd2DFFV[qf̘Q뵩fg IDATjk+--n]VW'TW_};wT; QѪU+K~???4iE:`…(++q|j[ QVVM6ilZ/2 C '"""2iyȜ[N͜9m۶ڦ&Q{n%LJKKQXXX6x`ATbϞ=uq1tٳ'?./((ĉL;v`̘1 ~Zdd$A sAǎQTTѣG#11@ l۶ Jjggg+V*)}=L>qqq֧>cd2cРAjyׯ#,, |V.c 6ߗ¬YpI:R]vq"""2iyȜ0M9sNu:usuuEqq1 ** wA-ТE cĈR?7ojd2^ZjWܦQF͛#11>,4i\("((HbK.!"VZGGG8;;uֈƇ~(#G":: ;;;4m666IJeːZի1zh(JXBe˖صk6oތMJ4>>>yȤ1!sSukzKJJ ja~:޽[c mQUVTT˫LAݑ|sлwơ7vطov؁;vڵk*˔,^#F~Xcxm6;v oFnn.4iwwwtXYYO7n)d 6 W>ADT AйsgcȠ9Īٰ:d U=OWTT\`,ZT*D?=RRRkkk_1JPwŚ5k`aaaczZPXXƍ \]ڐqlذ +THHn"L&ʕ+IcCDoy$vmj!iٲ@D?~<;HRRR0gDDD%޽{1!sS[TjÇS;01=>1c;v GIDdS*8~8c"""2iyȜhǎDO1n8t PVV6m`ĉڵk}C!">,c"""2iyȜ0M-]%d̙3®]tSۄ{ptt ڵkDGG?UPxbM6>wBDDOB1&I;wrJ#^߼y?cdff"66~~~jEQΝ;c\v 666ի/^#F<7obӦMAFF,,,ЩS'7 .D&M4S*ؾ};ƍAϞ=obԨQpssCzz:bcc[ XXX`ѢEA1!ssQ U65޽{7geM" t[PT J2+\$"" r\swwɓTg7W8<`i׮<==111j &Msŋ(--RDLL F-[DDw۷͛r ѫW/ܺuZrc޼ytoll,F[ "2;(ŋ7Ȥ1!ssafn}?@rssk2ص/<M>]>78Q1`t@ Pio6mڨ>>>pppЪQF!** YYYHNNFFݻ7nܸhݺ5|}}=z׮]^^^5八Wիj°~uaGff&,YKXѣ={65jUVaΜ9hժ***py̟?.\?5 7|AaA.?ʕ+d[!"҂(HOOG^ "0!sU;tӧc,{nc,>SJyxyyvލUVQкwwwuZZH̜9S~j߾=ն/_# qMܼy9BBBdɒ:_޽{VZxX󋋋X|9֬Yv~tt4pԩjS( (P+Mcii ooo?~^^^HLL7|Vʕ+-Z{u,̑L&~_Lc2':1Auaxq-o^/5qqJ#q-XZZbĉjT ѨjN7u;[[[kk֬j HJJ£GCԩS߿? .]/.,,^xXAAĉ˃.]ZL&vSB%..oF֭5`ggg'-((5/^\ j p""RġCIcCDسgv-=_TThDGGu֘6mM]e0ܹc!]v͛2e V^~ 999!;;999Z+vqqѺݤI0i$ו_E!K/ĠA?cT]w%_'''aeer- j۶@DDDdpy\jٲ%-[8<͛iaɻw"$$ݻwG駟)Gs…KR"8p4m߾=Bڵ$%%i_rruu6lPyMV5:foo/>?FiӦʡ!++ƭTVvںN70̕L&C߾}IcCDo>} <<8x .\/l? B_ݓ-\? (,,-ƍU{ѣGÇ;rM6֭.C7Ko߾]Uƙ5:ֲe:Nb[#F~#kN>]~ >#|...2e O޽{{(/ׯo>/<`׶w>Vl =vkoO0G^^:I 6t>|@eYƼw^,X@j۶-Ο?_ڨ]vHNNܒj|՛%4|puuUn]T],S~HL&Ô)S8ˉLc2'`pxblR"<<C=r8T gdZAۤ!.._5qqqa/TٵkWBBBp…P(0sL˖-XKJJj-Qۦ*OͭNmr9{9c4!I0di>}5g:{lz믿i̽zZwx&"RF=""""cCntaaas9'FJ|'''c 5z_6Hggg$IMT'Oݻ͛7[n(--kqrJB&!22B3c JohJv㭷PY;>O>ϯJ¬EZK/$C&MP^^F(ظq>,%.\W^^.-TW. 6m&4xO(=MJ%>36c.v'N_~Ҿasn:]`ii ͤIe˖IKKC?@.#??_ meeP,\P5"##1sL@jjR'{,(  sۻOX?;@DO+QDDDdBB4nܸhO?9sE2e ? LvPáxT"՟ja~:޽V[ˀT}\BM^^^`Hغu+&O]qͅ zEݻ#)) -BΝQZZ  :Ҙ*ѻwoX[[,SrQo@@n޼+VgϞAnn.r95k !!A- T&>pSwȐ!1olӌ1NKKÞ={{nܾ}zC>}:O6{wP8ɓwwwX[[P!wtݖTaa!ߏ(={VJn&Lk}wOz2zh.\@ Z281!z:XZZJ CEJǃI DDDDDDD+1޽;APKp;;;# Ɉx )FDOO?=2i?<͛_|C$"z) |g;w.,,,=""""`CD2 0m4=z <3zLuUVqt7&ID (DV0桧>fv-m(  }_T_*[[[dgg3MD"zZ?d1桧>zH굨-^J """2RM61!"""Ƙ̉3 M֎n@\ꊿDDDDDDD+/PKszuڕꉈȤ7nÃbCDdw5z׏n"""2i(ҥ ÏLc2':1!2&DTW """""""]= TiDDDdҔJ%?ΘLc2'LvF=2 C """28|.]իWM4#ڷo~a>|8 1ٳg"""2iJ5kobCD3g`8}4 k`?q-:u ӧch޼>EpIKDDD&MˌyȤ1!s9EEE0a|}} m*$(x>#xzz"**J"ddd{DDDDצMc9CEQ-Meʔ)x1l08;;]/''XjC#YeLȤ)Jlذ14#~ZmnݻSN㭷eTO%sss 8}BDD#"IcCDdٳg Ԫ͌3ФI|h޼9DQѣGQTT0>s43gHuҥNmݻ666h׮ BaQmⶑZ]?4#""cd dCDDD&1噙ݻwVm,--Qqu888`R9sFaR=K\ IDAT"##7oO?6=B`` m۶իxlllp:tӦMC=d돫k[GZS~d2Y0( "2=JNbCDDD&17=XYYթ%HQj /H3221:҅7/0ԓߚvL&CPPÇ6mڵk8p ~Cn?<o߾w?m۶ggg}%""z?0!sSYfEQZL[󝜜j, 0~Zo:=222DQ]d2 :14{n(J4jF(رcƍC7͛?.]ٳ'yNTO>A޽~ #G˜DDP*dCDDD&1#F^ϙ3iii9sH:th޺uKz]u7׷jO?A 8*>Ҹ+Uhl/}|c?P  R"R&P(XhcpwwܹS?7Ղcǎ5JBI&aܹx"JKKT*#Gb˖-@ݱ}vܼy W\App0z[R^^̛7.]ѣuVCe"""yc2':%g̘f͚޽^z!,, wQ;/##|zwlllw9鵻.4; NZm yU!z^V{V.dildp+DEEAE 0;vP9bbb4ְW%}||U?FPdFrѓܹs3gzߗfI7n]t9sj]3,, X~=rrrw" K.5=z(fϞ ]wEQQq9BPko Cnn.rrr3f`ɒ%5KDDQ=i#"""SƘ̉Nn;;;t Ê+'''kNNNh߾=/_.֭qvYY[Ca͛7#::ֲeKoWKQؽ{7@e ///(JxUٿZS&ʨ*22'jܴGq@˖-qe4jy&v܉^z>x˱fZjhZ[B UV*ѲeK$&&o",, j*\rТE |VV$DQQN:CP`ҥ/ڝ8qyyyҥK]W&aժU۷ѺukRQ'NP뷠GAʕ+~DDL&ayȤ1!sbxgl2k|@eY|/݋ h}~Um۶VeP*ɓuV]UT333k< <_U&zmۨfץ_""RT*q9@bb븹A$Ѽysܺu ZyEFFBE8;;cᵞJ|I^yh|>%%%nCGy=7WLHH੧kaĈR\\LPP&L`Μ9l߾ox7y9SpM:uT>fhl֬Yr=0a(..pp3w\6nȔ)Sϊ+x駙0aiӦs-x>ȓ=L""=a=Z}İNl6 , kg&5O>p8(++;_x;=k9_[r5װk.n ƞp?seL0st~5~mWkOgnmZ{ںmjj*Æ # 2}zLN'{`СLsfa'cڳ;{[~7gw8&}yǤ{ͦcIoyuLtLtgcUi<#l]>uL4M[.9N}϶Qōgvv6iRWWG^^hY[TTI-~-b1qOtLﳲ>;&?zp]<昴ٟ蘴x>(555>|_|ul2vE(++#77gy~{lڴ '|Bxزe o6>ׯg%'' d;w_|'K/Dff&㖚I{Yd ,,X$==ŋW_g={UUUdee /Gom6{1JKKqF}]VXƍפx&+ݺu+o|'Es=Gvv6v7`ʕ]ŋA]] ,`^իWTJ`Ց9&k׮eʕڵ p$;;{px뭷<:z)1Ybs5+zm]=mWkji7ᬳ"** }h"O?'>?&;ϾI~~>MD}:&:&:G1y ++D VD}:&%ݝ6333=9Շ|L6 믿_~;2w{,Xno=_\-ݎJeYQg޼yDr:<|xnH}.qI1ꂃ=[ǝ $$'m򦧟~Z'@.+`Ȑ!>\233O}I)[3eg!==s[dd$*rO+"""ғ#E_)--b̘1kdwFFquπ 0zh>cƎˠA,O&-$**ʓw;9<yYի SOyNe]ƶmHKKk~40M˗+uhHonp-f̙3=/bۭ\p%4ܲJOOg,Ja""""=a`Fg7EDDDgޤK/ۨQXnߎ٦ٳgFmc{m޼~.""""a&LPGDDDz4y79 *_{5ozڵk<8Y[oEllgd$_W֮]K~~>gfӦM̚56o… 9psa„ ^/p]wt:;"""">t:yǙ3g~~~PGz:!6 ?^9.Yk0~J233[oo[VQQ ** q7M={0|pMv < "ݕeYh"""">t$@yy9m.Fv&`r/Iؾ};=ٷoӇ>ndAw8""""';#"""VHoᵑݾ1 C4: 7~;šdJDr:-[pc۩bܹL8o[mN0|p,Stgeq'"""=<қtn%%%uvDDDD|N}-|rB~裏x׉ò,>3ƌ ,.`_|Mql6'OVGDDDz4y7%v◿%ein䷿-M`8_}a`Æ kӾ7ndٌ=H߿?W^y%K.tWVV{ǟ'.b<ǥ-༼o<ϟ4MuЋz^yk׮eʔ)ݧo%KxfY $((v#Gdٲe;7+VpW4ի9OXƎ;:uFee IDATʓO>ٮlpNOOo{ :HwNaPG w\6a /۷sma0Mŋ뗬ll߾&M*++Y|9gy&K,9>\pf1{lvIuu5xbٵkSL[񊸸8f̘ܹsy7ڴoMM ?e̘1l޼RJKKY`aSOe""1; """">>:.$$u1vX,ˢK_~ 8M~m9r$ .7ߤ}+v;O=#Gu]ƍ?~ȥ^ڦ_|E8@HH~!Ǐ\￟osRWWe3Mg}4;)"""">>&riƆ x7oH .\_g7r/9C~(--wiv}qqq,_@:_WߛN{tRf͚Eyaի;l˲x4i0}t>V!55naÆBXX&L1wgSN;m4>C@cH=ܣ>hHobﴊv~vVrcƌQ]eqTTT a̚5G}%K_}/^p0gΜ֑5\ëK/ă>~zf̘6gȑܹUVqtXNYfyRUXjOcȐ!M?9nzW^~R9ED˲رcGVj=ޤӂҵt`k<ggxW,38ޏ>(VСC$''7?soU=?OyWiv3ƌΝ;ٹsgh"/_a<vm]wwߍ~Gp r}q7D}}=ׯ[o~+dƍM/\w}0x衇={6#Gpr]wXHObY۶mcԨQODDDz,y74&fף3k+6n8ƌiۿ?Çou=)))z%K`Fo'%%JO>?̝;0>K.sΡ2N'gƲ,/^=vSٺug7F/Z{3q>}xW:uj46Yf#"""=<қ[.ͺ5qA'Xf nsUW5y͝W_=f?wnfwв5o[ZZIHHhzܳv:+WRRRsl6f/9p}m6 @tt4]twy~ap~DDz4M}MDOzz1H"##;U=wON|||~_pw^֭[Ǚgy-**6=/..ĴzK6lREGG7gn| yyyӧ: s6mR~3<O.pL B#Y=cǎeРAMM'WQQ[oh0eJm۶V׷cz߾}nŚpN#e?;%Jmm-999-.Ǵ]RHwe٘2enM}M-f]wulݺ&Mz- +hvwe˖Q]]y~ƌ[V̨QN]VnVVV۹_KLLe7DN.˲N|-ODr:&Jc"Zr%O>dr@nܣxs뭷RRR;ìYW~tVXҒe6e˖ׯׯo׾1b ,v#=ʽ-A-۝xf/^$$$4)-q7gK46K/TDDDGSGzY^gK{_GGo7'&& />W_}1b]w/f…\r%L42N'^{-uuuDGG?Mm"''Mkr8L>fCsNMaezlݺfk׮=&_7YgrqL<8qf[NEh.]HO>#ͺ5KoZd eIIw0>ÞqFEMM 3glqիl,Y䘉0O7MRg4zEDz???W}İ4[4RQQ`ذalذ9MdϞ= >\/hb#FrJN;4sUUU`t$@yy9m.';ó4wkt}gq1Sݻ9|0999|oWoOIII=m۶1gJMM L>wy`7SN! p)裏={q5ks=L0 q8~̝;76 tkd+x駙0aiӦs-x),SGDDDz4y7n͆ar]5FzE#:Ez}B@@Ǥ`1DDDDDDDduّF(M'?"… 8OLdʕ󈈈H>&> v'&& nD9s&|EEEǍ7ŋ<YdTN""""=<[}Q)Bjj*(^:_|Aff&!!!MT_`ŊaYϟ\Y6ىEDDDzy7_Wg '2zh dy':i"=W\qC d*K͛-=4yuKhHo *f̘ʕ+IIIaڵ2w"G#51< "ݕeY1h 3#"""=<]t *^u&MDjj*v u#b 8ɢ&"""ғ 0 """sHoᓜ<ӧOgϞ=ddd0sL832daaa?͔ӟ"""ңɂ ;w.~~~^4-LzEiQ47-\?s4I`a0 m6 6g?kF9#OҘlcNjs"q:^ivFIIց(}< "ݕeYlUDD,:'5T8)oXzz'5u&uΆŤz֛5M$m n#ߏ ?mُ>7za;GG@;a@? dh'߯/iL|2[|KK9t{ 4!""r,ˢΤZJ*(jXs5W hw@tG7-kTz̀`" 2؟z?D4</baHo`X@ӦMk IJ,>s: .iZURP^KAE Z ʏ\XYKIC0^H ӂJ *[f hi9ѡN܇QGz1 XݻHIIn"Eד #yiӴ(!ܲjrJ]yMمU6Zn3HOkIlD`SIt?VMPivzO[Dzjv"ҭɚ5k8s5߀9eV[VCNi58{[zpqZ0 .4S(CB`BBp&Cni "BCCE,ˢp DDntqi_QCvq5%UdWU\EvI5Y%UdWW^ tIy5+Pxcc6W;:~Q !oTpRtJc"Mv*< ** LӤ"8p 2PQ+jhgWs!}Zgͅoh'4Nh@?-v[ú\hv?~6ng35y;Og4?~ ,24qiQo(VGsT9w=ԛ9]չ_;^U뤼a2ϊ'e {Vyˮ"Fņ286A lX ԀGnƤ-[GII i_# _UiL۷/ޣo߾ tHc&K.W.ҋ`uNWYXɡ*2*9TXšJ2(wOD?DKx?v~`vv4|BNZ'5wYM=TQ\UGIekʪI+k=%U9};₀u-g_?Ņ2(PR$J"#Mdٲe<|w8Mvg;|x }Di}eذalذM9())zRDNXX tHdY{eذa$"ҍ9M*2 *]"W`;1aAvbD@#Pϑ!k <خc7`YN*]א_VJ=R^C~y-e5T7qE?[ f1~61!ć1,AJB*]~d/~w}~k韊hx `e3{%##&GFF>ӧO,:0 D3 Çwv3DD&8XPAzA1ªnff$><@bBqp4(`0 Ϩ䨐n_4)LzN]R͑RWV14Ӵ؟W >q&A>aJ cTbQؔ\g#9=CBB6laF#sssIJJ²,Lš5k|Di ʹq7ox3w~~e$"jdV^P@PQUN$.,@ƒs=53ׯ=_~9v.O?`7ԩS/M4_@6lp̗x#EDDD˲!0P+tӴ.@^9*8W +*2H "1"`"=? bK\$ʓǾqCEwn.{CJr`L";][]6;a :61e ٺu+gu/*-c """=Z~~>}f85Up >.kDRd$5#]Et -`106+j9Xu0 +|^ӂrRsywsAK`ldtR8!>,݌O ˗/?mt;ֳw^;إ^iv7ύ7ި4&""`zܟWNNiל2>,~! &9*~ Q!$F識hgtR"y 8_ξr+s w'G069aI!CFRR:֤1ϙ>}:ah"o7SDDDDDDp斳7}(BrtcT0C">T49_9W+~"8$FwX~]6INNa2<55]pOvYgidhin:R;FJښ͇[)8 &:4Hw`wBB.cl)Gih6 ,CEU9Rƞ2v)cwvihI#q epA V]/}GSDshsN`A;Jٙ]άR.֫uԛ?XE%8<(Ƀb8cP4A^S:O&L`dggi&&NئN'o)SxrfRLdٲe\}պ/"^Ie6 j)S`1(&!PǹJ9"Sf0$8O\WP [p1[PV+J9K``LahNMrTWIK.{O>iIOO0 &MD\\/)DZm6 fa;V}Vjϭ`ONiCP=G8RZݩ> )2?γ"y 9*.jn酕l= |o=TåTյ?,`A%~od07Kh"ò,߻T[[p] ygw]袋O1 㘼 .dܹa,_+MxcS99N À~Q!; %>a 9pd,H9M26!MEȯY}C24)Cc9sp 1@[x#.`7W\s-0uT̙ի1 *ǪUxصkea3f?E/=ýKxxxg7IDDD'N'-OaE֛-ݙ]άRJ|~k ahC0;!=$Ρ!E)eSFҋؘQĖnlP IDATdb8gᬡLM.Yv<3z;h`Yƍc͚5 v0*,,,LDDD,2ºm"Tֹ ]٥Q~61)aP{W@L'S:2667qLYCc8{h,Ebһ.Xr%^{-G+m\\s /Rht*>>+-"""=eY,CEUFk}TiFˠP jtߡJO+BK+$Oƒ윓y8wX}"^GO-555,]SSSs6'?aΜ9L4MTz+>F֋Ht:yg[z-"]&eM;K)4$AvF gD+=O Hנ>OV]Z!ߥ}Z!{sʽ^Lj>a7,1i@4vnn{RPP@EE$$$0tЎl@TRvdP ۳J iHl w4=O}ƒ4rSDċ +jF}ny?y8XCZ~w-ҵT'N^;&Idd$:1M~I&ai4٥ A.a_n9f8I8#R+<ޕ_^7 f_>_'лDž2mD:$~6> JޟYړ*@^x4"9xF&pް8"D4[h|eǎ4uB#EDDDD+s!ij*Ʉd$wP;Q hm4->WT9Rfphg*Ivv6ׯ'55bjjj'>>SN9s9ӧ+X'rfΜ+BXXXg7IDDD'L7W^yn +j]Ґl?\JFaea@LHڮEEyp/lƌCLL q֯_Ϟ={1vX֭[wLh;`޼ywvDDDD|tOrm=GuN=G0b{ˡ4;f ;c`PL(p˸|te|'Ur*5ړhqNJ3ax"CRLFMyy9a7ncʕy'DiKMzzҘHeYDGG^.4-W43zCglߣ#_T"mT9@vjWY%']1\8: F!!< -.Xp!aȪU>|xȢE ȑ#aA_(222˲,?~"IJ,Wy[3]Hz+D0ocڣ"H 9ADzy7˲ؕ]ƪ]9gw.[2OLÀFsDfI$., -=y]6=n8oߎa\|m߲,:,; `\yn4뮻_]dt3g+Ak\iH2N YPQ!uDžFl'MEx,eլޝvUju'ẁpDfC]6AYYIII:t]eK0 0g/R *EDDDD\H)͙l(pqU%G2o#keY5G lv>P͵nа.tZ'_GϮʪO(?YCbD.݇Ў퍸O4 0HIIiwÆ kRt &ࣹKEDDD˲زe ǏWS$YEZ~'9]٥w@;c3>9NƩHrwCf)ڊܵԔ~r[~7d>q6ݝ$ܰB@@@1<޶E䤩s1cLfCmɷ dV!9MR*5+3eh,KQ};>ٹs'.hAJJ"""ңYEjj*ƍ?~"mTTQCG[2)yv0j{|::oH˂R,wWBu1T@U1)iEj=ª|Vgk7l{fk[`\XdžC < !H7EG}!naq;,/æ">~OvPQשׁ7-ܛǗ{o }>2 'ӧsNmFII m.c͚5v=\o7QN`ff?yg7C˫7ٕ]ʦ"6g *}^ %/ɑ K#nmPst);GvlE񈾭 v|[b2AO!ۮ]ZQO:o WOz)yz?L?ɎR>qa_ny˫sZg+O#΅p$_g]pnO7x#>,<teYXŦ̣YA<#Ap@~*~UXLjm=#[˿ʂ[[źC!jkpDn["ݘ}tvD:UIU[!b *Z1R$%Ek77Z[YPzJ]/͂7@ON\M\LZ×֦1V_w]p-=Һ}!(B#¥GPG܆%qO˜3=G`kl&wmiuBl|_.Ā=;̙Cpp0wq ,`tM\xᅤ4߳l2^u9y7nluHf8;"iH')V@;#//`Y!%  =Zߦ:^ t f}+7iL*|vқƋCU!7q+5M#1 L #f,2 ۞@^g/g/Er$.D#oO݃nS]]ݻ 22()9z۲, == `x ٳq:[{Ht:yg뺓숴WaE-ӋؘZdPU>p?"?!q,4W0nԷníQMc1CpB0{0t]@sԆXk2]P:\yʝ?Zg UFUBmkDumk/ݑ֊s~],8ki,(8Mi]"L}9ƩN8c8[l>ܚ v_X_.kD<}J2SG~ ,ߣdZҸ:0AqdA>}HMMNdY999$$$t"'iZ9R loL/I$=#'dlB1j-y0'n*XڊI$1$\ѠH yre&ř] AN Zy1t:o^8meۃ!atC|$Npw)zD@}i/˲ؐ^Ċ͇pk6Eu.+*ğ&eɌN oKt(>KcҚA]ک3t7/Uqe-2ِ]LEo1695bavbD ꪠ( Fi e ohfFvқ7c!4ij!1ϵO} qe/˂GGkC޶ ZH> Mk{"'I}i040I%*5l6yuQeK9Ȓo2O3OM } nW^b͞=""""4M~i?^ҜEjnӋ=#8׶a8'=_$°cRlP `e[P% vG+_G+wVkBt /Jw$)JSZW~n4*HڵE ֵ>IRG!ncLOa|/w)cxݜ?,&3udW4&}yvi:6e15bjZ;`:\~LHd|La!?v/iǎ=?_?v%Mĺ& }]gQZfٯ`);zܺ7etܲj>ؒͻPɉwhAd?3G5T\F2"""ңYΝ;5jWJ1My yِQľ\ߦ ΄~QL䀃$(ޝGUݍ;ɾ¾, ZjXkyjb[Z뮵>nuy\EWP%$d_B&6$!! dk^3sY8~Y84.r3:Y AmAQ89gk0ǜ'3MlclPDP=?#ɣxu }>gvn]w?:0T/!m9;C2B[~a0y묹JAA8q9eE}ș{ry\ɗAҷ$3seLDw]6_]LZ^`LҘ.$B!Cu+[PLK_MfyON0,r2⒟wDҕ-΀渱\C3(1Դ6Cg3^w˽SݗG8c/Y`qBfåSٕ4[3] Hϖ.]*T !bX4?%K4:8XT|+{SPEuc[K3J1Bfx]JVH@K@]gˆq@E8K1Go;8W>꼵ۜ4(iPSu$cmw~ˇ'9{0n>H~/3b)nnOy}KsbKUUUwnBHHJ! tVQž|+ۇkhu߰mW0A-bW1QZ) mр*8ilG *i8뼍HvN\e[]B 7^s粺R~Hq#lt$\o; Fn l';Gl[ήmB {1^R !VGG/Q٥1`=}7s]weB!pp8x[1 &m"Ig`{Og&)}UmԊ ~rY]cȄ;-waʵ0rB) "q# v~쎋ȑ#B!t]8 kٝ_LIopI-vl~*@fć27ڋ[,'a=Wsl Y)pδC }1Tt8!T~UVV6MB!ȁnM'c|+3YC B&LT0Jd~IUHj|( !Ƈw* E~0bDLЄWqnYa5߹_=~bv!A<|!n=܃i !B4|?OrI0h9r;}Ug8H3IgDD&( ?~2Bȉgu#9YGg;8T !10g[k3| YC&.0^Ϥ$1]B!B Қfv[RTqD->$Q1Eed%Ij>JJ99;_=KcL|mD j !@סCYz a$y猤1B!p:YYY$''K!̡d:ӑvi cb(yLQIJ>J5쐱`Iǝ fGNvޏ^g!(5y`ͅc8CM@$\h]kak0F}HIGO$-\袋$-BaMukƎ+?; ٝoeO~ ?$N6?bu>Jk?Mѕ^ +8S;痰D 签iO\펮;?+arHHF{1Ic"4&B!b0kaw*g76?ηM.BW=SBUM@)K\V_I1^zLP)BaM4>S/^*y]ɫl$-JZUl0mLQ0Uec!_h{lRN~ vG"@? !D5^vk=ȀͿ`0r#}q>9`_lGp tB!# v{PJQjkk%-BaKut]GQwNFi-iVFoպϷ|5W-x Ä& IDATx~!8aP_\ ]u#yPn5@rJ4 !B zj^L&TНV ;&ܛ_E]e}t- a0j3 Iؘ_!WOp c=yیomC`)>8nE///ddB!-]q8L&BuyU[I˵^\CO?2]=t5j>ؘղp\ R[HBsXowv.#}W( .҅^9,66v BqEEE$$$ t3Fgp-vfY}2&W Am%5d=Hp`_3e0s/7)]ۡ muu:_/_TEEMoJeՙ[ 7n؟0;<_]ve!B!Au>cnndבWEZyVJjO+Td3]&E=%_=` nN clDv̽tv{Bv>|l8ZlVqoG5;g=/O֊]5;7_[͋]pC^{yM,& >& izBL`$\Gg0[pX2iy|.=sYYv[f(]RQQbbKB )+ +QSm[v[hҕسm= >pIr !||zꎡFZ#}>%R.0LN>Xq/dI**hdIy mv=9b}2vry_Sl|j˃ m0}|&D411ٿ׫ΛQ?G^\glypG¥-[>!B krW t3ȉ&g`;dZ&ic/LGvnM8t '< r=EC}B)+ps;M=Uk5Ԇ^1 v mߪR:Nw:;;tEEߴVC18G,3XL iCPW.G?4&B!4M^o'u]'\+;sʫڞ9qfYP3Icc9ؿ} ]2Y j:sƹU5]RPBiC)ee#^ G]趎#\.h0܎F|4ۍ)/iLrd4&5-5= 1TG`wg11ӱߓ_ORHC3!l].uopOao?ܵk*}!ǃlذ۷sQill}A'Vӥ B!E .t}M9VVבdWhfrqfIQPjՑdQu TL0b|[P;y9,=oZ)m(ĸqnۡ**_|m]i\.7ٛhhm0#ԧ`w`w%>&,yV_1 CRR 2-_CQ qI%DEbl4ٛhlmvrLFvwkh{C'QPW]1nOp=Bsd{2Z+\_o#4Xal Ƥo(B|PUO(/Fh+ 8togL11!c }ghD2p||?|~k6 I,<#'zC@y voܸcdpHH]ws!::??c#~!B1_+kZٓoeWnr+I/աOWiܫfjbRj`ԶQ\qֻ#6M_O^m,_v_= [`4F>^>̉C9# /CTHJ0TVxֳ?Kcksbʺ")+bZ4C\nQ-$'cljl x0+rsr=!D͆7C懰uTd&3XsZ<̡\y <^, .dÆ Pj,B!PVUU TE] imwZ9ZZ-~wg#|CZ a/vUjc~ gdEgչ. Y5^`.WT`+/aߡmt=e>G{uVo!s(##|[R^^Nhh('O[on0\UW]H!b4wyn/u.휓櫩"l-$e"&3dPm4!(ᬂ#Fza vL7Et}w…peiRȩ!ÚA5j&Kqz`wYQBި&HLvmm#m슐?B! ]ɮggcBɊz&)yTHUHU3~n{ ך{C|C;rlgDTv (/Aٽv޸/w=ȫG_|V,^\&-e.̾'h!B > { 0RT3gj7- !^%=2;,,r} }]͛ױ 9:7oB!İi;v`ܹ=水;4cW]U4Tf1SjӽQZld vђDM95d6#E^y/?m3fP&U4:#iluKL@ 117xޕFu#S ՑV3d b~|/fA\q#O‡R`3=R~xn81\x$=k,}wf,iIlݺd-[/unڴI !bXSUE-aJ̵r)1fYT$E&лuT-İ۸z֫] A…n˨Qw[]%\ⶎA1fgthHJJ@N&h7|?iiDHՕr<52UBE)8'8l -Qy/bHc͚5|~|ك t]g444ꫯw^, s>K:S7p1B!İS`L2-ؓ;W1Kj&M^g?8q:9ۣHCiK=rBČ3ȩ1$jcuDGvc_/_捚ǼQnSXWH^muS˄}?9DM [o_6a#nuqegϟڵk={v'uuuݻݻw{ni377ѣG5kְa?NCCQQQ,X,\Cȑ#t%ǏXիW9>|ŏ1!B|ۻrdwٴiLdp6jU%b&b&l!b 3<(d 9lF ×Er[T GQ( &EBFuʢEꨳy,_l($q}ϙ[s? tEQ4iyyc0+~30o<&MܹsH￿_۶pB/uݻk呗+wO|cr_w}7@pp03f ##>ՓҥK)//`Ŋ\o>SO=/>`>vFv; ]v'Ofƍ$''o>lW\aw8W!?N^e#;sL}']OAn7Dmm8)8sl9k9muVC/euE`l vόș'.⸋iqV'Yg,3dsfZ-|}D_$7LN.Ӎa05\{^y<w}7&0Ûǂ۷ogٲeγHw 4+V ""Yf1vXEaѢE}v}'|;Scٳ;w.YYY (B@@O>$?1]~?z,w嗓@~~>MMMv)'U[RRRSOgZ7>ɍ7ؑE!\huh.egN%Y(E;l?1nR R4mWfv!NC:ݯ><̉v_&\^\j(?n˜kݎڊnl[@t5t:?AQPUPTP.+^^(f Ōb6-3r>pt(Q3Miˁm d[X8mBHSJ6f?:n+ uD>ڰkKuz39IIv!iKEhtR:uhhuxEFdvc ~c6z{b #Q]"l!F5FLM]jUOrHf3͟g|͎T1/"[n%<>>̚5O>i((85Md2uWUme۷Tm߮<19_rLw=& 6հ3JZn%cֳ4~f4 : @Em4RCń֖kDEGYِ ˢ+:Snf%02Чu΁G2; doc'~(혴ooTl8Vjh55Neʗ^ hҶo]QBkzT@k{U]Vʶ?VZGk+.eaa>A) `̡xq/13c1A-wϼoJw$czU?&)8iPy 1r38޽ Yϡ:ߍOrDuv̙3;|ίcҹMg#ċQKK eee@y;\/Q.B6mDRRW^y%Xooo^y ۑs@EEEǏ)ovx衇~ݻwΜ6l`߾}<XVx8pׯ#-- ߔ?Oy7?믿瞣7~1^"'']Yz5|ym kƱcxhjjkc>y[oEzz:<TTTSOw^y6n޽{礧裏pA֭[Mصkk֬ĉ466pю[la<1z?;;_~>> _~lV^MA  IDATkk+dWr=zp2jllĉY]vi&֭[xG'|lܸwyKqq1--- 33W_}[_ /i^M^/d֭dffygoؼy3 !wD}})׮?_'d;S,,&3_)sx+93C:(gOv3wqR1ƥ%!ݟ~{SZl(v~~BZBR)qAߡ&rss]~Gh|i_}?䥇f#rb*_9vӏuu<ߓ1m:o[~7а+Cm&|9u4UQ_g;ɶ\ql,/^)dL'_Ɉ&n(>o):X(p=|rsB90Ùo )-Tѷp|\2{fB5ցvdbf]t4;vPSUm;"7(yEh:|#{t|;B~I5KUunHHCG| k5*wkȺ֡#!;&~*y[8$Se1>ߏ?DٞwƖ-[1#VXP&hΜ9qE_ 6{ ԟ)L@Qjjj z5n$&2Mn_l-w;Zs{=2c2n?-[rc?ي)*G]w|<^XIWl,x ;B7=|3~+輹MƇ4D^{9&( m0vݩLB,> O9&`m+#&(p\JmwPGa6'Bח3vT٘V;mnS[:VP9x%̃L9[zfTeka.e|z]64D)'ZZ ZKKqMnnx]wz]֫ztnF^]c^aa>.MhhQZT??,celIΛ96u>|G|ovǤ-mh)uEgL ?f#`=&Әm(m$}zSޗp(14wy_<Ǥ=}<[x(//3?'v3`|}};MKKK\ڃ]^^^N!'(9jӹPdv2;[0T_>f_28Ҷ)(yx0297ıc<=_Q{(~oŴc?yr>QScus(r $`_ޖnt/j|Ot {EEڦ56|͇uݧł%) 0 0S[G!ۆ 5u?c˅mBwaZغ =- ,ekYD{G<|`wxx8o&K,ᩧbĈO6uuunwqyl޽B!ę)nb\*lûd'-T[iu0u-&E~Z|! -m͑Qp]W'q¸qL Đqbi-.z̙3h-(k8F*55 S`j@ t5)$=b=ޣʪꬳ=Sn;닻,OJ`Q좁iC!i1[ez.R o`C`;y<.((`Ѽr-\7xosi(G;#@Kތ9r ݖ<)`{.= !$$dZ%BOuFҏ* KӘz(J[8i+ׇto I`m,qb^v5/t /f'1'1ﰥl]2%jM^udOAi"Asqc+FkɛNp==xs8<W(PC1G4_ NCsvE&K`t >S&VᨲbZqTUھ-ԟ8A}D\|Nw|SR2SJD!:j'-瓂OxKtnt&fk̪? qND~ݛ}B~ <ܴ:y:b8vܾ3)( vKӢE'ַ1j~~~A+V/tϟ? *}}}&or~ .B:uICC6+v3~8xfEa^Bl\..M`S[:)k(uk/]˼Q !OZEov[Ŀmt]pZ#]O?^#F` +< Sh0nܑY[{PS8GyH;ɓMM/u3f> mC-[bՅr`lmok1nܱͰhr3_w|itiABl8ZComi~s%1ٳ}u1EafLfFZX[u;w^>2HNB ;_A޶˵oɣ!>k1y>Ӏ`t\{\g}`-[`ٲe]&n6 ! Kjٕkp6wZ2|-xsBN C2]Cs:uՊ-'l9b穢 gNvlgkGcsnGqO4{9~_;Ӆ \"Wt(Qm" O(d92RSWUaÖKKv6-DZeD˙;􁧱(/ ^K$.^(qo;:S @w>\5&9|4MDʤIꪫظq#| ׿/٥j;]瞁hy衇:B!lvdz(99[cL}K6ZbsT.~XU^tͪ#RI]Mgd d9yزs਩qYWoȍ-=i=qK\dⷿmߡ_9fQlS= +43,iͥ%+4;FKFF{?gY!+U|uDG 1Ȩ&Xp7^o ؼ߃2g}!u9~8۷oﲬu1bD\{yGپ};'O;d߾}? 88.RRR<ߴiz!|lsH:'0])e:M돩w\ᶎ\DjM9.򶰰Zp"/ p-;t!<+ĜԉࠒGy:MKllZK\u]L6 EQyϸBNwd|'Ot]^^NѣddД~t}oCҨz-_N|^=)t\#,&@fm_†B3-~9ru;#pv^o7v%$$ v'&&yf yx;x衇ξЄ $-B " 62Ӱ;IjJ'U4Ie&}m:wp#o$ {1Pބx6SqCgmYvZR҂k9ߟK0`9.K\l)Ft]رcL:U~sBQ(u,o-+P:M4L38OݴM Y\| \8iFbp"ߜGKuII,lZ& 7//UݢIGO," .+dٲeL0?Q/R%$$tv5kְa?NCCQQQ̟?[o/Z}nt0$$D&B!΁&N/(Mc\!B.er^|oz[(k ZOjv3fҸ߳3@At" B'$6`J]-yꉧhؘ;9y@ Ĺ;?N޽4G޽ *6N3qi:msf1|5Z6dmіEo p˄A[s\3ݪv3f ˗/g,\PQoqƑmʕ+YjչoB1UUא 2$b7mGWZzVܢf7En&!pr2 T*#}֧c999<<d/_ҥKe$DzzzB!DV{ ;d{gZ0S:nSR|vSt%^*N cΘ0RC1oYozsL {,cNLlܦ+9}ǷUmɒ,L @#242(IiiwZݤtP~n[M!f6@(Aޖs;Ro_CH> GsE84& jX%T 4]=>qӁSPt :Coc00ܛ"z*uΘFHx֮rCpIj+י.A5s ylutqF9$hB^{z@jjj$3}ay-[ի ĵ叡^K.i=J^:I$I:tYjp]^>4aVs61>EyPHonA[)ȭq5/d̆t˻t230(-cNCO'"  U0!J0j8  XbtNiuzLVf!ro3`1N^f0au،(:ًS:,7ˈ>j{jy5zDijMS~G$>l]p꒤ۘvXl>'&LjmԨQ\̚5K.D^>1~~t:$I$I|l8Tˆ5?T)h|/!4;xrTV:RUNj61i\<`pdPĐB0^w_c;D hoǞ0jwBjF}&\UQǤNj7bu9"V Äiž`ƞ```m2/i'+*Z'w/)?qkMGkl?&Ӧt2$?LX-1.$)'EUO;./n)kTTU~{Wvik֬aٲe,[]wBB\s fb̙2XZT۷CI$I:!凶Qu%[#y쭋~5;1>LvXVxIKs<ď7C2|2U+OO0ss ul| C\@54Qbs؍8-pGGW Ke6!MOh-:~|?u ))p=gc17J!!w/ʿti$izfuH s@Ra2222Ҁ6`߿5^v-3-?dK/IAAAo%uMe٨a$I$uBa}I華#q ( &乏 )QsEVgD 2k B_)ȫIaFQ3xd= UūP|NB}ԟ$j}D?|a4j$‘h٣%mThDx*>ЅP4 1 ħڈOJFZqذe>Wv۔)nǕW32i z{,Xu.o|DK %iWocM[_+x^l6 mЄm{l2>NnܸqE]$H˛Gar$I$"|:*d9rܠgVf3LF4E<ޭ}2F3a}VI$og{ٲv)> ?Gۺ%iu#ž%ШI[GRECI_؍$eƑGbr4Р66i`09-`ʑ*O}WaoY*I`Z Nzϵ9=ҪO`DeݖZuO&NJJc֬Y\}r^$'$I$Fvf'XJ7ۍϷ2c8q{%c .%l(!m$tokMQyT>d5{$IXop<󣅇p}t:QN%r\qe(  h@MhY ״oj S:qI3oQ#ܸ]J&倥ayiK"rKx{AZ[oY= 3tN' Jw`LM*H0:at ka :C/V%I^Wv]%pˑ~g`HCߐ B|,[ &~Kھv܉Qrd$I4i`w jY/r gf6OWq@8 F|F&¾u(P[YSYRYSZ#_Rtk7Հi0bs9LXe{3h=#Z( X맩OSM7PL8GF;>*G jc#ߧ7ovWFo<*3r݈묻iPu]XaC͛ǔ)SNw9s&K,pwI$ItTM͆5?Tõv$&icN"kiEra?畨k<=3,൥ᱥm{ tD#eƞ`n2c (4McŊ\uUrS3! U+*}Wh]nu@$LkKM?eh^=YQϘA=:qb( :Ol|vndix6<tqd!}i<~u:0vX͛wAFFNZTӧOwߕa$I4i*oը Ǚ pԧ3 #ugVJdvbPۚFf;EgMh[Zm0Fjƚ5k6m!^wr/jK"e?ogʙl!{\b$1z&^#'JN]|1݋{:iXWn` :~Jؾw 6&w/ybBEAqW2|nL&y:ěJ$Iz"\m+ ^~3{*[f6Y6aÔuW]{% f{milhpѢǙdődd|HLbzAwZFז6Q[桦Mԕzд똘c'$'$^#!/E?3)S"ELSoMJ=?g}\$򷠩mtFo0ᖾKPvoekmCoxn6.Nz/!7=ÓO>$I. x *D;ԆXR痢r>\֫&pk]_iz__!Ugǖ'oIz⓭8[lkkHبli!P-" emtKL#UUyO"R)PyMձF*5R[ABn;;I䞕6N: ^}@sO#6tN׹.޼MRmrbSi; / Eż[y# v{^x ON:j̘1mN23e߭MΝ;[`$Ig^GSc%YK{;&B6 fߠL0TDڑTM>tfYd[~kr|l3bRm)VlNSq~^/A_ ?)yzQCp8nT{1nF7ٌjglaa0N|mkyY\&<Bp1rssh>T4QqM6k(:̑OHfĹ)8dy<Կ&5/@씞wŤ< z:iׁtXԌ,精/J^~o7??]cibxٻwodͣ[t: ͛Ǎ7ވlzP˛h4R[[+nI$N厕x%??>*R'rپUd'6u^ (x_:M'[OҶ'0[T j؋э764G=M}>B~_+ vL-Nb _Qmң(:N'7E.B 0_?BX@Ck]S)5I M%>E}MB?XNsϝr_o<ѣ{:i (m*Mn{;L}~߅=|}X>cڝ<vqF^x,YBmmmNNgk /KNS˛j̝;. OI$IC7g~c-f#[,fL$U>9^B,3qNj+PxἛٞy X`h`JfÕO7~p(c`ڢnnm+ְ (ٳWj;pvō<<.ݻn5{gJ*i8SRq#)Q-_謹xO5%LuRr+-σsx֬gm -t:ocz)g(tubq0/`헻r;{y$i awP(IJeXx1>pdѣG9r}Suf…,Z $IO ̗GpjVuqY &ȭQQAF_YuZYx2iˢy2QC!y0M~,v HmwQ:Hg^_-˳ͣWj5~S~ Jt=?bׯ|`OH!+=r0dړ %{(SK:ձ]MjSu~6G)E'a#O?wÆ$uI|tTxs<.E!`ᣅR;@;FfϞٳ_͛7n#`޽<#<̘1sM76'e˖uxSQݒ$IRTA//Աp ղͤtɾz%ܱWeT`D9'va_oĚxW&tԫԄ S*,\Hx- ͏ZBs7?vhFh:Ûń5']MbmMb0e5ԱG{Os%>BpA ;\PUNJڞHbs𝔝KRV6Y9]`s5%QShq|W GP5EC*6Ryo DFOM`B2֛E!©]8W_Q׿|]@W^!q]}P_&M>0F}풤^(0HoV1$ 5v<<Ν;yxW(+;1Y|G|G8NnV..袾*Sjveۡ$I$#ƻv@fDŐ[Zix(UĊ+e"ՖHRmw=XOobw<4jh4McŊodđNkm"\@$I„}x}ƾ=q{!6[̔ (BpA~͌+fL1eh-%F{l94ڳ J"-\E^<䔨ߏKCEy=gBmw׃hBo47 m ȣ~jKE Pá}(D>zo^m,:=cћ\&_{^p&#۪9g;!ӳsa:? 4EzzƿcGT *'">/{?MhXSbb.K$I:I4:3g2sLn7K,cÆ }1f̘%$IiPU4Gą%q6ϞĨ_+*UY&+EזF='j;ig6yHlBGZBtu^oJGbfBSݞژVeح(:N'VIe-Պjda0YLG5SzC1g5&FpO^wކzڴd4O>/N!jkθv-_ᮮ"k$feˑXQ(Brl_[@}C8ʣr/k^ϺRx^ gO"c[E>}q.qŇTm]e-:x}34Zb F+g$*P t}#ICQm߿m۶q.E$I/5 e[i} H`S_o&_Z5FgLȎڶgDӟ~H݄|Sή3L )NR8tx=]_wjcn3=v!vfCNb7ZNi\q}*h]YACUކ-mȘ۹j%{~$kYd=1g6>RmL:Wq98}a}*طu30YG!EQW_cԽ:W Ixc& ސ1`WC ?$i@ lAB^W$I}_ۘK/QTTݻ;B`6;mo"D$i dvƣ*fl-M|:|&|5&|Fu&qDc`=iv[(̞C0[h@zw~&%JؑS=! {b"q qUVW(]]]^_QFmI1?> f3?za :]I+-|?&3#G5lƜEq,rk,P 師NsѢgL<3:EDsalWD%Iu׻\ieV>Ho-]#_;a2HѿuIReҥK)**?nmqr~y1o<̙%JeI!7޷f#:=0Čᘞ6Bގ vN$v$Q-B}Pkj-г֕v;RR:{b2)8SR'&cOLžH\B$lRKO4/^]w%Fr:Fcm5ǩ))%SFt}^J\8k;wE>ƌ#od'N&5@^ Ѕ|)Sq͞7yB~m+I1㓙8#1 I/?F#Tÿ};Mk?'H;EgN<~0˶my֝2薆/4D .Emy<4UVQTToAccg77@zz:se޼y}}Qt3(#GdͭgS$IˆC?TÆõr0D0L'-{/%1y cɓ6h2v).pϷ'te.gMh}%\[kEkh` a!y?|ypY\џ(IC.vnz[2|mH?꒤S4 n͒%KXx19pEIېg޼y~$$ȑ&E˛j̝;n$IFS?dwZ:/#y!.zf5HSu5G;hv.=3rYfL4u /$ȓC_49(GKÜ^fUt<<ȣ{}}v !X|9/&.opgdd0w\ϟϸqe^t^p!N4P$IC#kp%'TgdL`L`t ^g`֑HSU Z `}WvWy~$΍ۉqkX|Λ1pJٮ 22[w IDUCo*9[$5ѵ8ZW=q5^a&{6nG.s/"d 1`[Skje`Gʿs-snY̟-ŻGgg.ܶ9% رcذdj8LՑCEىx5\RC[8ocVSStJ5tLu=g0ޤJJ({1<}:n *%I3j]uT~` h79(*CW!Z=BBS+H+Dz Q $[#ߛhMbV9y1 ik֬aڴiC6shݺQ^µ$-9nyBF_ƸiJ\\UB(<Ȕ 8L> j_| F !(yv 튿qN<)" Q6Ǭa ɗ#9a{ OHgyo݅4fΜɒ%Kd-IªƎXڍ_bٻUHա4:rq;p;p;wrI*Bj%ZW._Wo.[FRrM\)}O$s[Dڎ$e`uː@44McŊfF'`OLmჼ&o¹Lb&MmN{Blm+{b2>E72bR={p[@(Yd,\N^:d!_'¶l> c_chr3΃YslGl3J^B-h#Őq+8yNRs9HsbO0( Mu&Kf\BfWsۙG#U߾϶|hjYp5H}kx|'$K#<{]XHlH# K4^y̙3,FvJSUyxNyxON78'iAy1'mpr 3ڋI=wXͤ\;8T]Tk*YL#*i"sB; !.U`d-7ոqظqcL$I0o%3~!LaqgёK3sng>AS>' ~k% 8;E92!wfܸq2jȧ//7#>)L&\1# uq|x?zW2< &;y֭tH'Ob]Y$s]0 ]\$c(/͆/8cܵ ,51c\pOg?97nDQ>L1$IjC Af>nLj V*xk4q; p; h/).P!T^]cp)z|Kٿ5eBZ[ @E'MIUصnۂJ `6seWp޵7J*'ĖC:-\򭑲w{u/ufƔG֟ر}T[BjG<E5>\!mUԿsB֢bvXnQ/TA(F]fңkKDo7T4O< xسv;W}LՑCEaq7n"s/pj q!v+:=6鷎&1CH))yaBnL= \*O8 rr}4Tt8|[OH -Td-7fB1$iHk,gӮ%r{Xft1ą3ۑDm- ]s]Ww%YV=f(J-BvFo4Oj~ %%zFΈPJk=`}:*j_qٿS ]Ӳp}#[tQ S);175FtvӉ{Q׋fUǶ>`USǵ?)] R5%M|vw@Ste_WQ6M/n ?ktfsm%INy5Puұw-_zRO݆.J$ ]]X9\7 Wvg|GFkp%'E QWHζ$qhۙH FZPHbf6zCl*|!t!{ ˏYǑmnŬNnR}e7"u<鿥!JO?ڤЀf2 EQ9cڝwk'l}j|s\]U.IYvfhwTov{MlZ~_Urٜ䜕G]z_'ݴ5ixm_0a$Ig1-1jc&,˽,23ow=e}:|8G\.\.W?U%Itz!MGXkp7To[Smw$~EFn#N}b["\ d\i6Rp;IJDEѽZP܎gJj̣M Dm FFe{Bh0G#mNkFwN1vkخҙO:bMU骾hM%:{Ɲyu/!ɂ!ObHtBN4.]ʽ+ۘKܙߠdN~>7E w;c`ʓ ȷ~1kKYC;9qؖ;˜\rHyșP;b4&t8m8r~/X'M*dyhC* iǙ ~;x&wZ8.--e=Q4{ .dѢE}_$IRBofW6vXYkH ):C"K!Z5O\ut,qSfnnZ QաX ϟuWw"uQt]|1adnclMNJ z'rqX̘#uMsw(d;quexm8w7AS8{zS!v*znrᒛG2tƝ!9gSh. WUqoho tRk^?=gL=I,|,0wFai?Cn9[BTc/Ry+#Mdea4`Ic:s( B4J TD 5%x,'\@Oֳ0yV},*Vw5XBN1wvyXkmb I aL$pi7n .@{ԛnoĞ5jmq2np$[+MC%ȥ陬zme =qY#S/wG;?)B!~K{2L߯CfZ.UQg[t$}QKN… {i //CI~婆k \Mɾ/Y-QXNˣ>]k]#}t:}SH+ `iHtdb;Z'xF {;,7JE2踏Gvۺ8,P¯X6kcSPL:t&}MN7x0NdJb2ř (w6REgchA R!  !g:;\r]a= 6LvYvLvc.aH2s}ٺ/-nBhoY_N7pX9OuE/ط?CBBV)wOIgʟ&&OI'K[VRYNGrNi#F^8Bk5~ԓL)X|QNݛ;,ٍd>zaLuU?޺e?3hp'lZ1I,Ns}hHút; {P=! 7?uHS3>߻ڗww\Wz}ÝOj#b>$?ݾ7<.;I ZS㓸쎱G-u/TYIɏeK_GI[7gԺ>UqAlW P<[zXO:+Sr %$I=pmԯZ>&Kxʂc)^_EjZ tnB@0!0 G6b$i#F_t"<Fk_j}l#)k1. =?"xZ/t]Lr9ܸ/lP7Fv,1N.4M7omL!xݲGYE3K'm~Y\~XLMӗP@m^ëfԔa}LSS-ZLMÛK.T\9s0bK~S¢ㄻ?O$1 ^ܥp HsEJRaԩ={bIzW {q4栚F oڒQ*D M=])8lN$5o g%)l8LT3JOdmaH;k;!S ֑zG)پ7(z# ,Pt ?j}CRl}xJ;BczG0fy3۱=\/d˙v8SR!s[y_-?WA w}nj6gLLHHәLd<8qgQ߁ wc߻8I$1O~xq64DّEIKԎlc"IRo۶&J6K-zg~CM-G #WcvݏQRDzaa3KQ%-9-X|0RϐmL^ $IPnD[9:= |yhQjp/!Kt׎$VňӘL)1 1%NF^{.(fOHގ@ZOIح8Τ'tx3z4^K)]4Q(&="g+֑݁'8BeBWƴNUU? 5")+{Ѣ_.[>98k_Gh3l}QMuMwM>_^?zJ܅Cu]՟DGE1ȏރ54;I:mgtSςP'*vs7n3(.ǏM$I&4Ym8ڀw{bhRu;ɼ~bwFC1E?ܴyq}Kٲ&6,*mBIܘ_n|۫;,78Hᤞ._!hhh >>^@*Yj{?_s2F߹Q5%M|x7UnVM|JYR4 hn_vYl>L$3:QCʭpu|f Rꉑ2iyS%''savK)im?gW#t|;<*}NIϤC  QAXlvu-kwE׶ou-`%IL2}Id&|g=yћs{{B"pK 3?$>Wv!N⑗Duj 9.ݗQ<2||#O816QG|!AAhYo? t^+lH"8z4!h,lPWWl*/MHY$S-0Lǰ^OٶY2OkP`1;*v3VXx)2&B?Z|9|'Aw/_|NyV9ՖpLXӐêP<_-1Fm$u$iԱ$'"1DbŠSND'$qǎ#!}<1ɣi_vkHqhT x},0Y׳1q&qbƖ04xm>@}CM78hGbqy@Ȳ̫M7$ʘ @ 8އ(ؾ_.+ka[DV1TR& {ig7 AQypѻb/G!*f\rT 3 ;|먶GRCmCT"{*@iQi0iI1\_2cILO$s!2e4+]m YPNF'#Mhcjv P"oYЄPyD}ǡudϩnN5Fb.,'='{s{5lM]/ &q]y=gb{۾q)IˣҴv-wޅv6 Ə`dB=v\3C  S_/,j~Yظ!C1\I5c 6m$ʘ0PMk(f'!q4 ZdO% YDR23[7oY`U0K8G7gv.OKj_#zXQ(x8Z2G5-[:m j3 ~/Ea̘1C1$\;[?xéjfusZ @O|mN?Okћ4򻉤Le6F˖-p#⷏*"Q=qʔF&zG=7n]5L.,a c4 VO!~ѽ0,dNe˖K/&aڿ}3Ͻ6:fWFTM=>N6X"b`PPd+%˕SFIq3J{Igvˆnc69|h V&l$}W@eN'^EQ_@vY6m6z}Wxx8Sv` ֚?"thKUg,f:,Tì`PYΗ/=KNߋ RڌY}})~V%u*tyyx**QL\پnRK)nbKq̄LVzxh>|o]#/ g}}$IB?!m۶aZZg|jc߿]|'ޟv:>o٨:qKF/4"i9(nmB_kTu_ZW?XBfKoYXt=IYǑ2e:[ּ뷴ɤNnJbi$Eً-oޖlk$& m|_{n>(N']ψG!|G(EQx|&cT(v}#e̓y54On̂ X\|*-z{Alb3yMzn4ID(D'RVwYi0**EFW&.(7AP\\Lrrr2IHtXy&h=}ovv;j]&CCCEq10. O:{pX0򰞃-hc:t8XV, &Yڶ˂']0W$ézy'QlI80}oAߓ<\Nݿo)))A$|M;LسgOBbV ?GU 55^S'JqP>mP'P(]tMAJO_>\ȱ}>*.HL8=hif +w᥄cdOνs&V_;8ɄD _V_QL4ѿ17:CIFL~sGw GyBw޽ c'A8_۶m .Y9H+wٟa >nFݣ ˁmhO>-v[ 6Z3]4zt|lRAFP)Ȩc4,ӧ2c., Tzkc{r5|Ϟi;**T_|ڌiӦ1mڴ#?%%%KtJlX>{ԯ~F# &`SM UZB`lxa%Drŵ3ox<7q3|u6E|TYxmqT#uBoI*w`(58DNyb}7^[Mp`)#)=-K;wdX$wzz:lٲ $I4ijj">>͌3غuk(Bhh(~;w}Y EQߕGSD(j@v_X6zSOBF\ݚ9Lf̴h#x|RjI$HOhwe޼y,\} ,mFXX!!!xƎHǃbN,kr 'pBv͚5kk/Dbb;67ZP$qngap]qˣ>ʭ:nZ XM8$Nz&> aum![uOkP2=IA :eSS·!gW-/ B~Yq'%z ''I>}:Vj/ꩧ~znO?O>JEMM QQQ}C_T Lzq?%s,lCy(nO"tH!{\GqJr̆%>~#=&9iI3޹&(* em,]4a$2~ፍ^w㏟}7o=$$+V߃O'zP/X݆ށ1#GKuS,5ռ| 읟LHwȂ`g [ ƑqF& ?mYpJ BE^_^{D̙3ٸq#Fc9=OP]vqI'G'OTvFynJ7l[1KԹ#pkCa$IKzUyYp5dhX#ibm3X.|(\d翟B4}1VC%EM&"C>Y BֿϿ NӕB˕ޚ5?F\re'Nl9//O$lҤI"-=lsGkkqVdo5 QisuSZ4Cqx;%z! T$dԩ~Wں; YR!y+-×$IL&L&Hv;UUUTVV<O+7ٝޣ<jZ$p~]iB^70MFF< 9m6|-|8g{Yxŵhk0ιs&kEM5~[GI5T}w4zEЇ>wV30|̣30OA8_2 ;vZ1>7K?o?|Vkaߐ}7u8F5D1̠ u{FG[gflxF'T35R?I󙝞hbJNdwXXDFFLhQ1ھm466]'%Po_MZZ餥gĜ>-C9J\Єy=g#wM8X+<"9QWHo)Y߾͕ج.~ueZ{?:(_q C؂xP䕽Ojj>wc;8)Cu~ kx-KǍ7L2{vpZ;۷58yW ՉBژG +4^]߭'N>[&a(Q=E]eyy4jxk %>hm([ j;m3^M M m .b:uN9ejqKjgա(J0e""":$M&x08?kC z4zv^UUEUU}ZT2220a:H cxjlxn/_r81ƌ?g's;Ͽċ/G%eDF,mFX)җ;wvNt\]w=ᅦnG&w |r 뛻x|g10\K;>>&rs;͛9R<h$ yW+*ˊ;:*^ŃM7f%+u!VyxN)x7pqXV $e˖:>Aj53mZ )ۍnfVeee\.nrssEq10eRSSwȟ4#Gn_,h "~ҩJbܹR&g~̦W_@D맵P[Z0*o4ia:>{a/^MA}'<8qӼ Sb g{gǃIcbjTneNO;= x=(YInn.uuu|לx≽p'pB)tEBA<./,T5RDMx_#IDtxD´lz*{(3 4hwRj&, /gff 1JZ-Zm7׫c\.",,ɓ'3uT$T(I* hqZq6M輰gꫯF} ݺ7!$Tzq5HČS$1}=TzKQwI"`%&gkk 0m{ZB šk HFNn/ajK477yJw%-2SN%;;%Kꫯ?f/mٸ[xk~,XCh;F#"- *5%UKJ*QW: EQ+adH:22zzU3r5R685xz}38C,)t:)**"//|x$ԩS0a Enc4$ EQY WC?]jQgA0)̖绷^EQ(K&IxeZӯˆqQlhP<*nSN!ӂЇp테 ccT`$ q ;|HqA']рMvCkSN9}ʈ.,X?~$I"''\6la1K/_|?h;n61 MdYdWo>"&D Rɤn*4H-R|v`0@||#$6 I->|8['uw2#a`Ofq⷏Zk'3j9 z'aҊB'x"8wep΋ Xf ]tN=ݦmmVŋ裏#' Ł-{ۺ}4˴kc:||PUJ>+$Ӿ`^+<<\$azw^كf;c2ydLBBB<"EV~bJ c਄5z.M]|:\qm\Eyn>j͡$AwOo_# > {n.RvIpt:n|A1)N &uVQD{K IO;9X{S)q$ eWQi^so=L$N4'Т%FclWlly'C%//,rrrjqDΝĉƌa@Qrrr?~<;Og8:/O fº'`Vq\ࣄDOCnk5*Nv2E[! -M%}#J'"?W_oCJbڴiWcĈIZ|9O=aaaI&u =?l^_O. n2koVCrwjk݁BFL#3EX}Km/aaag!B84鍈̙Ì3Dm~&2:_|1* Ʋo{;H%^N|֫l!!\#G&)zdXMO~5*Nf23D»w]UIEEcM%ۍQp79|[A>\ss3uuuALL D!P\?@ߣjqlA.lU=:d|65l GPRv(]RP$Ш$f01CQL&;$ccch4 0566{n=c fΜIff`jo"D쐄h߷l]5ιAFNvXA' _Ͼ͕~4^=1lh|9̨_4}zCF%Pē_T ^X >6- \m'ŋyŵgnʲ(!b N晏@FQjFeFE_"$2XTk |+QHEjQ5޽h}lP1[[^SJسg-,nZfʔ)̝;~re?Eu( =E,xduYpe#2L8`3`(7roFkGIQ_\M#K{ut4)o.Ȳ ʬeܶ6捜uӮ v8 ՘g@.J \Ovusa'f lw΅ɓdr([gp֊Ď( os~C_* "pWc>$a)DnWjUjY8f\%Pd d^$ 6佄Ov~ [s}=6D[)=Y(LjԨ,ݤu{s{kǏ1l&bK㙓ffH Z56* ZV-[uV>g lSbF}Tu4*5$1 ax$6*s6cgnx,( ߼.ކ-g2qEU(@쭷sUJ8Z7pƛr-.wHj+E>i" pDVT ( $u;I;m'Z&++IIdddAQ*+6 l2 Fdc^ Yo/EQq㘓ffZrkr[a(s:ر+Vz}HQ^/jǵ 5+ψ:EPqY(޵}ȉu۽M F8]>p8ȸߤx("\~|)4aMoY xxĚĢBŘ'7|qS W,!pe|j;N:$6mԩ|`BQd|JYPKHlCLm 𨜂&4$&KeƴbHA%Kvv67oYfqhJ˙>}:jI{9NGe ֯J;%chศcs`KicYv‡GjYVbu6'<ێ%$bxz+R;o/׻i !wЧ82H.l$$z WOZ0z/<(EwJ :6CMP/r}V+<uuu(Btt4 .$##ٌ^jRPPnl;%Kp饗I8ڳg=D^*}]DPjT֗dZjĭPRpkCcL(fMȤDQV0PXXHtttE_X/^LzzH(Jh8K,4*TKcQnË+ٹ~vQs_ 60ze>{n/;k1[ mJ. {]J )テZ4hZJ90h c?L vH ՗c7³'ACp"lJEEE,^|bccyᇹ⋻YXX]w;#J{{?N4D!*T5RSlEb5(2۱I΀ѢPL%$0e\*OGX1 -0\ovؖŋIHHRT('~ˋ"7W`d"Ɖ#y)t@}>-~D%&q޽ [fݪ]'1=_4 n@@֮?m?O?4:ZԈTb"'Le<~rcL2lr1w\oNjj*_}F$I曜wy}GIuc&:8TT5RqfDCl k'Eh 1ɜtf'ӈ/!Azy駩~5׈adY楗^.umhEa05%E?&ϽE'(m'eJ ^J-ƏQԭ\=kF$Bט' }}0#~Wː$/O>ǘ?>_5GC苓J#Ӹ?a+jQjː-ӑ掭{R*QšFqD(.xNcF1598A-[nچ)))\z饃k60aS&!mxi(kR^pKx{5%V}&MdrQ7Yi޸oyŋ Xs=|w۱l{ѢElذdW+@$k?>R:FQK9u';HPFeN~]3 fE7\Ԋp,*81q17&"-$^ꫯ&111Q l,qFϟYNfWDR>wƌ//g%mO4yz g{kRty|L&R~ ر Lc⶷39m80%Hv/}rrr$1c17''G$lP; ^/ՅnNԕnioֳ7s_m[\tPbzLR3M"';6d$mAAVs嗳avݡmԩ",~}QP<^^GD,IA߯CRXt ԔPY;{hX$M:~i5^Xq"¢ L<>) ^0F>$E睏ҩ](RyuDD"!Ђ99jZ#2T]vD~( M)ܚMEEr 5* U#=]]֫LD/ O]թ06PR)ԩL3FaZ(椙Z%^ F~V+g>,e=XZm?G|,+p%^R,m<;L1(I;*1ᑸkwu}5YČ(QS>؛@50"6r7w]Q :BBo dgڵk$+gyW3m4ZZZ$Km'رcپ}{ & IIq)Qt {0o(/@k:6M(3X\*SQc3'9<9 X`7nlOx9+%Kdj[\\̖-[xYf ( $_p'Gm'ս˭JxxxCm)/`5qz.CS>?:](6wM]*! uW|g8)9if&$mAdYfՔvҥK=zt"_^o}A[ۑ@[m$3u0$=*c gq?ar)Sb8bl ΂B9{{Ӝ9zy } 8p5l7KVD a`y'tE$I6:NGKK $I<\{GI騫eL@ii 5n 5$GBBr#jTtFF0J,8&>e3ғff|Hn Y~}}233Ypᐚ( . NGz=NG$L\vw5%E~ə+B3Yas{Qţ,=Q ~u(V1]GM70"hp qNm&WO{qQ0 1O( x F̀IFX,r-^ަ-! \\N;Bh;CEws`>jjp{ ].Za2cث!%cӓLf\Hn zy'ihhoTTK.%%% EQ(--%999~ aᅢ } ^><|N Yp13W,U<@on$lP{y<f'`D E% 4iVx~b'7vx |Ν;Yjk֬gF̙3KY|y2'BഝT\s ?-cv)/+#gnkI[ŋELوSѲ]1OƘښܞf&=6T$AfX~=YYY=?{l.\أX2s=UW]5U2V<>Yjy;uf{$:i$.{',5v*қ462 ^E6::mxd0+?U[1j8v?_/:c^̂w/ʂͺ N.2h݇+))!//N'3yd v *Y Y(*(ZxS5蜡[i/ogƍ6BDbJd昄v\п + Mnn.}V۾,]D&Nvy}n7"~"fA}ؚ۷E%&q=3-6\vCsIDSR q汌~%aP2g((ƟfI,J) O[/|/ |\B d0T'p֭#,,,!{#_H'n:x<dOL*w&Lk9ffz"sҢ+ۂ B`v֯_Ν;{̙,ZhPe͛73w\T1N؇}O 3GYZTMq!oN--ČJ᜻JHdT u}2 W!hw,N7m7_}5q+n`D 8E ?n2õCX|`zM$>vRzꩼC.٭( :幍l|{.VU&UDKƺZ*$/Isi0=sRÜ43i1!"- ?,.]JZZZ";,駟dɒAsI!MeiÈd"갡xЪ"w?߽*gc/K~ӏcx>_~w$1=;A 㘧lxYb}!B$>7˘(B}u-zENŁF4PHsP_tzOB\jT6}PK # hRob?_ć뙓f&3̜hREr[Aׯgǎ=ꟙɢEЈE˖*;ѧIhM螢(bx(lz#_0Wস\-_#kvMBiAA@&xe)'q4$wD[sm'E]ĪUnCپ")--;.2CFlM>5fAAx3) * CFAo*ă:U(tEItE&̤MbEAtXA̹;(ez .`rZ\Ts x|%ث&Kc7A8Z^Gɢ;еjĉ'@d_7_AjyrU0CBocnr3Vh^b?{Uq33 wMDBQPDXEEEa]ϺXPQ셢tPRD =B $1Y0w er'3yܜ9sаŦ7w&\GT0ytn !p /߿2r:x(;vH{m:I([MOxpL0!4VofPǍQ/]GP9-[Hl{cw!`=&Bؓyj 6֟ lg^/Ţ궰i8Bkqqq]#t:H~o'瓱(; :B&D!ȱÙسj%G܇-[UIy|~JVzP/#O N5XG "ƙf]/c;ut!jOz,̽FuЏ$*NwvWGK#t:Pٛ꥗^_b$x&ZKSG1VxN})z=:ʍ[E1y%r8' |7oZ;ډxI6iL@BQ/s};u YX,}^x |OGGfco|ЩϣsԁR4zF |bD#)>sFխ-.Aq2aGҏ0m4Ne͛UwSGq6OXkخY.:oTz_Bvv6f׮]1b]t`ڴi(l({Sq…Z$''$8ù IPZD+/$+h {Uk 2iTߓuܺ"c7ΜYaaC=JTU2j(NeRs; k#}.Am3a {^v<-ԧcRǹ\gw?vU>7Ք)S>}z11L$%%wl'%%a1:@wtV95Ľu. x]hA1ShIOܬ$Y)V9wO w`" !7o߾qss ٕY,f͚ɓ-e(V+ $QwwDq2Y>2Wz+oTbw.ӷ3ýQݺCG\ݲxwﻪ Y3| Zmp`spDM# \_~޽>}sNGǩ7RL&p /Q, 'q3]u N4-xv=2؇>:ޭhP:B{9tk׮5k֌QFi6H}g:A< jQFtԳgX0w4 ?AwP&XK?޶̝2))5HؿEЃ"be L;X'>!q ͯ}!:={6O>$:#GЩS'GGTQQQl޼ f.\@BYO|j2vMx3B:}=4lF*yM4(m"S[f:sU0 XB!+IIIaŊdfVVR9VZi"ʾ}իWXw٤/8% ~"h8t}YۥsiޒoOwdy~[vf\wGK9wWdˎc云Xw1zPA>L&R_<6Y[Bŋ>4փww쮳?:~Xx&/$11 .`XjTUN1^7's߀ΌL XgIOwO*F s[!RF4iWĉ6+((`ѢEz\m|EZ)J%cQkkdoѶWn/[ZOOiM]ٽeNw^ptz+(˖-#55,^쥡Շ/<槓g4RhvAi}08 -Bnk'iޭm!NP;v믿rfN1b2='!ŠktxEQ8Snls#or sދ!3@WdnQ[0>r<^5 6^ӻ[qwm3cdwSrWS ,@]m۶JިQ8|;= oF]ǙrS(L'1ςV3&d}4Z{׬0jz>?GtcXB!N 7 H=~8-h4jjozB;1O8-:A>ImGTiI]pT_-?_E8!\LzʕmB:Vl$B!ÇvZfsZ?~f, 1׿0ԧ:}=N޶Yo۫/w=/Xi. w7 Wzq2Q{^y4#q# !Tԗ6O) B@sg.T:٭u[(ty뭷^ٷoQQQەreo@:uELLLt^ݚAI#74ϓ^޹AiDVnDtn !ŋYt)yyyBCC8q"ޚP,]^tsJzaNJ^f1}}&r|{7<5 4NF#}L֒% ^P&BOmJ+Ȁ/SWأ.aWӓCһwo;.] ѣ})NT{^fi}t>ݚ⩴" 9LD&iYDsZ oH"G:B.<<~%KN 7neЌ~ʧk>]CChI#+ֲ5z\q2mGqD/9Z?-ӦGɜa?˶[8m~ {(,)_/=ttaGSip;N!jA^paߟ-ZЩS*uVW^^ &&Olll/||<-[͞=UVKAAx<#ocZdXhڴ)/^dݕxPvg!1л7ڀ|#z#8">a(64"ԁ%(ڶ@D ̵.BuFիW3p@´hX,|[zK*g";jϟ}JUMZuc̫ yZ+t(gGEt֗WqjSQ7lO;{!)?mY9l%zL #Eу?f*`Ĉj2e ~lڴnmrJ=7բ;9&GN'w_ qFWDvX۶w`z !B!HO<˲W\TZoܾ##G*2b^2ԏCӎ5槒>YUk;U2UXp͗mW1DBGvI> 2`ë:gϞ;(8q"7ndϞ=̙3֭[/'|%Ma2nܸ*?G m?˵6g<&3!h1+@qyYrg$#IGB!j=i(޿Q_(Nʻ΢ iޒ۞xf©louFn z([I'8圶X١C 7ۉSzxn9琜Tޤ#z=qD-[ƩS"::*g%5v>y1x`xطoڵ>СCӲeKt:]W7L<UڴiË3!x)fkX4.^҉[:6tn !B;III,\(9sF>]B)$y&(%`s6fhLqqzf}8ғ t4~MʮGDh2}܂NTEO PJL|󁶁D6O eAASJiLnk~(f̘Qxرc:_՞l0`PiLN8AN+wۗ;wqFnvƎ˲e*s뭷rJg e6+V`̘1ݛݻwWu/]Bz~B!Dm`޼yF7nAҡbWVS Qt&|[7aOtG/8=7_cmoٕ!S/~>Y,VV<@\zp?Fxz;.JRfB)qM a{Xs|\{n!TYgtF-pt"giLjeb[k9ruoI&ohт֭[d}ݡ_)Ln|=d!B8^^^/h4ɼy?~|+cZYv-wuz}*.$}QJRoO3wEV XTLy;~h2AϠx{%EX8Ͼsws>aB.*';)=w/~wۻ$;AɄH2`͓á=%J5uoj:k5WFF6l͍ѣGW56l@TT;wJOe7 X,EAQ,mZZWQ--SoWߧ3}^9GϾĒ%KR,X}NwLj}nSPʿ.!>&ut߇n/pKogzwL|aT[J_+g]IuONWc g}ُj7A):wcِeu1qIxxS ֝`Xwc=ʏϢ:~jzAvv|ѣѼy+YcǮg}fLhhh^CחΦ4E,F#;X̜9}:fc￳i&-[x0\pٳKWi߻w/?#}]}999dddgիWf͚c矓Fnn.~!fʕ̝;dL&[:Bɓw=/S͛7, ӧOGQJ3[`Pzak˖-,ZӧOoS\\̹sعs'6l`>0k,Ǻu9x 1YYYdff駟j*֮]KLL _~%1sLܴb ֯_Ϯ]W+Ο?OQQNbɒ%l޼m۶7jeXVoضm7.bdN:;CQQϟ端`׮]_s#!爪#V^MJJ j ٰaC|QQQ8qޟ#L=}bW>M{=c9Qp#q(<=L׺9bT-4>ePE!zuXz ~G 05l*]Cs}l۶|9G\mn]H3A-?kL89z=:nn&oߎ?999WTeiZ"##O\|/\~ 7x#;˖-cرUzn8SN7 Nb_aZ ˮs߲+>e=-Soo}9&9&r};&,Y4QFL0//j}f9s0ydzzXf.%|'A;_.Ǥ a/أCu@nӱ^iG9&}LV+_|O>d>rLOڏX=zC{gl& `Z=gwͥI&F:tP# Bgwzzz,~z )Sʯ[BBZח|||0'B!pIHH(ָqcƏ_ΥE!55]If!Ěg-ě:}' He#6ßB%mjMz'&ͦ l T 1WytNXϟOAA:^z4b0L_{xx\uOO˦ -Z(R~B!͸qXb4mڔx‚}m?nA^<؅g # Q}Fڣ>]Җ'Z^5\c>ž~QSE7\*p3p"uNb0@(۷oF_yZj˥'뚌@ʓO>iNs!B{pwwgDGGӿjj2k,y R&~N(2PMPDGGU7מ').P(d3ɜERޝAƍ]=>ut@L< wςoR~|-]]>"^lKgEt[U:W^yn^߿뼼_ߟ[W͘1CNB!Sc `.n޼y t:<==iԨQ^GKxx8^{-cǎ{5Wk<== #55s]uKl޼ymFN:q sTB!( Gs2Z,^߯@ka_1NVw&mOVoY|1F!Eqg ۋNǒx r@*a/E"F::$i@ϐzb͘^s%lqgٳg+l+[]sZYt҅-[Gbb;/]dsZī@.o_6mB!(77`saEQ8|0rR/|eoDkzҾJG%HY3I5w]PeiLL\եSlٲ~ /={l5u=J||eeA!B8lϟϢEl.;vl@ IDAT@ QuH 4GGv{Պ e~K 4N-o7<`{:?7'a"ۧ QYFRf8?SdGrA2B>3G$mnBغS mʻ<::h{x:cȑ_W6۴iSC: C YflLa"B.++ EJJ /d2UjO?ɢTB܃Xr IMAhj0/Ms?sAM-ӱOjMQJ392۸&oߡq"Q]ozs(eŭx2QHkI mjn⦛nk׮uFdd$w}7v/Off&SLJ⋚flYE!'##_֖pK,Pe=_uJ8;%JcX d9gO=N1́}ݺYTڻ~T;|x2 cSƉ{0BNYOy-&&vb>p`B<5ÿlLkHةi$NӳRll,ef̘ɓ'9s&!!!5??Fr'**t&Nرciذ!'3f̙3<|-EAA~~~ۜR!IOOg…FڬY3ƍ\bUHwպgB :+5oo1K#]ř?X?jgkQ48QJJw$E}ЧIkJTjfĚ=ZϸچQ~~ژ!-Zui}l-$3Zox_sƩDUh0iأFC.EAY< ">>O?hB!W?+NǶqF;̙3Zs zO!"yu#_/\Mϡw!RVR\ĆYaNN֢~Ɖ[PO=e~wQ\\u ʡ+ YViOz!yDj ϷYK_[.YR!"--yQXXZwssiӦ'sE9}/wuF19s=ǩ q*!#;>6°O ,P)Mվ}{_B!pF,^H&OOO{1J[~3[Ʉq*m)Uk|jιGUfz2JSSNѾ}{ ˞?'*o@]>8Wç1O>2B!^V~EEE,]ɤa*!KChѭj_~܂pZv?~I8s PP={Zs:!x6{ᚱ`2[\F1B!+ںu+[nYoٲ%ƍMBMnz L C&=E[o8OgÇTkw=OMoS9x5 5 ^JLrAFvZ3h Y@!.㦛n{6gϞeݺu2έAH(6o!/#]Dڋh@>5ʶ=^ Z4njM).&'YV6m$~.T=b-,!sI~KrtQn֊MF6K;->w$ kwK'0X+!o& 8ºup6 &[ڱc]vUV=>GGB!777FMHH}n5LHLt9$I3)w9;iJ[> ONN!沲CAAj]3~xZjq2ע( ;9,ahI|Nľ߳m|՚?x/ Vߋ!5!O~ݐKLXw$E'N#fΤᰡq0 ˶lВ^p47|ĉ[iڝz]-.( :EkMժU+:T[!$%%1|L///~aBCC5N:2WGjͫS"kVe>Kʙ˶rO.i'5!ogĀʧiz0T{I՚{DST)~KR}ͨ4N$NQiժu="reC8NBB#!BԚM2bB.]J~~\W@H0'Ǧ7ʷuy~8^tth@MTk+;;q"[Ukd.8NEz?gc*1iHiѢ#_l_m)ʠT{IC1e^!B;lfʕpIaPb[: {ǶE3xZtё4uWkNO0\0ģ4d%gɏ *wڤϙC{0TuZ k3qk+MNov@2Qj2}t^}UihIQjXR~7zOrl6ViLk*]@ד#Ә!e)baÆ ܯ_~ tt!2]ܯnCqvYnV7]!.MQlق^gȑw͚5dddhu7%htž^2L^G1mOAN[HATD:X̬ ꒲6hH;?w yNmzB1B!(;;sb2/#<Ʉu874N|F#qNIZjݵƩv~^UGNg~P}d~IM;O<ɾ}8}4ѠA¸k9Mu3gΜ ?dq!Bʶm߿?z} ,Ysww-))bݘ +.{ͤ3j Z󉊢rm4^u !BԂm۶ 0[A5ku]A:!\#iӳ߆Ҋb+i?C:j=p!E+G޽lۆM79 m s+(֊ݳX;WVGv>|￿|AEQtW#Ha0xxwj++(Gon!B:ʲeˈU 'NI&'¹(=;غx a-[;:VX{IS ǻPS9~c<#;T!Y"왭^krnZ;111 0ಎn///z;߿?M6%%%{?≫0a͚5e˖=[!jh"GzFAÆ UgXXr%FQNalUrvI|7U}<4ʯq nzf}XJTFOo'o& lyny?mO'V:F#cƌ!++ (>|87o&//i&֭[֭[ILL$99>,[ٳm\jrB!\NwުmFes^˜VZ%j49BdG5o,za G^=114Ҫ{M:I3qxkƉN#l> DDެsc+Wjxڮo(. 3gΠ/?r <3J,|7jv Zq|<9kjH؃(D'F3j(#jjmȻͭ5Sq\Utv_=mРWYfdddm^{5 BfXx뭷T.M\\\mīVǒ,tX\y"#Q^}iѭj ;ݫkH[~zjIs*K ؞P;y=SY̏$&8:ZQ6ЀNCfS~`$6 SNד'Oy'*̙3mB!pzmNǰa ܾ}j#^`+x EfN'/Ɖ=t:n~pzA~5dwm]qTv4n/m*lnLB)6>c<ۭ}dKe7 IG C9)XVD'&~ 9iFgcJ*)"CdRx4{ d:R"mVgަoQrYƉum-pRF$'r>c`1z;s2 ) {yd# [=GGr)lQIgPg|8˖-o߾|Ͳ0xw »[Cmw &`X ~J&j]rptx;}F7 ѱ4F[ 5k¾e|'$seSgķ__B|=KTuױ ۳;<2o}f&6)$@ 1&e 꺮﫻b_PTXADtAAEJ!@( BKH@He2Dc@2L?^s]|';,w=] !!ށ ooox{{\_gOB"7YeYsvW;u9)򵀞3рFl& eLo^{}׿Łn׿AAA s@7 Ʉ%Kd2X؀0|:9WefٙW%pBظA-;ײ⁓kc,2hӦ ӛɂnAAZZZ""""{#Ii("66>>> UH>ekcS=NDDD힇(5/`~,RL`3oᄅYIZ_b۶mغu+F*9l$H:q Hl_KO4JRٗ#K| ޽{s)"""k$ӊ< m۶q=L(ܕBZLBBDK߇9;2lQh6G,D aCKLe3Y v `„ 0Z'K&]Hy7nP;*=AɓNHHH@bb©lँPٚ g‰^ZɲREn'ʯ*$JW8qÆJQp"jyŨq&Lۿ *M*]jwA kT0 5փeoϫW _c:b98l+aWu?;`޽HHH@JJJ/ɖHw1|L&cYd§~Z3d p"&&Bk1_VѨ\=2TTqɒ[ 8$!1Qd~-[DѾ}:?XhDDDDB$$$$s?{ UUUq 9,n޼ioCi&o!!!u.\„FٳXnj-Z`ȑ5IsN~Hm&ƛe( $O[w4]dk2)69^ޓQkNt1CV#GND,ky,b˗cٸr &O'NDDDdDQĎ; G-dkt‰싩 ?%!S(9ғkK\ 4MVQZ3{w*H9.N>l0)Nd{||0aW_)HaY:w\5"33f͂뇀 Xz%b<==ՎPNøqqF]бcGtiXeB/P|*_'K{_N}-7ibwl}jۏ3~ tv}c쁫dfqJCh?fs Ї0:%{/Zz*B2"eX[Cd)ds!5Mdoi]O$IW_}Tq0deCٸ-I(=z]5=<) wszp"2cdk_6 e'N dkޏ|S@ԬDIfD69%-. IRv!u<<@DDDvd2?G?l=:: &}#+NDiek'n~}NW0mr.ݺ SA‰9$$`ᡅQ]@#77""""{#Irے|'W>,THfL%U H_7z1@rhI0lv4z)[>u1O\RUG);^M{@prR!5Tny.fo09MCY9ky* CcL+ R/ ^Ƅl… K/5Q[mc00bٚ$Iعs'kAКw'xME+`Ԋ6÷%Lğ?[sunhY(ΫP8mz̞-[BѮ 'q񁯫lm[6W+Y{C}/Һ;|Mpf7 *hIJeP`fYfs ]b%o054Z5Yҩصlm10ٖ<$^ͥgO|_܎xЫ}^\ #x/^)8,&,,3ȮI˗/[uqƙڵ v_sӸ9sT[t O?WZLTNd[t>>z`l">qND56d,8|i-} ..^ɓUHFDjub~NW+/6"d nB2ݢ חE ⍽텫N~I-_3}|. +|ժUڵ+>C\|(BF_Hy&IDDDDgK"""ek'ODVV‰Hm=FAgf 33y.܇ }{ZClt7-fj2EQ;Ÿ;kxl-'ד Nd[-IfGюHY5޲$`k?yajg̘$ܼy#G_JJ rrrPTT{bн{w"%)Ydys2&DDDdDQĚ5kl d\rEDTT-IpI(D$!-46ػz9J Վe1=2[;?C$kth̬ ~=|]Ş,dSO|- pyy,"ݫWFII Aqyfy"!""ׯ]voF|8P{ #GTqƙ߿3Md*5`G2pGL67JՎE &\:z߼6-֬qo2s,E;{RNg(\DEkp׌T=p"g=YN}|}?SmEW{k2۶mFA||<.\8A{3kZnݺ]/33.qFrcH" 'PrP묷*&ƒD _AVrRPUa"gwK}M4Yfky|`"˱Ş,d x|-7 8Z<" @w}fgG$IXf ***,7-DDDdDQ[oes=''NDǎUHe4*BA{y|7TEMwRۭp"n3QUQp" !Cdkő;Qp"e=Y `fwr]bkv :ԫt揬O2PRR4{FEq"""kMz^H6˵/tb+!&wu}&֊sx‰yP v Izwb9N[(GFшݩ1w\y6^ڈ6KuD/$ flfb-Zki=~m^^^3;v,77""""&Ic=O@@"""v'hx_wV ^CJh*%;hdkhwEaYeH?w"hfև:ϟ-1GL</G7Nz{ҏ(u{Vk*`"e4 vA$֫ի={>k{yy5k>UV!##u.jG#"""jO=O%k/?ZB㡇הP:#Bealw t6JvJ"2/]P6z _~.s7^ggY tj-d DIͲn/*FdJ {2k_C|-; 3N<"~Y6fB?k֬ARRϞ=?ctڵCѾ}:?XhDDDDBEDGGs&P3nh=gs۲~I~yȻ^p"ۢk!A؁(z 8aR$x=dk_̞r6f`wDDD;vԩmǏ$I(..ƠA[o!22;w믿ÇvAY"&A:_|QhDDDDͦBdE 8q֛=h.'M%?›a}_:5{o|<ol3:ΐ]̻3gNd=Y~]kiGuF YVEEP\\CСCu0}y IDAT/_F~PVVIjgzv;VŶm0~Hf`0JJJ.95K9} ?liN I'^\kC.9=H/J'׹_/<:syuo4Ob1c\"\\\b [8q"nЩS'DFFϯ*I\֭@J}QBDDDvME|vTWWRD /|Fe}.!U")[#`fϳ;xz1"o:$OGC퐌FlS`7Z|9vQ hZ}:k"ÐրMJrf ;q&v)F9Y~UޝCflܨpjN7Jo 0U瞇l`'v,___#Y\^^,Bg? ???4}dkƜrTgs?[q`|[r2N֮_)D}P܇EFčmI4@*.Ʀ˛9q3~`X+h=sa"Y%72984۷kqI&Y<Oo!"""&"6l .]}q\8^c9mz0|x?k1v? m hKv)*Nd[ #GBתUh0DD hrtρnq Y^gL ?%R*&3Cki:%$$p""""k [nyAZ! -_/ O.Cדoi4,FTAj`**p W;5hj7c^y;=ݓ.$Sڡ}\goK{7A"""k W^yAN7ߡ?\=dk碯qջh1kZ>4mFN֮\Ñ# 'R{'-À~O* )n8Md9bCDDDd'L&>K4VUj*n.^Ĉݫv"Yu+_ˈ.P6p˘ٷH֦O޽{+6IPz* 0HܩP)5y Yɉn7@ժv,RԻ]5ŻwM(;qv!Cnj) TZ;h'X 1!9s&Oo!"""&"~y FcÇh*A VT0,S!5E#do/ŕSAKTE$R8uQ33UJE$Q{#ck93U6opdrS"""k 88z///w}\xQD0D~JpVt5:'l̞H(]w{R&w5m|APeaQ{1o0z0+W&Y|$"""&=ϰa܇W:l}'dkeq7!-p5xigPp>~5Z n%[N/FvF‰lKpIVO|A$čxk$4+GyȂ{g1+s IK/ ȮL&|G{ׯʕ+ 'M ԛ-`/dk=ۣM4[߿K$:T~.pv 3dkt:p"j,: bkV|{TԎl! u@+/vە`ʔ)󃓓1uT8pя_]ˑh4< 6l &mnAcp;k=):Q#vdk셩ZDsC޲ocw5u*߀NCMq$mO>AFqFʈR1Yr,E00BGڵk۷#44ӦMC6mm6DDD`ݺuzj;m戈~KgfSӑp"$47^Cx+hmA@ekeH>u\D1QeeY5e+ƶ|}a!NqNeܨ Wl$:`=Yzډ/|EpTVV_ رcbbbi&aݺu$ /"Fc󩧞.DDDdDQĪU>|ѣGLbt>.\t: :gg};N~pvVR&bYQ8 5&Lv7Jo(2E^{8`q8mQXXbĺk=ܹ3󑒒rV /VW^yš{mۢ}/"/Ou.CFRơ} zNEk Pwb19?`{53l$H١p`C`ަ6O=n;,$ ~^zqh"""k$̙3iL IotQe z= u{Ld͇=Y>:4vہ.]M6Addd_K.aҤIҥ ȮIK.9| Z\\***ND,ù{ sFk'ꅣ!xϐ_ `j A0 x=҈v$tX=) 4@rXx1f͚N:A@F?|plh߾={1Ev/I&!<<> 'x3g}w%"""h;|#ekUUUU8zA@O3U!9‰*'pI;q]  IzƓ=DKזjivyȑ8|Ĉ5jaÆ HLLlѭX*bbb 믿ȑ#`=;v,݋@`͈ OOF=ԩSq5Q?гgObbb`٬Dr6 _QxϘ.{U '-S:%/ Q%Y<(r{ܹoqe#** ;wn˸yOzj73<'N ,, gϞ}%TrKOwذaz7777nD߾}yf޽?۱cxz 5Fp<ZVv1؇JLw#s"2ԎD t*)FA݆/e".R8m0jlxn '"{r$*_`f͚&rEcO?@)#cu;wnm7nDuu5O^Kbƭ28/ OW%"""f2g=zeddի ']ƛen2 U* aYr:jVa]Nv.jݮܪ7]ekP89Sv { Y?'ݒ$رc|hm@F`"$n]!VQ~6![{8С@H j'AiQ]>'>.hҭ\ߥMbNw/DAxkTQj^7&m߽syl_w l9Eqmub {%~N[{h}/ӱ! 0A@:\q v7Aee%j6@y^z (bƌӧfΜ>}(x7ѥK?fYYj,((@UU ;;$-))P~~!qM,[ pIs[?K.E^^GΜ9͛7Y˗#++ Dذa`Ν8r`ժU@UU~m@bb"֭[ؿ,k"99$aѢE0LHKKիž=538\t Xb|w_sŋQTTccceO?X5械K,={6ml۶v\~eeex.\~ ؽ{7> Xz5a4h"+WW_ꫯpE`4^>|vo.\(++@۶mlڴv%KOjnlR|FQQ/^ w}رcG)+V@ff&oٳvIիW#-- & -$IHNNڵkԜɱ~u되xQUU Z pܹaÆ\|JKK˗9c֭jL9sG!??yyyXt) ..v'O,[ 7oDqq1>C56nѣG+WĵkPYYwype_w^r4w@]?'eUX$Hd$ ĸ?wgqf-[ϖA#I­aI-p[{8}4֞[k5W!އEbS P3٭[7`S=s_0^ ͭLDhuޛh&]{ڱȒ8}˨F vgdd>|xsߏѣG͛/yB[9s`_k։ogϮmԩFee%>#TTTԫ/ Ϋ`d{.= @=_&rLV۵: `(ݜTHe^ŕ1cekO=p"jݩr˲G| '(ް!UK*d~: 6~n›հ IDAT=E25 F9spvvF߾}ekyyyҝ|\Łny0P%jIn*ƶ胂گlp6Hf0v<\٢p{ǞT|T D׬ߎ&lz{=50aB)DDDDHEܹ= 2;H{eβKn(x=ׯ PczL ([;y99 '7yHu ofVnggg쮞qvSʆlhi :5 ^^^vkKII"g΃ekׯ0LDsxNK$X\;<*0d5۷`w@;н{wj.GEϞ=Ѿ}:?XhDDDDB`Ĉ<lDs`7\;zyp] +W^ 1=3vૉ_Ogu5{ }Z~2O7˷᫼FY{}f'Igf.kٳHIIsyE3kɄ+Wd2j!((H_g>"?>,c7 ‰l4bi)Jn xkƯ;|ֳڱ=Yu}jo&zk\vލT)Slni͢о}{Թx{{Yh4?"<<\vɄ'O*FŹ~P40|8^^mNCM1"hF^=YfVH;r߂&֭Ofɏ>}0|5o, .T4㽸~,U+AU׮]ef&66$JrH6fsz=<&orXrL}/zmܥ(xwZV8VKbسgOZQQѥK6SQJO@N@!h:UH>}H9} ~Վ\ zEʙzS71⏝=)SP F#vFR>9>>pvvFpp0?XlM tVǎAȁH$< =zԹMӡw5j:lXjDΗ (?[gN0Udm~%^g.>N gw/R8m4xM,[+1‰!28"퐃O<$Ijܬ<==ꫯ"&&@jj*֯_#G*C5"55ޥ@hDDDDB$:t-[b„ x1}tvh=p#[+; ZDFgbN NNdk y(/R8m43 IBQeÐCbCViZaroEϞ=Ѿ}:?XhDDDDB'FÖ!0o<<g*Ι2IJB YXaŵzmVkJ^[֪EVk^UB ! Be2fKJ:dc朙3WL&$C;|IH>)ո!zOp/ȸdAAµ=F=ď]CfY*\;yy+Md壜V^TVVxwu4""""p8y(8Im# :/P{hM!H_Bv!|]lr¢keG8d4$eWP1^MNީo۪w;ڵ3*ӨC$/2/@w[ʉ|Q&:wŰ;8pOo{]QGZG#MQ¯.&]v-DDDk,K/eC3/EȢX|{bk`& KTpO Wcx&&"x<wnwt7r/Zһ`C^mcQʡࣜNtp^cC3Fysp,e^'\;[Rf}_7#jEQ&ceb4’gAƁ F8vsQ]rcC^-,Xznڷo o"""5Izj"wvFpK-ظ|6Ɓ5IV, g9=ظqLQ " ;.B? pQ466kzZҽՋrMC:R*\ňMS9zu^W㺙aU0hkTyWK@OOfPضmӃ*<<\DDDDDЀDc$Á?'NG _FɈcBb|;؃5w Y6h̳Mžˠ8e5M65d*޺`LkcBB\s ;~}!eA B&hX?a&3j ,\zjj*֯_f8 hyf`fmѸq1dφ3GFF$gG 5>ȦD 66Qu=zT8Cy_Jڶmdυ~ɲJ>o…طoL&rrrh"DFFj˧.f[<^D4Q"84 }]Nk%k5HyKcq&Z1sA|`9toߎm`6E4yȟIBwq_BDDDp8?5E ׾5<øIppm܍ F#f-_-\?>kʉԑ@x]ge2ƟMňF7t}ݮQ*# 555ѡu4""""$ .$IZGy)))0ыP| vΒr}he}rudwoW` ф]u𺽹ǎIQ xϓ\yȟMBBJJʈ{NhDDDDn!IΝ?+D:˚(0=cBV^O_*~fhЁVKn. Zm*!w(m/y㚭ǟX8X? zᇱa,5JDDDD^v/c`0h! c1`)3 ! cƄdVѿm$Hkt-ypB`tZ+?քE=,fX֬ANk]?B}zM&WUmCyGf[3zz` ?k'#V!!!hjjEE7EQۋt"9{|Uk] 1kj#O0 A?i $_DDDk5͛7XǏW9o ]30XB`@BQ&t;(jTN[,׻޽cih2BBdm<'TÚ $uVKDDD&2n<f6!\+..FʉԗL<ʤAףLQ&q%SU1e;HBx=)OQ&yȟQNB_9CtpweͣWLQTTr"_&S*QlkMcAVqLF9skq8?de:̼o]ݸ 7gܬj2]Pz:k;=|klvPvv62:[8Kp8ZGYY(u=ph|3Sֱh iKW\+=Ih2bƬHZE~3L\$ Www[[DX?a>Srw]`> A|x_DDklz2@khatW.6[9mј¢c0-mpLn@<ʤ m V./ =!Ś $D$''x :[('O2WLq>8d.Y_~xwwSE:sMb2]pv6µ;TNC56I(33HEAqq1kef>L4?Fx}نAz.v@giSklvFe{E46λd&ȡ$r5ʤ4*QG|nx .FޥrrÎcM~N~.a>Íz'vF[_`n\\zG?7klv"""5Ybxw%yVPPfϞBb\{ 0틢'`,D#mr$f͇1PSsb3@HeYN춷5HENwVh5v3I{D"""5ݎy4jTN{df6}حO>+ f.\nHY >\ PyLFcY'wV9 MҸ^}^'k'lvٳ(1}:z{{lh˧gDy`c/{hhlp\]s2U<—%ϋ8-\:ق%w\rHO te"oƚ wvwߍ$''xcpǗzo> ֯_F$spH]|˵3GD=)A*\:h@WC k'lvЎ; I1k.CÄkGFĹQµ-l΍!u S&\]FY?ᣜ֭[ǃ HvŚNj xwO:GR.9v]DH'nvwުr"KX7ω{ߋ>gCĨuN쉈N---سgN> hkkCdd<+u2q>ՉӘ>{<+)+6qWlAtTti(j-ºuME9ퟃ5 &;w-DDDk,.c  F4;uԓ2224Nzԣ: 5F\BqN$ZEӨC$$eww(v;lh~y8l?t5IQDZX, Dkk+,zMDDD( ȝN^$!%%FQ8>V؂?<%OQ9Mľ^gt{&\b˪ Z9)\EKcv4?{`ݷviĚ|$l6O>bcc@DDDqMMMZGQddd ==I ʈ?l \G]Qi1}V luQg<[r5[q+"_6-c-µehvN$XV:`wL~ k'lvЦM`0ADDD1Y󐮙2$ 0) SIA]Y|)e/tg7skaW9o]+>T߀rӐ; `{vǾ@۹hL~X?IhժU|ƏtpO?Ŋ+ B<'"Ӝ(BD0s9K03g1f8$eEaj0g4uʕ,{APzh;)}~Í1^S7f8dCn \HO@Qs:MREXs]p "gn)1&džiQL)'cdžIAAd) Fb xrZI5j]:~{?5!$t1l6pDDDDD$̟?/荢(hnnFqq1V+Z#ŧ# Ȁ~Zua+gDh7HZG 7=hksZ[OX?aN>,~O>$6nܨ~ """"7$ ZǠqRMMM(..Fqq1ZZZ|K/'$"w1Ș1;'Z֪ [4 R fW ܄\KXӖNX?az!yNUrW7nǯ~+<0 Zǡ1455aӦMNʐA*"򔤬(aފ>F .ҷ/~SCb]:̍ Y$bX?/ """"򄡡!WҥKq5hʷt? [a   ])W&kgՅ'PwGLom#,sLp#qNDDcLc.]gH>̚LJF N> [_i;F6M@4n֎v7o_N~m ǏjsRb1;^ 5&S#X?aⴎ@DDDqZG r5ʤ?q0lbO44LUQ9:dZ6d+(Du 8_zw~'In_ YÃKe|_dc!Ip*=.wCopzuA>UNl[=|f4 jjq}9i $*HxXo2LHNN=6cx0_u&jf=gSE*QGf7Q&c1/_ 5*!OX?a\!"""IF%L(tvv\ ˊxD# Q0sh Us%"'h8dtP,YS9 Ðcǚc2Pn`!">^~~> I.f͚m۶ N>Kȷ̋hiN$SCXшy9(=+q #an$NkOP | bYcǜ=d MT{p}22GxZG]ܰ)b{45R[X#^Zد`CnڰaO%"""]s8xYiӦ!44TQ&wŻkNá1F4UuwP4żz@EUNCvZkGX7 ƀ@Z }펜f9sObU[q8PSxB4H IqhLA2kV=u wm6:t|N>Ea˖-ӟ4X,=vL04i$ltym{nCFFdY$I$i…pww7~_aٲedBJJ a޽".qZlhnnTWW^hh(kGHHpL&owphZĿ9{tA06Lt5 }YxGeAQIW^^chmmE__yf]>W+/cB{_9v4)g3 04|? sĻt`p3g?QfbW7|?ȠdCf6$O6<󈉉ŋI={s Z IDAT*++#ڰl2Ae?~sqX466v\wu8w܈˖-Cjj*x lڴ ַ\ޯjb.p3 /WUUq%dtz歹!V"}Foo/~if#==3gDpp&M=΢o eC<}7W '\ǿ@Bߢ\uµ/< s?2ף|?4\fԦE5?'k%0w ߇ݡ|Ń>xQRR2^|S^xW]uz)NKMMP}~F,Y2χ,Xr%nV\}0I`` _IDDD700EQ IQȍBBBp}!**?I;ӉhuѸŦ![ZM UjNEو~ZmIGz$ 6YTM`Co; =W\$TWWol6L&ӈ|no#СCX,XhѸd2MDDD?t*: 2F`yKY;^L63G;U[A*ϒe 3fEL؍KȊ.!fEO_~I^COO;UVs/2zzzp=< Nl6K^wVid,z歹!VaaalDG{Bz9lF5xiY(>tzuI1ښ4߄'2)ŇU%Э[q9'o8gϢA*v%m%yg\oaқpvZ@ byۧ~z_z%7u uV%88XPƼ&"pމɲHtߗ$i}OV׏_N~O=_''=1^uz_'Z{¯~OQ?No:=9rdRQ=Rd"T؞;wC~mzXx1ꐝp:u EEE |+WyΝCll۳Gii)'qc2Iy osǺӆ F||<^?uhjj>g9)2BUUq%]<6/ܹs/} pANikk<e?QZ)//G\kll~3bg}GKK x?~vL|n""""""""""ylvٳ7nW_HH\cj_:`X˗cӦMp8ZG$"""h_믿)))X,0L3gUxDN8n8qĈkk׮'|M """"7۴i2331k,СCǵ^{F#σ'"""e4,L>Css3p$$$hhor+r .`ڵZG""""r|;?eee/> S];wb ׇ{7oC0!HM&"""]Q$ z-~HΞ=3f !!555Z!ƙDDDDD ׫HUq&""""r @\\Iopp7n\}چ!٭ѣGqQ;v 8?wغu+aZիW&֬Y㡯5_y^x_?'"""C=ftvv"//Xj~M$ց\/¼

|6m̙3|[wOx"""qСC͛7MDDDNUUEAcc#n݊Fdggc׮]FI٭?4ykS__+---xg&""Iz_`ٲeAAAryxw߿{\+ 6و5O{{;*TUUG?DDDDV'$$2Df7#ׯwy;I{zzp1OG#"""rw<6 _= z#"""Ffȑ#%6 PTTX,HLLs~أ]5n8p]w^yIԘȝUl߾.Lj뭭ذa|r)93jߏ&zW+z{{yyyXlm}]L6rM;k^x> 006lǟI%"""8w;NC=X 44 GOOyf~DnBwwc\NkJDDD4iy:;;?DDD&w;\s {n塭 f ,,}܀nqA`` ~ mܸ7ntK6""""wqgz;띌 t_8"pf7d2 ?000/ܕ}]""""oǚoΣk8nBEDb &1֠Q5R4i1SckLmj6RR$BkKLVJ5B$x^ܛH\ޯsr={8}yGvے<*%%%˹<YwbŊ\rۍް y<(vCT^=I>_r=v9[n:w< IRV;3 CQQQ%Jq@~|X=zbcc5uT9sF4rH5lذ^:w'c1 pvx2/V0LQP׮]sܱw5k,KnS3ypg7lKsj:}RSSUB5o\ qu\yĝG(v\nˣ py.b7Q<G(v\nˣ py.b7,X:_X,X,qvz{Wttsy9b7r-Zhڼy~W;;-PȪpwjt.]u֮]@3_~IFE k޽q*UTF -ZTԀѲeK/^<uu))))Wp5J믿n)&&Ɖgnd+##C;1#EDD(000mc;o͛7Z3"ژ [Nҭ[$IE_W'g^ ZrCs.]-[@P@_n+T`.>}cG^t222$I}-{cwww'f~T^=IҞ={t)srn؈bbQ֭ϝ;g>no||ҤI$0qFf͚*Y,}lsy̙Ν;jժTRTfMڶm[_ѣG5bժUK%J6l>5dڬfŋ:``9'::ڡ9gΜG}͛RJ*VԨQ#=Z'Nph^SrrfϞ͛bŊPʕյkWmذuyf >\/ʖ-E[Wxx-[۷oի[nru-[sy<%Kr=|$I͚5S 4ݑ/ڱgaJ+Wo߾fObG,\Pcƌѵk{.99YN… K|&Nhs۷#Goϟ=z8gA{ƍ3g,IJLLTllf̘w}WӦM7oV-k׮ ~yC ԍ7TKٮ󴤤($$D۷o7sssSڵU|y(..Nw駟… Z|C;vLaaaJNNbQPPʗ/D)33S|rUXQ}YmܸQ6wl)RDuQ2etm>}͛6[l ?~\SDDFmu|W^RÆ zbŊj߾6mڤs)::/$wYPݟvv=w׍7 0@6 I$# n|xx_dICQZ5cӦMFffw}#>>fy̹Pĉ61FddQ\93k׮k.bAAA?`sE㭷2$e˖ٳY۪U+3fѢEv0sNTTTqz2-jL0vMLjjE1cl״~M~~~$O>m-Z?G5<==RJ}Xcnj &~~~=7c s5kf{޽k/_ޜ_ڝc#w{֬YcaX|_~Y[nzNe)<<|knnnzcƌ;ٳ6 ?г"99YUTݻl]j{ҤIZbjժeu]vTRիW~2#F0 IRժUsNʕ+W>ً~B֭ҥK%IEտ/}_M0Avqu{Zd*Wl\@@6nܨ *H222r;ݯ_?n???hԨQY!?0>=ILLLaI*QDi?oaY~_&qqqٳ]tє)Sx^Q@iNfΜiM5k'_fM}9sٻwbcc*[lY,͞=[KkAn2zhk.0uQdI5'd|Rl_gAŽ;lztϙ3G 4{~//+]z-غEIV 5?(,ےh6'&&jƍ *}Ot\o"yܹ':'.]"IW.]e*$$ġX;GМ^zcYK.9k?kϞ=?ɡy={4Y0`M'7on?euڵk?qHM,]pfӁ>y wqK޻wJzsTs 1eʔц TdI'gglP +-JR||.\`iơ㣤$]|Y 7߿9vt:h֬Y]vz\rͫW9>tG۸dźIvZۭ[7kӼysխ[WGUZZ.]wy籸 -3֭M> BfTzu>}ZQQQ:T")[_՜;wΝ;y>Ag^x^Zy^ ?P@VCqqqq-WuW^)v>}[sh\A~.^`楥cGz;V?l/c-33S?yܸqck:b,AG݆ahѢEu¨o߾0a2337hܸq:~aÆ.Rg]vZxq湕ɔ)SlcܹjѢEOP mgpusiӢ"7n޼isl}G\v-OãAV^x\7nJr.t{c*--M:xM!}۶mŊS>}o߾8q PDDƍSYƦ_Q4`'f@pt|9cG Ŋ˗\"?tA~o{|||lz?Qq׮]/-(jժ$ɓڳgIR"ElX9СOb7WPAaW_YTR899١\ˋ~>< >>>6m&C 1˖-3ۨ\~]k׮5+-L{{Ȑ!x$)888.]?2AAAZbKn ]T˗7Ǘ.]ʷgϞuhΙ3gS޽{ͱWԩS,6mj3ߦM}oݺUVI,YwJz7 7|S%JdۗݕZܹsG!!!:$W6l@ 0 jҤM˓;v˺52whqօDJII1W^1DZ6= #|cbbu㇭K,X`>6p@Y,|=gAR׮]m+]t⤌roڷo$hѢtxZb7G/y$޽[-ѣG%=uݯ_|;]ܡN'O9sZnČGIDATN7rHsuV-[ 5ӤIr߼yvww9޵} }vրSĉ  0scPxsΪPBixlϝ;)9$22fĈ6= pnݺYfq5o<.Ӵi{GÆ 3gϞ/2u9޽{;oN̾III5jTq7nPHH)=ǏW2e$=Wkiv۷OݻwWTTjرU4p@sCɬ$''kԩo]Ts9v)]ݡCnkN3fprV9+777ZJM4ŋu] 2D_|wFtJKKӕ+WtܹgɓvZsaÆiڵٳ[jJOOWhhV\i7____שS4`͛5|]vMmڴɓ'+U˗cǎwԢE mV]tQ͚5d]pAҖ-[gi?~bbbKzW{ӦMݻ6m*???ݾ}[OVLL6nܨ۷oɳ/A:rX*U\`~z.թS'/_^@(vPXۧ8p@tQM81kzyyW˖- IڲelXláb$M2E111f/hEGG?W^=TƍZm۶ھ}u릫WJmۦm۶94irssէOEFFJ4}|YȐ!6-Lo){:kiJFJg͟?_k1Xbj۶+3&۸jժ c{xxhڳgG;wTϞ=eX\wСڷo^WZh'OWٲesUXX6n蔍=<<_ecs^8<G(v\nˣ py.b7Q<G(v\n\~N?1_IENDB`PKmNkT--SNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_R1000m_EMTrue_LPMTrue.pngPNG  IHDR!wsBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxw\S?WQQQqhAE'gZZWuZjպj {UE Jr& x=<ɹ$77'{A@DDDDDDDDDDTDDDDDDDDDDDy`7y vQ`7y vQ`7y vQ`7y vQ`7y vQ`7y vQ`7y vAA&A&a̙n^9rDܿ]]] |~ޣGQLfn"*]i766Ɠ'O ,*Tʛ9uԩSYdxM> D!N$Rll,ۇYfsΨXvkKbb"~Wj UT9/_,6 ֭[X~=Ǝf͚Robƍѣj׮ [[[XYYzäIo>$''e{[|}*T@zzz|lؼy[3gx111=jժ^o߾-f<66h 6nX͟??K= 6.:ߌ`kkjժ{駟cO0)oׯ_שm066RϥK򒉊$C7(eP(n:L60 '-- 'F)yuc4m?6tSQQQ߿ϟ?q ̛7+WD JXr%&L|_c":::sq1,Z-„ =@%[l|CNrU]tKJ.#>>}6OL8?#BBB ݼcٳgqMԮ][:SAD,,,W_r޽annvm۶jrq>| c_ Ebb">C4`xldhS0̟?_RYepG x5]w0l0|SL\ 0o<K*[㉊1X۷obbbuEbb"ŋcܹcǢ}pvv.&<6Qf}RJx P)/[JJ ~GL>]-- +V0` MTʕ+v={p6mXZZ4ڵkK▖4i֬Y#>&͛u]w ;z5v 022BhhZa˖-HMM5T۷/LL2.K˗∠*Up/hKF=b6$$$ǍmB ={cܾ};X|^Ç:tܹs }]q^N3DDDˆ-Ř1c)<6! 8P/%?ׯ_ j?},.kĸcǎbj;wj2I=zDEDTlmڴI+WF:uШQ#رC:߿7GVlll`bbm۶7oΟ?A>|}#!LMM~ze/^ K.Qlll`jj |G3f Ξ=+igWz)Ν&M &&&dxZ;u9'gi,-[`ȑFQT)X[[]t+[I4h&B>}PzuXXXM6w}d^Sy'Oc?C?˨EۇCVZ\\\бcG/HIIѹW^pqq9QkG<3KʥkעG^:lll`ee777`z>SѴg1L&È#r,߯_?XYY۷oEDDڵk2%Kv|h֔Lulĉ(S-bS q(_[TRĿغuk#^ѭ[7t&*"bS ֬Y#>xb6mHʕ+BZu,Xef̘޾}+kN,kaa!޽;KW^ իW/!999CuA6l h3>>^MMMI۷xb2-%r {պ̟CRRc͛7s7222{eq9ߠA۷5֗G -Z>U\Y$b^rMxZ{]\\Su݇jm}R/[pqq~5nXR;FFFBS=[HHZjIZm۶:͚5Z3 [fnvz- ǏLMMs|MLL &r<ۺ^~-L:Ur;ԩ#AԷo_2c[AG˶mVc3o~TTJ8z~\\wtȐ!B>[n?۠AAaԨQcVvݗ/_ǵʕ+ r\c}E@JLT-ZS]j}Ν;k+t [ldWQZ5"[j%TXX]vǏ*V͛+V?s 7oqo$x{{KZGܕ+Wr0gyi۷o׺Ѿ}{,^X@uA@@`nn cjsdVLtY\^~gϞ'  %HBIh}lfÆ ڵwؽ{qM._ 5B@@V*y-:t 55q...hѢ4qzjL[ةΩqF֯_?IYRP^iTT)xyy?~\\RJhժU[KT|7n/ߊ'N`Œ4x`ѣ+Wøv>|(QvժUZ?l0匌u!66Ϟ=éS^BTT8\.ǠA$g8p5ks?~ǎCllZzлwomۦ\^.7MOOG޽` [xgϞETT={]vt 2$K,X˝:u£GpUDFF޽{8w4hׯ_cܸq:P<ѣG'Zng"::ǏGTTիnttܻwO\VF\rrr'޽{jU儍.\ȑ#QfMXYY5kСCq!biSSS|7x%_Ç̙3xΝ+O,_<:URRWwmmmѭ[7ɯP޿ӧOlMɓ&m~ 0@<}ظq#LMM;tP?GLL .\ÇطogOJJܹs1a\p5©S#9rgΜǏdzf9ZQӸqcԪU pرlSbp#s?|S!4>>Kš$55U/_ b 6hm6%73KvT_?~uIZO5 4&gϞ 'NrڹsXT8x`7m$w)sd9{lٲb#F]0|wj-[ؔ<6i>}ӦMӺ̟̙3-z011!11Qc8ή@g)4& owƍk 4&iiiBJNNNYdvӧ>G}$w#*Ixڇf)ӭ[7qF;w:GR;t}E4o\^z8q8/;033nݺ폎 k#F?fCYnxpssO?㤗j') @m/m7իW(d!('e&+aa:sEđ@ ԎMhҤxLdI&M69O>b7oވi2366F~m۶8q?: { |76mX50|pcSv F)d2.]֟vژ>}zχӡP(믿f*lٲj}ǏԞԉU_ŁRJy;5kE9V*V(n޼J*Զ`刪͛jǎucʔ)HHH عs'+2;vC-&W]S ꥠFtk׮DJJ N>oJ> S5nXIOz2)W_JKHH裏'Ԛ5k+Wnݺϟ?Ǹqyf'%[8y$1c$'44T̍mwРAb`eN*wwwɹ[PPڲ\.G\\_.^2dٳgޏ#<6,?M֭[d|Zz5/i}Uq@HRРAZNߋ&M~'**W-["<<,rO>lj#q,^X-Vҥ1yd8pXGXXZڞw *&b%>>wUGWe֯_?1ذyfYÇ}ի秗6ڵ }Gжm۶mUݻw8t.\ 11޽SH5ǣ\RG+֭[ׯ_Gjj*|gYʭ^ZWn]oݺ#GڵkCRRrƲHIIeutCUʕ`w||uT_5Au`~[|,AmT󦚛# @:hݺ?\ ㏭WRԮ]BNKKS; "u"SSSҥK|F //,L-Yp^)Tz4<$s̓S~([kB 'Չ>cg UX6m8:""<Jǎ׫WOrz4S<==ʼn4_z={˅iThM0i$3&_Nؔ:6i`1faa-[h4] A QWo޼Um۶:I'֭['8@ǎQlYM[r 6ԩSZݿۖߤx۶mprrҩnݺIIIغu+/_  ѹDDTlڴ iii2Fzyye[UVH݄ر#ێ¸q`ѢE TV AAAOOwƜ9s`m޽~zIz͛e˖FjY)1B]g v 5kֈR.>{, )g2KHH6bYIUTA@@>wɓƟ)*ԩ#y}1حZ1Mz''Rʝ;w^ʼn[QM=v-\z.CSUi{?ڵkZORT>h X"L&˱sNjժ,W={&d^jjx_1`РAb;22O]o ƨQ-[`ٲe0777H ,rr}ܿ?[Tj ˗/Gڵu^={ի;w"$$tС@Nj% vQD۟Fccc9P׮]mcǎXp!&O,F>VX!JY&wÇUR{UGb:'N`KN˓`HMMťKpy|b~B333֭[HyRLr≓0x{{2DQLtv˕+'9hCCC_"--ML]5uT2)LZjʕ+܎'^|w_ƍP(sNo:](oؤ2 d\Kнϥkr=z5k;w"((7>r?322,ĵ IDAT5ʖ- e˖QF1p@^@0!҂TQqM¿;xSP/<<$ρnEժUd_y&v ;ܡCƍ^Ν;rR,]T츻ĉ9)ח[VVV޽;QT._lIDK.?fT&L&۷ö́e1i$\rEIGr$L&|wn0W6mC+7h q;wp)1jt֭[!?8``…0`jժmؔ:6i}vt >|8d2 Ɠ=¡CRT 2  ~ \޽{BBBxe  vQ ˱aÆ<c[7Fƍ1qDaǎ2e8m;v֔&عs't邴4\xmڴAxx8ʔ)㺇8qֶK2ၫW"11[nn:qBjժiS|A_5vA8pP566F߾}sUxÇS͗Z5GÇ%ymj3O&R}] >x~:s ^Kꋂ:uꈩ0.]$i/T%4CiWRJRSoeɝD<2{AAApttGӮ[M6B'2(j';͛M6͛72e vءyl.?Maǎڵ+/  %2:k,rܼy@RA9 6Si4&DT,NallXI OB&HE"evЧO8p@<.!imbΝb .M6Z|#y<==ב'OJj>1BL]zaôY54ᨒXڶm+y>#'O-i=eu@fWٙTKIݣڱϋի]-;J%xHOO׺αc4PRO333˒zL9fΡ/ׯ8sڴ0Ä ;wlQɓǦ(m۶q5СC硂i7ŏ!q@-"*&bAubʀ, sRR%4kLc]rwwG:u/^H^7((;vϟV+%v k~߿?,--Ǐǚ5kpuA )u}F2,ˤyܴI&j9\-?m޼YkIIIسgrԂR.UWM}2 mڴȑ#O r:IoQХK~bb"vޝcr׮]~(]N*СC&MdːjMw.>>wV ֨QCR=Z-֬YV7MDZ)'عs'd 6*jժAr} nOb0U Q&"͛7$гgOP]Gur@YUKɻ]vjs!00 ˫ =ydz޿/R䕭-z-.5J߱cGI#U_$MO: ٳgW}tUtiC\^`s\G5:wjŋb̝;WrFO:O.ƍ'޿y&ϟ􄇇wC~ܹ *]vq?W^ )))r,{n\vM\гU7<|ܺuKO-V9O?v.7#0e2x3ҥKc̘1-9]~rbnn]v' \>;vLOr+:tM"*&"oӦMbOcc\MԣGqכ7o>~>>>￵^"b ˬ[hs[ڵkm۶#uϞ=m[Of;*)) ݻwϗɞO'ML{֬YَL߳gO,髯SƢs _}Zxĉ UjAaÆedXh#""תz*wQ^^^ӧ<}t̚5Kŋ={Z.WWW1m9sϞ='j<dӦM63Ciʕ+6ٳNp|2*.;88R5uT*Dj ǏڞӧOW^TjHII1;vZZٳg5ŃM(ޭ[ѯ4hPDDDTQv?D{RTT bkת!N8.]lٲh߾=[[[ݻؾ}ڥ]v^Sm6t߿Ǚ3gжm[ ͛7?~K ގ1"_/I/ׯ3gbڴi2ԩS| 4isssܾ}V¹s|||0~xu~7Ґ 8۷Gٲel޼Y|{-)IPPի'0`YLL ߏÇ0`^/pu\z `ƌXz5BCCrիWq =z "_.4iWOpss{[ Çk58|p|Y}vѹsg),YgbذapqqALL ?:-Z&Um?+ejUGj*6qf'N޽{q)ݺuC=J*8pVZ%Nfiddue;_Ji&o>|@tt4|}}Ѻukt FRR>} .b>蚄/ۦԲeK8;;K0ǨQ`;pUUq>6icaa:uBDD L<]H*Y[[kzѣr+ y ;v\]]+++\U0a!..#7o_~%u-YDHx CmHy{{ 3p@܌3rlݻRJ6m*$$$y⢵MΝ;3f 8Pv3駟otZモ ޽S{ÇsPjѢΚ5k4T~vT7uTmصk`jj%zϟ?/.]Zkƒ$퓺|BPP}j}ϴv<(PLueA٢E HMMڴi#i5^z%j?T-x~NRXQF3776l GtnCtzowmT :{Du˗/KKKqݞ={M]q=6LIIZj%5666nܘ׮kMjߣ?lmm۠ASb͚5:}5s-222kNELcR|8|0ʗ/@h^?4jԨ@'#*(R#J5BGTP .$GTTڤMձcG_vO: 8}4u>>>8sdF~}###ӍL<aaajU-[3gDxxt%ܹs//l8::bҥ8|0lmmٹsg:u 7,Y}=&Mh||Xt)I{֭[fobb͛cҥXtB9ߏ>cQ2e0uT:uJH}Ҕ+WO̙3]tٳg%|۷1m4WۣO>S3.]t,G-[VA-eٶmp dɯcؽ{7Zl J(""? 8ZGZݻw1b֯_sl/^nnn5ƍX$$$… v3D^|#F@DGGqzz* J"""""""*Jl[+;/\`<~82G?P ׹ׯKoJGjժYBdd$ *"""""""* Jl-s==Bv!Cp>} ˗/ɓx m111ؾ};bbbÇ*V~… tQ*#-[xzzzdGTT#w۷u=Zׯ_iӦ{.pEԯ_?K=GckSBH*Cxxxlٲ{.'$""""""""b 01c乎[nnoo,nBcƍYUVM<VZM6EDD^?XDDDDDDDDDDEA v֭[#Fȶ\`` \\\c޽P+oKKK@\\\n΃#G[lm9L-[b͚5HNNS-̐gAB!--- dBM"""""""""*A@JJ \r02}IkkkTR%Dzu߸qC %%]tQ^zQF!&&ި^zšB zmT/^@u^O8 \F(y&vڡW^+lق*U`볱VԲ\rd011A2e^zɓ'˗s{yyk׮=zQFeʔ  6DϞ=;wFƍG#1e'BCCڵO&|pvvFR7jԨAZn!CL3g>|8VZӧNNN5j;vI&tppp_|Dn裏ƍCr`gg'ׯ^z:uꄦM>sTX:u*vׯ ((2RTR9s&z#uOOO_|.]&MxxxO>;0j(899ӧOԪU ^0|p3g΄L& @֭ B5| J*ggg|k*2e (oܸ1:w ٳ'6l0aʔ){{{?ШQ#еkWxyyȘ|򰱱ɓCHH}h֬`ȑ\2_1`@6m6lV ###̜9FFFZ* G6m ;믿9*W#G5k1#x(|777ԭ[#x1|WWlʼnD6iNʱ}ѣGcٲeiwZ x1^~ +++ԪU :uѣQti$''2 ѰBL&L&\.G+ CPZV U_eQUSْ򞔔Ϟ #={c?{'|OxgIyOJgQ655+VB@RR8VLcK}眘g ,s=/?DDDDōB#G/vyP |+c:ס$k-&޷̗6铱@DDDi"""}*)8;lllIIIZ'''k\ >"""*֌DDDD|G޼ycBڵk9҉5y$a;&%%˱7uvÁၪUݖ.]jL&Cfr(`J1Ƀ-ZÇcРA H>jb~ׯ_ϒ_@-""""/LwwwC7(_C% GvA=+W̶#@ǎ&,T\j75krBDDDo硒'$""b_}kPI *I25?uIB۷oj֬T&D%DTT oʊWQ>iLH#KKK<~8Negg;;;Hrۉ&"""*J硒H#WWWԫWUVU-]M#""" B[BP)DDDD}*IƄԨ^.puXZZ=yd7DDDDDDDWHcˆiԸqc8;;U&DquuL&Ñ#G ""DPDDDD/%йsg|åKD̙32 ˖-Ú5k eDDTxq&"""* 硒nݻdnFm6$%%vژ?>`˖-HMMvرc011;l2Ԯ][|L22d.\  )) =z@|||Xr%|8OˉJ\%K`ܸq0666tsc ̜9S/x u[M en3,, iӦpss1{…ӧOQreuq___.]Zv:t耰0xׯ_GݺuB͛D˶\zp ܸq@_hn LYfaرAtt4&L'Tc{affSbĈprrBzz:Ξ=1cܹsƅ :$Ǯ] 0w\=ֈ)S0a„lKDDC ĺDDDTC% r׮]Çn_|񅡛V[@F[~W j֬)y;5j?zHzk׮L&Uv}''l)S-Կ+L>] 6l/RRR'1zhUVa̙6LLLbŊr8h"ԩS1eqbGGG^-[Ը]""Jyғ8cJ I!Cj7}0!͎=zR{N$,,,zʠe%gaa * y;@F`W2璒 "!!8qbu0uTEEETƴ4`oovډRnRRJ*/2z2 SLQ( B0tS vEqeʔѸ7LMM\DD1Əof+y$n{|Tսמ\pGP5ZD#R)pR)|<7UKܾ*JE ^8x;bEA[Lr$$afov3fIȐ0~>x {{͇|Gwy~rqoǎׯPJ:*w}vk˥px΋p8:t(i^}ODDj4M?{4l˗w7{*ѣa`&G˹fWwj?~Aڴivpb+""l6#Gnxb'~z}7|Q@Frr2۞lْ_׬[%KX=z`„ C=D>}<p0~xJKKiѢ/bZTTDfff4lXۗ/M6P8aaalڴ.]NDD7o3j(̙fc… 6욟ou=tܙz!0`̙Uaq aҤI̚5YfYgϞwɄTBPP6Tx\ަir!̙CٻwU744'+kYfff㏳uV튈;F߾}󈈈OS#0^)(( 44?<3o֬[Ç޽n5}H%[lﶶaV:^zӧH˖-:Gf޼y5=;p$++ &MPXXh!..c݄Ə'յq|1cHLL &MioNRR p|rq&,,|)))sii)#F`ݺu?>gɓڵ\ݫ\< uP# ׸$nq>F$ģ>o[n[ou|,z!222̴^nm9/]V'77}zyҥ 4i҄zJ}V\ɂ 뮻Ҕlذ˶͑#G4i4lؐBCC{6m{q膲k֬aDDDX473X""Rf1zh=GfvP> OP4[;z(]v%881Km}@DWiOXXauwDDDDB1\/4[7LN^%*R0`t\ϜN'ۯDDDD|b'bccI9r$֭#;;vQ|I,EDij&MGDDD|b'uQk͚5|Ga&v?c {""49p{OzEDDg)mݦnzczо}{FErr2ӧOi~<"""?⦺0> """""""WK Tni6aÆ)GO?T]VZuDDDDN1 vG1118q4_t:3gN""""5yğiu ?  tә1cgÇ޽~#tU~\nӸqj#;%[oeڵT͚5.4֭auwDDDDB1 vGCuWDDDD4M vR#DiLMu."\Hc ??p4ɖ-[󈈈OS#DQiii]wADDD낃 """"^GrvG۷oW*i6u7DDDDJ1fGiNQ#""">M1 vG۶m """ `yDDDħ)n(== :ual߾"""tر """uy_h[<Ա;wbaЭ[jݳg111ݛf͚ѰaC:t#XlK}|oM6us1qDvJFhժQQQYt2sL<"""?1L4Rf#77˖w:>|ݻkQZ㏳h")))u.^O?MBB 4aÆZzɊ+ۼZfq_RRR,qHVVaaaZ?1o޼SNZ_#Dze&NͦR# ׸$nq>F$#nj*"##HHHlXx16<ŋ… Ӿ}{{_|S[fȐ!L6?V]\\?LVVݻ<9s&aŋk]MDDDb &ם>|zIll,+W:ٹs'^8zio޼9&L`Ϟ=q3rH~>WcذadeeqF^~e V_p!Ǐ'$$swԩSy6mڶ-4󈈈OS#D\T{9.U=*r;v,o&//իW{,Q,X ^n@u֬Z piΝ[M^=eC3gHJJ4M.\H>}hܸ1-[dlܸJ9rznݺBXXwK=sNw}jwРA_˜""UaK"""? H4`kp۽wgA*fY4~T+3 Att4g&!!G}Bx7N;v_RGQPPP]wo-Y4{ܹ3P6`۶m>}BxiҤIo~@ff&_w{g\ᕖs;x9sj* _&;;l222^ܹsax >}:PXXȮ]ӧ'N`ĈB.]0xW!;;3g0n8Tڮ+)).xbnʩSHKKs{u|ҥKp~턇t:;v ݻW]ZҪ\/!!0jԩS۹Ξ=k馛*-W|aaO+ӦM#,,*l2Oaaa9bbb0Mxf̘aHdd$7ood߾} n(>gLɓ۶mˢE8pvEDĝf#**J3DDDħ)oxtӻwonו2ٱcǎ#00QFs/YdIzήAϪ(_6//5jD6mjjݺu۹v>$$r}ֶ-[KPP/B:6)Sx<^rr2Ǐ]vhтCZmo7??`&NXaLQ#""">M1 vG8]#itR,Iqq1v tX cӦMt҅t"""ؼy???QFY)j.\ȰaîO?dʧui6sBBd; IDATa`'|Ν;SPPC=ľ}e㋊`̙YBBB4ifb֬Y֠ٳg~Grr2!!! wf<@rr4M:Ĝ9s޽;{ꆆ2qD^y^{5Lqn]qSO=GDDD|b'ΤBCCشiaaa-t:9|0ݻwWؾ}یѣ[lq˅]TTD^^PK/ t[r̛7uU)Āܶ%$$0~xN8aͨ. 8,4iBaa$&& cƌ!11( 4iBNNioAzzǾ-_" #??mwJJ \ZZʈ#Xn]vϟٳ9y$v"22Jׯt$55HݻDDDg)k\nӸqjCpYfuZ&:DFF[^l@7v)sK.ͭq|A޽ٿ??<]t&M0x`V^qW\ɂ 뮻Ҕlذ˶͑#G4i4lؐBCC{6m{q膲k֬aDDDX473X.\^eI||t_*GţvuDDDD̙3uS#"; Ӛ5k@DDD|f㷿m]wCDDDī?hx4rHEDDD|$11Q14M11N @?\Kz (""=_f&{U#""">M1 vG]vMPt 0ؾ}{]wEDD~4M9GDDD|b'VZTulΝat֭ZuCLL {Yf4lؐ:0b-[RkߩS7oINhРݛg}ǏJ;ΝcĉtڕFѪU+XfM_DD#}x9x /^aÆ:uիWcqm~/v:u;sNÆ )))ʕ+ܹs9z(AAAuVγ>[Kg$""dڵyDDDħ)n.BVZ@dd$>III QQQ,^FLL5؝Å }|׏/ۧrU\3Ї 9wNQQcǎe߾}5j~,ٻw/yyy1sL ..ŋ橉H=Ѷmۺ)n/[G}D~~>={$66+WRTTTi?ܹ@V^M\\={7oޜ &g9r$^?j޼9{aƍ3VZ/KlB֭toVXp!Ǐ'$$swԩSy6msb""R/l6<"""?ѷ\ _uXltС_|08s III… ӧ7e˖ <7V#GSOѭ[7BBB #""VZtr]wY4ZSD*Ͽֲ.\S>c?}}UךtkP5::0*Oe 44mtڕ1cNH˖-tRvv JC m۶s8=?|t:ٶm> ͻlݛ p ào3fpwrر JKK1b< |nRR=qqqվ""H5?P#Drnu֒%K0M{wΝ;e3lO&Mo~2339p@mtNf.WiWwAsaժU/Lvv6ddd /s<sÆ <0}t222(((]vѧON8#*<}eڵJNNٜ9sqvED]hhh]wADDD`xUzҥKp~턇t:fv޽tzVz QWNNU$&&gƏ_gϞtMs+_ʧ׿iӦf_l111I||<3f̰ $22͛7s7o>֮]kյ̙3)S0yd+hi۶--bwN+GţYfP;;vرc2j(}>(P6\|ټ*kԨmڴѫuUnJVr!$$r}ֶ-[KPP/B:6)Sx<^rr2Ǐ]vs-Z`СV['88'Vg'O\DD(SN~ 55Hk_";;mX]ybь=!''aÆqy:w̢Ey\ bvmhc￟ wsh۶mmOSkϚ(?`|̙JZ0 0<?tܙz!``̙;{HH&M`֬Y̚5>{,HNN&$$BAAA;l6RSSyHNNΙɡC3gݻwg޽VP&N+kf?֭[=+"" ,P#""">M1jgRNAA|V bƍ<3gz""εh/S#B3ō 7&Nx 4S9z(]v%88~tW^aԩuwDDDDB1\/4[楗^ P: >-"r= obiyğh[<ڵ+/R9u֑mm;z(O>$B""iyDDDħ)X_~ ck֬ᣏ> ,, 43fUW.ɮ]ҥkGrvQ^qFGVVp w}<3򗿼f}}@DDDDDDDrvKRSSls=Wtzg"Rx qQ(..ԩSXt\ϜN'~biyğh]t?Wu QKky_z-k|$EDDħl6GDDD|b'SN1c {1_L0A?ot:YhbiyğhȜ9s8۷o """ P#""">M1ԞO>kG6mX'N^_rK]wADDD˙$''oMnݰlaUxg{UV4jԈ[nwر;'3O?}Ǜ>}~"""">t/+G_/޽{kX{aĈmOKK#-->͛՟̘1'O|rx3gdĉ3f1uT-$""">M1ioڴ) m۶>NZZC'L͛/X`;w`L4v:w}Ǜoɸq㈌co߾V#"""R>} """uy_` &))ݻW8'N$++ 8㉊o߾`t_}y__M߾}ݻe_wuj{Oۮ?uYG}&.p8tZ寶ine]UWY˕k/7ŋuMtgkkR_SI]_krd4]C 44:\l^jjieRJJJ8wir%/# x"PFtr%+yaa!999dgg[mdffp8p8 "\ ҥK8N~G.^ȅ n[-))4MΞ= @qq1ϟ ??|Ο?Oqq1U~ ({XW<Ϟ=餴se?͵0u]뚸γ*ܹsVO5&iV隸>rM\ykR5q畮I5)yz&}IeIeٳ)..&## ƍXbu3gdee;W_oyqy7o裏Oؽ{7.0{lM6Y}N:EII Gaҥ|gփ„?i̜9Azz:ܹ[J2k,8s Ά Xr%7 //s1|ڵkXf {֊8<̝;}u/x8{,Zk˖-ɓ')--e̙;v%KDRRK,رc̜9RN?nj '==̙31MǏ=Xt)GW^SNk.6m?O+.={6dff{n>>#[|Mpo_1_}YYY3g,Yb7n$55 Aqq1*?˖-O?eǎ,Z'Nt:9s&N'Nh"v~ exW=_׿5=B#tG{yl߿ݮ{@GL0...aÆ@@fZ+W2zhLb-!!^1W+7c=iڴ)Nേ IDATZpXOX\:at0?jVT.ַxl}O}({z @tB``Y,I@@O[TUU[e]quջ\8ykr%裏b'ruMtMtgkR_i,[cZۯk޿IQQM4t*g v˔[޽mRZ.ַxl}O}([z֟=C.w?nY?תleS_Iz5 fxIz&yTkR^m^}Z1|Myk)ەϹR _| ¸q0MʳsөS' èV|6 àGyDDDħ)hԨޕr\}BBBҧ6m4+aԍ;wZOuV{!&&޽{ӬY36lH1b˖->ۯӧҭ[75kFpp07x#CeٲeWYO8]ҨQ#ZjETTKDD|+7Hu)nZׂo?[n?!kϵ-bWsE&L@>}x9x /^aÆ:uիWcqmY w>/7nȑ#\t`~G6mc=k3w\=JPP999lݺÇH}aGDDD|b'@ 8u˧[;t~զMNZZ+'' Yj'%%%DEExbl6111`wNN.\ >>ӯ_? oU{;w.w&//ݎn'33W_}8qb_\\?LVVݻ<9s&aŋkDD>ή.xb쮡plfɓ'/[޽{{_}s-j[>"??={ ʕ+ܟgvI`` W&..={Z7o΄ سgwq97n8yˈnɓ'3i$PZZZ/\Ǐ;CSN駟R""R9N֮][+DDDD+i$%%иqc~_xo᫯8qsy͒Ufq;s7ի=?z( ,e V[nͪUhРOfܹko߾@±.\ve˖/"apryipBCƍiٲ%fƍUjȑ#}:P63tܸqmٲ4z!-Hnkc׬y:m?==T0 ={6 <p8 矿b]ve̘1,Y_~ZٵkP0ɕ^v;w`Ȑ!tЁ={rAmFTTpm  88m۶m۶+">>zʚ1Bqq1~-~-K,a֭znJKKyGXv[III|g̛7ZAD_9N>s^G5ԫW/~o]̅ p[lٲූ,Yi{t( m6N>]kp4iҤJ7 33FׯB:ԩS3g111Q| ;5'}S̙3UVa/2dggAtt4/Νx 6OȠBvE>}8q#Fbvll,k׮0 ^}Urrr̙37/+""j b~9ѣmjshh(#Gps璒O?DLL | 4mڔ{x版վui_Yt)nop;.]ʔ)S;v ݻW]ZҪO>!!W:vhҡrrrh޼y큁hvٳg7tS\ʗ/,,eڴin-[Fff4GL$>>m~`` l޼pڵk1bP65?e&Olm۶--ٳl޼ZBDl6z衺W)◃))){ܱcGݷr 7ndĈ:uEhѢ ~ikpz1f-\Pvc dԨQn}QL’%K* vr;Ve\QFiӦkݺuA?ήvsssx"aË/H``ogvzRi9׾|kۖ-[%((=)SxNNNkcZ-Z0tP-ZĖ-[-[Opp0'NP0 &On*p:\QF!,թ>|88~ >#̟?VVVQ0!Kd7iիWTZ_ObCS5jTرc1{l`߾}P_z5***:B||<$ݵk̙յigΜW 999B Eiiixj|D&w^gkKUަbKDDd2fΜڕDDDd%ᷜ4jԨ`Q233*q]777 :+FHH <<gϞ ӦMCEE\]]pB:KoԵJpRqqt]]or|>(,,Pʕ+İ"Ǐƍ&33۷lgg\b<|P/c׮]hܸqk`ڴi iFuuiii4hrssNNN(--JbӦM5) L0{P@899!??(bӦM裏ꫯo[[[8::Hmɓ'ѿ __BDD~w:u ~~~|†"zR)J$''gϞ""""Ř$PUVSQ 'ݑLT)ʕ+uZ]lUZ +UVV)((UVصkfΜ=z&O￯J.]y駟FYY0d۷OcJ2زe z [[[UeJ8: Ƶkװxbtvvvχ\.G>}|r$''%񈊊Bݥ~~f͒NYM% cMjAdŊ Dtt(..V+b  """""""}qf7͈# mܹ=Bxx8 n"'R޽{X5S=O=7nb P(~zHDDD1Y&.]4888n"""22 ƍ301Y&F6mSmc̅R_.DDDDf1Y&IwzDDDDF׼ysS`_~L{!DDDdd2kac$fF?P(L= """"Q(ؼy3c"""2kyȒ0M}7MDDDfM&!((15DHHz͛7ҥKx!pM۷'OF׮]j둜l륥֭Czz:lll#G`ј3g""LJRX51vפSb???oM۷C&!44TJv._~++Vz_ FBnn.|}}q>AM}v71!K /HJJB [oėS0W'N-&7ߠ>>>|xAm~m8qطo6m鸋 BBBgyEEE3f ~ 7Dii)6o ;;;uVܸqؿ?yUe[o/_ #"LJL& /c$ -¯U?3 :KY3fFRDM0#>Yܓ&M?ڴiB۷Oزe ȑ#kvfͰ{n4jXno,_|: f\\ 88m۶q|…999HHHq\Elݺ{Fƍ!C~Ъk׮:u8::{x\WTO>AϞ=~˜DDP(غu+'_YcCĺ!;sqqÇ1k,l۶ >}テWCpA|GF8 ;'}M~NMϬ,) A`ĉ5DGGCP@.c޼ycǎ0abccm6Z߿yA.cƍfqq1Μ9N&m۶.]G"00P:P(,-=GbÆ uҌqŋx"bccq|C}`bcc!"+4iѣήFVfF߹siiiQ۸{.V\ \E[yc.]RݻwCZ yyyí[ ݻyL>VVVXbnݺԩSݻ7222T{xx8[>CNNNwy~H]˖-M=""""cCdtΝx9#1l2k";vWu___(Jxuׯ_ر:33Sv111^TwQƢ{={vI:Z<ձ痖J-Z˗Q:?..(--q=BPhI}X[[B˖-"fGFF.]%K@.Zh? /S*Xf c"""2kyȒaÆԩSRLPQ^^nʡY0XYYz租~ammqƩS/NUYFs ngoowwzm͚5Ӻ7߄L&Ö-[ ,..^׵2XQQ((( ,XPL&ҥK5^/117n@֭5WWW >\zEEEkK,_TO0!"""sƘ,I֤s8s F'N>s~i5۷ ͛8q"-[~ III󓎹 77W^nnnZ?~<Əz7|}i~ܹs]U9?ydzЯ_?UWԩS!b6Lmmeffy=Ս+VHt}@y~WyfEZhҤ ***vDQA ;w.k_EEZ@rcݺuDDDz=""L&9Éc$FӦMC6m驶 EEر@U 2׺ 4P*عstGGG,rsswå~֯_/—dXlԮ5AF͛7GJJ y4iNNNXd DQDhh<,X1c@E,]puuE֭>Hw/`oo_~ppp@ӦMagg,\5-.[ #FRŋ~[l۷chڴH3AϘc$z^rQw}AG+W֭[EQz]neeZztw}7o ={ĬY+hlgee[n֭[qeUeJϟÇ㣏>` ؼy3<7n ??M4Aǎ/"((Hӭbccx|駈իWTw0tP,[ 4QAO?mac$X=#L Qգd|%%% üyTJRJyyyc ==;v-ʯIP(c尲2p1=)TyI(..FƍuFe$/*K2իW3aE =MD$dXd c"""2kyȒ-ĮkS-K2-[zDT1cG^^/==3f@tt4H YQn߾m!cz%J֛*y=l0ڱi#GNNNpttDǎm6@XXM>@7 O/1Y&Im۶qJ^_v ?#<|!!!ݻ76oތK.Ç͛7o>L<]vEjjGox2 n|_u!==666Ǒ#G0zh̙3ǀ2 ӧOgCDDDf1Y~I#kkkSb???oM۷C&!44TJv._~+ӦMnnYYF\… (,,Daa!}M6a~GDD841Y 2)))Gu _&OUzMoAQQ|||믿ƦM`ooo'N{ȑ#Վ $$#Gċ//b̘1HIIKC֭[q 888`h۶-˖-۷cx`ccc(JܹgφCDDDdyȒ޽ы O&~zZðXYܓ&M?ڴi#!8qbӱek$k֬vލ]";;֭븸8@ppn…OE۶m֭[qe١G?>]uѣΆz)=sE&M4S*زe իCo_'?"" `eeyzDDDDFŘ,eLDQ4Vz}AmJ-a("JPU XA R&P(ZXǎ1aU-Uqq1Μ96lsڶm ѣGՎ) ?3gĹsPVVRG⥗^ƍ?::]t-[p52\xaaaѣ_^]EE0k,?^7!!#FMqYQq9ƛDDDd%ѻ0jfiyzz6C0ڵ/*M?X?78 Qѷo_t@ iZUrNNNZ/#66wAZZtb7b`wEϞ=qU@֭Ptڵ^׼|=<___\t .]RݻwC\ś#rrr;`=9pOFaҥ1cZjJ9sgٳgdGB^?d;,BDQ=ziE""""SaC`oSL1c uY2{bǎER}&Mu ;v`ҥjmTcǎL1116mT׮];dff֫mii).\gggڵkv>swoߖ^jժTǪ_ZZpE|rp;v BCC!"JX[[/RRR"((@lHҥKdm-8tN%d+bCD2& H"333rJ._vd7zh.Pi?_kkk7N*![]AAtZ{f͚iݏJVT<|GII ;>}@P`/uvqqTNJ}FAAlll`md2Y*qZn;J5>oQQlmm1APKQJ%ǘc$zΝ;c!..[ɓ1ydx{{d0n޼i!X۷ ͛8q"-[~ III󓎹 77yyyZ/vssӺ1~xW```E!mll0p@O0`~,Z&LLRZ9wk׮puux?kk:u @Ui-Zڇ*KΟ?/⢱lllPQQ!"\mڴ11Y B-[… gΜY&-,y-K.ӧ>Sqd:gϞm!U)))={@lvڡj.Tٶm[@jjI[np Xz5oDn/--<1GGGiݻw5jM6_Uwܩu+))16Uu]dݻ7c"""2kyȒ[ޫW/DEE!''{Rٳ?-[W__( CuO6w\4={=zsTuwڅJ HJJ½{otYT>}7nЩmqNNN穎lRi^lWokod]ՏB YcC` TW^+{/; j&c||<憉'bʔ)ٳBz/jժvmGk5^(ڣFرc1{l`߾}P_z5***:B||<$Ƽk.̙3GkӦ Μ9SuUioooi클Z-fW)?^W\wwwBUަbKDDd2&NYNDDDd%1 gٳge˖l?QQQxgѵkW]֘!5xMmYYi5m↖D CP7BBB8{lP(6m***ꊅ 4YzMUÐN>-ԩ\.s=8xs5 ,ի %%L'OQӘ{![zuIIIMDFzDDDDFǘ,Eҥ "##qM߿ƍNKKâEj8o&Wm@111ERIڨG[ׯGΝQVV1c:xɒ%HHHL&CLLL0eԩZдeffףJvTTT_yBDy~Wf(hժ( D&MPQQF(Xf> $%ΝZWQQ!-TW.֭&"tO(=IJ%>3}m6Dyee%SN>Cd@1>c t%%%1bRRRT`͛>lllvXx1`͚5Xf}6LD8881d20`$&&JDQĕ+W ///\pAj+1|իJ޹so9_""Rgee J'DyȒbvVVVxTKb&VRR\͛#77+VՃV*z*ˋj3uÇg=xjXܮ\+VX[[Mj3~xlܸoh233Ѿ}{vvv(,,fC ""sxL6 IZZ $}睜PZZ* ŦMjS(0a*prrB~~>DQĦMG!++ PkW_7pttDQQl'Oҟ+**F8uj DE|ADDDf1=)TyI(..FƍuFe$~g̘1-Zĉq!TVVJe m۶=?Tdddm%T SǕ+Wp-تD7^Jjm =crwwǦM0ax{{qχwy.] 55O?2899aȐ!طoD7Pd믱eʔ8puk׮a޽;쐟\>}`HNNVKtU xDEE{R?YfIz}6DDLE\tedyȒufwff&v܉;vƍԓo۷ǔ)S0eٛd:ANOzz::v[[[_1 1Ѓ*..ݻ'OJm:::bرxo@F P'dJK/uDDDd%1H[E㏈E||TVd2d^u=薌޽{a̘1:u*U3#"" BDDT;WWWSЫ˗c!''zxЪU+GKF2&DOkkkiA_GGGbxXX we2&]t j nWWW_G޽<[o%%҈駟~@JJ rssQ^^f /`!= >3̜9VVVQ0!KnLADHHz͛7ҥKx!pM۷'OF׮]j{[GZzU~d2Y0( "2?JǎcCDDDf1Y7>(5yCۛdRz???oM۷C&!44TJv._~+z?ݻ7|}}O6mPo#>"""yRn֬DQ&Ӗ|Zqww^|@9Մ:v(߶man)Ge2# Ǐ̙3q9ATѣx饗q:GGGK.زe ]APVV/",, =zP-T@PPf͚K&$$`Ĉشi2Yk𘇈!1!KW{ԩh֭֬[ѣ"##qM󲳳vZn٩%ԩS;3L+`ҤI56]fȫo 鏈3 j_rnOz w?XLll,DQD߾}ѡCU3ѣkثprrҪ_~@ՓiiFSN~L6Mݽ{W%ݸqct 3f̨s!H޽ `ժUC^^nݺ`,Xw>}:b ܺu %%%(--ũSлwoddd (( Bmxx8[>CNNNwy~/' ~DDDd%+ NXx1<==₶mڵâE `ʕ.//w}A憮]3L~zZl5} 6j;vW* R)N5K~DzSA]h3hٲ%^ii).\F׮]ömУG]Vz-hժm BCC!"VZZB˖-oVj[\\HҥKdr@-cРA%""u +WdCDDDf1Y+ӏ=QQQdgg(J狢sb^S-^|E}H΅ Lয়~ammqƩ8q"JwTJzj͞{{{kS= `׮])Sʪjժ())cЧO( ,X_~ZÇ666X`Ad2,]TcqZn-T*jV XdȒd2,Z15+%N׵k O?a_h"L0A Ν;ڵkŸyX[[RmLݻwѢEZV\\ ߥ}ϟuqq666DDTΝ;hӦADDDdTyR$ ?˗/رcDAA^xz2TwTm۶!77Ƙ1cкuk/sVRR={پڵCqIĨ%۶m:K]:ݺ~?LMU¤o߾6Z?Xz5l?^SĮkԨ6m?Cm۷Tls#Q$_UٓV_""RT*P """2GyȒ,٭C_gٳ8wӥ+:.**§~{"==%%%hѢxNjpBDFFbZ_c˖-ٳŰѣ53i$| Cpilٲ:tDEEaņ|-{=}>Clٲl2haN&h5YkloH14\CDbb"um0tP Uz{{#$$@gϞ ӦMCEE\]]pBܹs^>T{hҤ{ӧOK?ᝒRk'O֨ PU_i<=z^w$&"Ғ.4=󐥰dwHHKoCBBt󑛛 شi{3gę3gбcGڵk:;oL?5IЖł(". "\*SwtTAu@pFaSAEYe-eFI&ir~ ЖMs]rIz>T*Uo- w}pI222l_;Zj 7py=\/2Cfq7q<{llقZfժUg y>sꖙ٢m9~8{ _p?p5j뮻0G%E^ht&L{1v9ҳ]^n祗^jt } !pSxB!D&}ѝto#<ԩSINNnuiG駟0vXfΜy<,]p_6`Fտ '*4{[l'o&6 m„ rxw1 lذEjj*7nn2;Xhj˗s7R/L8xN2؞Ř1cXbEjkkٺu+Ǐ~_l1 ^ / /xL>[rVt:˖-CVcjn( GeѢE 4A%^ϓO> s=Nj/naa!3f૯jtB!r\B!D&}ѝenOcԒs裏<@]wuݛ,֮]j%88<| x,6k٧[nfܯZmիW3m4.Ls @qq1&M3{嗽YZ3<-mswdɒx;>cZ>}z޹sHPPz*oNc…5k{?fΜ9h4RQQ(+,^z7x#.3fd`00L 3ϰgK~iyv]6i…dgg1y3PT\tEB!D&}ѝef=ýo;=a„&STf3{u8|07Tˑ#G NZG۠.v:\t?[[[`V|'v=:cccyW뮻޽{7n\t:}K.%55ջ݉'~z~ag~I!,JŰaä#B.M<;Q)+Zj5* EQPTK}mA322 Fט={RXX^d2s޿̚5 o&OF>.xyWϹjz=QQQDEE7{Vү_?RSSNW_皚y=9[{Z:8p L&t:Oرc 0}ѐBxOj\.cZ3g^rϼ5o[ΰOϾŋ5kjZ'}g/D#䳗}r/?;Og'w}bZ1\.fs+T痙p:f_J\Ǐs 7w%\_LZZW\q/bgZX,TTTxK*( (/$@YY555>墶;bZ(//nӉWFee%Q[[ p0a\\\nGQgWZZ X{NTbvJJJwV'rp8(..' <">l>)..p4kz(Ҭ}exIϾ>ϷObxgcgsx}g}g_ZZ=,\Fnn.˗/`ǎ_5kpa-Zde˖{n >S%K(++_~'vZvkFaa!:9¿o6lžb rrrvqo9͛7{YjNBQϟ$+++WwW_{k[V? ?Ⱥu9x /bx{?>c޽{PR*++8p?/[_'??_Mؾ};+W$;;8y$W`˖-lٲpR:y$p'۷ogӦM|^u]R/?K/QYYIii)w|g|}tRbϾ{퓶`wG߂`wNN7[+}h͛8q"3f7lF1O{̙̟?x].A_\!oiZNw'(ެly1wvi^㡇Bќ!BNH<%W{=@HHOԖ.]*@!믿mFqW^qlݺBљi4fΜ)}!BtiZF d\__]zKf!Drصk\r\"B.K<;`w+CQQ999睿ву,ᄇwPB!ږgp_!BL<9UUUTUU5|,39gTaÆ]maзo4!B6V[%I!]yDwp"""ug;;y&S-[_][ocutӄB!ڄ⣏>mB!Ҥ#v;(JG7nv˛oӦMdff_*++>}u&B!*T*ɨTnB!HGt'~lCeرW_}yʘ9s&l駟n6?i?!BPTJG!]yDwrATml6[>}zmĉl߾sDEEy/۷o3go>NJXX?3 ,ԩS<㤦{񅧞z B!/?F!ByDwR.~ZB͟k=Z{キ[v͔)SirzW_}ϢUWW뉈 ;;^]. 4H;Rr"""&BZ'. `6 m:.(ۣ9֮3=C駟rꙙ IDAT ٳ'W\q,;ΰ߅B!.Tg7F!#6Jrs塇`hzxxxA*%S!!Dgt:Yd >\+B.K/Un!BLQȑ#BNEQNt)8nӥrqf.QPRZBE}ݿBujtZ55:Jov2E 7.\jg'_~y[SAtV!BBQN:EjjBqE^^bsbbu8؝u7^^V[7N.I}=;wDr1c/9iR@!!B(BIyUZjjj:Ljܯ5|Kl+jttހxx-$鈐DΨ˘7|pv+Ÿgf3o&9/2SNmMv0yd\=S,BK./[nEN !Dd;))SVmwkN/\ TZTZED=:1c $!P峝#6-RxG2e ذaEEEwcռ۷-7)|$77 Bs!-PpRlQdQlQldFCݕVVKv5c"p& 3,`‚iڡ#}]YƼ{<R :kK)c_O>deeeƏiB!ąPA`ll\MEIwÃIhpDdh@IcMƤIxGydNN:ks`m㪫 99cǎ5{ٽ{͛7KMM 111=)S0uT4qVd2evݻٳgXK,X/ӧOʨQx衇 ;7 **J2 JHH̝ٗ;yyKF̘1zx7Cj*<ځQYy!CXf )))i|ϸ}Ç3a1`0`Xp:Gy%K}\7HfB(#XBJ5'VN[-[a!J^E UV +mݾJ!: ZB54j ݴ4jjhhZzjj4j Z^ZFB;Z_(JݴnU7fE(8  Ӆ~\~lwkSpboV{-Vgvpv=U* &)2=~QӻGgvws!y.]bʕT*).Z@VsСT>, }cǎeǎZnu]w}FᡇdȐ!s璖Ƹqꫯ3fL _ѣ:t(w}wlr-1|p}].", /2yWHMM{mQ|n!#88 ~ b[-+JnOh0i10Mk1 k Btj 06CÉA}_gѲj;U5]FQ8U5 "C_t(?ZOdh@A,"C\BBB5kVG4E#T'yfϟϜ9sݻ7999{f58qt:7os=?NJJ 6g}oz+m1cưsNf̘-T_vv6}AQ6nu]춴źEaŊ,_49r$O>$&M:oK|7>}FCx k.7x7|tHMM'ছnjQ]B! BVY5eK݁2 yV\b hC @!h}ц@D juhԒ]-jNM6L6"S Ug+O!:F30ր! VBNU k͋>|x)//o5=FSR:u* .dժUW\D㏟wu]^+Vt`wKfv 7 $t!E4$Frv'yVJUXɭ!}#jWXQOe O ưx#IuQ<`o)))[8;իQ.~0m4.\իWe<+gΑ#G8rH{ѢE|GT*׿裏b0㩧b֬YM>Yn?̙3xxjkkٵk<wfʔ)ݻj ,?GRs1sLz=̞=zU%WQ2tP'L52K,dVQ\MFR N֪U՟ gX01@)"Fp]. +9VKN2O6Wִk{=u9zL!H˰8=C9f3+~zAtYXbEG7[zwcĈ >Co3gΜ˜><՟X,,Xgm̻Kaa!7o>kN3g( +Wlj;v,7nd8p?)SE0gfϞ]gϞ[qf !j5SNf!D5'eNWQRMfTI5%f[G7 $L`‚DTh j .DVc "Ȥq89]~{YdM;ۡ3*=v^NÐ8`dX|zD$-u7r:ζm8y$Z;kw}7sag+++uUUU^.88f__tttk- i4k&ֽi&*++tWV3gN[r)-kɤIx뭷شi7ؽi&L&pR¹W8"7H[4ᄇwP_\s54xgرcرcz_Eu+*SѣG;;=hܞ={wɠF+j6ӳg& ggg{۷owMէ;v,:[ \!2!|Rȫr.rO)wtcww㤺["5O!LVh \QJvodQ5NjL(2xk.vg;L\!JHjb]<1aeL$-sNRRRz~ܹ^Ӻ?h4[wތ7۷jժ$8x`watBB?YcXgnX0>uDEEQPPyOINaayiC힫J@@=z8kBըjƍBtZYg'gG7+@zp$3[R^֯abZy& H/4^PűB3f۹3Tm:Q)%f_uZQ]۠\'}"*¯H[4;+@'Oc6 nktiӦ}v֬YÒ%K n`رfejW^ :ވk2 @\\_u:?&Mĺu.x}B]9N/_<` _!hJEfi5f8Vh"DVimC>Q o,=B1Hl!:g~+r+QZ~G(DR4> AWh( ޓz9 @F`tow{X|Z Dt vFmڴ%KzGm[hժUr-M<#TVV;ִixp8,]YYY|g,IK®Y՟Ubb"vjղ1x`T*pa|,/tݞ`xcv;g=繁^?;u3kmWq(C+CM[Jl<\tjR2/RD+ vF6dffuVnJ=/Yz7=x`>V\ɂ ѣ]{pɟj6tFce$,Xw$-5k,\X.VZ(DFFr 7siӦ_W_/c9?h]ٳgej5V:k {{ZLG6m?|_HLLl… Qx~_ۺ:¨;=\E^ht&LO>dffcZCc6y饗_z2 .l>Brh"̙#eL*,vϔM5uk -b3 Fπh=CI A'B !@>E\x&^hAs*ؗS9*nm+ ɯH~o}ZX`t -ڐJjoPl6z]. 4H.nEQ߿?s=,][,b^駟Ä 8qѼ;\L&f̘G}Zf̘1çﭭԿҠ>}g5X,,, ?IСC9u#FwaĈXV,Yœ9sPz{キV>n[`̞=Js=̙3?5k֠X,lٲ{]n7|3.. pWhPt֮]믿oW\]v޼yj~^Oaa!swirB!ӥQRMZ~G HwװͯvhCBJ+_9jOQغѽ# qH[4R 8={f.ܷ~bi&.sV*]˓׿sj bywdɒ־kn翩Ç0aEEF#["d̙+g-w`%e.>c4 F EW^adee5>f̘j dn?پ}{)S_]KpB;vlRcǎ1p@ 4 IUZTq4.]PEz [^ޑ!td. !:̅y<`˩`oV98W/ժUJ(LbDp4Rh`ON<Kː 30ek=z&kh 뗥mLeee 6`֮]KNNFQF3yYF?d,_4]'dҤI,^NUW]ūʆ 8u̵^˔)Su=t:}:+W'NSO=_3<hMo!*E᧟~"99YB9K!.[.Sh kGQ 5xoɱzz!P+eB<"wT},gwf+dZ2vfW qy\͕Q$F\6DnZJ"**ЉH!ĉ'HNN& |Vi_B!RUّMBvM[{>[I'LHHZH jJ!:'V鮧f0P}}޼yMGB!R(1s(^vMQ_!qF404Ȑ8#@B( '8YʏT)6[NbLjp 70Dk2&> voFRaڶބϗjȑ۷Ν˼y%%Db ֯_ρ(**f_?UW]uq@Y\.z->9v JZ' ʭΫhM)k`C 32;BA(BzKvNbm}zxߗn6mDrr2۷o'::mJJJbݺug}$[KrBtVA߾}%Sfk9RW~خxZO~R6ʓ=g]`.$Bфq8ٓUζ|w#Um pݰX!,XX vsM7{nx嗹[%<_*. IDATZMee  r !8 ErV;?!KIZ~s+9p+9^dڄAqFǹklKBLWm|mJ~MЪU߃krX‚du6׿-[dBRe]F1 /i&&xTh4s~ r !8 謜N'gElN9[vi bXa a 72a F}(}`m_!18~-ElI/6Y߽{xߣ"Ш޾7mֶu<4;޽{wtB!|.++}vt3Z8]-Gr$ {u.=C j7b ڨB޺rcRJRpUhӋ8p֦fZX]+ J c1%KDHI|Zю&NB!(l޼O,Dt)d9PW3>Wj 3KBSGV+^aX@jkk9~8'!)r+OW?+9[I}@7[{x])ѡc_!_s8](c:RH^e324뇹3// ~[[t^//0 ]֒xBl6V%99#rضmW]u7 ZӕvNOWPb˶C4 wgȍFJB}zBiHl.wprt qОLJɸQn-:7u 唗*YBt#P^^ЬcBo  \5'iUs&k;]U3,Ȉ^$2 BtiHR1wp˄BR8UR wptiU8Q3$ȈwvJ0cRD!DWjhX1 ع1_'%I:])..k<_ӧꫯ6;S\N0 !hŻ~;9I/EQU7sNr*1Z7PVKh*HI"k @+{!zնZ`>Q㸰wߨPn([.g@Nv\Y^{~ )| OPRR?"##}DQK5p@ӢVJL& !:V`0&BNIQ;%Fj[-s+ϔ#ɩhGV100 cDBzi|m!Io!DסR$BԩuH/4?sٟS"S}TPR{3G$34(m!Ǭv'[߃|V~aKDrۨn1u5~+ // adeeQ^^dxEaܸql۶M|Fܹs7o^7L!9Ny̙F#A|EU5ͮ`_v9+8[q57G>pRHM WaB>o8l=V̺|} |h\;4ߌJhtl, v_veܹD/^ɓjL4760a~-:RgϞTB!w` UDlNU/u Ϸ!%!p.J '51 !h1G<6a-rQSF%0,{ lnm[7 ?;wDR1`{ZqR[[ˁ}Tфhz-'Bѥ~$Z/]Ρ :۞I1QwB!ڇyGNÍ)qܘGU bߟ(iqy3k`ʨ&L w> vG7xŁnc$nf\._)BQ\.k׮KzC |?d`.J gd]x#!>i&BHtvt"Hƺ|?=Y-^Wz G7 )~XO?4'eLOFF>}כSd\s5T*-ZO<hB!7p j.H~oG ֹː #5)‰tB!_-|Wz=nǝ$2*)K92&T*[fkf%[!]bǎ;{ X80kZ5\+[kO.S!D%}+"9Vh?r_]Vmw|4Cct"SF"нO$i*k9JJJ2 b}.B ڀ(dZؗ] l-0liqJ adȤ JA!>koS S|4`,zet& щV%> vrIN:uڵ;-n:9'B.MVsM7ut3D+mϩ n-n3X0F&E0*)n9%s>ӨUŸQZ6*}d)-)@]RtMG 1{ۋ{/ZSSS9y$۷#Ghy}ݛˉ"sSd'yۓ\';.IƔ?Oݯk>fϞ͆ Z?OVV*ѣGfs8xB!DRHII>:9[ެrd'bokm&3.NDhB!:t^<4~^ݟ|7/QVmozvf3y_6& a>juR)JKn3h 1c˖-C0i$6n܈J: xgq\T*>#LMMhQOB!hL`;k}{ar=B.6-ݧ6W]+$qE~qI֮]m݆gf„ t:YhfBttsKx]$YdZ|McuHF%EpQb8a:nS!' *kdi>ܝCV+T@-G&p$ulЯ˖-Gi5O@[R&(ˆ#ضm[ۙKe0~B!EQ0L GmSޛ]gS``npF&E/*dm !Ƥ)Oe|;uq*QI=7GO}`ӦM{h?6]wb )<_N<)n!BtYPTTDLLk[ad_Ӂ$#CΨL gDb8@ W!^jݟLJO?U0i2$kh6Sl6Wwe׮]lg0ŵ^?ѣ}$ϗGod !r:,[~X.m*wv]Y* $RFO.Bykv})8ZKD0mLo&$PO vg9vTWWFll, hf&B!1vf3V_"!F&sqH.AB!h{MG xlv*m:z0$D|xpЭS|Fo}Vp;uB!mr{nFZKTI@.TqO+"{Gxob h5򹜗  n5{gv}0<5d}ZzY 2ZMSwk@S7k7.#;Ul惝|uk2}loѦWٵE[ ډFY,RRRz~̛ܹ7$ByyyPp5dE+/umZŰ0F n|Ne$ثnv ozӵ5_ vgn=˰) vk~`.t!h@#N7x>BtsLHHH%[!]Zf݌QVmgwfٕYơJN]:ۣ{G2WA.P3nK)X2ckTM_w!;ߴq?u3:,഻o ۦJ != L~)Hw4L /4l>sfD|~ҙ2*c{3 lL/صkǏ͆h$&&QFqWr5 3~o'11cB!rO2eJWQ,,gwf28$b n_;~Qt@u1 \ Egͅ ؖҖeU 7_PX@4|XJ7SA󖳙8g}cAvB.}zɱ9Y۳džu}X<3V>9?#n}[<7sK"C!$BFI !Ġs~V Ή9qd*ɶV%_n\w%< =~饗OJkk+( ;թcѢ$&F{ǂ/"7tuM}}}9s>}:@^^dggƥ[l /d֭F ϻ;O/B19VZߎ2tN ̯1ʒTszUaP?˩z+ίGu:٥֗ vjR`O->kHX*dHZҝ'|a|7hdlfr'h\c;vCBaPC&%PfmvBΛM`b$[ '? }k.?~z8{VJO?<{B!*?ڕWYkۨ_zu."ƜpfŇ}I*>j+f2t=6X"!ax?x',>'6WD354Z=zweMڛ:ڭu!m]_{~u(b:]2їDsYݭurQz?tB yCa#~(9Eɑնʶ^(tTH%"DI#ǽsM\W^Mcc#0zh>3&MT>c~:< ?]'zqUnF!b88ʶ5ױ$Ɏ~1~K cnb8Ù0*нY6FLP/} Tv߹OTo2h9`~F /~a4s̼FDsN~ 6Uus3׮*29ia 9 :I5ѳepC6CۘP?~sd~q>_ [ [h~A˼&y w  sOek֬1>C=ĦMؾ};mmmlذM{B!i>,wqǠ][vא_͞Z잙)Q{+=%Itݨ]m|Zm3n7m[ zB=6}b(w(㾀 vg __>[x?3nQc|wq͵sS{ˇ#+(sӍ-r6Balj8Ncoa-/n-}Ŵ6Y)ۜec_eH X;^ynVEG;p(3MMMxʲ3B!JZˑdאUZ.RIe^b8sHM#4^nr:b__w}w^̘Myˍ}`Ė˽to( 0jW]B_|ׁY%PMh !Tҏ|];JF)ӍKz$[QEa„ ĉ{'ά)e"BaMuˬY<24#dWwj=^==6o~k[j@vwPvW̵ ?s md58(`F(CY/FMvFסڨ;Z\s\m\:lh/8yz#ĉ&sp /_%N#8233ijri)xl\\;%a„ B!İ:Ga̙ny`Q]gpޮoa%D37xp{|T?y:n5&!cOQuhQ$4tnmgEc~]%N˘IpBU= E)cFvٯl|txG_|1߿:BBHƦMw o&=`C!cTUN!vTw%wvgm L anbQ$!Q}TYF^3m|*5EM4j$CAx#('5p(fƔ+ d TdWZ8ܸ`s|j, ;bS!nB 1PcH!^ZҏRsy$}-SO_}~1~iE᪫b(L+eJ!B k{qW.o%=te5x޶BjBhgv8)cC 9iFl#Vm,XUF)q}ˆd?.f˘Άq1-;PqupgbM G7Q ;SbCݲd*ȭ8 xԩSYr%wu {57 ;v,W =!Bq_u Iϯ & IDAT&VMz~5U[BdOw9yaL9wF+vaho8uY`w %AX'AX}xBv⢯ECA(*z}Ċ3{z3}[w|#B~k#` aX6TW6<\ᖾ݃qwƤI۸K0aBAuuuK/aYh>Ú NS!BFtȯfp7o$ (nԷ.?UGzz'5\+ kni h%B@ Bϳet xcQuXXhħ&kB>72y%=7n\Juc&44ooon:b9\7N-u/_Ί+! !B]]coa5"Edzl1I/Ua aDoe?# \kVmBq !μJ虮êY9] [ )}"p8xꩧ~2&`rGGݪ뉧SfuTKÑ#GB!v;vgm.AB/0NjԄ0%POrSvPS,f%FvhɾB7/ =ӿ딕ݯ؛g;L 6"+_!b(mn'#,:Zfn𹢃}X06H-!͆Zq21'\I\q!p=FFmpwio0"B(F  Ot+Π˗i`C!”ҺV۪ȯ&VCvk|Jk z?2SZT_{rNⰭ.4쎞f} 6FN2FM%YB u"8q|+\ 8Bǚk[mSRC4|I~H1ytJ1B!8麎jm5WQXXp0N-r (a"D4f6W'~W:جxhrg RK[18mPz ;j߂kqݮX$'σ!YR!ڦN*eeBqVph:Y۪ܕI؃NZCF -LV2(2]-`TkG4alVg,2FM]; ,7jvD!YJmpt;Yk+s(bZYW[ /K 0 HIu233:uÞS)))B!Ġh;jm̯(@w1Q`V|w&gv 7Q$-b`h c`o69X^76|O/?! ]ٻw/SL`Aʘ!Lkl3k==vHO g~R8S#U+/ ,3} !Pdo3+C\(߿sxw06\ۦGFi'} 1uy. UU{8BxS555t%44AB!mդWaHy)Q6+6LT VzքrK1INynpp0L v=[D2XK!Do`iɇ66 KR+!qngg1=x3{/wߙB!]ɭhNUST{EieR jOSlLPRL\vͿaƵmz>_Ũ3xp;fD B!NOG+K7jw} E;/xy:~=} !0)c"3T4s3J2p8xgiXvtlGMA!X}#IÒ?B[r?Ϡze&\q q|3B a-z%>>Sfy !bik/e{gߵ/Yeb#I-sH yRně[0M!١&z~nd~7;.v6ܲ\ڣA isSwbIf27B!Đ`ZmlUh [ [J28 0B Ky?66G ~{>&^fZxb65WL,'gS4B!fggA mU۪[XGQ@9e1~8/?Y0:4{ Fjʕ+^!,VH8.4UBF;sh#8޿Ô+a7 4sDʘB1tα)jvy\FQj>mQ]qhk<?墒B!_@wzVc´:cޟB CKJ[KuvZ{HB!胮U6=풺VOP1ƩU!石dT7g !&+ǐإy~3^Ё' 2CŠ_r=3`A!'4첆ΚFveciWy.Mۍ BS [[Q$8 ՝^E;dѧgyHqڙݪj z1B!vFfI=$3k} Hv\75z jzA4M1ר`aB Sv( BCIO^ }3cB!jP3 F)y7t憺dB!0ݮmyb; jhl;mkD)jRbTŘ撧yp?Ғ"V rTV<ԳiCl6`A!v,a{Qo{Z:55j~MK m\É q0nہ=KΆ~wIJJth;ڱkvfdĘ3:v !>(ѡu`Ud_ !Đ5 .UAuP߸?A}CfcW|̸&-o);*;y#p%S{1B!j;al~q<1o/,}k)>?n&;``%!2UB;ƺf4kpccp>>s!+ v VX]w5B!6mFmyUd5pM~n/x}@묩ZRIqc1mԵQZCm[-qAq\=j+_NwyQ)ݪrw]kq^{+L8\m6mԶwseծU߫Jw0"rXBCx8N;b8q-$3EOwi>074ʐ̓1s ,񌿹m7~Cek%U-UԴ֠c%޽]B\׉ qw?jY[u>S~wdf2"n v;k=jwybBqAX[al¬wpcŰl#p%eLS< ?`C!4[jJO $(e*G&Uar]vzm>J?aIF`{Lgp;ft;)o.2ʚˈℋ]֒Nl4 s_nknUU{3{ʘoed[Mq |$H I"!8cB-x ܺ> Gy&|z|z/f^S+l#p%n/ T !Q4M't[;3ڻ4%Taf9D*γgg*yxaT+2ЛIO DZot>(؞kdmD:y5^&,5:-,ڙPPv٭i7oaW[Gǡ9:}evm˘t1[~LI'O Wa!F4c-8_hgg:m4ɗ 1"81\I[8%хB wvt[5]:qJ%W;Gक़ Oigr8b}INZRpƅF[@4#[+s;"񆤩b)j,[fBwc?Ud~΃-}1ih:JO@c6 }kk xbp"/-{ ŊUzz*~k.Ytqɡɼ%[}ev-cR|`n[>PBU 0U}ho@aN1\I[8~zO!İfwXmlU3v>3]1b#IU0J1M̏{iIćCuާWޡ޻iq˘ẤJ_ٺͥA~}~-2к2/B|B h3~GLWUU.J1G TX<2 47P^O}[=5m5Ljݡ>նzn3%m˴i9H?\ C /2?9߇?>cS.8YٜGJ©}{RD!Đ`Z۪؞Wͮ5Oߦs+S8z"`n놑k7SPQ]vg&oqc`wٺ-5;^ic_Yf3C-ZI+p7T/|u^ݕᓹ=vJJ{p?tuN' v7w4lئLpjd#Fof}Y?ýs !u%_TCӈWʙj0sv>w/7ߐvu*6lu6lu6s¶F~}>+0Uj]IS >⃜L1̚k&?p2Vw7ckU9tR꽫 a^#u{u]GZZG_gΣ>oB [5mUl˫`qng\0X3zBsmԙݙ1Nuxk9]2.T@k5貏檢Ml`R(؅rwJ3Z'>DN+GL7uddE9EYez,B1Y`RKA5;d`lQFwʍmnd18d#F~>k׮%<<vz !ۇJ қHUpRrS]5G=}&3?)I _+JKqw1L"29S~'&'bO. †BS K>XieFMM ~~~= U9XyU(m*`ZW(aRRBS6M;zϸIy2#Gݻv2:^@ʕ+ٰa儅1m4nfz\uUhکB!t[uw$7c=DhBi@|HK '-)qLxV˱qS9k"F[6ނb !}M˗hhʚz 'G3:p iz\{Z-dVe23rKӝWPX8zd] bo70=HZj818d#FE@Qmv;c۶m^oT(--e߾},]zeMMMH@)(ohe{Qd{^5Z*Sf$$ISF$ IDATcQYgfp'79o}A_s={Yxqq|tGM4(Owc_qǽO.>^zM68~1]@t@)gGd_iBww!X>B掸G2)//gwe*dee JfB)kVE^E T%>B$e˭5N NtvG;o}dO\i۶mcRrksјEX_ 6m~gjT.{&^JBp*g(G2Z-eMjl맶>__<`,j9Ԩ.(#0s> ?? '.yz|}}IIIWByUFm[5Uͧl@OMt (Rg]<LJNukurjsH沏a>a$$Hbp"I!I( R].5e;H/I'4ܺ\:v/*̪LsB]B_-F:0Yf ][hdHgyH`}> رcsiD6l / !蓮iakb;bzsqX٣'MGxA\O#Q%9õGLw7>t<ե:>!(LosN҄,MX uC}n.ڌCw8?!1۲A: ҿ~J;3c}9I<Xz57nncƍRكKt]gɒ%455/k.IKK[ޮ/>_/eLBtu$%slQsO[wgأ'w64v;|YFbh4i\b L8J6;6^g|x2J3zSPowy,EH{47xo}[!a,Q azt7H! @]cʅ=@}cb!bϏQ s1xP[oҥKٹs'{.O?4]vcvΝ;ɡkNFbbb[z5k׮%''&bbb8O~Gb++V?c:x "] !H:M݋I&ilnQzX5= -#ºܭ'LgƝKLaFF&:boX1SuugMIS BǑ$'oG3EQ:uyD/W?-MXjwGCw4a)!>!B"E `,fE>;QjvDѻ"ʯ~+:SNeDGG+{qfϞ͞={?]vqWSPPg˗j*z뭬Y///"""Xf /_|G̞=;w;V=B1ΑFvne$g|%x_}mw8/1Ÿgh|p1%^6gܖrs[H{% S?&+p# 7S{؀XLS:pVzk=BAR UFWTh*7Rn? 0%s1T6e˖Խ/((Yf1zh/~^pa@7@xx8O>$]vCꫯj7~x|}O8QTTTǎON21V!8X\]s;=V{6FY<-sϯ(w tLtaC!ͦf] vVVVVVv5tMM뼭CC5Xcc]i/(@Zj\\(|GSvfaB t !FPc3#ށnZOcK<zOJ>3d#F W\ISSO< 7܀bof[nv\r {҂_n>%%ŨXSSj~}r7vGBqph/c{nr \h~c2I9(Lca6'ڪfb'-q6f`8qᨭQ_VWg|_׹^Q_oۭ`9T/hNO?g v׽505(K`jP@Ԡ c_PpWKD8֨(,QxEE5MW_erIp[muzUW!Em7[@.pJd|, 꺎V_{e%ii.Yz Z]݀If$G]1@ 5454`wSQ+2آ x(,XBCrZ/A9ޒBiM|hҦC|BX{94|]NL@*gB`}S|8|wHȨ=Rxt!GԩSogff=mZ~3^R1=6l ""t̝;.0OEW@9MbE=> 5L ā ]\zω7RzpTTQUft+PWVuMQP:Oumu;ڢkG{qcZM=tǸ)ּS>N8|Ǝk:&8TooFvٳQeHFͯ#q ٷs{l+;Yg,KXU5vu88v0fEB!߃<'#qs8 k`Gf,Q**F?*49JX)C}37Ύ;3gN过8"!!!pFYYwئ? Q{9}ƏϕW^Ijj*7t>>>KZlϯzmm-o+**u]6F#Pw@yy9?رc.k׮eZjjjjxػw/o6HKK <l۶?7xG}z***x'صk֭c׮]iUUuuu{1ꨪ'~N֭[; y7ٶmO?4Ŵ+~͛+V@ux?_|#G׿v ygزe 1o2zX/##{~{SSSCuu5V`ر󟔗? < G}֭[Xf EEEpa^~e6lMxglhƊ+4 Ƴ> Mذȸx9|0<mmmfnG}kD^#xITKC?Kw3_̴EWD(`F=$\}$fUbrQJdI""˱Kr' 5bJ)n!-%%K %:kyͷh޽l?){a~s׈5ﬣܖO}m-|kMH`˹Wz8k\P՟-QT6PٙO|yᅔĎo]ˋH6\j|=y2{R+wyk5WKmh(w=793,$?) 4kPc.׿N]H-~~s7QVS4Kbcٴx1g$sQ/<:]Qh>"2Mc,cQMSYzo]GJuD^v$$-8>|;^z[ߟ{= aW{)|ϧh>׈GyB:4^#d14zK[3( l`L>*#d1_#@kzaS(6~C~at`9mPh]2׹Lb@ê#G@Fk5y 7tnz~HKK###'lxbKX`TE"ҺGo\/_n݋`ϟ'%LV=U:F'Gi|*?{yN9ipa$3+ܯ\% 1TE7Ud@j%׋}>!ʱ|Xzevx)̊'-1pp睓 UbI<9&GLfrd&N$?sڊ{q EE8()Gq1%%Ƃzg&ngđ9sKWpo\?Lwfv'U|ft{˱lO^˿c ?nO>'.c#׈9R;9u9\εI]?1=Hysт_ϣAgݧK@{܈1{2R썶---iZGʘ\s5ddd~jjj iMKKKmo/}NX#c}}7྾oveɷOߝmT۾Oۑ򜌔)I9}>'mvv*8]JE=aHKQlد/9 %E6.P|'v>XЕȪbIɤI<0OtqO(/.W\?_W:70p[,s5 KPZCCwT]^Qago v_mO>Nٻ8{ߝUݖ{l0bZ(JANBBI < 8@8166.زqMV[mf+ɒ%{W=3[i$͝5ИHٌF$ F+AsI ]ttX} F>_pKL ߿Pﭫߓ5ӻ?#FOKkVsUW艶Py=yo{m~>wNw0|OPy{~5Z[Оq nvb;+{r設(|-}| ߇nz{ҜIvq >; woHҳS# %=쎍>`ټ_zRl>Pg[l4?/AP1?ސW҆͞vIO0-z;Fv [[OlW{}|F1jCg'OQ8hNWR ZA(Eoލ# a ?ٝn4b(q?)ߎnGz5AݟSR7(*ee%JUU*人S8bDXMuTM7m³w_K:X>a_6g޸y.`;`P}0cxNϔ;a }a(dwQQYYYq,\y1m4*,I {h$!! Co=)e{/'r.9ETTTE%ո|lw}|\q*#FGhdрUbusOYi#$Oblx8YU@&Oqs9#|$kBջa̎f].>]\xqqHa;􉉧搦h#vÆ&P^K8,.WRBeo4fsKIPM4y,˼K` ׅwLVDBya0dwVVVg~_vX nKǏopPTTt$vƍN[o2kmk .얚 ]˶={ݳ sFxvC)x&O#تjTNMe#6 șH1$ i*2WZJJ\=-qW@2NF@OGn1'%KHhIX;>N}r2ḑnk+._\Ҵ,Fֈ{@yyLnI[lO|S݅ѩ IDAT`6 봩aa AHL̴QXV /Aboz7wə gr25ip#f{`-|&]Jθ aNtQ(Zn#I$ڦxh4s=oosvNUUV\ j0z6mnS1[Qo5\vq*o W96b2իT~VK$I9jRFguxۥVry61LZ[u#R@w՘Ǝ Y Cڨ())R[eSSL$lò|07%tw]R) So˔) kX0EF-[k]x~?&D F3RvkahOa]4ga'`cgzs kYp! ˖-/=Czz:vCAGk]ٱ oWlbjM؈*PղddT2P ]jK*ڭguëa%}WnWXVې+d0h4dvjvr25Q5p }f6%Qbbm7xGy-ސ" [,SatӦ! ȅk_>Vn~sf /_,.( 0tؓ_~Dw36|dLs/#FY^ryOVVV}j>^~ex6kjj6mD$6oܪ۟\."""ĚǏA8;\V]q=h'gAu4A4r_n}aLXj]}#XUҪ!J%J MbEEC!y]t22ЧݜNLD` {;vҸcx.'K;Zif"'%u5lA貟9 uY/1+#߂ CgBmۈHIwy; y!yáCXvmueee-?CZݒ^8=k׮glݺoHmSO=E^^?pOt6q~?^TUɡ+ZClf{Մa zcR<Ծ7$G6,1LKVCV|~~LjJqCe6+(4rdXÇw_CffuII231dd` >D 'ł; *;v`ĉFsۏEp}׷a;y5 ӸaSQ(¯;66v,祟׻ $ pê??k`=zfw NfH&׮]˼yNE333;Lvggg_r5P\\wkw}Ϟzh"- *yU.rjͯ&7F6 V!iXo4dD !y}l6O:3#!|sa6mOVwpx8huMǑKvz:)%BUUτ }suP¤{ݳ]BGĬN.. ="-"]7^:mO_$8AN|h9iiSIWx> 6Td̙\q\~=;QoIlݑ^}U>c:"))s9s=oؽ{7NFEEI*ATUP 5U_CۮcPUz=jS/6 H8y.:w6ҫ B%\ .$,)'glW'v덣G3r0uu׆\ܹBjU_2w@*F #hT"0ٳI{Q ǐ,=/&TEVeEV r l^ײ=H $Z I9IHK1BE EQ_H Wn.܍r7DP(ݎ _z)֩S䍗B{Z=şV w~q+sڑעEA`ߠh}aµIB_ٳ3g\r <4T&MG L?Pd{9};I)~E2^8c(V۞=ZŹ~ ԸPAufð%Kz5TU5q}V<@dܔnUTbIZMSrKNBob1Z,:Lz=&i.4H">)ƍ2eJ?ŕ8׬E9xg~٥O?]o efV,qQQlg04v~00T<Л<ٝg}ƒ%KXf ~؁:CZ>e#rB/莓J)B޾Tmz2H:Ib6mF#&9|yɐǕP7ddV\VUcCea>CpLsKĽ,+46x%ԭur$ -:L}X%҈-DDV|pTYq+W\|L]J2K.!+0 Q BhksݒPi?aR$O蘁SR5w`P;ngAϓݭ544tR,Y—_~IM-G1+9spg+JLIOb:$A % *wP,vbh?aQn0}hǸ`b md$9`>cp s%ķ z/_pY\}[-~>р5ʈ-|ĘǚZ}Fe^}Un-+)JV= Z^6B Dzl(3xw/G%)2r_5sӿaE=ITG[Jv( k׮eɒ%,YM։h.̙ٳEbh>9p@2& =A{)ع+1%q'6B"Y_Ƕ[QU컞\j^Hf0mX,bXy-Ghcc[%cWLb`Uw,uz46X" ؛߶Xsĸ-ք >x6UU)--%99J4N'kq\uu]>b~%D_{-Ne%nd m|zէ^J+ ;I0x`3`Bw, "-Bi\*ֲ\<{0N6>?# YqYZ21V6= \o6snj3!5bYYMm'/މ}iL& #F?uT<>mpvC:/>b7b%6-ؔ"ǛD*n+@׆\_8];VˈoW!m7BBh,O3^WpYCf%'rJ?!y2Wl}R{jT޸ yL!r] 0/Nxu:L!8e <2ݚ,ˬ^eÇ֪3e]Ɯ9sŤ=HLP)Bw ۹yl*m_lhyJ7*zaǣCffc{Ε+[V4Z<Mqx"'Lo +Mi0Z: fFsYj%$IAk~jVB[iulj4dVYVQ r@EO (ȲP{ǖq'l~>& -tze R\.+W8׮ Y;Ww^' IjMbS&=ߌ! bҭ/Q_~q`TU࣡CCU#Kzg>^{2x< 0;:Mrhix]sb{%MUU~`2OGGuGjFkwUQ,rPY`7%DƛIEHRrL08ʖ-[=zth##яяSGj~tMXnbn Q"(tFTҺ߬ [}߇EoAmu('8{ʝp`cGzJ}"~UVd&Nȝw! Z޽mU!HUtr_(gcl^ڪtae,WTDw #Jȩ;ˆחsҩ.>~IBSqz9ċT*eIeImIo8sږd)}HNtNOٔ ohJ;jޭcHIrNpw\Z0>UC~CZj}41e4bn 瞋F?s_=/h:ђȣS.AQxe@g~ xq1[\ܹs_>p\W>%#3'O}T(A8noW caڽ0zЛ:l:<БS-IeI 7oW^y%C };y2$bßQ;oTb4ddAϗ%GI 1-{54hiZޮ̸JI-=HqflM ȸcmk$> yb#kJ](a#sB,YHȰ}}N0J#w]0-9kt-'*s *>[`0NHy魓?ncԩ]} 5Tw}7>,vy+‰y2[ؐWMn~5[3ѷ} 222ؽ{w &"([jِWÆj #aѥeQGV;Q[EC))*3w<"bLm##̘"- 4:x].<^vI~ປCƻnl_ޏ>v/cvGAo47ya0YFE-&[l{pyM$dN#kB,] UU)**"##cPYP˗S4nֲ>g}09}N/=Uꜫy':,A]Gig j҄A>OvVRR¢E?o\$.ΝUW]8@4'^F$a :}Go/^K^-N:.3 R;Nk*Έ4ɸ-(dKD3SYFg I^N;{\>|7#Mξ֐/[n0\=avy[6KZ11Dam $F:oczJQz/tFL9%3jXUU~?z~~kܾƹ;r^6TU#`6]F7G gO^Xh}0sNz~ ,> 4붑,Y~/@S#Gl)sSah}# .Lx$BqU9ݫG *:KCiTjZJ؎'jmfKM mGD*Nk.k2wTDUpa0yܠ8{85{dlc.F(3oO?d{oH οy0d+쵗z$4n>$g[l<Ygf?g IDAT RWO* vVSsuH0jZ"٧ţTY&#l3')$ 9Q$D1)YM*JԢ:?6BUTvWSI395ԑHRyÇ>|8]cE݆u ~sLFAt`*8NOĚ!0d%OGa?$CyeOa;qqq #IVFhqZگ$ UQ{=<F^o2"6.z4f UE֩Bjp`ږ,3&221ZNgf4&J P68{W5 Nٷ}˰F9%QSM۹ATUe͚5 6L$Z5kb=^L>/뎮knuj~6"A`L`Oaap--OqU?f @LixvS"<褔kRQ&wTQU]'I9 \7R|].hhL&oGwd \yTn{+^JaZ4Cua:?^=ݑdwk ,^7|6u0oN]Iu'݂M<~/aC^ u̟?;FQyD%( /S1@ժQ)(DD?@Ull|r)ǧ*`),&WȹΤ9ׄlw:19\f47d{ۅ5(FzAU 8pT㬮QSմYS/x; / yܥ}.xuF#iq/~Ns^ vTr`c9|^bD&J#.rJf͚$F/?zʗ_O ̏ 4/n a{a {AN7]zL,SB5;رCu( ]ત^ͦrِW(d61 k PsDWdLՎaNҟMu @&5˝s.F c;jjg V#"6[L1bƵYgGvzb/:I#IX"DF8,6q9qTc onKCeHtwh#MciW6r`cs˨h~JٻQLPa{gFHt 8 ઀o9Xe}:ЏG;h"n˛=C1NR(}_ryA1ҧx][ؚF2K}iÖ#" 5XGaݝ2R*"HGIwB9l. /d;9h.OUU 8Wqt#Mc9)D_q=3۶NG̭w}h#&001|S͏GA2;1T#9pCzV& Y?fѢEXE |gus妛n"::7CҚOy/2&p<9ei<0 z)50i q9_!8l42iee5uo\̈*״*;R,3Nh=D\ش"([wGr(nz!|>^Hd m(L]Y)TSYT@UQ]:+FM?'dkVo>v<&1n"1YV(] eBt$N/1rjguosm2&'*+xy|yya#?'+OҖ(tҬ9#:( {wY3?w[&*ٽzj-Zć~Ь&wsIII|̝;qFXqOnr ѭƵ[앛1*nrG2ʈ#*6O]eɀÖޒnehI˫7kQ Bԛ'<Ҧb"0Vڻv_NLcDbFfBtlA)޴,,>~.{dKZ:Kdc'>n"&"2a68e9Pץcbt&!I}WUÇ3|ps Px1/R^v˔)$?; YY=0(Ȋ&A )_K@ pث@o% TOvh"-ZDaa!>m43gsebTMeL!#q\ث=]Z 4VpWA=IP4Z42a"QUը6D}yPl1&&Ƹ"1T"u,kK@;o.Q/_&5 -} P^E2?ol(tMLv744xb~m;XII&1w\nFQi>ϟ7ܮITTQQM.&υp-|٭2|W0]e]e@KhpYZ LR>\KQ|{μ^ vʼ0Y#NI%:#&%dƞ SzZ磢0FN;3d ޸NFDli琜#emUXYLF f9LZ[e~c䄶xOҸeKX퍣GO`о t*ܻ^;X SuX V<M}=8IegXba=0.t-`a7nUUꫯxOz-['曙7ocƌ9՗z@I%IRK=.\? B7rzܻrGG +WQ*haoӖ54CX 4w՞;!qKpD&& .ogds{(;";Vs`S9JsӮ&UUϨTUg TVAOgH oʶWZ4~?wN| f]=s1| T܋ݹ}!ϓ;wdѢE'LW\ܹsE~JKKcҥN*1[*rjͯfC^ *ܪy )&`B!2ԶgO^^U<(r%jCP* -燌Mw~to=n?awBg, vyi0j9$I >=ʮoKp:٦ 3nxIoUU)**"##C\NtQQcNT'rKsQ:){v<=i"eAJNϣ(pp{!,߁ nI$[?^kk5%ہ*PR1np٦'!NB {<|]{ÀTn$Q G О=ADβ'0r9}-3YVZɎoJ(\p޲,orw2&ěO…7m }UWh+'tWrݒTw}T(޹L:QvMn8q^o<~NII[naܹ=RhGسl(mupa?DmzeD!YRN|YUNbL;6l16W_u'<` &S҈iJf7?L'y.©ٿ;)޽aMבdnu1* رwIgGz CU>gEqt|A5]r2)iz!:a +u]6@="A*ú`˞mZ~6L-eJ."Qdk>f̘nJAs%Pռ^-+QbySBSr["VѠ}b)8Zhmq¿6:tևO]ۉLHl71dtr*1b;AGOvkxDFhEI5{l/^,B߫-uB-X]ҲioE5'\ĞӚ*:(x/t.ꗿaYSCs`Ӌ߂0x\Nˁ k)ؾ5d֧_"!kX/E78u5m40ጚFҠ( ˖-6zcrʞ_!'噧1 ҂<.n}N}CAzXLxO a}XϏl0>4"5y[|DO*[0ي>oC0xfd*9TsȗGhFFՁF ]s^Ux^zO´G-Bq:99Pc+,/WЦ j3cBкNȴqu#Htw݅Fkah*/o;oṼ 0yV:SL)L,1}ЧD[v'-_W1[Yʑl si("E~N;l(? ^5CxkkW*ƨhBhU=c|ddMlZN(ɡ7p` wnCe^}='!UU!* 0-?N2bRR{!c"v\;8JumݽĽy3G,_X鴉<^LA/EQx馛G'zkpܻ }J$n|R37`НTUhy R%*d< |}aǯHDKjgѱb9A:tphzRG +a}d^/ڭϜxg̾3&!Ib5:|l:JZôgrřLbqoPnʟ}6Q޶/&z!*a(PU7W\Q+j 0t޽{3fL̺-XPvZ~Ĉ2CA&?|LSO=ՕCtگ~+6n܈FaŊC(c"E)ڲC߬Žy Qy{nt` &4س -@s'J %P*_^WoqLuFLv3$dص}N0Y#&.38R;!s1i  HV} Kϲoݷ'nO.e 1Blj:FvpFMI 9=kP*+;ܮKL$Ȅo;Ƌ[^d|x yżY&%IBp_tv%W_h)tj̟?]|};4)Xmۈ)؇!rXKreMTE.G 4'U)ǣL&m$4%2Dƛ%loȧ䔦v6qMeHlq*Ѭ:)1c4,/_nWUT(X&'a=#!ba '~d=Խ纣HYdѣ1ŚY[kW#:Qg䌋/'qXN/D74:|l+KPT[> I Yvf\?ab'p|I"sX&MAgM_q?jS''=ϙgqd =Oe~iϟVɇw ܾ#/?=ЧD[v'b\1Nodپ뿔؅FL#`ϦޞE@s|(2'ovUM򺪬Ç1ӎd}k{g5m^c֑pzX]v|K/~Af}GTm) >Vu!F}?wQ?5WHH! J,y;<Ołt@BH!֙ dSk_wfM<|sC!нs6|i?Q_Ȁg''.1,rv7ۮhlH6e} he5KgkaGԝwvpTBw[5KVl^ pa ;(2A( &un}lKMM>ۙN kNI[$EcBPQ$!PeT]CyhjBPJM\ jJ]@]]Sz..SNuV[ۇcTQ!(i=AFl98+UnIeQ@ xz,j @$B1xTl3+~\_#gP?>gUܙHaN ,6w '?u_CƂVv}8]eqq_MI@#ZT謙9=(Dv[G$t [qK&xrÓM [MM FsAp{a`*~Gp0`&@$ӹ"U%YfCpppaaauPTB(waްkϣH/5!~)d- i/Fn\FVrXGWƀ#GkG%z5%jlȟBOz`4X\:qԫ5)Q-K2;]U&[Hvvdb&PwQšWKG>6sEիy2d_ÎR{>Ɍ:Ɯѹ*x:PX/bӒ4[ $l4=[e}}[Kr@"{;|IG{":-BPT_D'=!݂ tϠ IDAT{,7p]wu6&' u&lm5Wwlvz=rОZ1еr>-b:w}w}eSO=O? {洽X6mƚUDUm } =zHZ](u%ȎbP,ǝMRnegI"<.>GL%&)f&㨳hHz}mO"dUi -.uDkMe)C,+M8<<-r KV5ZBgUAo02ttLFсLv!;<,KiL:RFIo@0tboa돇ؽRn [3#%Չ!_4AoWmLODz?a_è,-vB0f>Cݢ{)c/8oX"[S T|d"b HbU1ZW׷?q}׷?)Qd/3kG*m(fg2(aOʵ*5-Mv{J4+ίc"xۘon8IeewnP] P}jW$ @6(B$^ҫ@&p +~aׯ?R_YYg73zww=/5䦷 !k[)SoDlXĻ+*(^4Cc!D*Ut@4/lz0%q #Ah,yfN?t4]ՇV#?Pq0p:Nv?SmǓDdYaA ᅥ>)Ć&$K2Ym[X"W9G)"#׻[ 2!#BY(!0,OlT*}{巤0gT5%}*`6Չfsx= ξZkW+9-+"~hG;rFGϲ6PO-CA|ަsh%taFU8rdshG`<'XuՂP0rñHF6(I: pθO~dmΟ nUdׯ?d uYΨfݢݩ,l`[~N".LE/"uf`/v^\ ,IxuNZ=O,ų_D+)--ZOuViW8+sy}cMRDypXT|dYa6n-Pfb@YAqT ;( ^9ŜQ=tf g'x=QgMnE: 4qyEn4$f:Q}+.GvYsf D1$hT}e.&^#xfm5 Bљ>sp.Щ+:Krn{ꪫ[(l-X Ӈ_́l^DaV r(hYm-; }鳘_sFxh vWv'`d~ٞYMD4 !4Azzm3'}L;shÍh ͫq(mŞ+;qV0oZ9cpD֊JLb1ذ3&D dYfѢE\qh44Z ç$<<՟ej,AgsiUM sR"-H$AiNti}΀뾂ݰ[PdpDwZ\CLD[p+##C첝]ơ_?Ǵ+m8Stcv獼/%m̑}~Q@!}1IdPơv18Fp-Biӥ+?'`|=[qV, ,ucμB .tЌhcYMP}ٓϪD4&S]Dq#۝H !R1C ejd?}W#pLsX )}m}As҃ԯ;ݘFüXR*Ǵe{k^O%vew:lrvncȤs8l,fĺZ+kO6u}.M̈́DH_jؼ<¢ڰ0R/B[|`FqC1x=%Fnj浩j ASq>k0:8O'DGyjYpDΝgPQD%:[](5(U.* $48'$]0fBÈۏۏؾ  \zjې=KMƴ0Hj= CIN$Q`zՖXu-LYV:oXRhq}qcP#Um÷L&L:ǹXn7p8xWxj'B wP-c4Դ|PfUs-C%|%IY{Ŝ W$6Sgcos)19/~o/ey{wpt f#-dl[ˆ o' Q-4s JXXMWS+gʯ^$%ʪ(aWY@Q$uWm)%DA>}`+KLp'82mO_fbZ7(CT}E/oQinM2h(1qd[ɱ6(jZLg}sGjwdEA#CvTSZ‚b:/0iEtRJGPSSChhz-&fߺBcz g]ُ!g^ w2B3bLK#:::ܵ.6ov[b@ĀLvmmy~x1^g? 1'.I[TvdUTT999"Cul}*6 )Tb[Ȏb{)`z.walk@47#c*A9?q:]?!F,tYr*?e&POTE`UFיS߀ptrS#{f$\Ȅ+BQ***lMAF%+?ɠulh\?@ 8# B[yz,>)3xiK ©99Ok&O &>. DnY^=,g+-~6 Ϡ( [(AX#"w:{r[OхQ68+l &1֟9->!hKkC(ysKU%lDH:u t'%`άlإ߀pr`W²٪HOX'%$ng޶% 2~ k<6qV$2 .{m- #ql^r巸ee̓O1־-s0$Aɷq -zլ.XMy6ã: *AwsnEa\g"5K8 }X8c!~ pJlf 5;THDh{G_TGfբJ,{-~ƽuSݼ{*:ɀCT*vI ;5C~tۻֺl:7aR8duЊ۴Yj){k}7A ʦofw_㰻^d9VcEs%W7C( ۷ogѧTXoeZzLy0!-QWUqOWcs޾l8wA U{VÎDE"i9Ob/a*% }[&B;X`R8֥Pрl?ք(DG>l/F#8 qc G Pm-xFo$osuGɨUU.ڏik5_kN>Q׳wPuL1g0uDmyA={2$]l- )B_JwK׆|GhAA4dJ>w obA\z=zJڭ;)X+(`w ; AG bGZa_c|>~NJA!|QU;h\VUud2a6>_kLnW[`ٰlqÉ&::I$ӘQ9zZ&ӰRB HZX<$"eh6,?~eNu#wp572 HŐ,|w\|mVĕwmacKy~=2 glԭXq97<&NlA}bh02| __ꎭ̆h'&݂[lřk*RVlNAoCv#ۋn#G1MR$]/F\OB9c5z4Azzg"VӡG_ݏxCCk׮un)^Ts8t뭪Bɓ9rdE&I#aH ƐL$V̙:^ш96kN 95GebK;o!pƾۭV~.wl5pKLlz $qp+f`qQy{+ŭ̸s8`HL$ȿ.ln(5'K9B;|U" 4Ŝ[h`L0;[>@/c,D[pk֭< qg( mgiah(J9(X}T G_|!OlGG݊L@NC( Iܴ(ż*y.綗f0LAÂTT;3,˲ƍU?_{;ZU׷\RZmyGV}^eqžцz|"֯8_^ZF̣2-ya|UܸFo ӵǜے$H|nU/Bcϼ_Tuw2>Ovosa_=yyyHN^[AŞ={\wnEQpdJrj)ʮ0lE8p "q⨷W[5rGiK3\LܖQVVFia TkM4({UV[j1X,*}L@`` MW2dp89-IQQꪃJJJ4mYShk}~'F#qb}X=lLi04$?A{WG8y$w =ۧ|[j-.9?s#94cA<^Xһ,ܤX FSIt'|:sۺu+W_}59993 y 2=P_pţc}]q\UE/ne-CH&z5I!ѿ=' ګhD@`xpBȭu٧e_D[s!HZ+Q`ᥐp3wHz!I9C$I575ÿ 矑$c5̙3Yl2:Lj+ۋ,+T63C[PwQ4O$XLDQgO5 IDAT/^5|ONBʊfUڥťXDOxeg}믿4ϵj**++[$h$%{[={h"\f޼yTWW8&$$h}Byy,t#6 BVF@dYv2D ǹsh4DFFR###U%VD7@mm-dggb bbbj3*\ 6lE "&8I>q}1d+EQHOOgذaږ4_JTb0?粶ȱ opUЈ+\E {Qݎ1[o#hz((?}, g>+݂ t 9Nv`3|r$)MNO~m~V',ngC idwCa"k^Ѐl/'GFL!uu0C6y"LNN,bĢ4P%5P#pH2nmb6Uz衇bcƌwZN@{%j*>Kw {h#׸};ysn"wщN7B !3Yq%%ittH @X+ڵ͕[[MLCYIdHII!;;e6&VbԩHK/?a nGC?(&WǒkIx_`T9VTa3r9XHƥFpFj$iQ=ev|h46MDDF&$YZlڵmQQQMXnF6ʯ'6~%˯Am-&wV/o(3_kLC⨩8د}>xI!;jE)AͰEuǥL)CqmLJKK$> 1k֬6YRvȔ&om&k(k xU0$G!PCKߡQU⦿qP-9ɲf]\2R#y$?&0*NkmKR;::`8څFQlF׷Y۞r֬YÚ5khJ|Njg~E/ry+ gOQdlf0v,2?#3f𻣌zfy8dOkXm\xBZ2aC|3 ,;&>ZNW!!݂ t6i#%7|wj#mI|g7dhb`XNhV0nshwR@%.88IJ/cMޓR~ZjN2qy뮼yymOžIvMjw>Aq1vXjjj-zJYY)%+++Yn֭#<<)ݫHvFp$#ӶR `tX  iDZh7rms#O~-s:ic2p@OTTۅԴ1y7o$3cXأ=vsKWi3UeX(r-ư?#Io='LCھ Wu{VGDt'9vcgzorJV^uBBB\QQQc5 tY%%%dffRPf9ؖ6-nٻwoDd[a=0UVmYjޚծ|c` {; #?eӱ=vP V_7&l-G Љpk]*kJ9* !HqDkFpFs4P-9R-[22U 6m#HF?_Zr:iӦyaϞ=,Z0Im '?`߾}BBB*mv]LշYE.NT1bpLX:E%Iänf}zp;pwvu,}} 5Vc4)7 dv簕7&99 ςŢBeWgs7SiD3o<': +W ^YX&/^̕W^$I3ףkU-=w\ϟ$IL2U 苪W^dddP]e+) . I+SNmybLZBtL6,]O_qImO&q;/5kְb {ュzNAN]]ݻ\N&((A1iҤ7?P`r dB$sTBgVQǷ/?GuIQsC:EN`ct :jLS$/g//'w-$"s>ʠ1W9v ju9(sQ/@f׽:aE'%rwyO?DZZ?K,ilVV?#=ݳgC(+@d EZ [ظ/S !1c7Զ: ӠptttkZbccIHH8 '/88c2gz!f͚EjjIOپ};zgΨֆ >w;G$tv }4|T㊳pF 2 Gg{GvZ Y}d btQQ$-CJ1}w˭8jk12+ZvhD7U1 2Ip/pba>okb4%:'n$ EQ8sERàӡ8d>n'_u\mm-vjjC.ZB'@FF#''U.퉄稱P!L]v ã% ;Cm:o!i:EVX8]8XF+CmVRJލ7bmUQy=4brEQy.ŏANGQ sIɑQp.0v;;m㥧3{lvyI=$ > ?HXv/r cBCCy:Ah&L&/RFVFl}X^zkѐB풂W{WƯチfkq3ѴJɀkt]0j<#y=Κ5k;v,&LPuvEqw5y ꎳɠITXEY, W>F2GRDe>S.Wd_?܋lt*uޞe`v>B}IRSQQACCDEE5:/{'f @qQf3g޽deep8߿?^{}qg2nܸv'PrrBg? ‡ Y}U%KE2[ǥ>EdiJ~|{7vb ;3z%МnVPqL襗H" x +2_d|e.nAm/ŷ4g=coCkeBuEuriRb($$(v_(B+X,OPP)-, vTmm-@9F0Sd6Sm`w&:3}xV+{8/84qiOydY_e]*b1sFnkւ^=bcoؿ=&:A go'm nfc\QQQm mh42l0v{CC&XͲCMnsf =/4"Iԓ λ>bSX}u|\$ yR+sѽ#YNf Ù|Nfy1oK}rGU1U 7?aW\ 1]}#Rמð5 hGaD$&E[A:><7=TNȒ[Kۻ<m~}1"3ݽ^PqVc߸ YR[˒Wwb1=I{Fozƽ{ɛ=ux$*pE\ATG" tfՏS.onqmƄ ˹;ƽ5\ôi1bzI#A:BII}'N:!EV>DK>_"x)irYyw=Tw%1I!\(<'Kݼ4[1ߙtB\"- Yyns\5?Ѕt9 gOgLz6;,.\}ҕSNmXܒ$~]K8v%99) ]lju&tBCC{lqP].ty$XM|9k˾anuOdEQ%))S(y;iЎJ Fa m~Zl6BgAҊa©vK t96;%]< I{d.Ph|( $px^pGh[G_TZ]v v t~ _͛73c SFrOӟ\'P;+)k ÙkXCyԋ x֝l&n6vv_'xsڛLs>NBE6zҿT% L{|V&9t{.DGGK/qu׵/5''{ FÓO>ɓO>RSSٵk-BayשqذaLXd,U7^`߬npXV HNNf̞=`)))|CLДmA ޙHt JO')v0\)ܺRx?%ۊO*?c̙$I,_)ST|N0yd֬YCRR999mA[\AAjl6ͣAxV˘1c80HKrA_mp kظ .{B;:QU:1#%ri⫝4Mw⨪"O"^hQqC103|EA&g lvg vB@ϞVv/\Jtñ>yyy_bԙ2e ,wt BsWj`ӦM,_Fߩ[, `Wc9XAQ ͡X+Tœi,ˬXGy辑["Pjਪ/\}M$g se D[VIsL[~kayOm'L$Io߾'}lV Ӥp7sn ƺu7oWb8J(Kn-ssZi̬j爄Ψp|?ue|Ԗ6IutF-?bǯyUSx1 /LU Ӭ Z=i#"Ik 2 `]qp5tk'2jkkO{|BY|9O^ $Iߟo+(UY,V\ɫʆ < F20w'znR$t:yߋ`?"T]y_=7*h4L6GyRC9w8Zy,9܎Q*J^8;Ïƽ{?0A[s h40r ,+)·1WyTTNeeIcʕMl̙# ci4 ܹsK Wud_~^c˖-łc>:+Ґͧ2QKb"ӭZ>zjJ'`=nΓ0 F?39C5]x8ow߀U]$j8d7VAqdYshu}o8^^ ].ȑ#>;;kQ,6A׋rA4 #Ff֬YN IDAT:~7xtHD=]l@Ew`dBg1oU,S5GyE1x僽_8uc.Cf̠G ЉBdVfrwQѡ$Ib„ =r#}BrV;<I'_h4z=v֭\~#IdݴŪ ݕfc֭]ɤaÆ1sL|]ϥT/=PG#t"F;EYMM'ٻ3þ{Y▹J-\r5%%}swQAQmfe83 gui0<9ºeJLDj1Я;J1zV5k.>./':/B@2..?Q߶ر!HZ Ȍ~ #ڏzV(b^R/лwo;wN3]~}L8/0#,, vq808s zꥏGٓ×_~ ;;;#B)..Ƶkpҥ*oJaÆ^zzNg8SI[b^0q(ZvDSu>Y3Kнwv8$͙ .a?hq;o.|%"v|;NN"&#EVcŘ;w.rUR#7Lڱ&@珁7 5tݻ`F3y] fffP(..a^| ;}+{R!##C#RQaa!._WViSJLt҅.!PbG!(A9HO/w;nòh!8v nZhlAČ bȂ"4l)8T|68Ob8CII }џG@䑪= o*`fn]'₿&LVb8#//,j&A8|0Mt]b,--ѧO|ҥKWI,'O"(( B8Cho Ggb!ǰ[:`K'}=CUR"t<ZtѾ1b\,K{b8Íp?>6o8!PH70r04Fվ(83Cp^aӦMy&L777rtk׮EDD h%HBHؠѱcG^sXnbccJH^{)aciO1Űw{>:JW8߻ÿ,ZUAvm0 zi-N.0!U0 %ݖ{G[ m?8!,cǎ<F?`Q`uվ&/ʆ5zkcӧO,hݺ5mehJBD#++ݻwyɿ'ڹqXs0&9夦`"?#]1;_| ]Md<~ɛÛm"ʂ2zD^"$Ozo\f|kBDIJ@" ++J8,`=IT6oرc;!JEEE8z(_zlÆ 1tP xOGƎhm\<(c΂wʖzi3J )*žoBe^?MkjVQd$MuD~R){|,IO`J)!Ĉ,˗/k׮/ P(Ҵnz^4M!5caa!C`РA055اObݺu(qRek .uCXvLxӛ~1 q;i S -+@9H6=qqLLDؑH-nuv*MtB+vbLw^s3;nR1!KKKÞ={)LΝd^lWΣ[E\DqO{7(dc&hKYLY}W릔֦65ػZ 8p,~Cu 2_n F!RS F@񴲛ͨQhBWWWL4 :uz׮]æM0>p@Dri֯SK퓵7ÝSLe88ZE %"G *Nt/Q/|(B!˲ yb8?ڍMQee [0 6oެ#+[k׮iVyBэ|;}KAUߣadPW!H,ZoQ]* 1ciy^{{ο d !3F0FgB~07d:Q:/R9jcB!{"!!A1FvLe|Թ%ٚҀ޿}KCTV5ޞ6&f8IZ{ z 8>Y{6$:fx  B1R۰ۘp|_K7IB?ݴ[mӦ Mt @ngFDFNVcɒ%Ph͜FV~xi0,J9v8O 8ؿ'MZ=tY%`""ELe7a9`9js@Լ8!Ġ6]ee_cj5+W `Ȑ!-Tt޼yH([mcc$jcB!z۷'''L:"'#LV݊&%8( X[[k~Μ鍫dxk4y) GQK#7 Cz4~%NF”P\)<}{aIH/Lǧg?ÌƷ/_RT]btqB/Օyaݺu;˨=<<|8K!ѣi@$##!Pp3>[BJ˲0:|Mtk\oo^U8RLQU`lZJM_SNFj+c1,މnX矝8!D_y"Z]իҥ ._,vATBHP\\۷o2AUfRW~BpִzOphz ̈́ d$vFw[<:MJ6$E2aq(PTٚ^?s"$#b$Ecǎ\v "1>~~~tƏB ѣGq "77W8/A&i[PFjeq5TC^hUknH". 0|8Zܼyg fNXs䌼u @&DBhCNv{{{k>yI!hqܻwu!**JTңL)*Xkݼ=K}HNN'E?ȇ/?Pb>[©6"$GT0 <>>ZIfϟ fo{scSSBcBj ~Qb"1? !ѣn+((@PPN< k&p;m?L&àA=yv"3&,L060?ê8_IV =oų3Nfx;=%mtJtCHmb7nh>1IuV0 ҏ競mPI!GTbϞ=P*[gDFFd7m 7f#[DwmW͚8ͣphJQK V1ۻZd_9%8X Ge?ZNݽԟ8>9~ L7!RDTcb&''-M&M`Ѽ9sVVVСCǴZB LZZxk2 Æ Cpaa+0^aЬYWmݞo-Ц,2 7/IMp:3V:w/HzGdUgCHmpg0,o>̝;'''$%%Ttׂ 0o< ((cu)!ž={_X틮]8Jp*r;s9u g7Zoݻ/N\D8F ~ Р$StG(xx>֭+p2B!WyIݻ+T*heg/^L5c1c5_}j"B&GGGL0!!!tiӦҥɤOfEQ1c *}M}s*⭇GSoOQ 01򑞐_8>G:a+ X߇:3B3O0˱ !Bu՜M!bxq3^ 㐕GGW`׼4.75Gf:JZ{`()_4Q=h&t)E$L4aܿ%`""e矝۫,ĎCy.Vvmq+9 ˗/D1bK'_D/~b6mSD8ihS>WuVVx|X;P+8#ݰ ?lk8t{Sjgnق LD8>g!!"33 lB1.Ƅ^Vvo۶핎733-<==ѲeW<ܺu 7n7pMDGGkcccѨQWkb߾}BuI&{zISը_>qUt_Sve̙7oHJ!Hr> ŵdؼQ4JV__|QKz?gav:{dwݏq7$Ak}6hEDǩT?7n..h|LNF@Vbxoۇ6yϣ1p5"]6 *Ծ}{ܹsGkU&oݺ!Ch6g_tp)M6Ǐ5A%!Hajj_](ũXd~{z®wCS}}0BX7h/\ VؿRbsyV&`n'9[ Lڔ))>YYu`z$$83Y¸VNE!D {q={+O\\~mD pI\v ֭CƍfϞUT)˴oߞ.q! x"BBBpI\H[F& T<&T8ܺuFcvAnվJn"Cɾ0b@@bN&mӏZv)3rd@7^=B^.<F;=a!** YYY +ϗ_~TUyf~~~:u*_fJ7'Z|94j Te󅅅ؿ?`ѯs5i҄^ !D"\3gh̙3EL$=!χ(~[>{i"/qZq/ZD[78l"# Dj=3NLl=." ]y-Ƥw???,]ZҥK`gϞeeÇ1gϞEddd?*j J !6KKK: >}4p9s.DbYɘ|zƳ8W{4ZEvOffzW2]۝§[{|{#6D݄b茶.8_0z~~>n!]W222p `Ĉպ'NZPZ&NV8pZX[-Svl6<&s=&xwP˗/׈-Z:X`p S/[}L yRn]=&^^C#h>t"no'2 o}&Ǥ NqZ ?=y575?W akN4DŽ'5L4o;εNC9wOZf;] <ؠaÆO‡5Wpp0J% W]*PPPFII UAR! ??@ieٲeCjj*~w7p!}pmLdeeܽ{{P"ݿ׬Y( OJӝ;w(/k)qF$$$/<~I[jzX-Zjؼy3… 8}4ҕ=,YHLLW^լܽ{7+V@nn.onݺ8[n(\p=ٳp֮]$KWDDDhZ:uJ!͛S(J,Zm۶BCC ضmbbb-RӧO5ŋq)@PP""J/QPP$]@i+#G٣cʕAFFVZyL88x1ߐ\Xݻw;i۳~z$&&K,~8z5^mD6aaaزe XF$9+``?)\6FkHFt2 ^c@K7ؼ~FŒ#~^ yCelrMvOS/Dpkg`۷/b7Ƶ׻n!i$FFk#T5bTQ{G5$Ayd8t /^DPP^kz|e5cje!˝yeg|ʎ-:}[زXcyL==&R~LqAd>۷ǀ`jG IDATbbJ!U~1Ll11Rĺu0m4d2=&K$(lS%}#q` Gd& > ujiCLI4+> ֮qFİc9wO ˲Xz5>S11߽q=&˲mݹW ezdwzzftU6<~8 4gt->>^^^FJJ ^&i O!>[w6m0x`@)8pssӼЕԸ'JY[_ SS~_CVM֝Zc`b&8\qZ^=χ?$b9!DtAIMC-1瓙YiEǡ?P(0 :uTӈz&fff/=\yY{}Ԝ M4 !noŽ{,}4DR~5֨1_[O~h߯R#?v-PfǠ".Nj5iiBK^˲Xf f͚;>{#)oذ>D˖-W7DJE!DW6mQF᯿R=&** ;wĈ#`jd}Rz2dvf6B8<@V6'71Ż3f_kYU~0 zi(r*Nj  ֆ&`uȼiS}%R~X;8:HIpT0~T?'WZfУa.f#Db(j<WᶲMzY *k ___ //O>tM6[j%Dpy0|Bѹƍc̘1رc֖\ B@@@ UQ ]>Y=XP!pp3h2E6[ ^Od8f BCQt<v 3kŚk*΁/Aء1nBy1:kcop-VBBBqBCCر޳Ɩ>}!萧'Ǝ[n#Ŏ;?Aj&J"Ott(Z2 D8[ /?FfBDdt):wߡIS=܂P*C'"Žy^塡 ŏ?7Æ |aǝ:uJwީ;0 4@F}P B `ܸqs ھ};L&]V 0+V#p˲8z(m-5s=ޚJև`;%Sww֩#v "A-[b yk:nҞ# PјLv=z@֭q\rWpLff&>3gfϞ-h;!իW~a'dBZu\S_kNdD2OܔIj|n~*p*BHuɭ'`SMp6]ǥMobG"R b^h'n݊>{zzn 7n!C[iӦaI'`ҥ;!a۶mzƍXG<8} VMHj6l)S ŎJ˻PqŎ$(pd]<}[wЯ;B&~%ΎF;vbG!ژmD^`Aj]Nv@nn.֮]}!:: x71yrY'Uݺuqԩ O*B@FFmۆ\Ǹ?ɤGP-TsԫWO YIqtr8Wҿq!y7z^q! \\\0ߓ /Fpp0jZy+2mR9Px/EL% ,ԩS1a>V$p*8Zʹ"3I!`"߯!wu{{Ѯ]pz&:s#&̢ C1.R"]4!Dh*((@||<}dggBȼѻwoX>}ZDҥ?i[s,ű9"333#hX;'ӵoޏ(ڙU,m*P]ۣpòؑĴukvnW\;N>CO4Mx]t [W_~EhB @n㣵~Uܽ{WDd吹8Y\m2 ={4KzڿV=8uBR J\/kgt?cJ3byprPstɂ$!☇}16nX9b111|/c믿ZZB!ƅa 4HMMS5%2H]{PԖ;ytK0rzR],b˖-0aA1nނ";B-=!FEH&v&F/A6.~҄Ζ/ćP'ڹÊ+x' !gcB᪹L&0Sq`~ HP^^^w^nB!EذaCmKKK >\@q3Y0oސ[ӊ˚8U=C+~rY \=N%.pHxڠkn;mRڋWca*5CyIχ+G&@*{Rd2d7!q1rH8::Kr?Z2l4]`dF8˲,⨎ÿ+xkn^M0zJ=*'-Z߾³!5u;6ڻ;!ecBbmLBCCh^B!UҤIٳg}@ !"e!$$Ġ< I`nſ%)*wN8<ۣUz5Xp[TԟA쐡(}[s{֎( 11 %UjØ]nkӦMmBJ!оd2L4!ZOP`Ϟ=xxx_9*"t;ʰJ`WBY\CEF{RIWx:#~FH ԊcZR}2kkx|-M[O[ v}aZ !*1?_39H7}~;By)cÞp5 >P#aJ{1 \ ?-^*W݄B#99;wDvv6a0vX4nXdQ=.X>#LieT>y![֡磩qYnz!Zp H?mF]N%}>yOlAW HQ"CNqoaJ)"//KښߚmƍׯMmٷD- sssɓ'xYiM3 QF?G\V;gN$}p>]k=ebEE&"R0 -:4P3r0-Zڥ6y.LvoܸO<0033_wZ yxx`̙xzt{޼yPI*E/Bt^zxwyk&5da |XrcBn/&#MUpϿYeVN$}&pK%K&BT,۵㭩v!ژe{ĉ,lݺ֭0ԩZlerbG#B eq%Irx +ܞLu9;oMYƕ1'>F&+ݬRսQ+p*b̨W"D֭U_~;!#V$v "qR9_PIM8i Ssl&#)Z{CbѲ%G/*HY& 1<}*vB T<޶aݸq#F|SL{P(}vpqq}ЦM}E$ƃbG#b }vlݺbǑ,Neܫ{d2X}f E-кw_ޚJYƷziW]s3]7Ws"F@ {PEHiC0NO0A#Gوpvv(Jpa[o^zgl޼YB ~zڊBINNΝ;5O1rHR8CT䞈60q;(XŮ]0bI+3>FQ~o}ߢIZbע0d%{4o4ޚih|0d"RW,kq(PGz.sEJEaژHWټ$C/2 iٷzZeju5mʞTr F!8pJeۇ֭[JZy%E3O;NmFf|'8ÃЪU+ɜLwNo\[suBTJxC,lL1fA[ J8E|(޽[w>.O8tL<9Or֗X~ !1&]Lvtq>[AH!DP1110 IDAT ǏB!tp;HfJs)QdaGfܴ#p"5qB|%n812ܿ򷕾~=G菣#ܭ7yQnbԤ8!D}yqD@gϦUBըQ#xxx gǏǰaDH& Eo-d,Z8JTRXlf͚#F&i1w&8= u*o(5]5E  M@`j|ҷ CvppWXԟ"$#R$ɱ ?<ii~~7!!AcBKR{].`kkDjcB!DPIIIظq#Xđ#GE吾)Orxf mq[jgq`kk+Ng6xkuĐ%3̵COpXoI7+l #DLjha6X HtjXta˜`k31{#ERi16&v-BWNZGAaa1pj9 o'@Hȱݹ;7N$}Όs+I'>''~zKդD:yt´ub0g,My7&FuU!Oݻw+||&a8>mĹ JJ*2n0kPdb>!^ۘaŊ D|||aT*'#PB!$..[nZ?~<5j$XBjܴTl1jB v.}*+Y 65c׵nfI/uذf8!B A1sZh "..UCll,}dg.BӨQ#tIkСC(Y%HHU,={H^;W7t0R@_ɨ,V''2S@[;}ka'"NT;DMc "m2!S4### hn_>ԩ+++}|[Caaahݺu͛ Bz뭷 L^Ta4nܸxU(̭wq!~MLѦ$H;t)NFÌ׈ύBם;!zcLcB䫯ʕ+0 r9fϞ?u":\TĘp;J(;=1!mcrQ7oƂ h9s&ׯFnB!bhڴ)ڵt8=>t8KC꺻`Kb Z+WBo{s} G>'_ab[KxȊ䒚adg㣨f6=!=$!{FEP@APQO~pyCPҋRBR( !=ݝ䈙L6z#{yY~3>j=!$8N~^n>: 4JFd[zyHl2}55?llҥE-NDDWvqA\H_՗Q7d(^M# 9rt~u>A-5H-CY*NPS d.Zr" lFLFb-$T!}ɫ反kݿM=U70`CbR`BWp(&om7`*0mَQ՝$ܼgܟڶɴӰ]y)n'jTʉރX+<#d,3Tc*ҋoj&<_6,0xxRرcK/U;M6E˖ʳO.g3](8 ~,!wk&lI$,^XW= =j, _-@맞A@gwؔɢ׈Zօv[!3Dŋ9(C6ӽNwm9gBD{lK=M6>Z  gwC{,crqơرcѵkWV?*˘ܹsQ\qb~Э[7S %IH6ogxh~FYUd#?wG |v͛7;vСCQ~}8;;`0<Ѝx8#Zj_~V{AffjP/ Aז5v[$^@x+J 8ʉ*=%I„ Od2sģH}n:}m5ٌM6Dn!8asAAVPRXZP] ڏ{9%*'"""<<6eCܹs t8y$DѦ*M 8NV65KNNӧUNEBEt҅=qݟbꮏwpB>kf$&2so{ʗ/_ 69<<}vލ . 11o H1~xX,q?oooj}׮]Q1 łٳgdBԶMn82+kMumZks_:BhDܹjt(8N[^Ƶ<.eD=M6ի:AK/aʕ\{N]>((eUg$aٲeHNNVcȑ5viz4,#-- mX>y<3+5/(emSlr"JJv>,99jZ"9u&ۅ|aep2(_QFT]!{Qm7 nO߮Z4ӑX$ 9 [6 .aV, =:<6.-- h۶-<==m#Ə Ȯ!22j}TU%)0giHٳgM#֎ Y438<[~d~sJjrI 2(ĭwn$V\\7jѱ!=`wHHX,SƍHJJ*w㚧DDTuڵb/lVJrp3*r~=V > ZÚڡ XZέT\8[Dk)~ug%<0)r֯GIO4m=Ytj})0I&U{ vw,#>>O*G-V6k/""KErUN>C_cz nnOLJ"=wg;6aQ*GÞ&ݑ=z4dYo۷oZYnZu4""ѣk%%%HJJR7P  E0MQ9Q刢#F@mۭ/hP?T\r"m 4kwۄ䄀 >#F0nF*^;ƶZNe/Q׏⠼q-QuƞfyaĈz*ڷokbQ{gq-BCߦM?-Z(}D>Y͖"P$lݺ=xF맞V j&iAK?y*֮_Bkc ߸q O8ktvbsЧA=2<'S6*i̘1lP燔 >^^^СxJAh"[Ĥ?u""J F=p!4jO=Ղ[@N+wܹ7<6jf<=0a8o̥%jn^6}]?k9͉4ʩj>AQ:霣 wd^ E ;vpF#ݕ/U&""f7n@hhQjK~)n x³os%uzZ!c(iKe(^U^{ФvyGTDDDD5GUKlYݬߍo$=tۀ|7xt[,|y pruS޺ yژA"":ӏ?K*_0}tcQ5ֶ*MEߟ5YZcVWp74HM}7*ѝQɈcCzbeL~ݽ\ e4,NNNԞ o8?B舱_/D-_}mfQ5ĐuH$Y’KP`*CT{zo>w%""M$|y:?bb2?H{unS嵹o%,,I(:XZA&fEw1xq#Þ3nPIDDDD2`фq(Ȯ8kptĸ9Sbӊڡxq2gwAe@Y0]0xyitfﵽ)FXz뽑8lq`t#!!O+\Q%2܇3XL8'i/8 [(};)7.eH ϜAQP )?Y˖it먯r^B{v=zMj[naʕX|9mۆS%2=ʞ _?ڹ[Qr"ujԶ$P y*2kry&&vicCz2&yyyHIIAnn.JJJziTt/.cBDDz{ܹs厷o=FjLW08:URԶMطtbaxQ*'ޖ9|>S6P10s1{b7Q/TNDz6TqwGwпa R٧tPwu̝;7nD||CEfFȚzQdXh"YgΜA׮]Qvm %3%W\֝+c[i"Iw^DFFBy?Ean}|Q*muju$<8m + V kJ|!j+Ijk֘1 ..{MŚl2!*'"_oBH=yHOl*{ťBݺuc}}ڵ*LGnݺZG """;rƍZGBt|&T&@vm+/`ZΆ (s&L<%'jt=M}||yyyj,66cYYYUD>} ˲1lFeڵ=OMٻ:;Ԇwb[ :9f32}n "IIm$\X؞]TyHOl2ݸqcȲ ֭[}k.w޲5… qu$%%hJq*b.-ř[h›9kZd:DQ@($3xŪx{Wƍ(UlJYSOe(.f^,W'iQ2<'6ywmSO]Һxb\rGGGo-svl@ѢE ͚5KhDDDBvv1IpJ2r_ IDATػ[gSSw׸s jU\.IAѤr"}Ο 2nF\q2Ɉ}N d;22[իW,G.]駟b۶mؾ}; ""e\v1#&&n'N:j m6̙3;w:@q1l\9Oi-d}6D<\*!z?L矇c[Pr"" " Qp$ʩH^ )..F`` ѣG:t\=..:t@aa!dYyH[lA~:"YQPPhDDD5Yii)?ÇرcQ^= oL?_:yHO8M@DDT-"""B&I٣r",nk8em􇣳D[~Z-gv]S7NN;V&!k2Yw>: y6Ǹ]5ѱ!=᫜˼7Z?piH~=<+Omޠr v}+,f T9~..3Z& k*U!k%d {v .h&QuӪU+ZY5>>iii*'͛7gc#^Ѥ㊵/ 5>VDk)>ΊnlH?|^~+Wd-_Ѩr"<<15b*D0(hЖpM(O>VGU1 UAкuk<6i5=6Dzb(߄9j9)!zyHO*'Ek ]fX;}4TNT3Ȳ9XriPx6"3'n疔 k~u+nZ$^z+n}UnnE!=1cP ÞݤW^.DDD DQDk8uʉje0ű܄lMO"IV^͞A@]/_}o[/)ϲ\ѰMb,dfkRi)JUNDDd{yHO= 0pww8Qc20sL*'Qd+o5JVyi>}0L)ht}nr%?7J֬G0"G5S9~32p>__~>Çg!"""R_UKrf7)ر#Y.]( r"5rkjUq-s%?xSD?#|.5ARn\:<&E?w%""nnnh߾b-33*'NzkG8TEfCi>>ß?pfEDaY>n=nbs֑cCzW9)2dgGn b(ǵBw­UQ9,Ia<AD'*֊M;r""99}(2J̊u,p%%%YNDDDwx{{e˖7oڵk*'/=-m^D4hЀ=iulP}'͈c)¦ڞrW]ZC7i;<'&EQQQ|$""zݻwZ;r䈊Ij^!:t4݃k٩~)KDDT]EkE*'"{ݤhҤIXF #<<\۷?, fΜɞe7._l:ZG?컡n"_p PegamZ=`Czd0`ڵkcؿC?֊+qѣѣGULBCE5=L%ٷ+&O'#xaM/R9wNiLy|JN>jcCzWy tRDFF_~AÆ #$$[lAdd$/_Pg6m Cp2U9=(#V^mZ ~D[4N֑UBbpvd[~A!H|RSDTN:ZȻ=^i D<=kL8 `֭8q֭[3g`e'N7= A$ 'NP9=IpB<9a Nn\rS.!-FS7BkQlM*.Fո3Hy=\ ZThDLh?M}fgG&ZGj= s{ow)t ]vűc*ԛ6mXƢI?`AA<<<F 7gX0{lT999aҤIpuu Y$%aү%aXkI<$i¡ؿ*Vkch3DDp=[F{vGTDu "*SP899}w{lݺ5x t]VZZӧOf2 84dsf'ɲsαH@PkJvV3eX PDDDU=.q̘1ÇG&M "A HJJz/еkWaaaxWqA%%KG׮]/}x1d\sڵܥ!999K.5шh?Y0 Q|9\-`fCPx.X;k+,:>?(EEEUV#C># A_ޜ9p 6Q%pF!=`o^^^ݻ7q3 990fر'N~ fϞj[dDDD ""111(((@LL qL<Æ {KOeDDDzۗ;֤I=(}Q2ӵxjvڕ~V}X;}iOU<.7UN/OO _G];Q9<\XDr!n^O}@ǎѨQ#޽{Dq^xlذ1Ǐ_]">>(̙3hݺu -0uVٟcccѲeKm'N(wYbAΝ;vo߾U)eggcܹhٲ%wU cE_̬p\ts@!:4HEUewbm䴯FYç'RPצ#_Dtɂ%`0f4mUWu4""EU1.˙&LѸqcĻ˗/ tw֭@7b\22m4 c=ƍ5kl6cРA_2 e?ϰX,|"""ŠA8]E<c;|4@b9sT69[<ЌkDDw*7vYK}vH yHO˾~7ޯo߾hРyfյ{T7\hm]dzJ֯_SV*T9΍:p zy](bȐ!ܬh[jG7,h9~Ңt쿁ש"1/KѣNt VPj&<'|?{gIGFFZ euшӧOWy믊'O4h=U5A8=|=U6U%CgmvT+7998Y`Z稜EZ: CƇ?Dn ? { v? .<<|;wLjոt?Gaa!RSS7s-[֭Ctt4/Dnn.233_='wOlܸ9={6ӑ3fbbbvZ֭[qq󑒒%ybccj*]pС$99SL,HHHҥKܹc޽˗#>>~:.\8z(oNp}(((@ZZ͛7Yt8w`̙FVV+3g شiN:;w.n߾|L>qk֬l۶ ǎ,X7oDII >3@\\V\ ؽ{7<Xx1!ILIŋ<ݻwV\8g}ܼy ,;v ۶mG==bƌjV}Qд`p;*ҊJv՝ע#n'"CM8 ;Εb w~|`G$Opi8Kz406; [RG=`0|{Yc̘1 A;ts{Ɓ zߌ tRbf۶m߿?`eںu0|DEE!77ر#Əg}͛7DZc I Ab);"I C3/Uy߻g|wܽ9ߓ{>'|N߽ł |N0febc wj2dz³Vm_Mt "d<0 m:{0߼8x=}DO=9k.A֘s݂uul޼9A焿{}='EEEecFxXM~zl툈3ݻO>$`ر& 9r$͛Zji2pttQtI$^#F(kI{?}H8}qf<,XqUy:cԔEnT3gd)wB|Dj)6c}z {lDF󐽸;.  e_]㏔}fLUmʕ|$""dk IDAT l޼3g, '"Fɞi3-f3.F(EDŚ13UN?ł;p$;IG\\JW8ЭsyHO*vϿgΞ~Kjܸqk֬9spiX,?~fYh$IoΞ mk{C6 GnFb~O=[|96""p8;;v,ir?nJ ZVHNNFRRR[NNшӧwߕmsW~~~bT9LBM{NODр֑k٩)~!ZDspBx.f!Wa:;| Sn@*'""zxyH/8Zl k׮}~ -Zir1j aaanf:]jڴ)/!>z(g<"YQq{ƣ)(gϞjDV~/voW9Mвg] \8tS0:3r$XZD4DD= _叨W^e_ݻdYƾ}СͳU^{ HLL,w8qш쒻;ڵkXKOOG||ʉ_ ܚq ϣb&! ,KT;~Х17/otzEDF~!KGSa1-9ֆWsPuFDDU/8Go:{v?_| XΝ;0`@-}!,, nZG#""[ݺu {zzrGd,x,t}WE׏6O= ߲5L7-A;(Xd-{(֊&\r"gw;rC6 ubyHO*D͛7ǠAYcΜ9﫚2RSS@DDTye]6 &RgՉK3?<k'nAap>NA0f|XГ&bP]8ȥLlͥiSwX߽Yޒ:*⿿oz E(2a0Y< GpW\ÇuVٟ֭=<|8pYL6 I&m۶6U\;wш=zqƊ39%WsKS⣏>3u S"R'T5|GFc eϏErq)ٗ.aKǿh{AOya.]ѣG?4hP:u C ׭~;#9sŇقxxiF#5NDDDDd%Nw .pEs;˼iT^#S9ȲCI 5텁K?XuifBt b""һ2&ԱcG?ӦMCΝ ggg4h ߏs@5j!""";ctk @Z!pRx@,˸r {+~!nX=q \ߖA+"dYn JtzZ_z~zaȦrf7Yw ʈ#MۛTQb,h~5$aٲex׸aٕkEZeO.bKRi)D> KFFC@ ޏQ6r_i &ugFɨ*!{Q39MRzI²(rka臝4H/~Y_)ւMA*'"ztoĻ{bJ)q*"#.cB6$&&M8QhDDDDUB$ٳr18h=X~-UN?ÆApqQe/_Ȯ#@DH?5{v"GGG4hn\„bS'p|hu.NQ1>9{`Zŋ(R9Q=}r.]BDT)\ƄʩrdYhDZBTgf f cV&Q[,T3]ḣOlJSkCݯfȾqѣG"""ĉopB$I’%K<ۉb0%="!aۥrynT%Arsiʉl+՘;ǸB= IѺuk͚MVZ˲gϪI%f mid,AQt 0Z~DQ|QdKl/j#M;a*)V9|Kw̥ذ5矇XZ3`؞/l~Ncӑu$z@yHO*'Eu瑘X6qD8 4b-** =$hBΦ0.P+8ZϩC[ +K"1T-W]Rh3* /X+zGj # wN[GTt^pChhhшjAо}{ZNN8sa8¹b0&R%IŽ;x2΄wZ5.e޾6kܨR̘Z\4DU,1rH| X̊= Iт `0ADDm۶ziiTTiG`YBao&{;fk/D#-uUN4鬼QeJ|oHCBP'k$1QDDUAtKM^Z_qqd ;! iBjբX[wjm^uZ*J-*nu[jU,KHaM$dg9,sf漞G;Ϝ"p:v֣$L[ݪ~.***@X;Fׯ8Mx3 C{ ð; @lbof8>*&Bt5]ۿL5,Nÿ۠7hժժZ~P>/sCYθkO,N2r;+61tmb8ԙ3MךU':Nec~zxj4oW]szj*%U#/\ijeW))͹'q o얤+9 ](/DPן=K?SGYY6'+9K?3+TyCp"˥oyPn;ug_S{[`׫7x>f7Lܹeggm۶M k0?kmC2LoxS: ; O*+y$4as.T\\چ ,N|>֯_OƼ^nݤzOh߱;-Rĩ{dӵ]kJj޺:swUȣ1fRT}{:5'QIhvTff&2>|URٙi޽1Yx恓,|;l\@JKKS>}L׶l٢&.׫%K<- 6ې ;wR;}Ϭ $"5,tm#jj`"RSt饦kuWDu~wj}ʇu j 솩oFر4wޭծ;mQɯתv-g2˭߱UUG $2iip3&vHZkIk0S=z4rb30n:.o H 4H111k29u.KFRZGW[XX)I[!n |>\0A"cp'&Fdebs(s0AoC"IQI;q܆ZFb~2'2 ÆdxCNny<c6lu&ǣy橮\uޖj~.BGz,edGr3DΕz5$wj:?*c0iɀ5p16ǾzcyM>f7L+@(0/\6 -.K^{*9nakC!]v`9s6n՜miS'3u>Eed ̍7jL1ףU|dݱ> N ڻw&%%E)))6uEr\ՠA_/::ZhEOUc6*eF?8 Uϟ_}A29Ye^3Aekڭ*ȩ}#`WlgL;` ˭'>ƖFNbX\eee7o4{l5Fz ׫]Mq!-s2,I;W|.יtۨpUYuB"'<@3|NTjkk Iھ}ڬsf7Gf=JFIQaa`ggOژcj+NxW䞚M;]3W;w)$QIhvTYY:\NDF({Xӵ5+dq3f 78 $O[uRX8պݫ IRY-O͵6' M

|ͪ\x叺7U{Udi恓,o]4jݺuzSO7TC7:Gy$sEǛ-w(ۥ>Ej+-N\FdZ[;7c$9:Y>7^Bf IDATwSʼnB5f7L;@/7zTTT$IjllT~~႔e]F Hs k`q3ּIXƹ [3g5߯+,N973iH=`N³;fwptӍmfCАzJy}j]:8:@?LZ{jDt3]۵4ΖrRDڱnq>az%js|PAzc9զdTk 솩 @РALvڥ&nw2^WO=ߚRZW[U^ e U\r8Mp0 FGVX Y%"=]]dVɧj.8GbT"\_tk^V>6' =_Wf7L=#rv!77xss,Nn~_<- *]E+nrS2"\nrƵeb.e䞣lJe1QR|Uo[YnZ~6g7e~6gro;Y05p@v7 dff*dtf4|ڹsiNyu[vd,X`21`.-e=)g:ArzM2]۵;FQYYko-afo1Bj ܘ=_ۭkڵJMMUnnrssեKawvZ.CCU`k,YH"z MҺ%馒ªvǫJtxOM!g_[k).VJd>{̜ᣣ*!!ATSSczv^eeeWϞ=y1sWn2]K"[ c[XMzzۿD:&`C*gj9vL&n-o3ؐ $׳\={GEEItYz} ^>C5EJSLۃ.ȴX ֊MR!LfVHMU%|8Pu5Nhvݻ5tPeee7o&&&a& N PVt SxCMEU5U|uũ5f7LTKKգ>J̓V 55ھ_Zѳ7}O[?ݑlp߹]L׊!VJQeK*,6 D ܉sm>nJ+8Up恓A%8>0 UUU񨰰P۶mΝ;u7svDza\pVkGkMzL9u/1},_m2]5`l79Լo_Ȍ lT GXJt&`SB̓P0YYYvGPTT{Oo+hjllԶmcw{Ui}F$ک2g葓(ӵu-Nl˥2]k޷OukX.{MӇo j8n2e8Giݺuks|֭ҥKs~׬0Ip e4e{j-Nl)߹\0Ft;4(2[O}^DX-'K+B]~<NJtE'm0uqa`~׶njaz'VlT:T뵪HkTՙ.Iܮڊc ]9tQ&KQes*cm Lj T)mwIII4]۶m/g=}vB5ns~@Ƃ re9va?*T[hq"g?o"{4]xM>pr44a?Dnn ZgйW:eziGs 3J˥oTTT5k-N TI*05{l L <m۶Y&xx^ UMVQ&oS]UiC Jg(% Uoeq tڧcXLj T솩˗0 cS~L׶m>a;'"5FQku[eyULlTyxOJٜJ]()kS*k!EfjvG̙<@ S eRSS{Z&8Ӯyb2$Gf*!RJkWX&x-qvR2eklT{YM&=dOT\ֻߵ;%δBnzxd0]s(ǣ~kiG]*iJoEt頤asvmU_SmR) ^„ b>K-Nu/yis~mJe3yPDΝtmǎ|rtvNV׻G*L7eЕ3nqǣV[&xd2oQ6g+cְcv8ܼ>.(ko^~vؙ<@(YS]T&LUXXhqp0#V~JJ7W/8M>׼-I7pvRZgwm ܆殅zsכ5f7L]z饎ݬ p(5'2zzyІa?<ӵXWkq.Ik2^Tފ;tmh8FtϽq]#!uy$4ajr)22R4]/lq"{nzahذa2 # m~[SԐWDž=\.2)ܸN͍ ' bԭon{\i~vJ]f7L)77WYYYm>͛gw4p\. b{n9ca2dYrT/nסW/Tሼu-^KM{ZuxnLժL<}?ǜs=?3`ɀWT&O1Zj 솩{G[lў={|}vGoΝ;-Ncǣ\̿!(Z^ܰL>/LBYAC册1?qM;Tg.P5ю%%F S4o/g5{n577[555gSdDՌ2 }S.RchtQ&NJkUv]=zhCzpŃnIzx?oc4a.ܬ={Xz^WoY<(5;U]$?'Q%Puϧo׽ݫlBn?n1@իbccM,Nc=ۭ9sܹ+!R񣻩 g@0OVӵZ?0 Ϳ8Q`n3f noի} ꤄I=~9JbuɋJ/U+Uyqi6Z?:Gk~ʼn#5hvTn,oIMM-Nc<;>R)d.6~3wIFFMօ/ls<'&=,/Xn&.;;%>r.P|JM6]۽Q&Bazd#HP.?{'7y$<ւu|>WU*XR%%I6Gbu铨#{ۭpD~ T;^dnM G恓8x,ws]vY:GO>$5N~|Rk[~CuU6&VUYi I 'o>xPukYݨy$4aO FٳG ҍ7H̓S;wqϫ k-N[ ٨I3Kk[-4/j8 rb Βczjk5BYZ>Jj~DU qJ`FJ2t꣏ 71;7֏nս+7xϜDfϞ.8Hݕhgqkx^V>5R?7t7ո;|7t0g6-bgwV4+ݻmrؔ /KZYR7η;y`Bz)nc\.gwڵ+,g/5V(3PIɦk<$[RǛx4$#2Rz>kşw fpB=A5yڭb/TXQhC*: ~KR %%%iѺԫW/u ϧybw6=nVӁ=Xrȱkׯ7 8U6Nx0z*Yf7L[ DFFj̘12ens=K0l\.]uUR H~70$ePS;[&xa>(a&#)Cs'Εiky`y`ó.r6..bM2Eݻwiw鐚 P1t"7+p(=%tmFˤ^tw^z%qYf7LtmLl㭫Ӟ+Ҟ.W/Sx|RR[bפ恓솩svϧ% nxj=ҭ-N<\n2Z*f\qq2"߄|Xpfo[.*(kSIhvTnn|>1ZZZTPP_ӂ j*cӶmۨyp {vw4[(xeXۢCb+czQծXaq9uG赝Vw}z,KHH`.;;<ސ!CԧOjϧu^vPGU^?mSKy%_#M 7qYt}G2hԑq)~FU[oSk\q~_UVir ӵM2Kرaj;8 \KO|\YYRS%)#)Ú, &6n(IΕW^ŋ>9sڬkܸqϗƍu9{S1"I]vUIIIck׮uȑ6Ǎ~W^т t-}Z%$$H,SءHYYYo O~o;rٕ;dI;k|UKYC9 Tz_+M&]SzY(0B?[~+.N/,VǟPނ9s0d#_ӎ8'%o߮c஻:عsgk{җFΟ?_SNܹsꫯ_~s;}ѣG+??_6m$˥?_W_}M&I$б+I>ϲK#:ϼsT%ǪSxj!-!ɗ}۴SR6 InVmuű@x7[o|~w%O>ڻw}]׷_W@2%%%[omsNVRBBFyJK:^f>wL-奩&L;5UcڭU4,__&^[BL8 }Y / Ѕ^?Ϫ5a ~SMMnfŝ J׳S/^]]]kkۿ;9p!]^WIIIﰯJ0N8]ǩo&֚)ܮև:Kwr\[LI{Pނ9s0d#x=zzzmk >֓OwעA8Cɓ'$$ڵO/!!kO>moÆ 6/^싉񥦦1>s\yOr hozkF~N8gτ '?L?O>3g$MLL<)gL$֮]{FQnPit6llll=xoꫯ$?ף>'5j8C*%%E_|o߮$:19]C a׮]߿icLPuuuį9siz״qFUWWG\={_눟3z g9GQQQ_{;ԝwyVrԥ˙d3pVg(66vSS޿m 8=4%1\٣}[}߿kw fY͕;}wz{Ȑ! fY|>>SIR||FIhvs=~?UTT$I>}z-gfY! /?)߿O>Hjݺu+~ga5{fw 5J۶mӳ>ŋ@֭&LnfrGhv#.]zHӦMSNdLbw,onAJHHPbbƏ =1cX 4H?OTVVfw<fv#͛796yd}g n$ 2D PYYVZF]zzw~ tEDD(::Zٳa=zT{ջwocp\rfΜc*22R'O;@@EFFnӽޫ袋]twؘ|?~[544o֢Ez饗lLřP6m҈#8'0L^{5]{? l &nI6l$СCV$EEEٜhf7@nݺٜ 𚛛CIMfo+a[N֭UPPj٣zg}V/VAAjkkխ[7M8Q?5iҤN g3f z{ѣGUYY 6СC0a~_ɷ tfv#FhӦM~O tWh޽~3gw;1J0<=eddhJHH8z'33L8Q-R>}N) `Ƙ߯HNN֔)S٢"M6׍7ި?PWւ Էo_I_&<) gժU;E-X띢"|>h*))СC'v6#qfwx駕QF);;[ahʔ)ZtS+ŋ[sΜ9m5n8riƍ:sN %k]vWYY^z%]wugMG zD{СCչsgQ%gvKfRO2ܹN:Πz;w8MZ:tH7UZZ'|F78cZ|UVVƍ}i֭g4!Iz7[o|~w%czwU__%5ϱc4uT?8MVx$Ig4!ImF\x~gFzMM֯_&5O}}f̘[n7kڵ~YP$i풤eddncǎHyZZZ4sL-_\ӧO… Rc@ Tjɒ%zmi*))㕝ً;بÇK}{ j…:I҆ 4nܸ,YDݻw?#5{I4{lx0- d_{Q׮]5b%&&X6mRMM222hѢ~Y UWWNLLx?hƉ$* dSYYzPfhv+ַb}ڰa!Chƌ3ghATT?::3OC顇 H6@ dCQ 띜W \8bcc[o755}O<+λ;8n|X1\`Ff7.]H?qÂS PpG IRnn/۷oIcǎC \Df7$I'On'ӧ~*Iȑ#;<@PpG' IUW]z{***$M>;8nH/\rJ=3S^^9sH\.xK3-jwdv+((вe+))i[o)-- m;ҲeTZZ9shƍ5ki&͝;W{GÇ=jwc|>!pv^x?8ӧ2Zn⊓{gaQpGFFҶmj*((Pmmu &覛nj@(zNęGhvBn@ȣ y4!f7 <GhvBn@ȣ y4!f7VKKkޣ*0?K\9QQL*G45ԘX0 \"qFZZYjQM ԑ X*$H S @ߜ-s8`o-woeټ;wĜ9sZ JJ;;;SGt~;JOO7uz^nnnX&""".-Bjj*~G466:->ޭ5aoonv:GՊn}󉈈" S'@DDDD}[ll,Μ9#1zhXZZMQ`b[0w\Beee駟 0aFDDD b:҂8o#66ք_\\Zm{PDjj.**ˆ#L=Ƅ:UXXj?8#@؈})su;vL6zn""""۷E.!BCCX hii%/""" SblnnnL_WdeePݢnn""""IOOJJW_EEE"&""B_f @$ 88⩩Ffffk׊hZhZTTT ??uuu mZĉbƎ ggg"??wO?{سg;* pvvFyy9 سg\]]w^JJ dOl[XXƐ!CP__K./d}||ϣqqqX|裏׿5&LgѣGqUBMss(j̟?SիJ={F̆Hiii hƇK#GJGZ[[EO?$n߾] I.\ŴHIIIСCE\@@@dffJ*JzzzJ_},Dz$,+WtiDݻI$F#椥u",--UVIeee:ߖ,,,D|隺(BCCk׮⊊$oooknn.[PP YYYxߗ*++~wҪU$GGv6m$|m$ggg1?;G%w}󒓓%I{};tg:8_CuaLb s\"V""""C`n""""2r077F?5kw^3F W_uҥK!I`Ĉ8u~bܰo>֭[wСCHHHXZZ_֮] GGGYbcc'}VB]]sܾ}:1|p1FZZZ;!vttDFF-[򞞞Xvm}áVmO5;A3m}Yq:<(-L`~~~X~"""+h򗿈iW6o,SLիo)n.̙3z* [l\I1k֬.ッ1w\@eehѕѣGwug$?AѼ qG^z_:9uT1>|1=ǎ{=8))IK]Ų.Zk,Ok> ܽwMMMjnQ42d983"""9 *(x EU(**Bqq؞1c`ggJܸqpssϞ=+J_7gWkhb兡C*%999zm&tP7@k3uT<#(((@CC+۵kh#`}nc2e FK.!-- ׮];÷0qssã>ڭ9N;wz|Η^zI|8Cj=^X&""""9r|1633Vebݭ[dK.nA+JA>WѼ1Vs\I[+++1nk/~DTT?۪b$Iؽ{maժUhmmŧ~+W˄ ]ȬYwkVq+c۶mZDDDDb7voVYm>| ;4tCYYYý#=P׽WEEx'O444 77Νҏ?.^p9`իWC$aʕŔɲ~˖-Cdd 3"#m IDAT"""?&""""P:EF1VZ0`Ar C1[pNUn 5FiӦ.^,| Y 77lΜ9ظq""""?Ȥlmm$'kcc#555rQ---]׽=N${"::ZE۷oX_oaFh|}} D|o~:~ߊe<==w~rM"""zpMDDDD&,ׯ_7XYw+W(seEqO777+ oaa5MJ֦ƐNdݱn:͛1}tfDDDD9^{51/xkqss3֬Ye|jj*233SxikkH… 1Hў -/,< \\\ vSOo۶))$Yt:Q_b7\`` L"_xl߾] cÆ aɒ%b{˖-;\'// .TyDJ,[ø !Cۯӧ󑖖 bbbh"BɎwUnQΝ;b_^L <<\Κ5 6m2qVDDDD]0uDDDDDfffؿ?&M455!::|ϟ' y&p)c7puK,`h4TVV/Ν;؈ ۷Oox;v@aa!"##jQUU;v@YYf̘/-z6 {ܹs܌Rx{{c̙󃇇QSSbرct{]Xddd/pѣGpBL<ǥKˊy1~x}5>|XEMM ͛h3⌕QX&""">7|(((ի{5Kp1;v]qCQ֯_ K:==⼼=ugΜ'N 00n?~ǏW47 ERR7n4Ѳ&/e{Μ98V=Qo6lc;`̙裏bŊNFo077ow\V#** YYYUN: @Ruŋ GGG7.^7xNNN]:88 88)))&yqZga]zzzv>n816334'""""JD^lܸqUUU!C0f7zׯ_ɓ'Q\\ Z wwwL>vvv"Fp}hZ떖"-- /~ ̘1CnOI<֭[hhh5鉇~O=_5nܸZX[[C`ĉ~wɒ%Ϻ/=jN=WTT#Fmo)DDDDD:Xjg}b7{vQm6Q>|8}^;wxx6n(kBweYfCDDD*O9{,z-?~ƒ!ێs?;|1,!MDDDDD&uMDEEA$ܹsŨQxbgHDDDDDDDDDdR8tP Bbb"js`h0a1]ym;왛 .DNN&MdꔈPIx9>MDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDDDDDDDDDDDDMDDDDDDDDDD/9a8IENDB`PKmN6ΒXNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_dOmega0.0_EMFalse_LPMFalse.pngPNG  IHDR?sBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxwtgޅ17SC/t cz =j PIHB =H ``cK$[$[k;GHڙwW$ """"""""""*T(MDDDDDDDDDDcc7xl&"""""""""DDDDDDDDDDT౱ <6vQn""""""""""*MDDDDDDDDDDcc7xl&"""""""""DDDDDDDDDDT౱ <6vQn"B&,, $A$Ȧbcc[|_dd%KHc4~qHaΝ3֭[ 7IЫW/5jTrt@dƎk^111ބ|۷>@Νj?ƌիCVUTAk׮|oUVGZ* * ""SLۑ o-o;r]Vll,T*\ެYlCcٳ'U xxxDSF-[ --&srq81;""gZbٲexw:[lǏQHҧaݺu GEШQ#ܸqޡRRR0qD|ٖ]t .]²eЭ[7,\v>1n8ܽ{7۲k׮ڵkؿ?̙9s`ҤIdjt^cǎUY˖-RпřJԡ={ٳgcHIIɶ޽{wN>~KᅬB*}(qccc74 V\KMZZ֮]QFY^8N'ZhaU *(cIMMunF^z_B .ٳg 6ƍطorʏjɘ;ww />|/{OUA믿d1حӶm[,Y&1u+WSNr(S j5 7oĐ!CqFZ >>>ZwA(G_4Q>پ};իWK/ f 0ҥK-ΧV rNŋǎ;zٻ=+V QQQxiӦ|_o3|pܾ}ǎÇq]L>]^~ =:tJV3g4hn߾==8=zN>$ٳ#GMmO8[]q5eڃ~*00PnmFƍ {C!>>'OݻÇزe ^~e9-[o8 G8JDDT""RL@̚5KL:U|_Vϟ+PGѹC=yDTPA%6md6VӧO78zM*p(qػQ8="ŞDD yn s˾}bu AO7eʕ 0S=zL2v/T_|a2姈v`0([ !0|phZ@NtVkɟWX!lTz OOOh :?[[0a^ Nyfe$I{߭_ު 2G8JDDT0H!WƋ/(UU:uȜ iƍ Z =z@WWW\rh߾=>8qB\*ݻ5kB$H>}:[ϟc֭?~<""" OOOx{{TRh߾=fϞZް0y' 99-BvH$?޴iS9ĉ-F!̙ƴ4,]mڴARၐt+Vگ_?/_n Z>>f͚-Zdɒ@PPjժ*ȑ#:t(ʕ+///A{Ik6}llA[۱cFիhѢ𐏭$jTxlذA~߫W']swwǐ!C۶m0?Νyݘ?"žvݻصk߼y3>}j,{ЯC-[M6ETTXW~?{'LmZOLL 6l(h* ʯk#a:FVJ\[wލlٲDѰaC̚5 䆭J)y<Q>[r""'W^=Mϛ7Om۶uYQJGrz͚5dY>RxUQlY9mXXrJtV~~~+/^lv{xqǏ_7nBtR f~ !v)sssW|mիWE:ur,e˖"111rc";v?L=uꔜI&&W_}evI$  ,WbرB$e+VLڵGJX2Z;Ʌ DӦM[%K,aLNQrK.k͚5f>| cǡ1I^~޽{\m͖>##Cykq:tU\9guw}W~̘1֡Ə/i۶m/r 8BJ1t~X^n5JͅPx ÞDD 8{ ݻwGi9VZŋw_>ڴiMB PnͣƜ9s͚58x *T-kא(.Vׯ֭[iӦ %%%aС,ڵkhӦqruʓU=})HHHxRE_{5qdd$N:P"##Q^=c0,u^{uO:o C-PvmB`h۶AZS \2"##QjU@||<:udGu!4m`5???4l-[DJܹW^y[lGdGgΜ1ܸqcy֭ wwweq3;viٶ...nܸѢkl\\~7snؒ~ 6鿷dҥ;Z;vD%;wU9GC:VFݻcʕWZ-[Dxx8$I+-J͝ITط9M4I/ttt۷95vX9mhhزeȖ.))IlܸQtM̞=dyzv۷Oi5j$=zd>H4iD|֭[FӜF믿fKb yyJr,O8Srj޲e򒗷oPEhD׮]'OlQqzzu\pA#I?ܠOdK }{etBd6D׬YSN;h j1bҥK۲eA, cFɓ'&c|7 СCFӥŋׯ/RRRMKKt㡟ݺQv9 ѩS'9ak4vٳ'ofWN爭O!C)Wt7DVqXΝ;bBRxlRX~rڈYF 9}v̦WR:Լy󲥙>}u6S| nnny*KǾ*yq8c(q~?yD&[qN*Eus%"Ƅv؁{|]vt˗/СC&DYfŠ.˖-Cns@޽uVrJe0͛- lڪUy!/^cQ~ 5~puuŸqZP&y_~y sL?w\)SF`6n܈Ȝn…2Vw? .]$XjU?H+3s ,yQs:NюCG?+>#̙3G*RJhٲ%jժep޳g6l(_RzO.~yH2cN:h^{ЯCT*DGGgKӯ_?:TBB&6~tI=RGC:Rʕ+,dXRo5-J͝ITXo9 "",YD~ߧOQooot˗/ؤIyzzʳȟ9s 6yĉFod4ʗ/ $$$ʕ+x juy:uꄒ%KZ#F`~ 3g4!\p@Ɛ!Cr}mN׮]Ë/ ƣ4I&X"\={֭[x饗=֭[ŋG-.ȼA_OsLQFaڴi[Bdˍ@Zr,RJh߾=mfUmŊ%%K"""vBjj*:(CU\``Ǜ%jԨa2E׸d;ҿIOJJʶǡy d^z{aXv-"`o}>}0as$̘1he˖еkW(IժU+fKSre8qPY iLIIIV5f@=Ru _U~eiŋk[~unuNŠDD6c0H)еk/4ZWv 7ŋay|w}}Qʺy&vڅgx222 n8{`K{ƍãGpmر:uʖNbʨ(*UlJl7Bӧ(V|ӧˍ`͚5?TgQ/z}GƼ+rcwRRΟ?5k믿6uo}dK7~xڵkhѢʗ/(4o͚5糾~[I|xe*} f7sJJq 83f̀K.2IFFnܸ!7Y*U*ߐ\zՠ;##pʵ4=d:^*Y<ŋw2<5أJ=Ν;-g6%I[3֐7ߘl$ ,Mk?;?]dpW_BnLƤIhrC(QիW>}+Wスԫ)uq8c(q~|gIoqk[umY7w:'Qan""v9uqqA߾}yݨ+={6N*z5|7od6wÇGXXbhڴ)Ǝkq^ **1SKnjsgu#Gmۆx5k񆄄YrX5{ҥK#22{˗qj8U6KhѢsuuZS}Mʵ4hZm;s Μ9cu9TT .4E1wQ~r%ѣG닱cb֭|2={t!䗹1͸+We0 02dbc[։*{uW_֛knff-'zxxX~{xU)( D97JDS/s_n6}x~@&Ow]u pqq1dݺuqd2޽֡'4E?:ZF:uϛ6mu7nSϑ. P(q(Up{(Q7w:'QaƞDD6O?|VŲeq ŋpB8q{ž}cѥO>AJJܳ9''OFÆ 1sL=$I¢E, /^X\Vȑ#\ry͖k #G޽{d>FoΝ;g0t믿n G޾޽;x $''cڵ#۷e5ۯ6k/%\H ߲cE&'+(,ZY)ל"%%%ۣܺuK~_Je<-u{c0&&mڴjbƍioG*uq8c(q~{yyuZ IKas<(Q7WIDk!"~M~=-۷K.ȑ#Vعs|shX\̙3@f#F͛{Kn9o/}j4\` -[֪2۷ooԹ?~x)'O jopNM0M68Ɯ85PkġTC[۷ bL||<6l`u;J9((@.6md4ӧEbŊIIIFߺuѿā*Kÿ_-Z:>:ǵ92(!z(]ߕ?\h4tϟ?'N4(YfٳgVW)uqkRu Yf%]f͛{@iNly^+Vu]%JDwl&"ʣ ȕ֭[纜&Mo^حhѢb⫯۶mv}h۶A%[n&ciw1(s޽+4b„ b۶mb߾}bբ_~Eޮ^zm؝f@4iĢJm_n k쎏1+bٲe?7ocǎ5؟*Jl߾=ߺuK)RD#IիXfػwX~߿PTݻE7"<< 7}u։C 777@ 8Тr-mB!C'F!VX!v-OqFg] =WOOOѾ}{^cƌs ŰaÄGoj4Mll2ss{I-o_Ν;Ň~(/./wqq̖kPn%~+!2>5jdpٳXzطoشi=zpww_>==]dkXUزQL_%svQF}1n8^{li5k˗i %=r T!2wFFvlVVMlRԨQC<.~9[n%Jl&lv2bҤI",,Lxxx01i$hЈ?cPys] no߾mmq&cMsڴiekZr\.,Z-bʔ),^Jl_n kB˗/lWN/77{;r3[f6m˗-=q7[n߾}ſkQ4vk41uTq[7vUV#rcǎ u([tu(!,?& dk̙G*UP~αE;wcAAA&˴yORus!9M8fIIIADDΝ JN:ARaܹ@JJC$r:[n.GZ˗/G1{lDDDLRL|ػw/ju'`ԩocǎ5Hӷo_l۶ ˗7Z/Ǝ EI\֪Y`|Os 9+̙34i}L2@PPի?ϟGv9uly^%JD$!ԩS1k,k֬ 4 z_~SNŧ~j0(p\rGJJ ڵk#<<\9Ki4=zNӧOҥK#22RP^:t;vF2yы/p\r>/J,| P(_}Pb\x"6lhܸACN`` ,Xjϲy饗 ]:K.8l#FL׮];)SuV<`S}_Fk׮VZ1cu$$$xVlܿV0&v(3^?~^___߿'NDzz:n݊tL8űj9}@@#<(($ExyyЧON ???7ԯ_]tuL0(R&M]6z ܹ34h;v,BBBiӦ޷o_@^FK/wwwbŊB`߾}h޼}A' >y9BCCj(w1#////̦OKK{{{+۵k NDDDTz9N:;"umVaˀ:%*))h^% VŒ%KX!""":&l#y[nM?)%Zs"""@$4i҄u"""rjPaaL,<<wFbb"n޼c# իWW4+W͛نKQPՊ(?H$OzEDDDX„=EݻwL'={>>>x+""իWGٲe ^_|%"""/|4C!"""R }}_QvmuԉSjÇ)u*L8I,YC 8}2ektѭ[7ܺud1c믿V[<.@DDDDDDD䈄`Sr$Iuۥ-%ٳAԫWΝw} 6իHNNFHH5kÇLff͚g795VCI&P8z9>}Dddd;|'@rr2|||8f7 WWW! ^^^n&iϗ *YhZرQQQl&""rRϞ=Ý;wi4aBvQdI[=M*cfΜ (?.'"Eӓ&RVEjj*?~$@XXE=9 )G9sўDDDD@b͚5M/z)̆RJ!<x >R ܾ}IIIxi gn2…  ˱7QA&Ijժś>"""'(RH{m$ EARR/ec7u…B$I^ """!(===}Iedd@/m|^6m4 """RF~:ҟW&{i({uLZ`Ac@DDDMRaر wD5{2cuQa!șiZ{@/MFٓB"""rjZׯgޣGQ!=rgWVCV#4""""""""hZ\t Pre[Fd֞IIIz<ɨ%Jz([/whDDDD6jqQ&"""&@RRR&LDDDNM$jz.gդIɯT۷5kքV[o0jHrʡgϞ5kfΜiU#GѣPذaRRR 6@V3fѼϟǐ!C^zݻx ޽={ŋ>͚5Ç~;w@"..~-ڶmk$'$&MFc0h0|?>O=|ȹdh4a(4.aB(^_+Wʕ+gӲ+ IDAT <Ob?~]5pBDDDȑ#pssÅ PB; ÇcX~=pBƍ1^VCV)*""""۲DMDDDDСC ??|PnO?/r.VRSsד+Wr#))I~m n]/:f;&OMٳЭuXx1c(MFUR#3gDLLLDDDDdcZK.Ÿq8 9/^vXFaaaJBPPn߾mr1cEc'>IF9rϟ ^oC#""" L0 DDD$IBHHHnѢB -- ΝàAÇ͛61zh@JJtusʫX6̫ךJ[+ٰg7UN.]D&"""r&B:u uԱdMDDDDBx{{ۤիcɒ%HOOǪU8\(~~~ERR޽k2n.n/ϩQLs#|Ò/>>NoC$\v +WTl=pA+VL~'}bŌаaC<~]tѥK<~7Ʒ~k4oO? k׮E%PH(Qk׮,Y*U(kdԛo Fc0hW_CDDDNM+:)w*Uйsg'|+___߿9֭ nݺ7o 틿 }Ahh(RRR}رcǭq>'99Ƶkk!hO'"""Z.]T\P?%@FF\]]Y|eyki` '$RRRpƍlZZSTDDDDeWpNFժU ([/whDDDD6jB;""""E=x! &<{&"""g₩S; """"EIP{A/MFtϟG9~%9-!RSS:9=cBFըQCYzMu"""rz)))(_Zz5'/ """RЧOyȩIEW7 ٓQ;vdMDDDԴZ-~Wyȩ !>Fɨ'O;""""qm"""* \]9m<ɨC^"""rj* M6wDDDD$ (_5=z44 """RFw}:95!1|xzzCϞ=iӦ ;y$|}}Ѹqcԭ[2e q H!YOIEܻw( AAA@דR'WZӧ+ ۾};ƌ#.!'_}U>gkk+[fuvvvZۗ׶je_/6J^fLvV]&:u]vؼy3#G"##ѷo_$%%[nطo֭uےS}ym򐞞=U ˘VGB{!DDDd  `0oZ&.ACۗgʕ Źsu*MRٹsg<~J_z5{*}!|||7x<'''8;;#)) 4h"""m۶x];w ּT1LvVƍ{)U(ضmƌÛDDDTznƎp`R\ I }R bʔ) _jIIIZWD^^^O<'>uB`Ν8tf͚53g( @dΝC=JOBٺuJ ǣG """z ]}DDDD5My#u5sLXXX &&[ltxeJӧAll,<<zݤٳq DGGk,3f0vhDDDDzR*ء$I$Iǜ9s ѢE 8qvvvHs*njڵh֬5/""""z( ̞=5nؠnC,Z&(9?]VV={V撚\z_|ڵkI`ee=z`Æ _`ffVf ?qqɓ'q&d:Ɂ-\]]qt""""2&IS4mڔLL(wãVܖ$ JjUϡ:/ ٰ>k'EnE5tc@T-&֯__#DDDD/;333|!"""&6lQT+0MZDDDD&ME!"""&I :A%QMd7iʼn(6#DDDT;janf:p@LBom0 JjZLjԨQ|L(yCDDD&M$ LvV7oDDDdA믿k"""2yZ iu-ÏL 4vDDDD%QnjܹPT`T*,Yk"""2i$!>>eLV`9A%4BS򚇈L^Æ Q=i[63vDDDD `9r$Ȥ;w򚇈L^jjC LvVk֬ """2333|G!"""&5jA 1MZuܙȤ .𚇈L$IT+0MZ5m!\\\C """2Bc@T-̍L!!!P(x/LB """2(AP^=cAT-$}]>KDDD&ME޽J2vDDDDRk"""2i$!!!A2&o&%??ODQČ3Ǩ 8ɓ'l7eEnn.saԩZFDD`„ P*1b␞8{1MZmܸ?FLLƒnЈBP`񜔛L^y#zBhh(,,, "mۦ}D7n?0l0ɰan݊[nj_۷pqq;о}{/21'f͚i,V2vhDDDDzòmDDDDUVZK7*oIвeK >wy-[$Iرcƺ ߿0k,kV677ǬY{EVVCk. _>Q?=33_|<<<`ee|&?5II&o4^wtt4RDDDDD%"6n܈3gQ 4ם`i QQu Z7P 9 hlӸBjFU}yDQ);~8`ZM ** ǎXB6 k>âE`nnu"##ӧq1h}͛7accQu… 8{,,,,|j2&I K,y""" ?p~7s/l'j]\Vuz=twbp<~{ m.]† b'%2&Uu$ ׮]54Ik"EEEW/wwwue͛7WJ%={VukkkUŋVi}Q0zho0RLmɓ2ˬ˳4FcbjСbb"""DQDhh(yȤIt$R IDAT$I$ uƏ\L<=ciӦ~WDm-J&k[r6V=zYۨחoj&j&"""\ԩvaGll,Fi2v DJJ+z]?jq׶T61!.\Bt) 3DDDDe9!;Y9UO-!hpP} IW}Zr%BCCq9lݺJTv?W^{Jm+. M6x""""l^צM۶m xT')) S0MZM>*aJºu0uTN"""5mS{:[M՟F$ hذ'nذ!L@̟?x(Nj^yyyUjWp#uニ/~+ÇOYRϞ=QN~ѣlkii={tVvn"""2i *yCDDDN *3sLXXX &&[ltxeJEu=zoN Ğ={JFdd$A:{{{ 2XjiQQϥWVn*Ilc@DDDdpz&1}WWWyŋk۶m;#$''˯gggěoT`{yyaԨQr=44&M;/Xu+W0zhyμ3W\%,X`&On2 i#"֮]k"""2y:І2g`ݗ.T*1l08;;NNNppp?>} ggg۷ZoѵkW666/н{w[NkvaӦMΝ;ѤIԫWM4Ν;aaa͛7uֆ< & GKU>'%%}P[x1kWI333ç~k"""2i EKjݺ5 XhQ… 1x`4o Wz%Kݻx뭷gΜ+СC:t@`` N:2… 5j\\\ ŋ9r!B!z_~ 4TÇ!B~m۶Exx8%"""%In߾mDDDTDQĽ{zIu򚇪Ue?$P\Ze1']]ڵ+n߾]>oߞ瞈L$I~:y;jadN x!w_P#=۱cGIDDDOPߟ>>HJJ2EHDDD&MPgϞ!"""&XƄjjž}0c ]t͛7#PT`T*^I$ ,cBB cannA=z`޽UЯQNDDDd ?󚇈LC ~eè_>A@vv6%KTw(TgϞ;""""kԨC """28 c@T-2ϟ@E|g;v, =gܹEa(Xt)y%$$;jag6[hck;v@>}8X`̌/54AФINPIQ _Ŵi"ܹ3bbbZkq"""2i$!"""&IyCgQ(Xf ֯_/y ߿oj=zKL$I8{,yegg;jadڔ)Sp!ԫWU7oBQc>>ȠA 52MUl2k׮ĉH/4Qyf&"""&IRRRРA&ǫzɓ$"""&yCDDD&ֶJ B8q".]h ɓ'ؾ};fΜ^zV>R* Dǎaoo{{{t +WR|ak׮ahڴ),--1cT<6uMZEGG;""""k֬C """28KKK[XX~ɸ>߿ Z ӧO5j|r^ѯ_?֭ |2._]vȑ#~ǎx)oߎ]v!((#G4ȾkFv7oK-up)XFBVP(;9111oٲe֭`eef͚aܸq8}A͛2&DDDdDQ_^ɋשoyӧQ1c DDD)Z͛7.]yU)SGGG#77#Ν;Sjm &@TbĈCzz:Bݻzwm!H$U:9CeR+T*7ʭk ww u >en3}t^vx x{{ɓn[[[#--ʏt$AŘLL(wãVQ2oWk_AVT*1w\,^Xp N}~/8oܸC$޽ݻw ƍX; 88۷ŋanGэ"t׮]~g*9T%QU'־1DЧO4nܸ`r{ĉo͛7]sO!ܓ'O_wwwj ^%ݕ}vH-[bֿ;hٲ%$IŽ;4edd`Yfi$fݻYYYz7GnɓHLLĴi+++kXpɉ'0x`8;;ݺut=~ oAдiSOĉN:e˖}ABBB5kk֬ѨOԥK[n1zhxyyݽܑkԨQc1I#Gn"""*SᓧPǵifffIA]6;~8`ZAcǎi ڿazwI=z4`ooR(իW/`6mMCbZ5NM6Ux۠ 믿^vGݻw ޽Bڵk1h %KhҢE |E8;;W= rJȘ &Ol0{Pm@wN呢 ruS%I)~+^V~8;;aÆHLL۷d.iƌ?  Ŀo`ܹ={6QFܹs裏׿US۵k20`}!//VVV۔wz]+Q%"Μ9^z:DDDd$IBvv6lmm4[QQΟ??EEE*WV;(iӦMRBNNI&en^%wIBk^1~ށP~}5>s8qǏ &~G4k O>ٳgѫWrXA>>>en'|||i&dggٳg5DXueNDDD7vDDDDƳgju"'`رcvvv5I );;[ںJҘpEmK/Y[}]Ntԯ_?Tʧ~ZjZlHܼynS.okkW_}m۶m+|>|0G8IS(eK$"""2 A>J%={VukkkUŋFm.Ahذ!-[ԺMF4ŧ+&@(6U}4E~\+WЭ[7y={}988SNJxGDD@EyvWJ%EfffDBm%I$IvVz[uq 礶'{~G]礨?!ωNjq99wuN'Iį^ت{JJ 4hm:fooo8q X|90yd:u jȶUmWmK)o[y2U .^ݶsK.珳}5vu F?66JB9V/}G({eqn|ۗܦd[}z 7oR %IJOOgMJJ$I(**ʏSܹS_"++ .]޽{z*`HMMEZZ<1/'[n={,[ @h~ p!={@D?Faa\k(22[lP<͛CH BR!666l9sGl߾PN^^Ο?~gXb233k(!  +Wk֬AJJ 222qv ؿ?.\X~=㑛K(@=Çذa=zR  رc<ҥKx_p߿{nܸq `͚59 dڵHJJBff&VXy&~g5Ο?o<,^p=l߾p9sF>'PTXp!$IÇyf%ԏlٲE| c|:tয়~'Xlrrr3[@}~\~rJ!55W\zUw޽t믿Fbb"_(sNq9w}O-ܿ۶m=zOlܸE .(ƍOѣG۶m-BAA>}p9'vvvr<..N㜨3;;>P6778'%uNJ~rss,YFw""T%Irr2*1qDBB 8p?暦O>8udh^zoHY?}}yvM#OX;;;]Zs|yNxN|yNxN4 GCgY{մ/|HxnsU-kcu & ((Hcdwm={-Z ''G,1t?.g1bNǹ~ :俩ڵ+.^iӦ7ў?ĺuХK?^^ 2@qٹTIII`РAr]t)sڴiZ @8qޥb „ hsüy^xEQ!I<<RGJ\r>UO-]e-礶'Iv<'9)e;'@hO?T>j9wt;xNjqnsN=y?յ6R؁ pqqyoKoԨL@?ѣaaaQx*E?ŋVN߾}5ѫW/ԩS8|0F]*^u[KKKSc}Y.CY9+zywRxҦeIJΚZ'ƶb ?4""""SP('𚇈Lz!̜9K9UFLL<ʷK@@^"##gϞR냃 Aﯱ^X|QQ\ZjС6}YZZʳVQRVdBKcWC """2<<hS_\]]1zhs \)J$''ˋ7K¨Q>BCC{hh(&M;v,<==K_`ԩ+W`r넄3W\%,X}Lv@Gzh׮A҇#::111H?NE$QMg|Μ9s bbb*$I5Cضm["$$ΝW_}iӦilӧ(iܹ5j77b2M"""JMM5vDDDDWhNnJtWfn_YQQQ xM]v '''w[[[ DXX1}t\zF]%KÇgm߾H_zS(2d """2(A>:%Ǐ8]XX&LPٳgk5ݬY3 '$2>cLPO:iGÇXӍ^T*,[ *ء$IHHH0xD5ݤ7|///4kLcYjC#""" B)Sp<'''c@T-tMN*g%"""SRPP` 0jرxW0MDDDBEر(;""""JMM5vDB *?՜yY IDAT}RjqJ"""""""zqJ"3:1YjAХ auԉȤ+WC0,I kkj^%I2B+;""""{C """2Bc@T-2A pss>`Ϟ=غu """2BaÆ; """"3vDB/nx0n8U4dDGGz9I%Q___1!"""%I2&dt0` $I(8}4&Mƍcܸq8z(K.]_͚5XVZeЈBt"GDDDN:Z脄lݺ[lADD?4icbرhӦnђ4""9j:Qq="2~K%accS}Ioܸ1fϞ7oҥK6m &tRxzzK.XnRSSu-̙3 wwwn"""2* +WJ2v(DDDD#I={ T+VfaϞ=|2O&M` EQQ>C =ٺu+zIS(;v,yկ_J B8q".]h ʕ+7oz-4jpttDݱddffl̟?AzгgOlڴB7N< ___4nuօ;Lh\ERRRclٲ/_c_~ǸqбcGCB~\?DDDDd$IBFFXİ$IJYy yrrtBU0}tm۷oǘ1cA222D񫯾m۶ZG޽Aaa!J%`ذaصk̴_lΝ I ooo컺eL^A>}:.^[n\\\)))ꫯХKxzz:ɓ'CEcADDDd0(5dڿHHH|>}^^^E3fИ˯R*ĉq -- YYY =z~yyyZCTT\]]qIdgg#''},--g,X@kÇˉӧ#55B>}Ç#%%E- >[Qqalٲ!!!/FX3qȘ8[?#qRcbbЪU+(J̝;/ +޽{ppp@ƍ?~8  ¸q4۷C GΝ5/_gφ5bcc䤱cǎr }iD6mٳgcٲezݷ1n;U(? ۷+X燈L$I~:yȤI\\󸻻UVR(3 >>>pssrj۶m{> SNrssݻr `Μ9>ر˾cbbz111ѴiSXYY]v5 oooԫWsJ1Ν`Ϟ= ѣGGF'ں:ár4o111jv;::HQ$Iw^u """V`0e[ aχAbQL4\ RN84hֶի8cǎoرcݻw~OݻhӦ^]ҥK#33(((۷1m4/^;VogggW>Kݻ֭,X볳+Ŭ^n|qFzzF{]]ٳDBPN|'uE~~>n޼inIp!$$DT' cذa[jpyp""""P(jtA""""}ԓT*ٳR[[[#$$r/^%4z*ƌI1xyyi}]=]ߋB}:.^[na ~&"""P(0|p^luAvyf#66#G(zGuD߾}nݺa߾}e-Y+;..>ωۗ6//D/5A; 333l߾۷oG@Ea !Q c[cv7v岭gY#rmʕ Źsu*MRٹsg<~J_z5{*}!|||7x,܋ 4HvmjΝ;EQ uDoT`Noƌ/9"""EWƜ9s @"""z(wć5AbbҰaCL2?>KM~"IIIZWD^^^O<'{wU}sf2}*\F#U*VJjQPܩ "֭Vnh]Pp]$ K92@Hd53g3ntiF7N/[onx>Iih_I*//'|O>o$W^2dHMB6&N,ovu7fzdPxzkuK/=ڵKƍS~~w}W-wɒe˖/h?r%&&kؐ!C4|pI?TQQH|E5{ѤM#G ٶ͛7G?9-XmV<{ɓOhΜ9Kf!UXXO?]۷oנAl2u֭O0A'|>#wyz5zh~=䓺%Iӟ,ϙ3Ggu,Y뮻Nߔ۷wvڥLM>=mz-_^$׿׿6y3glڵ^y ^Kf,㢹؏BMO4`V]A \.F0eRRR./vٳGPEE|>Ҕ~W^NV+;l%P0MS-_ @m[Wvv6mLB^/W_պu낳6[n9r&O'*&[o;a8r鬳k ⥦;],ߵk.r 0@b ʶC.{ի .@{c={ wѣGCp w@I{6lx ,d3 CƍPV[dYVpeY3g9x{ w@0샫ҭrJy|uFFrrrrmذA%%%ZM2EZzVX/ C999ZlPUU%ILP :˲uVIi[CQl;J^z^@o񆊊b kZbocmzGiҤI뮻zjm޼Y'Oްa&MԖGuxCm[~-9hmQM^yyy2 CwV^7Yg>LÇmۺ7󕗗`)-- wh"I*)) 3۶URR"b{i񪫫SUUWin3dȐ={.@|aÆ5Z?sL͚51˥N;-aDla,۶)qe6ޓҦbw=TZZJUUUJJJ:>UUU/evv? 555m pE/K>a ,ғO>K.$* @KHHP^k.UVVF$~?hOzRBBBMSN9E7oV]]Ν;P]] Љ'v*VR;(@geN=T&k 񨬬L),LӤ؍vk[jc .… %IsQfffum>svݻwoKhof:puޝV kMѰ;vV\8ahȐ!o~JIIQEE֯_ŋkӦMm[a裏֦MsXBahϞ=n'UUUJNN֬Yt+555!84M͞=[3f̐w8 AgQ_6wޭ?^,fPz۶?Pw\ܹs  ˲4tQqq1mL@IJm[>OoE΃"67ٳ>#{ڰaCp5mgϞl[l٢+B4jԨVѣGCpܞ={Էop(rDL;?p@YF]`ƍ1@Elȑ#էO;GXUViĈr:ڌфW8ԥKpp8rD ژP|]D(a…  r0qhe'$=:,]qlٲEa; F΃h6&񳳳@{6&x2M3a84M͛7D4rD67n\X| PLLN>Fe˖ P\\&M6?["ThoK؝M60 [nӏF}<++K !R>|VXAnl֚5k4|pZE΃"61YnfΜ)ǣ~ӟ?naߟV2 ٶ|ryM4͛uW?a2 C_~r_Fvw,1>ޏ~#}ᇚ?eY{1 2DCq _L\"eYzy@D#A4 I޵^M6sΑm*,,Ԕ)S4~xTpΝ;G΃h6&MYx:'1cnXƤc aژ4eҤIڼy.ٶ͘1 ,;뮻Ni; ǘD4rDFvlٲeꪫm۶FXfff2ҥKm߾=x5 ض}K.2 #8E}N;Mׯ 7 `K)CRWWG΃h.nI׼yg ^URtUW1K/hei< K2MSwunVHic0A%dXJJJT^^.IrݻwB/c=V?|Uzz@ضkذa|D,rtgws222ԯ_?׏Bwcrrr4`}B¶mmڴc@D#A4 nt<_Aٸq~xI҆ TUU)+fY.\H"9#K/TG^Wy0c8 ryM)v}Ѻd۶s4pw}׻wp8rD ǚO]w%۶5ydM8QJKK:%Bhƌ|D4˲tmF΃hbضm /((PMMMJ+%%E жmB"QUUdr%'';$Gض-۶e_E}]R*++tLj uPS^RRҢoD;6y-kcRpj{c7ͶmXD4rDGژX"3fLHp$:lӝs&.Ͳ,-_\cǎm\29 p4v;qqDrD Gژ $#ѤK/~ Y'xD4rDGzv7o{ァ5kh߾}*++mZlYm~K(<>#0cN:$ryMocvZtMzwm[a4F5JVauq9bD[o%K/P^^ PNN.]y-p@÷1Y`Fw}Wm7Xex 'CO??|=S:K֮]Zկ[|M^i[o%ı>.bIQ:s{L6lhvdWnTZZou"Ĉh"}:*o駟;vC JllWS"mzk b#KJJ4mڴJzG?Az:111/~!۶;w:fD:uznI:5w\I /u-tDq<.\.H='pB Bb9ԕ'ݻwxg}6fYx ryM)v;SU8xr^^^(ŠZ۷o$u޽<#rNvn[W]u9h<&kCG:Fzzz~yyyB Њ+tw /1#%0d+**twjȑVBB Zre?ϗ$M0r)\Ͳ,}< 8qbIR׮][} ĕѣGkݺu!9֚5kty)??<駟ִitD?.]}ꫯn~)))F181!ApddwZZ$رcG~VVVc3@cǎ=6_"X:u~m}gzG4p@I7tShoO?T?y<=L[7ߔCp\/I"9#={ʶmmܸQ>Ux*SNճ>Z%%%z5x#> 7ܠBI뢋.- Yg}D4rDGژ;V_~jkkxbM2ߵk^xIRBBF?[lK/$I5jMhL͟?_ǏeY;w}F 4H->w.]}l:묳~}GKҺuڽ @{2 C?Oy@D#A4q%I7xƍ={hZ7Q]] /DmV_+^YY/‘xjjj4a_^\rΝc/i!c1MSs!đݒ裏jȑc~iv .7|e˖iݺuG{ב~ݡqFIRrr{m=M6SN i,~_\p>#s9z42;/|DlܸQe߲,`(ummۖmmsjx귭Pۆ IyNxNo]ωmۚ6m ߞ<'\.]s52 Cmw焿}t='ZMڣG-]4Xm[6l߯o&ꪫtwkݺu_0 ͚5K\sSY]] $鰅nxϟ_]K/TSLiTbb%Iz}ɶm~HUYY)IZxq"yTQQB=?\K,$KZv$WqqJJJtJK⋒^{MW$=C*((PUUNI =$魷 ~;`…ڹs^n6I7|zJR`"OS^ׯ$}*//׾}4|IҚ5kꫯJ^yYFR`Ӣ"{$}W#Iz׵j*I?={Zwq$iK.Շ~(IZhv!ϧٳgKmۦ'|ROj۶mٳgiǎ?ҥK%I>6o,)pZ{?,IZjU5'8Y=ܣ2>'$W_ >'׾}T^^[~z=7xC~$iڽ{jjj4gI֭[K;>>'2MSgϖmھ}x IoqOSOo$vmzڹs.\(I[oI{9mڴItwJz衇$IWk&Iz_J^8jڵ9,Y?\P7oŋK|M}'!wڥ:~>3w}W+W$=͕eY={,RnnqIʕ+Jy}גo]uuuڵk}QI'|7|S|FgD7o*++yf>#3I|FgD~F<|Fψ1uTa۶ݦ#Fuun=c?<СCu]w鬳r2&;V+V$n$?ς//)I6mZM*fnw?wUU5m4zJOO+G\MJ*{>#Gs`]}r\<'Nossg{X|P\sMp𷏮礦F,KJJJґr]T/>_^EEERZZu릑#Gꬳg4iw}ꩧ>4i&Ic&/vKj D(꒎tM:C;RWWHL4bĈUHdYV^O<18 Ґ on_vTݻwwۻwoCp9VS׮]%ZRdBp[d W@Ds\8q"9h<&*7MSZv>SmڴIo0B"''GR`d;m R`ΎnĉU^^^4ܡeYzh"9IۧyiԨQJIIQGN8A'| nݺo߾S 6L hw} $ G-0 cyM ۶mnN͞=[f9;裏?S5iرZb$)77W?6m 5j>&{5~xIҤIsυ.;xӍ76L3==] @:.YYY#>c#kkk5a͘1C555]ܶmZJ#G_ c=V{$O>?Fkڴi=nv?w߿B7iꮻi1<& xb!۶;O/,ũB۷oתUs髯 UV92oՇ~`ܹsuVIҼy󔝝|,99Y~jĈSNՅ^4[Ns%I7p뮐.T%##C;v^M4mD|D,rtH{ҥ?~|h}gkٳa}^m[FG}O.kS^^^}:sfkԿ233OD,۶U\\9:?sꫯ-Io[ovK Le' N8A6lܹs5beff*..Nɓ|r=K/e^,ғO>I"9##;vr)77W}9cw?.0h"]z饡M`JÎ.((a:th ݒtg78W5tP 0r};4m[k֬9$9I޽{Lx7###a1Bv[݌¶mm߾]w\j7p$yM)v8P{9䄍s EX8K,ѳ>۪ t.K~p9#mL&M$IڶmV矗$uEcǎ Uhhs= @D,K 9h<&/ 0@t嗫%K0 |rNCصkWCp\Ϟ=y- ֭ۡgb :T߿b7ei޼y,+ܡ8ф6&h *7&c9qD2۶uVryM(vI#GCD4۶gF΃hB4@6&pg YKF΃hBM|qq<nc2pPbah۶ma;$ dLkO'0d۶ haH}].b_`ӕBDz,=:u\."9IGv\`!4Ѡ JzzJKK=>sL͚51۶0D,rta]oĈ;z>}V^.veeeڰaC@$ׯ_Cp9Eݙ3fL(biѹ>fΜ>}(555ܡ8²,͞=[3f̐w8 A4Qt뭷 D4˥3fF΃hҦWy8u} y-Z_$u-d̙3uUWi l{ァS2Y`۶^K:S:>K z-^Sߒ[6~Ki˲,f`YuV.!u \o'}%ǭXbbz܊|sl[.w!M΃hbT4qPz ϶mLU,ZSZ|ufblգ1MQl[m%(>ɣ$x 4%u6OP4vXY0cYV\ѣG}j*|«U>UUWsp1*GIy~%׫ro|p<@!ܣ8%~nӈlrDh wz[T2-TTUVrj+}§bO^T32BTYRʒmq)1-PNHUbZ x%g)9#N 1y-hchc@~K@,fWթԫ:UyUSᕨ bJN  IqJɌWjvSյ Ðw :_@D3 Cwv3UQT(QZUF͈X=KQ\Blha]jfdwsO+BW>b){W]Qx11Jq>LRuAuj叩V/9Wg0\y ؄eN,};E=0mH_ޟ3g?;q8hĉӧRSS #,k+6&}*)ViAJVFeN1 m)[Ֆ([,d_.S&dci_O>Y1Yr%$ȕ(#!ADҢ.LYS6ڶiNTСeT˪]]ğErdw;Ps]JɌWJfFXAϬڨ g\boŏƯߔj7w eHRꝬ$ʹSSSUYY.]h޽|5Rrr@;%L )ViAJ ?J_+Q|]i0NM;##TRRNM+%UdRR7hbC jZ7,/Y^&Dfq2/. NȘ /, 3[+_mW6Y1[ |buSo/+>FY+Rف>֨ߩ)ŵ(һ%ku헪nS;Y1G_;9D77 ۶UYR=U*S-[#/ ;-T E-V=WMNX+Y{k5\(&++dg]?wɖ;YrȲ-W_Zjx5n3CK--|Ր!jw7f]8ɞOw~/C܆[GGX?o+{c m)ޢOcDOWNvN~Έ[Wyu=vm˪]P,o.v>[X$#d jve V!C{14u>ԨgB*Te j_V Ir eJR~/E){Rg<#qi֭ڰa|>RvBo#@Ds\:t(eF{j:N/mwKJ뒠.J /ZN7^OL<y9+5ϊ:R_?ۖ-W\ƸZVJZk_|4Ʀ*56U))q})3>Eqtaȝ,wr!fE|w˷kw~YR6o6l[EG]i.wSG+n`Rs!r5U-ڿR> MQ>0M[T$8W6m}QUVVJ'N]xᅴ1Ͳ,-^X&M"?c%{EtkPO}uf'(kҺ$(9=Ѩ㵯0CjnYf[l-9 ?ֲˤ I}A[TNIhZKA>.ZږĴi?TkmǡUz+Ѯ|,';E/}} ee*;1[]*-.Chq=xnqJモ7?_^{<۶U},G?P2]ekcթvnؠ`n}s*!'GCsu1>ŝjvWJYUhWL?s5~X%I!eNǠ4dwƑb!Ctm馛n 7ܠk̘1N Y~=ox аayD4۲U^T]*]݁ղvuJ.Pbuk PO5P__ I^>qњYTS5qvX6,%6GCqMUЂ4ZlֱZ|#q%%)d V|]Z:{od۲Eu[?/y<99"a;(<*]=}fJ #;+U[Ilm[V$%Ū48*]=IWvdZDO>]m[n駟+B_~~ӟ2rذa0 DFP v(h-]%ۏؖkXSKk WWYݽ7VFVmiR{W^Kj∥u-*v7f۲baWc5fˊs#F&kndwKzu׫7&ƴ_-_z*I=#z&T:*ɝ?Dfq}Mu۾wvmۦTqj7n\W00l;N D  eLVVd Y`;۶UUվ*/Wa^බ22ݧm&K NWcҕ;Y.75f55|pM0A ,Ђ ,ƶ0 m۶0фnIqi7onF-?t>=U`#VbA%(f_ڒdx<-O+w^J}t$Z\4$E{ZՕwJarTg:癞4#H("X f5{׀lbYڗ]m^o`NbL0`B$PJCOιQ=I3 ysO:4]]|Db?>z*b̊Zf%{6&5JH8Dbw J> e"oyX\#IRf&{)ȱYE >j3 ի1WW# 8fn3u9걊7BWF*7GfO4qF^DV3s˜=ICdEQFttth:^%HQgTވIgnkK".Յ%*x"ctyȕTȲL\c '„!BDH"0qfl=זpB7@H;ZwS,UFRg)Y3yMGq]y%kh4$Eƚ55spmlc] ͆$Irr,^>PdPwg<;x$I^ YOѢ )]EN=M?!zS V'@ g3pSTh@ H'H޶Тm=$pHKgHԶ<؃BF,(Y,**{tdIjqC@O&ϤH ku,K1݃Bn49횅MǮy Έ`0Kt,v/f{IUfՌϲdU0+eFǗ:Kmmc~1?̯93&1њ8Y^i}x1k~i`:<hD~LQ"=|94~tC0._m:a[*UhgG"ɏKI/zٟ$I|w9adnJkp-m>Ln6l@aa!66&O} Y+p @ Yy'{@ 8c^Zؼ=s-I6cxWJD/lQz%ŘTbSe t:z=nheri2nY2=lƺb9ˇڔdXc#Ci|6}۷=>0aj {T 9Aop7RMv*?9ř tOS=4wk~#ۀBjw55j5l.ڬL$DUA‡=|%$Q}SXt681@:}ȉYG%-uRZlY63߷fCLKfݻ ~_ ,d"[ Fevͺuo@ 1P|~5@O ŗkc~vv>s=kj*cL,?_iWInP-D 4 uiYʺuȱm&ے}څ'OeeJ}|{>|ǜ_x>@z*6-3Ko5 ew;vuO^&LH,55ɛbD&w/K̵K,tXFʗgS\$bI< >ڏ~|OL-ngK-zJfQ<8ܖL`IXz58 u@ i}@p:萈ݬzl{gqھF FYEvLY OgGS܏,')\?XP?tcư% <%YKxtۣ'9+XbT(DQM{^|1߸\eƨ^7{'Xvdºz5ի{ ޽mia駱>+ PIzo/QuqFi;6w'#IvSWY*S,---c333w&@0_txs@ (B?%li'kՑN$ 2ldU ";E\Vt:;>ϪК#њ# z\?+EBNha l.LB{!ZQ HŠ-+WVd>4io&W˜3+\fMcpy1"?|fղ,{˲*wՔ2gcAmpmh/w`7IchKw96lqх/SIɘzn{ՐLt5i;O}txN_{ ҌѬdٔƙ%gBZ:ihhH3@mm-˗/կ~}kg> @ YFey>O @({#tmU $hDG gG{ /\4rFo..5Ъ%qIO-oԫJEi:@pමܚ Vh?;fr9ƨ_qhH6vmdW.xw;wV%>΃+.O!J$ċ48K0HXf_&{[6Ul OЃ›o1ͮ՜gсY3]_x!?D ڭVw4x hob-ܲsz%nJ|b}Zt#}ӟe@g=[F\#qVdݧؘt1LZd9 n@ ,4E}N a[ڎgp (Ƽt)o uM\ǚƿiS**e26m^w&:ި={h7q0GzpyLI6=p"]].dM@ 8Ȳ#<}'lLyF$OgF~3v~[WY=8`YYv%w`A9s>}d8 ٶiD'&`vq|yjt'N+t_iǹ[vW`# ֳ`.@g2a߰ }>?Ix< 謎'@@ @ 8" zZt5ly$pfzG!PZiɉҔn6߈ 4vf x1&0c HFANT:1v:ie$>2&At⡬`nxSO\1dgk>4Ir=4%L&H˥6 a 6[g?WV&@ ق(۷UVل"i V$>:O2C!AN]d'Inr' F"A$|v PX_U95nXtCY29 C:e!\y:L3|b=AҰ^| %8vG4<ˣhqY=-Ӈ4`hC灩7-9#ѯK6炴1aAV7p#2Q(^xDƂ{j_1?JO,~F qNF{^dvѿ/6íd ]j_T`q@߱`9{pvdм..Zh'~Ċl*+b8sKLeed~;YN#s' [^ƌ?A\[몫p]}IgYqq1+..&Ӱh>7._oe8,,^G|rJg=܂@ NAA\ {EG>:>'1cɫ$E^r6۶I(cc{r{iRf-N" .zT!;؝QmEn*/||3}G5Z(dZ3,vkB[Ia߸*R(.La2繪*Vbg:v}B],YݨsN;^+(9@{{V3QGrj\W_HpW_+$Ezʕۮ(k7RX8A^N~E^'"|J3LF% ِOF~$nڵKd8 @ Xt:6n^\ lyr#tOm0!RH|M؂M$}\c=q& N er$k 5j5[=qkSl#J-20K=knbcIZq.L}ƈ+̮|U.j6x]VG-ɴUUU\z<#;رc$q VCLʽK2R@ sL2?^?9 i H' ٳ/$1\&fF{]'SHr3:=ȷ.n<[f(٩MX{3GBW[toM0S V0@oevMU1VWoA$i'*_wfx D8$"xXu}F!T[ ~_scZCҩZ/P=$ITdThh8E5( ogaZWG@qW=޳=t> q]s mWȘXIO\V璈'i>;i3oOOOlE65`$]tvvW^z)|C  m .$f EQ]DKwYHo-Ek$H+AΒBl-Dzfs2&=ŜYIU);T7X?#i"ԣu~t`v~˖Ʌ\ KOSrf)9شŐ 6ŰjV~ī.L8"TiA{RdhVVsY|sH.y~/u븸b.-R>3@$,Kj,!!ԤZ }>ڵЮ]x{7TKyģIpbjuLLMe=4dѳhM5 (D͝v;#@:=@ )YH<ɗj0‡):@,Knj˲eO- NQQ5]?s!P끖pݦ ׾6um*i׮MvWw&6& }TRqKnqD mM](V`ɪN/QExO01p:Lq:=Yݐ] 9Ր8UWVgg=ϕW6ymi{`;>̱jѺཎx=]ïf9m񟊩"{<_z /NKv]}Ռb1T˧z]>p}C}Ey#tp^ϒd;!v {E>A lAe/}iΧ 3e0kS?@;cuQ\f\Fx#]&l_/Iȱk͢EX s(neh8̢][?GT3^ EmK| E-|h>JmcB}þ~hݥHzp 95 r~戳erqE\Q~oqhgX>rFS1ud~;6|#?@6p]53{$&%B"8{9֏Qx+|r3eNn*f}Ǚȗe!t:$IvSWW7qC$'&Ӿ@ ݞ~/#@ @05;ҾDHEv$./E1b1Z,Z'}"1M Sf53l8&_ЋGӅ_{??ޯ}\QJ,/rm99SQ,jkO=jC§_Q-UZU ??`GKPsʻ kj^xcq\z)?eJyS8c{jҾ u9,THٲ,tg͆.9㻡~|͙#g,[i>@ 8+PÇl2&`^( HʊD$m =B)oh&'S&I.+݊)y "{jC+f=QDߘ*Mj=Ф,6%i )dvbY3_y(f<3\cv%g}*~{[뀷uRu1Y{| _ntI^-H,P{m;.+L-۹2rr&z$^d\^/m%~d~&]ά-2RV]VJ'ȱ]{ 'tsrO76% XOC.W@ 4o>jkkϹ~M"?izN]2ߌ߈hIJ͗pޖ[֢Ll/rQEtOYdvEDLƊ/V-eq2bk+W #7'P E3C{<zO13.DQr9G8UfTRAǎ|y1 _x>[˷rYegD6/ZDGC1|oزE^Buz[o 㚫gh;bux}}ÉݝDC)/G4+WXuymcs2mt ac"@ 9Oж}:4,9`ͯt_ ),T!wrǩ|4,L?NO<0ynz0XU"vx-dj^`~p7j B}?CA:S_pZdEHv͖79{Ϯ,[z_WFtUl[}+!MiBwiggS $dB`/vyhK21mQG\V9]_́6W]uXR Fe?m6t4 $]~:u~.OHb4ؑX TȯʠE~efy~^h8 H%=5XΛEuD; 936A9Bv 9c9?+ڙW3{gp.o~`j${15j]X7\I:g/gyrf zK&l9=!'0 x[۸B7@XTju.Pus=ǧ0 HewgXNY0.~M@ \.P }(/x?m{ן=;SvGbvS|:w I7{âX˩q`1LlY2.n= }2W,yVZ5 ~׃oj3E݂qٹs'---lQ홙dffQT@ N /@dR%@ہ')fϾm0=ЀHsv#VF8Q$&+鿛7ͧ(Q3DĜ]TE*fw"#1 wZF(ö#ux>p?ݞQj?أZ .,Z(]ӻ m0gp11?zIh,bTU5jaKˊXjj4#Q\\ޡR$#ʆXM%m9n{I"!n]˗iW׾3@ ,L&nzmSYDq<'hH2oimw*Wp۸/j,4tE&6*NN9R<Nح7Afz|fY:ȇspھ@ HRT5# dP?U$q25Ln16$%|nT=¸c(Qd/=8z.Ǩ=Ǐ?aKME4;2oO~ȁ < ?kVd7V:m\W_Oʕ:t%K(YES N~őw:OB9@`a2@eqq1/#x-`( ---ja(+L.4iዚzNA&JUW08{$,{˳$k VuO{?ͳ( k3FWߝ'ܑكරBb@ XBi]"Jig;3,p /7ˍ/lWœ̊J{n;7Ӝ\s3˲5fr$p\pz ^wh1%Kȼ24q=A>~:zcCxxZ` T [0Ad2ۋ@ ҂(b1L&cHe:|LA]2Q9o`Nqn֬$"`˚߅Wu:nߍKƊڙe`:SDR&%M~O$dYVH IE!LpG&,GiGE$I^']Km٠da0:ڠU:>~͇*@ #&7_fP^TSvѾ2/"-mC5ZpdJ2kL% -Guf,v r}t@  Y͗eac" ~0"Y&}"HF8$B}Č++]hʗ # y[`ݝpM>FNϤ&F!uB0 KJ,UFCDrH!{-bP6FzFVIlfc7Mz&Cc7Rmňݤb|ǖ[nz=z/*×.z&zJ7jAU>9$+5CDJHl6[a:>v>J$waZ[nvk>N'Q(]oS>N2q^y%?yM!l"0S IDAT[0.Ո @ 2pqE6'KI/^Dj][7Nt_dukik~so(uӡ})A;z0'srba!{Ul!t"$po":Hգ۽T?Xp!+ =Ax;2Fl&2m&&2mvv93NL4өbsX}ږAa9~ ޝH[A۵;ꇎ}ï8rB.w9h#.wM5yӔ:KY_tf,9d_/}doxǼd [o%kѝdZ-;~8ιI  -Ȳ/~ n6tbqE='t7cՓP89Z@u.O~VâېD}?Y}֩Y^ΩũZx1DIC11BqC11CT[AzPĉ%jԓ4;B_[jl @>삶a򁎿 ݬe]u)T^ 龅y^mzP"Qgdmeܬ,-a \[u-/(73ygE &Agq oۦFf6&@  EVmкmt{ek:O#Nf\ <'8Yzmg3lH44'/EMsӫB؎Lh"I_0Fo FoJK #A?'6 ddM,fX(̴PaZݶ >mqHAy"%o*~W^ڟhy'hAVޥgOk 0@~֯TQ$Ix^~GֱYAqp-'L~4mOnI 0R@tXD {$A'$֩~Hz}jסƟ 1~!)$eY,#j=r_RVH*li3RPi BJۦY6s6ey~U t(^ .We|N>|0=ےͫAwDxI;v~SD[?X0, nAH&E@ ?!_ I/'81@wKeH`ns$Fs7+WPpR}FpD:Ba2񿻎_u`F\?-.p}T֜%þ9ՐY>qLo0F?J?J?B?JOJUq[jc5XzlmI}=n10u zLZR٦S^!qlBQIXR&OK2`$:Ze1u`,I8 KJIBZǒ rF@(@(F]RQ62l{h:_{ҍ 0 HY;g-6 pM5s"tH˶l qgaIwh#C~HϏ~-oMDؘ@  EQvi?܅9LI/OIexg7rKK.,ϫWW0tCj{b.865 r[sK;Mu=:#cӱ]uvňݬn6Hk=a6`3Aq\΢ȲB8$M#?Q;GF?-,e1P2FETȱ,|!|ʄ=hz[-{/NĚN| q=},Zr#%$[ K:Rn̪PEmM`1$3;imbwұb`X=gf1%(/EE2OC Lx*&HՐ,j 6ň2,d qBdLwXBVC1UG,1R}Ek`_}vh4L9{9cw6-([CKj?Ho"+p'w95Vwzbē2](*bէlGVb n"fm3⶛pL)@T![!V ?X@n@tׁ(/δ8Au|,sa_g' ;T~;՟/ի"djAU׷7 乓ϱg?_Z%>Ӛ}ÇxYM7qUU8LhK/ ݫ阐,1`-Po|?EQ$IgA[$|>@ ,XE"Qzbi<-6)=?H%9ߌoZO o=G? ~Iđ[aUPu)olK6I8W s #Gx%<2" zq:g}x}Q0w|_6&@ 4,o~|+GQA9Nv:dPד%vU{hvptm*~d]삼ZT\4{T7LpVB\Ԭll{vzp;j<I $ Y,ΛXS ǒx|:!|?4gC:}Q:}Qv՞0S[褶^dH9,B-kиSIh R-z3T]ų^昪 h)v#ta2gKm-|/#gG$Zf|k3a.++[n_"c{׸ٳgГ&EQ(..K_{l(`f`_dv @ X(B2D׋i 'eOQ?{@T|$f ]CH]cׇt*.0ouz^ԃқ g*j/T(9+'e<)-% Hma;U:\\ZuVj;n"a&nJ%fEQ h/D0'Zr,+t4%qg'93y◴]R: pkuǘvve+BhW_}R+_ ַsI"77Er~>`2sA[ EQ(//?!h}-vް{uE{(4<'ɦ+t rXΫ“:>TvL.°q 98䥄<%Uj$s7HCOƞ =A{D7-=yNNf;]XN,eUN=n8= M=Ca@{gcw?,6Ć 1j:F2ybp{QGiKe>o4M ąN 鬆OxTmMm o¼aƥ'I'{׼7o][u z7μS.Ǡߗ%O*s4 f^z˗ow܁h4t:QU~;^$ .>@*B1e)͛YdWpxZ+;\DCQmmё8/c> FC0n~ۗWroc>"hwi}ّAo`b"f0!怩!(}?RGIs/=x#9Ia$[Icv\0;Nsg/od=F^D),{7clM$'jg?˓{<0cצ_O/=}v]7n>f p7=3tL&>#.袓4CB!+n˻i,뢩g`|2 z”zҢH<;.% "☋L6>}ks fwbLxu JEMv;5Oy DPfoj$&DtI&uB14 qfB\q*!UUisRGQS=5R҇R=N>o&pyh3uFNrFc0(PJAВ?e]1N2z~AGN;GÊY󙓪NOOLGGFg'<< wSO=5] ?6&B!~4vXEku/TE`_.*h )'?{tb8M#o %c)b,B}$.B]7ȮS=jy#D) ;.DLaDŽH-'cPj{kꥰ^)ٿբ''[}Vj9Ia SBWڻ Z"nJER6sw9+k]~Wvh={ nV ϙ3\4 ~Z٭ފ!BDQ^}UuS=u47yv_j1 7HNsifݠxFh Q~e!n.=ӚQtPfFUv;Um6x&yP7N fYH R-S_cos,x$X͜ƹ#X<=ӹ_z|A8q >] [t AygE;IJ⃊ xȎպo [y\~ƑQE.)a8Au}_B!_x<z!~ߠMBkMpXލjbmvR+h 4sD/n'7ymXۣPm0{(خ܁P=b3!LB!bo:{Om{j:wA=ҟZŇXqzV~zea;~)o;_ԥZeo]3{Y#=,I-|n2ʹ `B!S8fV%,vG 6:](ZҬ%~`~~!);p8=?ۂde0_ pZ\o|nMiGQirjFe;hdžHDxp o! VÌ Ң9?^G||<6uNvUu(Ty}g-AUߑ|cFenE^_<%soO|$*Q1 3qnܹ~ݿO*bhw]OvOI`&z[rAZ[[x*Tۨid;?0AvRp`Hb~Bqf;9]꠱ci5OrAzK2"J?C~xz | {A0&|y6swŊ]wҴ1FU}hw+-OF/ Ȝ9sHHHnGkk+IIIlٲnC&B!?UU| [iax@!X_Moor˰D8w5ț ]~}G9`M>`Cu>oj|0QU/EUᇪSR-bQUN:xUe-}>O)fDrAFK#I |~qCf ׂs2ksX}7 b)O#|r'DY_>)n{ /^xh~.^~enV^zF1b IDATncZx1ׯ'88B!}v-Z4ZUQi-izS!mp3牖be 7/BQyN'nGD FްޑI۪뤼o8ȮhQG]PF2-" )$|Q!P'{asyWϧGߋGhlUb"5´@R#@-nD!Ĕ7sm[qsFy^p.ɌhG眽{PQa[3P3^)xZ_̎}'<&HKKJ!BC\N7;ʨQASW、> rz 崇_ߠ>2ƽ UUi(kVjwrɏbBDxa@R1$B!v6OaiNZNm9f\/r1^Z e˖zoE| !B(xUN>'_Q[MS]T0yo>gtvSpRQdkI͘ 3@ Ўà4vSzX]KYK},*8jd:[m#B!qǗ"\57϶6'j*REAy3"$33 1OhXo[[x  G.;wAniqVvGnn.޽3+++IMM~i}]ʰlƲd~q/9=Ckk+ڵkZ'\wln:mB!T*r17ك0g^K+bSI^Z nL@7̎ Gy'SA/B#y<?_nb`ۆf/+0״:y}g !Рhřф>+| {_;NW-lXp̾nˆ*%xBݑO>$QQQuY̘1FE]ĦMWv_\bwtth"JKKjٳsWc$&&f|ee%DDDPZZpj륍B!NҜ_OCI'-*eێoZEEѺ*4c됍$VbEV]BN'm_8#o>!wHJ@Cy[qs/?I^!%"鑁E1=rJ;EB*===6&c(*=l,jaCq {kEjiX4=+fryV YۏnCGsy (&ku8qƆ2ְ,%/f֭\n,]~\z׏zQQQl޼y_ve|p+(***$B!Ĥ(4UQڊ.V<xQQѹ-#6ePHBAK0ZPkν?3= UvoKigUjG1#n$-[f&@BIKUUZ[[a׵9 -|YJo'۝cfDd~XƷnox[Lr6&[o ~]ww+Yv-|2 `XhkkP(B1=ࡹۖVT c*W',ֳzdmpv(!VSHbA+0}nt܏d<EAqB[L9Xt fDÿ"2pZ}@B!(kXbۘED&rD< ;UE-{WͣɈ bٜ857yy5h?uº_'yۛ}d;}D*3K/ 6P]]Mrrq;xؼy3o= ӧDii)3f82AB!&rd%4Wsjr.sE .V6{[$ gyEJ^'M%ͽawM( $I gD1#[jd=-B!Ά{[EO&N [q,ˎ#36xr {!%889gL6}d]*'X~~>AAA' f͚5{AAc۹kj]FwMSS/>a}8YguĶF(h44 gx}EQtZveUUEUeײCZvh-닿txNΔS^{yN9y'9wQ)jA(*A7֠ jGFCD\iAT֯B[q3mкT佌R ߢEE[5p9m+ʥ+јB&k:^\oN'#__f,QVaa!˗/'>>e˖q7dRSSy7INN_f36 ;nkk+vn|>(\}}]O;wO؈n==&'|W~m^zcM{{;O>sf{䩧?p|M>#o3=x<V^TTT /_ _K/QZZ <墶g}[oPPP#q:;;'`Ϟ=Óz{{yGO?Xn۶mo8N|AJJJxW/?Aee%zjE||g+t:o۶mcݺuG{G{đ"rr 2~H x|r篅A|]?qp˳۩eYMmm KTs9+ %$kiFdG =7qۼPn0{7t-,{ ['H"Tw)C}%m6l_<y+>k ^7\V|E5#܍ DWn`X;>㝵'{wɐ6&h mLڈs>gݺu\yXbZ_)))cƍTWWA`` \}լX3tF`&U]>cNy9D#sYJ톃7ܡæ]a&g%/#1#`cW14ԇSP]hfovٸcsh$^)jQMU 9NPPСǏ^vz鑁̌ "#6@ңI1 AyN9S^{yN9Ca |Lqm09ͻljq͂DҢ&kꇒuhRZ*l%7Ϥy!!!(26&v1ݵK,x6l^ ww dž˗ /-hMdѬ=/őf }Բ po 'U?դg2ÿ8928oB!F* mGKi-&B6GӠg($^O6c6. wC%GQTj:5PCmDMg=p~n&#:p{zT &nB#BEѐr<)ht~d:=||4c\wac="y\GT_A'}κfAw6̀ ח|vzqNiu')z !·TE@e_g!{YICxC>|"jfk+ht3{?+;(h覨¦^Jzq x[8|7 11T ӣ4JB!GѰp‰Ƥbor7Rig&>:Ďvq߻;]osތH9X Jﭣv?YwnnwA<$g;w$,,zzz8쳹{O~]N(Htt4---֎RfBˉv=xF^P!gGyw5_PK[: 0ջ r0'.c>uh4ԡZ"]H]l%yڗ㮧A;VG҇ !B1Z'|trEuq*.N&ld[؃oEͥml.m(Ih܇OJ?E[` Z}{KZ gK6oLEE<x졇͛7O`Μ9lذ^jjjNb͒ 0{S1/rwjbߦB!&CbjXm[gޛ vws 5'BQZVhqgRL%{kj*ֻ2'&+cd336dZ; \!'BICr뭷G+*E)94oGa}~3 5z^$ :FȺjxj{oq ?( dlFp\@}}=Fb,T\\NUUONUU{2jo43>dʕZL!~5vs>%[ ihSlqiJ~=湜ĀJcH6ڙ|iƺ8<&D%HO5wbɌ !3.Ԉ@tZ B1Jww789Yw5󤶕aaDI )|W~ 0{;a-s|1An'x{ y睼 7nm4 tl}TDMyp@̸2cɌ !+[{- !B{6&>P`@A(NƲ.Jԣ+$$= ng4ԍ}ݠ8Gp9U&] e..]Veݺul޼ŋr7'~axGFrj%̊ aV\(v|s0EQxd&!BLYrsj)Ϊ:#txVW͛$mNο7iKZ~̈́ZfOz<2駟wߥ Fll,>? }0j6&B!顧A/>HOoN. +IX I )urJyJ:yj:yJ:ejpl0贤yfŅBy|B!Ya3ճ1&d ^˕qxVN bZ{yvkz IDATƾ~T\ߐuwOxOMBѐ\pZAtR}ѣژB!ĩ*-ʺh(O YN̲'!j~U>5\%\e&yJ:բ CH :^pUWIB!,9Z{`'L𝅉\0PG8J>@妱?z{zfc%++kxrj ILLn T ʕ+YjթBqQ&7T}t5/}8KX+f|)bj%W`AA~OJe8 BM~^Q;wr9?!BLYr34n^=kԏVKң$.͊(Ǩd0`?0' Gٓ2׿{g\s5\[܍|,KeB{ҔWN=Vڱp:/Kt+ItX4콛:0CQ5vA 6l4̌ fV\3c B!8<ʶvS9̢ڜn9'y'ttwх/\']ؽ~z-[ƒ%Kش[~W_n: _JAxB1xvRi-5O6ym4r<̊aN7؞ʴ@N?Jcc#qqq?ɏB!9駢v:ZzwgY $fDO`Bv(osIvwcʕ,_~nFy~r}bwO*BssB!8ۜOJt(:_( XLdAr,xT2?~09 ̎?l'[jOQb۱X,O!SM%[-Ÿ礆s˹,;@X1EJKK ࡇ:|{2_N(DC!8- )ߘG"zZiQz Ի'"*I0o( P#F}=L֨P|SbB̉evB(s+5q䩢( O<^!BLYrs i4+KbhsfO=UKiKߘUXz{N23'5|wӞ夥11y!bs:(t%;j5Ţj}ߪM(}9| 1jl^FO$[ɠXMd=1|vB(C6vB!'GUUvfnk5tk;N;Tm _L6&bj:عs1B!.՟no= ]TOGm)}oۭj)TUfMD>-d'܄PfŇ`d*deeB!'"+@/B19ϙwzz۬qmN<.JeV|Fx$ic"rBppDE!8i%4vPEGm.:gg⊌;:f$Z $xۑąqX&/B!ĩ !d.z@t/e'`S`omp0B!Bqo5@8#rNBlo&6&G}_ BZ.=]D:J4:z5]LrT2)SQo;РjGn9m'9x<{9Nt:<*B198>ҶjJ[ƼNaX8/a>)ȑ[AL~~ 'B!&au q8#q"/(gq'Z Z j"Lv)*49uBhe^yEI}JMM R-/B)Kyĉ^^f<أy~4̎;'v :z=v !p⠡k5I_/;;zJћXj%Zˀ&J:=iK e~7Ί *z'B)Kyh5u^QC[?sEuQ LDqK-|nZjs1BqʩJW~ %غ]~WNm"Y`A٭dKd2tc22 &bpL3իWs}%B!G˭q~/obWU7hv~<7gv ;?j^Պj !B΃ؐKG~%`SPP٧k j(m:*K %*H !B!^^͚=8VCFL0#D$6*&&_P!bʒs ݎ]۫lyp }#J$ؤ?2v :n~ճ[*Bqk!5h `yq07QK2Qb6g{[If%Z!X >h/rmʗB!Gl*i[*\6ܰ0K%%0[ns8B<.7 _f{V:_eW \Hu?n*T2YG=X-Bh%r!B!ęVn^ʘhbXLp}g5 T5tP]r%Y`LB1u.?AzkL~ؓBd@% |  9k{2"5'teN|`%[3(lܸ/XB1e9.wҶ*Ǽ~N?Sz'o=kqWZ5 %B!&v~mKW.EgحE*D| .e&kv|58Hj0$[Ff\0z-B!>aEih47*vW=_# &]٭jh4LDF3?ȤBsP~jw8@'(ZCTFG5Zm \rC`v&J턞p$l%'9@*B!vJ>߈[]~}`*$$$pefFO?Lw(c#bjpة|/yu47yDjaAFqcrԂCđf񹲄(w`wʌ  9VңiI!g9a^?ݜoռ=;;;cѲe$>E6o,K eG_PWC_g TdcQ7ҥQbҳ!M>T..\'b $1/J⌡hXd!bJs1bBL⊙3xoo=\IiKwaMP!(McY;_}xY`~:G#bHQ@aK皣@FL0 RIVnO D+U‡4 3f̘a!BqxV_J*k~$Ǵj*.SDmƲ.Kh(i>hJH ۨպ9V&Z 2i/ի|xB!$" pŽLDD"e%/ZIjȠs'1ۨ4q:̡Sʱ'C{Ć3SG'ҭ%xeG-;8df s(̙T`ȾqGl$;>BItJij*n]+"""AK9t6n9Bnh ثJ 3*(H/?{*ZjpdEJvQ62 Piq@ɱ.rLg}6i~EDVeQUPIQ^#*?ҵENw3IqF9n`9mZG aNQ}㙐{E%6`&֭㬳p:P#Dn9&eQu7_}4ŝj ||Iˤaˈ#n2̖#ߤh7'$0o<aZ->!r jc"GP2M[Yή4 W2tX aBJovjRzmHmLjkkY|9֭#==J9aݻQ]jc""b4)I$wnj(mDc(TÛIDd:qqwUN&{#II`|rQa#ɫʵ^KzEDD$h)Pbg?PWW׮[ei&""`zMoM޺q)W4sfga5faI3f^DG<'ڑLHI`hX\N% `yDDD$)P6&?yOx)*6jc""rrLI J>F^Ν |wӝNF_6dF-Q9#ڑLHIw|_bCmcosf<W]uSLwDEE}$~hAD^>K']SJ $:snaL2o[CbAO#Ø~Xa{txڃZx^x~_tjU Ny$eeٳYjapg|rFm%**blHRN>CQN enJ2 o,adj2v+vfB&,náKENeYXEDD$x)瑮Ӯ޼y\k*twA$ mnpvr(2^W$c;f;uu a9 k*BCINp3hw qUUUPDDDr ~)vWVVbƍW^B+4@!"w-M|Z8FgLgDkGˋ~?j2]l$Q!40 ,#6٩ DF"`&˗/?.GB_ژݛ9>#/~t;v8jx-&%5dn`itt>ajO_xra^qv$'/!RHmL&N;CNN?/o߾1⨯/X v|@""m5)Ω0 gU|ʕl0[ o܍#&D^2 p#d1HR$PLdÆ L<CWPHpR#/ax㍼;撖ĉ1ѨQxڠREkk* 3+ٿ2f Y8i@f9j?1) L8r8HRRRDDDDN9 1>}:k֬a„ Y]ΥqHGjc;1h\1o0['EDs!À}☘ȤD&&#.8DDDDDDDQmcl2f̘M8묳x駙Uws”صk6HN* Ss?LA6nڋ˹+8V#.̈́fbJLMdbj#T(ҕ駟GDDDr %~kcâEXd l/;491@keV3K(L/؅i_TnƢe2ya9QlRiEJRԡ$WnPDDDDDDO:uuqSSS,r[UX;S "!j*mGCuMd,ǡ{}.|IK4;~"Aswt:""""]r %~Yٝѣ}-661cлwoNx/!q͠x<})""vi,&ídnȠ䀓~`!Ლb$Pq:4o{m4˲">>^ ,DDD$h)瑮Ӯ~0 bbbxǸk S!p_DBLÁ*r?}_Ԡڙe8`igkL\a4ǔQ|HI`ҡU#v߶k'"""̔HKE?̙31 7܀iCD >}_jgvd?yZed& Foͦb4R_EK/OS]+"""AK91g/~ *Edևl/M}nǽ| \-l2FİqLJMVmӶ1ƏқHh+*'Md&`ږ$[Cr\afitj16DPm9eyfƏ?DDD$h)Pbwjj*TVVRSSUj *yP pm-nZjkj6E ICD&&295QmeY2n8'"""AK91y . IDAT c$$$=ژHu^1隣Jjc q\5ńGn&x315ɩ-"""""""K]VVȑ#)))a:Asx/40vsM8ZˎnD'36yJEHNNt""""~GB_VvuVn6l7|3SNgϞ>^QCmLDOmEdTRYIeq_ k 5˝Mil3vEmt&&2ЪmcmLۆhn0hmm-6fm[on6&DDTRR0`/D4Լ|JbZ=QНI ܃鴼^/?8t:P#]E/v[u"lj y^!q}?z Xpa&"Ǖvj*[h&/D4ѭy7=N>: h& ƤLLIWmHaYt]s"""HWi{v /'t}>TZ-x)ش6ӐKKx7`3gR[20;ġD;I195[RTm)Pbi8t$''PDBeYTS)(砶)У|T˛AKD>b\Ob &LD~CD.ya&O?4/tI-<JD.mP)XiRe&Sam{;LJuhzX7_Mwp LbҀDF#̩$EDDDDDD:uFV2"4M2>E3)=oXe|WK'518&"ò,mƨQԿRDDDr %T6m\r _|1C+&FbɁ-{YyԚ}hu{w:t2ңG4S`@"S$/!R4˲عs'#GPDDDr %p~IȜ9s3gӦMS.JmLDe&%iMjJhO[B"C~ 3/R4 ~WDDDDDDDTQ½56v+ÝGQsYQqT)L#2H0M+Wr׊}{nL$TR+8T܎ ]FLrz=|&D#KYEaa!}9WDDDr*Lp\+V{QUU`6l}g藱}"##)))Q[^KS3[yuԕi@bjj2ÝNa~L􌋰LFe@d&EDD$x)瑮KzYvo޽{a|III\tE̙3 .@}C;SmL$x&y5fTh1m^S&3"8TܞHb1EDx^>n]+"""AK9t]u1MX[{s= 1iJ 6^Iin d,4ӞaޘȢ"ԑtuvcBJa)""""""",KT 6aÆ_2_UVQSSBСCD "'E8ػ5v|C6Nrɏ|hz:/c\rn͖tve{nN?t]+"""AK9NU>\RR7p7p---Y+VЧO@&Mbt u&iFSX*!ق!p+ѭ c\7a""_eqF ?DDD$h)PrJmL~0w\&MdgL@jc"]k9۔"hMcq; OYL+%gT LbX8%""""""""v xnÁa :srӻwN:̙3YlIB\kYoEޞ:ʪ0-_;͸1T0b*FŔI Cmc&|3f:"""HWizvs]w3fp7}Ֆ1*JqA%{)N$ >tG .$yY }S&?1Jv@ """wy$T0,W ꫯ榛nbʔ)D+~6&jI{c9[Tד, 4*nL ȔAILJM'DDDDDDDDI}}=˖-cɒ%Y4<駟ks &;C򗿨خ[ٴºCm8 c_gKbʠ$&&-&DD1M{[nE􊈈HR#]E݇۷oK,ᥗ^b~hw}w]Ν˥^Jx NMۇ*55m۶>`"XVM/ٔOq)ԺlmݼW.uI&af2bx&$io,"77GNU>܆ xYt)Z8_SSۇrQQQb"?IbJ júaqmE-z"\cC6(""|,t:-܁xWXd [l981ڜL>o.LmNձ,X v\@ |YDa~~)nZD>^ČȘ3O.zȩ,˷CDDD$X)瑮Kc^|E^}Ur6'?馛83::ĐJIIw9Cݡ>$Jv-=iAY0~p""b?˲bODDDr*li,Yzp8|O>TG=W~J޶R4v6ߊfc1Xt;R&18T`&/"sUC"""HW݇fҥDT5/㸛%dNq!:c+""""""""AӴ1,UVxbz-|_?|֨M7̰aZ{:cYy(ޖGA~e4&NcU8L ]~q "LHhz{"""H(9۶mcɒ%+G) K.aܹ\pjSɵ͠n|)i'|r-#h5r~OG$1eDFvwRDDBeY477vuY-ā0*]i  $,Z9)_LoOct2oc"k 6&---d\ELQְ֟`+-bZZq8yyik\}պWDDDr %.vO>ɓ's7뮻ذaaz3Tmݺ5$e47_$ h ;U8{XL8pacƌ GDDDBr %.vY03o_ڹsgPϦdn5S~uzۼrKdC! F |w,SM#!m """r* `ĈCDDDįH(Q90N5)ȮbK~vU-i۶nG6hwgYf"""b;˃>ȯ~+Ng <JڽA0 .V\iw\4{lVZaAQPTTk U4ղkd5b ҦÊ1L/q 9DTm"3rF-""UXE]]AyE(瑮SlPm6͛w9ᱤct"wCm _,}}= صaאCWpf7#DDD&""""]r \+,,dv"UW]iaI)6+2H';/s0֞ۆr]+9`̄tr`a&?tI-<JNIqMlLƆ * Tċ<f Xa8891ix"ɂ R&Oݵ/[&Ê}latss!.cgvnGDDD:ilܸI&t!?)PbS^:dR>{(^MXdibA 5cRs:i'"""])P6&ҹ_3<˲yGOuncTUK4lȣ~X0[pxwP֯&0uboFrjSDDDDDDDD hZ[[[OvmPTQÎwJˣIuCIw^,wv:Na """TL7+%"""H(Q;=|W̛7]0NP\Qo~D.j'X'  Œzb &ξCfPq[DDDNaviyDDDD <JT2,\n>[I,?Ou21[~]G;#!8}Y|N"""na0v@!"""Wy$dϟ⡇wmq~_zz]A!鯿K2ZS Ƥ$?Mzk{z2C-"""z<#?t:P#D b z-{1zyJzX`uxm%E*jAMd?0k:šbEyzSZ-"""~p87ozWHPS#$$555l޼4شi{,IMM==,_={PWWG^8M?>cǎn;?zA` 0ljh.k%fH-S}7 hDDDDr !Y6m[nX7o/'77䐓K/_U .$//咔sRSهÞY?WKv2qyc˱EDDD4M/^߮KzEDD$h)Pg7nvb'ufϞMII ?-[?Ndd$SzUW]u ˖-c֭;G}4h7>n$9 W\-W@wϥ'=eYdee1vX'"""AK9,v~>o̙ˊ+hhh 22^)..PPPpR[lg̛wxsqD?e/S YDDD$W^ye+<J}0Yw6 xmm-6m5ǃeYǼ ~XuDK/%~ ɮO5+K.=sU*tHg&o&i:Q#D+iǎпo|}wYgPPP嫗PDDDDO>ADDDHbwFF7o*L{lkm?d6 72yd_cL0 ^o&N7p8m+۞:=-綽kޓP>{DC=,ɓ'cYD=9B?{'8&La'ه{rxL6&wwb IDAT}ߟaÆqu 6msßsk;$R,ˢ 멭_z衇o|rl_W˩G/7`Ŋlܸ'xbx+_{5{=>3Oss3{/,Y>_$++ ˲Xh^\{9>>^yv }GCC<|\Km6P]]Mii)?87o歷7d֭#//-Z޽{Yx111/f޽,Z|ɺuxxWIOO"|I6lo`O ~*x|ɛo [o{OqJKK/ ۶mcҥ\?~Bؽ{7 ||=h",/"pmG}%K{凉|g{ksN|A(..'N*X7x/Gy _ -[|ۤjjjx衇O:.ׯg&?'!_~e>C֮] ?Ovv6ih"L$;;k/'(((g`:GsD;GG̛7SaXeAZZW_}5Y#?4cu?8~;apr]w+Ds=?dggzVk}پ|Gr-<uuuгgO222 #ͦi&U?{'zOt>KYYݻw?⸡':Gg$"za]=>ޓ_-hNߊ[nsϥ!ȑ#ٰa7몪ٳ'---?7OD?L⛹9w} /f:bwll,:$,bcc}d,ѣpɷ9|Sв3q:CDDDoN'wur jy$6wϞ=e#GWv}s1¯qeذau th"""",۷㧮~""""r %~)vhuDsoX,$̈́ N'#GdG}@&"""b ˲ضmGB_%%%<~:Z[[m^W^y3ׯaٳu/[nݺsJ6?0̟֭?-[p5֭[?9cǎ'P| y$TtMK̴iӎx|٬Z 0zGJKKq:g[|/"7| ??%%׊Ҹ?o6aɆꈉG$"""""""""Ύ_ژ\r%wyIܾ;(--0 9[ v8q"۷og$&&NJJ ]wk֬{(t?1'"DDDD'T#"""AM96M1cưsNf͚K/}q, >`v(6ү_?})""""Ʋ, ۷o[ """rHWanv8<|ߥ{s72}t|ݳg^^z2_nR;@JKK=CxIDDD+<*͛oɵ^KSSݦmد0 ,b̙X0'62m4֮]{ ,`…ͼ^/ӟo~ t8""""~G ;Vv m6n&nASpq,Z/-ڱcQQQG<"""""""""b.QnK/'{ccrpmѷoߎIC5d6mڤ""","##!C- ?ϼyp8t'<J]^fwp,KHYY۷o?jEEDD$XӕoHPS#mLNv&ꛆ;s #BiUUUKDDDDeY"""HW6&/·>?aY9$é!++ 6qFj̚5){K54Yhp:GDDD/H(999̜9{ҽ{wx:\׳Yt){{qhe rPG ;Vv+}ss3W^y%{!55 6pM7}c`k4M~߳tR("%%%!]nnnC;<*R~ؼy3aҿzo[MeY׿G-?o."""YG}GDDDr %~ic2c V^Mrrrg^xn `ڵy6G)b""""""""""'Ӷ1ٽ{7a0hРv޽ێ$ydggsĭ2С4M֬YMEDD$)Pbwii)>m;t"Fŀ=裁MDDD6́ADDDH#۩[nm6ILL$*tXn8p !r dر::Z*URrr7or E9R? _8RU馛-J-*l?O3KzgOic+ @QD.Ymx1F_594r#={gϞ7n\gϞ# iӦ ӌ1ںu+94r#mL,ҕW^Ek^{.\(˲ #! B%6&p5\l… yOJm;o¹eY.GOwv;%%%y $h/T Pjυ@ Ν;y'y[NeN:nKFW:`0)SO#灟?8pOgѣG_~Y999,K;v<Q oqpL u]ly'k]L@ڑmeYZtzq>!V=׏?Zk1QŊY'x9ʊ$egguNcB~VԛeYz)tdԨQ <ͶmM2x9gv7hB,K111UVTbE%%%]v2d. p 6(...D%&&ٽcǎ3~(%%E-:ߗ W-[+550c6nܨ-ZpI/,ry rᲔ?^a7|͛?Y%y',P0,P E.tPMF @idO<~B <>x96&C%6&pL^XxmZd 94r n+ a}݉q]t4۶gO#灟8֙~ƌlG#GԷ~[9993gZj z?ڴiT8jժ8v#_8d'˲$IjRVTZ5EGG+++KڴiN<)c,R^TNoY9sf5ژ(iK:R^M0,F(Hޗj>}*UvHm[o[< IDAT @ \E΃"r*j}엊ZGmذ <Ͳ,hтx9đb-JY0y'1ӂz)}݊r;GOٍ+7NBB~P1ȑ#JHH6Y<(+"ѳWLL!8n8rnlv; ضsO#灟a"qE$꒎,P]viӦM:trssU7`dO8<Ͷm[NڵS y'SOW_UFFFaYnԫWvڹy1Fw.,_,K`0lhc6&? ߿_e~^n]]pseA 4۶`ߟKzgO)v?䓡BwTTƍo]kv;v˲L<~H͛k˖-,Kf 7闀ChcE.ȵ ;weYS2j̘1J 3ϐO#灟8Rλ,iӦNHIIeY6o\}͞=>Nnri<Gzv7nXׯWvv9?i+W.>~HP*+H: P/Gׯ땛8'^xgԠALj#dvd(l֌34vXEEE#y'\0j(zgx 8lҤI ӢtO#灟8R[^|EIң>9s82pP6mdq; c7ߐO#灟8֙ל9snIW]u͛~~1cF;C>~"Yf ӌ1ڲe 94re/[L}ɓ'|˲)geeiݺuZf֬Yk*---􋟞^YYY6mϟ4())IݺuӭުݻG=RJJVXqϣ5i$=Q||$);;;߅. "Qtlfm=z*tcusBݕ{GnZZnZn//~;vL;vٳգG=3h=zܹs}vjƍd۶?_/jf۶~mri<G 4H/BX49=ʕ++%%EIIIEώ;Էo_eddH>@_|^|E5jH4e7.2GՐ!C԰aCƪyz'C|B맟~r*LRf͚n8r#mL^y 6Le&Mhԩ.iɑQ=jԨ:I&,+ HaۘwC5jT%\[*諯R6mO B¨Uv]m1JJJ޽{}v5lذmicE.Y.AI?AiΜ9*WΑ*>͛7 ]t9-IUVՔ)SԧOٶ'jܹgl׸qcUPЯ]FBokY7n{jg-vӟ`0X(kM;CQQQnr#oFTBM>#7 9rd[;CG*666l>ȱ8%T3"O\111_\\:v쨖-[&Z7 |01FƘP\mV=׶Ƙm;m^`01apL#9&=&mkɡ119+)vwImݺՉݗ Ǐמ={$霅_nS( k֭8pj׮>}hРAرڷoM6k׮z' \J:'NH~'c?Z*;;[믇NL4IYYYڻw^xIҚ5koKϟJ:xyI̛7O;hՒSjϞ=7IN k_}$iƌԉ'cի*IZtihY}vc4aAeddh̙O>D~$_l"Iz'tQڵK/$iժUZh$7%IO=9~ISL$[N .$-X@֭tjz%:y[oI}]}嗒iӦTnnns޴iS?ŋrJI̙3sNs%$$ȶmY%˲ CgXlVTTTؙHnw'oۼ9m^{ DŽ1Ϟcc"*BhBecgcrP-2;;kΑb$r-zոqc}駪Y/Q)E(vgfffkw-t K. oLW5uTUTa۶ΝCo!AYWTbcSjСڶmڵk7x#ԓ bccCZ|C)̙<-'F?9w_bjժi׮]2d*W۫VZ^ҲP?YYY>/[Z't ٶŋwx9đbYBfSkc:j^5kj޽Dg JLLt)* ޽a8~H{NѣGhҥKu7绝1F˖-$UXQ۷/]vǏԒ ‚fΜ[nEQQQnr 0p{>}zŋkǎ~-nYZݻW}2xE ЕW^IJi<E߿$??6ШQ$\ƍW1מ={ (v/ q< zvviiiZrev[oz꡿kg駟ʕ+o>5J_} ʕ+믿ĉ}vIҘ1cԶm[Qd=m0c۶x =C\ <~bfҰa }rrr/YF PfffϿ;ϗ7%)''G3ژ@E.IС;M8Q:uRժUd /B4i">aQZZ94rI>rvڥÇ~^ ;2tP)y 9rDK,СCC-[jݺuJOOw"DҥK9<-/'F?q[>sLegg˲,[SF >..N={Ԝ9sZjtei!KDΰaBȶm<y'?'鹗^z}]_^ƍtx(O>$4,RnyO)voذA. :ԩS' .]_rƇsꪫT^=5h Fxm \G y'1DzcǎɓeY233UvcjР$)>>^k׮U&MžK/Unn,ҧ~K.$a"999t_/gv@E.={/Z(z+1FYYYܹzTnBƍsN֭gٶ?x9đݽzRJW^yEzk'OV핛*555@@SLeYN`F7\Cp9‘6&ki۶m,KcƌQlll+Ww|2d1P"Qtdf$ CܹS'O\9RIIINs빼xmۚ;w@~#灟86eS͛/ Mc6mڤ͛6x9ʊH؍06lؠFh<*n]@v-[aÆaɓ'@DA= nr 3& JllV^}fv0(77Wqqq\ <eE^e[bb |X+W^Y<(+"1\7DGG+999G u 7J/4۶5{lri<ژ L$.`J8]v<2c֮]K<~BjР 4c222yOhc01Phc\{,\<Ͷm?!F?؍|effիv#_ahc뮻 1`P'O&F?af7AQo:5OQ,r;G󠬈r p1eddJLLTbbKQDVLL!8~Aujժ6lv]||< OkٲyO(v{@FF,YM_~g0~J@tx9XBS9993g֭[huY RtttyQByqqq<y,vgeeiݺuZf֬Yk*---Ԩ?==] 4(M+--M999JJJRnt뭷{S6n(ڕ{5aEzOUTav7* ***PCe{#ui;c͞=[Fҳ>+˲"tAI /jժi…JIIQff^{0`֮][85{l]s5JHHP˖-`կ___}/^\}2/|Y>|Ν^Բety?w}+Iz4sL[:umݦիWiӦoO dYVo,WTI+"h 2D'UVUzQ&:tH:tۡgrv^>>eָKC\nPo>r aL@8>)4\bs#~Mr5e{2d6mZ"7o%I]tѨQئjժ2eS'N7n /зzKɒ*ƾ}82СCzGKeW|&gSV[i4V %5j AP39;/Js̥!67b($AYsb=ϗ=#7 9rd[;CG*666l>bi۶K$UXkE'N1ƱUJr/gvGC{Yveڵk#˯k%&&*==]zz#_06l I/}H-ZoܸQ]vh,˗ןg=裺;+..N/kɒ%V p} |VR5kdvx0 =߶mEEECsnk1&m6/mwm#>1)3''G@@/999,K5rsseYrrrBǧgggKrrrUjƈ_on|N\(;;۱1F 1‹}:HRX'١ӏ91)濯e}1$)-cDIEcKs='mruw<=z4b10ӣG#H2gرcm[hq}xE|fL^zdW_m.b#ĘEj?{1LŊMŊ$Srem$ի˲LrL*U$k$3dӪU+#Ɍ7TTԬYӌ=H2;v47C1;TZTRs=Fi۶$s5טN:IfԨQ&))Ǜ?9 :H2}5]v5nիg#}nݺIfȑ~|&55H2M41Æ 3LϞ=MϞ=$3l0ӤI#ɤ˛뛑#GI[nO>FMC8s?OFKW_m$A6mI{5zf̘1Fi׮0`dZӡC#u]F&!!w}Fiݺ|d.2ӫW/#|ͦiӦFyGLttWۍ$ӵkWӷo_# :ԴhH27IIIfԨQFԩk$suיmI{1UT1UV5cǎ5_lh$;IfѦf͚RJfܸqFiժ2ddpwu *~H2կ̍7h$+¤I[o5 64@@ `6lhnV#ɤ+H27xկ~e$~TPԭ[qFKUW]Q*Lj+-[2F0F0F0F;FH#򗿘ʕ+3F0F1BYzuj1-{KJJVX!IJOOW v߾}Q$sZjY{骫$5J=\dcǎiĉ;w222TR%u]?p[dggRJ璙uy1)GGGGsKFPB*55Xb&(iy-bw1Ɔ8q?~|-t6ϔEDbQ͚5%s.w,.+ԪU+Ifvܹnܸ1te˖~Dzt3hٲeN-ؾ}{c]L ݟ>}z-^X;v$/lqK@dP.-Z?\?8p@F$7Dc(vnHKKʕ+~{zKիW=>>>l&w~Z+WԾ}4j(}W2d*WZ'N%IcƌQ۶mzGo1ƸDI5k V퓓CH~i͚50`233 |wީ^e5T@!rfw$uA}M+--M999JJJR׮]5bĈ,˙oaJ@GPQFĭXB۷V*˲vXy馛nRVJ*K.ze۶!'xBW_}6lxƪy{~@nD\۶m7߄GZ|;D؋/;CԲeK]xڿVZǏ7,XrX]ʕSLLZj:u(77W֭O?zO?Uz!F[ RΝU|y"|;4vX5i$[W^^zI],YD]tQLLLgǎȑ#5{l=zW]n8믿_n)Yc5tPY?֭ziΝnг( ݒtEIvUR(IRttˑ(v}vIRRRˑDɓ'*I۷kޣ8"" `^k:JGA24\ZWLѤYKV.S6jZ#&Z-qԂS&*;(g-{}{kPQ||ݫ{j߾}JIIQIG* R-X@k֬QJJ@M4IAAAՕ5ϼy$I!!!Un^u3uT={VيWZZ7x* 8 5^z)!!+0>>^Çױc?ܯf7ڼ)d=j۶fXں '00P˗/MՅ2&0`@6õi&O?m&J F}ͳ{n=srvvItJTfk͚5JOOWݵe˖J8Ov}Zl[:tdҀ}vI7bYƘ3""L[rrrգGrn`/yoo߾:w-[qU&M6w,=zTݻw٨Ov?F;Vk>lӧu%˨AY\\9sT=hJk4=CлKTYm]\]vݻ%&&V)NHvCzj=y2 4ȨǴ~z8<6{ VjjOiӦ7`J$)## QAdUbde3L빹ڷoC{y D7P+TG@$}U pݐ$%%%IԶmrvh>^{6DGGu77@es3oL\\\d2d2Y7simVy @U``&M7ԩS*,,鰀Zw}W9 ռyYvmc~'Nt7:6jXv1cvmiF;v$ͭB"((HM41*5~ҥ2d׭[J]qwwC=d(66#nHK.5|M͘1#oҥ 䵭%~,nM7n4SSSծ]G1@uIRÆ #jyaakƤkӦMVP5$Psm___t ?h+TTT$I0aCY@._l4hPߟ'uMk.%''W82)n,@m۶d2d23;v8o'553qDٳ%IfY111 UNԬY3L& eƐkСj׮\]]N:'͛+}_III߮M[={ԫjueݛ} `ٶmMc97xC-ܢƍua)rrr'_~jݺ\\\t뭷jZ~M^kƍzgԽ{wlRP=+W*??jرcFQc}*loaaaF{ٲeݿ%I}U[enʱp3gh„ FMb[,YD/222{-''GZdb yyyU8oYfY=L8p@?h"=8ҥKz5o<%)33SJHH|^xAsΕϱ۷O#Gԑ#GΟe\R~z>}Z>>>^~ӎ;'|1aرTQQ/__]&ԾOu[&P5$`K=Ւ]&M:Oaa~aݻWԪU+uQewܹs_EEE:|QG|ƍ Ԏ;MxkS%+11Qyyy;v<<<ʜjذasNNN;\%&&ŋr}]8qBVi*44T9992Lܹ|||DKVZ֭[+w5 K.jѢ󕒒b|xm5>((H;w֡Cte-]TӧO>/^lnӦw֭[kРAڰa;m۶Y}C˗$FYݡV-٣;02lݺ,,_a0f̒۷7oذ\\\lr955j… ̣F2>|تOQQ9**ܪU+ˌgǎfdܹ~sIc=fdnٲU G-u}> l7lݺ~cǎ59;;gΜiȰꓗg~7 64~GeiyOfIǛ?n/55hmР/sޤ${{A̙3׽stԩ땸t駟V8"W4.::l6_}qnĉ[nտ+忧0xK~ɘ綾^pѣG Q6msN[rhРSNY={+~Vs:99iĈڱc%Ik֬O?Tj 2͒vilO_BCCun:XBzmU3fˍs3gT^^^8w^|E-[Lzk$ܺ'N4VllMVW IDAT;wkVj0HZ$66{()w"IM65gJ<#{UK})a1c [oUQn8o$N3o<#iڷo_͚5:uҫjϟ?>wVBBqe˖g2'yH%\O|2d$)++(Q;.uwwwe}eםwYܮ;׼ys=cƱeX>j(ハ²,Inn֬Yczffbbb$I4h ]oҥDرc7tMjMJu+VT~<= ClRÆ SNiرce}F; @!!!e5guߵk.IW|m7f]p 7ׯ>tP},kq7\szF;**jKK'NtҤI7t]G|Z)n{w%IW7hРZcB 6HhBׯWfj82p3cJ8D޽+LJRjjN8a8Ц马,>}Ziii3^߳gѶu?رhwMZi\n݌v|||-R&em:h#*"S׮]XB>u,Ybڵsv}CJII֭[uqiFK{}v]x|'g5j5k( n8Dmꗘh*U2YwYdwJJѶL~`>}ypxΜ9:|MԄpR9pƍgs?Q;++KӦM+5l0cSŠ̘1C-Zt^߯;wV8...N#G֭[mHx՚4idirrr4gL^xhו)x?>> | k:IW=ܣ'OҥK2e>#9RzRUPP3gھ}QcW^)u_]k׮56|駵vZ3F>L5j Oyzz},GU@@@󦥥i֭JKKڶmZ[UfYPbbΞ=O;wV.]j~g>}ZrsszU'~~izpp6l%UUvnI!//O~~~p$ov=ޫnP,XHtzzGaaaVxwJ9bUnʞ={oJ(VǑv… n `O$Ԩ3gh2JKKӾ}:tSO=U. FkݺuםoڴV\)@hٳ'1pڳm;^ Ժuk7N{j:$&38y$un@GPy$un@GPy$un@GPy$u}/IENDB`PKmN hhXNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_dOmega2.5_EMFalse_LPMFalse.pngPNG  IHDR?sBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxwT.#k,v.]3֧ITbI/ɳDyCdʝݻwPA322/9WD%_||FիWwqIt9qqqr* ךMUT-RJxѪU+jժػe&LE)))Xx1>Ղ d={… ѺukY_و֭[\jرReq54jȨ4N<۷oҴ$2ӑZ2_Ν;ӧҼch۶vzz::?ϟ ǎ+ҬЫW/;]tؑ#G0ydܼyoa޼yXhY,""ҧEDdߎ=#Fк5k&M"##q-q?~|}}o<dضm۷| Wx+izԨQ# .G}$۰a._\y5`xf*22~4`hӦMAɬ~;;;iZ4[|rСCѷo_ K 8PvppΝ;m6k._$x뭷pY̛7O?)lll0~x`Ϟ=4hкtH4h@|r|ի^zEݬ",C}ɓ'K -CM6M  {~J,ĉMѣGe2F.s\[ň# L55suU6¼&"2k׮IW0h iYHH L+>>]t7ynnnhݺ5u:vڲ&yuY˗/cǎ4n'ODڵ}6J*uڵ+:t///iYrr2Əܾ}ݺu^?Y&ѲeK8::Jႃ$^Zޯ_?T\XqE@ڵVZF wQY$ҌSЫEm=g/???yq/ н{wYX]&L+VZԫWR ӧ7JSNC8y4m۶EΝQn]iobݖ*YP>۵k7N˖-akk3 M< :w&M #Gwa56>> ?cJe(mnH l0KÍջwoTZU߂rZ-OT*cڪR0h lڴI6Aܹ37n B!7\YkβyY-s;k'"*fΜ)=6lX={g5e)ؽ{.99YرC 8P,YDgzZv?~\Iax 3}駢}~… GUqqq1F׮]իWe^z%>^?"-88XJvEJٲel_ݻdikvssFA899ի h"C5W\ @CܹsGߨʺ*x 3Fo qFiyݺu LOСCA*w-={Մ]QT*1`)Yf܂qVVuDEEIq JVR1 _MJanj3]]'N懇狷{nY^)33Sv7iDxBg{=ٶ:uJktQJ)\֭Ejjְ_nA7a,Qٝ{# @4o޼-#wWR٭YaOA爩hϜƍSfMތ]tƒaib֬YBTxuY9}֭zI&R=z oNyP˖-f޼yN<)m?^i>|)RZBklYUTiii&Kߘdgg'f̘;;s1q~xB899U]ecJʺ(x 34tTւhJJpvvM111ݠjVܿutI;o޼6lP pBס'| B5kH jMrZ_[ŗMfk,C*? ܖ4MWPK.͛7A7aƍR_"**J߿/] ˗/)H~L4WhϜݚf- ׯ_?M{^>KCe)xweiխ[WtY4k,_ os+Wʮΰ.\{wiJV7nܐ幠2Ԯ]da!f+V߭OijOe_rIϻW.ڷo/t"7o.++~ڵkW`:5k[[[e6ʺ0ln2'?kI[NkZGGG 06lWrgooL9my^|9f̘!O+W7ZjƋ/^`>}uL8'NOX`WSN!** @N?ƍ3bK+aV`;Jo߾LYouAtt4={^<{ {TR={48] _Xnݺ ܹs{J;if͚nݺuѳgOݻר7JZPPdA|||Ç#==NBPPjvFohҤӴ黽8˗l|rsШQ#iG0m4;w`Ĉ>s{߇`ȐH?ְׯazbNe.];_z_\zlژMmONN]p lݺUz2bh r黶}͛o)Uv'''ڵkhڴ,̟)}7BW^%#a tx7*.\`JF{{{$-c5mT6x嗕%}7 {~k2qx̞=[o:W\3FV9M1c i 8|pz{{c˖-͛ xatM׀ *୷¯ B[[ewvvW:tQTL2TnewAe^xQ''"Wگ JƍMX" ){{{5 }AnݤAw܉k=WU0}Y{.] JK.%\e]Sjbe7 mٲrZµk׮ƣGKر!!!M6M}6PV-SNرQ-5_ w ˗/ԩSN֭[x~iԦVZFcƌTj筀MJJ/"MO04͹}d(NMM58FCp;<<\ٸs4mhkZ!Uvggg#..NnܸAΒ/u 舉'$$,?UT)Օ-e湯UͰ8|8`p>zr45m+WY1P(b ܹSFY&_ewq\Ǝ+Uv߾}۷O<njcP>E  ;l0̜9*2TժUe111z>*HttѱHKC*븸A;v@zcoWyi29t_}Wۍڛo%K`Μ9Prn\W\+WȩX4h&L???يC2eqsEDD ((HroD bt&M*݋ǏJ*[J*5(ksU^8z(nݺHKAfWVr+V4(5ݑ E)54jٶ]|/_6:CPYQfpNNN[oJ Cw6%w6kӧOUom4+wׯ/[0y(lkϟK-;v,.] Ν;1l09o8V(J252TŊ 3wxwZ`jذap ..BݍΣr *m'Ok׮R666ضmzauEށMQvmi\e syZUeV$ce7 T*lܸ鄇eee6mڠM65k222c̝;WonŊ:uA]M IDAT 3[빹ԩS6SRR<8 $}رcU0;w.O}Aaxt#ԳgOYW/Ƥ u+kQKbb&!D...5mPmll4ŔkʕC9JlKl. 6M_tIow<ۿ+Cj׮ [[[iOC۷z>k7jZX~T٭مI׮]-r2Tpp0lllsvvF߾}uVPo6>30,, ݺu3 ObŊtvLeGi>}ݺuÍ7@2*o_yAs1q~;88HeZ MCVe9.sQ+{Y˭`kBܿ_y&"##Z H7* i,X@j 䴚8q~s_a`M_dddu`kk+{-{ȐP$o_Qh{](k"n7fi/_Ci35*7xCnyJS6m`oo/MGDDs ٴxgmm-ЊX黝]VŹǎ+}-٠-%hȺ_G32͛'M:uJPSN* Kv/^@=BRcΙvQQQimU0Y=zAq Wln2'?Vvf_;wgA|||d /iݺue-s_3TXXϟ/M^&M*[E!-vbn'NXvTYbE 0%} sΨ^4}:=͊;vQCÆ 3ym]J/bHe7^rEof+~MvVڿKl.NNNڵ4i&q44i5kǡa $}4CI۶m8}HHJ¦Mdc5/47FF ٳgOsڴiYf{(? ;O:ǂk`rr2z%uP(f͚Bu}V知5kjmn2oqvۗ}v$1WܜeN"*~&"*/^`׮]!CNC3?,eu^7F?~ZjBCCuCOD}7N–-[SQԭ[WR#==ӧO5J2%} KPΝ;Mϋ4D-Ξ=m۶Ip?~otWZ%u壏f ͛bm"##eȑ#n[0iҤRFYθqW\)xpۧ5& IMM7|S`={իt)}!f"<<<_!yx  ȃ4-C[jmm`iZ ITb۶mQ2[o%Kxx8HݻwǢEci>}H- ~ PoV[s1u~9R!##'NK{Ϩ>My^,s""* ē'ONBPHlٲE!DllСصk*0N@DEEi +9z0~,PV 8;;K.iM̙3SfA7$ںukW^\'DQ3Xaƌ#ׯA􂃃eA1׍7jժŋ:0`F޽[kC {{|.{۸qpW\UV58݀)O?3? Kٳg: !DJJXn޽{ 9H+ѣFWբe˖Rxoooq|>|(4h iii:ӵqy躞JQ~+!XpVܹSkK.J*Ia+U$-}gDDDQi ! 0:&2ǵ>NG!bbbDe+_}PTpiiibƌt;v(^zetJtѣG>L1iӦwJK.VVVR...U0xbYAAA۲0w M bZ[*뚳ln|"*:PIDTDh>>>h׮N:%;ɓ'ѯ_?TX{F֭QfM!##ؾ}jP~)«P(rJ+'Nŋdoҥ \]]ݻ[nJBϞ=KS0`*U$}hԨ޸aJ+WĉxT*BBBi&zx%>իWK)JY&_[x9Я_? 27ҋfnꫯs0c ܽ{_4ذa7rH/M`سgo:5mK,)r>RSS|r|h߾=ФIxzzϞ=eDGGK񬬬aÆ*c1c=ߏZjaÆR qU!`kkQɐA_Ksu<XL+))I̜9S ;;;'fΜ),52'?CZ|R:[ckN<\zie1w\Yړ'OfӦMBTWƍEbbA7en!={,/k׮589ֲۨ[!nݺ%ۮ>666)\\\٭[7q-[1?^Mw6(]C[v mΜ9F>>>h4k֬y(-tm{nw4(MKhm*WBBhѢAi|[DSqO?tƔ)SN#W2>e(! ?&ƌ#˛YgnE jl5pǎFCرà4W\wZZ6lXiTXQ8p@vyzzLӔ&suU6<[v?]K.RD>}T*tR#55Y$*s4[$YYYaNkRiZ 6J*Xd tW_}cǎݽcΜ9oL2Efػw/jժ5 gggL2'*Vh|iӦwWWWY+)ԩ˗/c̙Ry?]tIjyO۶mq%CrWWW|طoQ-ZlǏm۶ZW\_56md HR*/pYWo4hsȑ#& o.^ (ڋ۷ǩSdǡa<==ql)T*ѯ_?={#FЛfq},+J=t.^d9-EgΜit5lnʆcСuٳqUkc2o{{{lٲBHH|}}aggOOOj }]=zɓ'R>> ,CX?~= |}}ѥK"W^ӧwwwԪU ;w.DDDΝ;x)J%PfM4iD6(Ç@Rmڴyo(egg#""111HHH^{5jp\a/_\yXfsDɃp5$$$ӧHJJ3<==Ѽys4lذHeas1˜K.ŬYtͣkz^lnえ̋eDff&*Utܿ_ɓ'Vu(QYrԬYjpyl¹"""*} ;wBTƍSDDZ!иqcDEE:ۙx^QYnLʈ'NիWjeʕW^!""B9$"/R~7XMDDTH#C*.X@趵EHHΰ/_ֺ>|8>i{ァnDTY[:YRR.\sܹs8J2Vv[ضmۤ'NGٳiii-/^5~&M)DDDDDDDDDD%+-?wEg8B!-ONNe;v;v e8~8\\\ЩS'e`v5.F6l(}Bǎi;;;/{g͛7 * 'OFff&}Z-U;::r@K"""""""""2;!4'Jiۂ222cΝ;ϟ?/ϣytn߾f͚azב*UDDDDDDDDDDcT\xĂ...zkь'N3={ ++ 3f'dpݥnnnRpOOO( X[[B 8;;BBBиqc9sʕ+'u߿?`hѢ`@ 0sL@1d@߾}ѦM)Sggg̝;@NÇz%z k[[[N:;v,[nܹ3`Y& `mm ???L0=zF>#888jժUV0``hٲ%`ڴi􄻻;f͚ o`[o7xptt|hР4JwPPԅĉQzu ,, Pvm7@Nw:]7kիWԩ#GD |7xo 88Xg~֬Ypww'Mhٲ%0`ZjxQR%br6l7Dv'OFժU>P~}5 @N? & B@͚51~x@Νѭ[7رcQN9lmmk!44@NBz >\z#cܹpvv4m6mзo_!Cмys̙3QBxxx`-Z`urʭ\2\\\0g@ƍݻ7ڷoxwQZ5c޼yubݻ#00;FP* RD5;ѽ{wѣQn]y`oojժwo{kFQhԨFk#x5׈yP(kJ5(BQH&00ǎOg{I;uǏ#GеkWoիW&nݺ!<<nnnPP(P(PT+jVVVPRiҰB!67?asOOxo_Ivv6N>:@Pp8)/ߞ'%u!pqtI_Z O Z$q1؍988H333Ȑ;::%O'ÇfTkp"""& QY֧OKgH/͊:J0e8%+99Yk\s;vtpEj֭c4y._gϞaʔ)rF%3g___>&""ǖٱC.DDDKWxzzJ4Z0a,""""`vcR֭øq 닸8Ν;޽{:O<}Y_91DDDDDDDD% #2BQKSKew ѪU+\z=oߎ ;vĄ dY[ǎٲ4ZSN}P*ٻQY/_")) ٖNB %%NNN쳛5\\\b]7[vLnݺaӔ\ Z#((DDDeԫWKgT*0!񁫫AaMѲ$yPi`_ !--MN*T=rZFzz:?dA-ٍ `-Z[bذa%""*^| Zj !={r(J8;; Grr2^|Ylݙ_J3Bf͚񦏈JJJTP;::Z: T( TPHJJWݤUTTT# ""MPQFB¹,BQeggCQ,u|_;w.T*ADDDd6* _|>>Cj0rH\|(F-*5k뻛,t.;;Hmll!M'&&֭[u_cʔ)EfXt)BONNFnp=8ԨQ~~~+P*ׯ_k&""2MPݨyo'==ǏGӦMVڵk&̵( ԬYC ŋ`O4 gΜ;oߎTbpwwӧ1ydq]q!++ x!^xbȐ!رcq SljĒ=i*DDDT!ٳBuc5:u]vj7n4YtRܾ} fϞVZʕ+زe `0`ʀj* p|ϟL4o6m77oF͑`K'VvVEzGDDDT) ԩSe"""*r05???ԭ[JMn++Bݴi]6oAPvm!yfٲ/_b޽3fZ޻5f̘ؽ{7d P(ضm:uwwwxxxW^_z^zppp7{=x_toLS(h޼9>ѽ{w,8@%i5sLT*KglT*/_iӦ-*5Lt6 fk+ڰ !cTRޱԬYӤi4B\~иqcrR *U5nJPrekb۶mE;wI6ir&"""ԩS򒦟>}*Ur_|_PiWT kIPx,}wtAsYRRTٝٝf7CGzz: "Utkڵ+֮]FDDDdVVV>}:+LS(*RB@ \zcƌAjj*&Lw0%Sn mHMMNsftnj.V :ku]*anҪE^D&"""*Kx"ZhaJ !RSSh2-5ju!++ 7oưaQBqqq3CrϕWwAq5TM#VZÒ4!oy0K˗/N> 6*֭[˫P[B@ ׮].wYn\ 6<~Z&$$ɓ'd&~W[ """2R[:DDDTxΖF P(a|T\&M²eÇƨ4nB+.]ٳ8p03;8pF3:vhœ&ZmlZݻѷo2-J<- Bŋpww7KmӦMÊ+6*~\\d.Çǒ%K;v`۷oGtt4 .[7|۷oDze0l01Xlo߾:즂TOZ=xY """2ܾ2[[[]Z5_|Q?BbbyꕴLsF6mo]vIwڵ `ԨQhܸq .-.\#F >>#G… … ͱ+IgϲiJmڴa4B'c㢸fX ", ݨ$CbChN4-M`KEW,XbDT@H}g~ + RvY\^c̼g||gKN=w\bǎz;.?RHoѣG7ЫW/_^kێ;b033î]ƍ v킙lقvIO?*aJڵk!"""&I={I۵kaÆ,Yb+RsaժUܹ3LLL`jjΝ;gΜe}}}qe=ͅ#|}}q5RrrrT*ѬY3<|J!$IHLLDf:҉j('$IBqq1LMMZUϡ:/ 4('$rssSH d?/K'?-[X NCECBDDDWVpd7iuyBu&"""cabby: """"V0MZW^an"""2Z$!<<;vdJ"""2Z$!??5b˘V^g%"""24Ipmy:Zd7i?r"""2j Gf hڴ)GuS=i;p&"""2j(_e$IHOOlT/0MZ:""""DDDTr>NZ]pQS(ݻ """+AT* Q`6㏡R ިT*lذ}"""2j$!11eL^`:pGvQS(x!"""mT_gOZ%'':""""3tDDDDzǚT_0MZ͙3(: """"E_}/Qc:q8Q^^^ѳLMMѷo_ (b:=> =ƍ1`(=~xڵ ݻwi? ((Hmff)S`+W"99L> $aСXv-lmm[Fpp0˗&IC@DDDw...H5O+ڶm /n7774o޼^^^rڵke֫^^^֭[ӦMrss޽{ ̝;L[kkk|;wIwߡk׮P*h֬|||p}y̜9Z/ݤH/5Qxbybi1[Tŕ!#F_QOմiS@qqԩSkmkaa}(PwkkkKkAbccq޽rc7nN۷oejك>}ÇDݱf111Xd FUL M-ٳ ( |*C-q%44uڇqttvۊDEE!22ЪU+6%''Ν;wwwuIIIHJJҺ4www:twx]{˝~޽ۗ&88EEEغu+>C!$$#GDBB͛h8;;@nn.V^/8|p {%""ۈ>(,,oooy /WWWPe˖-:<+`…(,,>uG;99Gӫ\ǻXv-ƍ @+Vٳ>ġCQr9@k=rcݤUk4K/Q]'INO8W6//ZS尌 iu1(BDDDKP`꺿߾[TnI}A`ccSYz5qEl۶ZTv O<׬Y?Zm=z///_o1zyvvvGRR1x`ۅ:t(jͻjkOd7i5~Qe۷cرODDDkbJ&ŵ$ )))hڴ'n֬N ,\UxeU]LL SѣZ't|vڅÇcZ9w o LzEݻL#G(]vU>/b*cDGGk,G)^v G:GQ]Sш嚚5k[V}tt\_ /// Ǐ]ڎ3p \v 6 331bƺvڡs+Vi 6|}}G&&I-[X N777C hԨqu̟?;v$I077G޽qF/011)7_8y$yyypqq)SpMxzzAmz@T^k:$IE-XʄȈ[-I`ff>ժ~yIΆeY?T{OnE`^zzC LvV6l """ >cyȨ f͚qT7 LvVoG9QEϟg$IDuݤ'$""Q}P\\ljСCz"""2~  """+A8 f3IѣG^"""2j(d$IHIIa&n߾͉ Ȩ ^{}"""2zV iuÏ pww7tDDDDz% Qnj޼yPTHoT*-[>5I2&T/0MZ}לBi!"""׬Y3C@T+س'x yyyH8!7LvVF!5Qk.y襦:Zd7ivZ: """"111~>5AA  1MZu֍Ȩ˗/CDDDFM$pJ&Zha...!]aaC }A"""2^ ކHA@ƍ Q`6H/5QgyȨIT1znÇ hժCs*>}vSNEhh(lmm\"((x"Mmxx8&N"9qqqHOOG\\|||PXX???ܻwOOgm&6mڄ'O ::ZcIOO7thDDDD:P(0aNMDDDFajj}"88fffE۷o1[n>|\d۶mÝ;wʴ?> ѩS'رGGGܹ:uBAAϟ_{'edس'-[j,HgX\]]Ѷm[xFvWǎ; Iڴi#FYM6$ ;wXfϞ SSҦ={6`XpB~vލ}M4!C4gffbpss9'@V&&Ox@(شif͚CCDDDuTlv?ff#0f 34hVrE݆ IDATy&99n_Q5kN< 4hA `xN8.$$r{mԯ $$C Ѻ%K5BFF>gĉhݺ5۷o("!!ׯ˗qU:eLvVlٲO`@DDDTW "":n/i&tk>؋WVyݭ S&6G>8Rm'7~"QQQjJ/З'NW_ǏѨQ#iOƀ$IWNݻw͚5Cbb"޽5} ?:u*,,,pm ""f͂ q9غu+>c\z7n] ˘V:uDDDDu$IqO.^x"mVI*u'OTk֬~XQz^Aо}{\rQk߾:t<{ ɰ+Dj&f̘Je0FRa6mH'Z([Ԩ5K67h$!11͚5͚5ԩS ffO% ^m+#//Z* ddνp9rGP2di}A PXX#G`̘1mذ!S8tڽ{7GvQSOP>NPYYf غukGGGUX/[c|w}L? 22{->((묭1tPAP2^y5bٓVنHH/Q]ϛ(KoߎCrrzvv6~GHMM%.\XF 裏,'ރ1ydq^EРAa̘1y ;v,аaC,ZHg_?0MZ͘1h& """FE[}"""2z:2w\bǎz=VMT*a᰷`cc___}|ѣ KKKXXXiiiի֯_mǎyfa׮]prrBƍ]v [lAvy^ݏ?}NJJAoҥ]IDDDF}5j>ժ~yILE7 ʣO^ٳgѣGܽ{שS'^{"""2j$͛5tDBon"A# G:sz}דB/ѣGѤIl1˖-PϞ=3tDDDDz`! cĥKE9ƍBCDϙ7oDQ4tDDDDz#"/_>C@T+ f֭q% 4H~mΝׯG- """̟?}"""2j ɉTR`_1}tH~hh(uhCVꫜ$I>-XeLȨыQ7x 򒟟g(b̙Q%Zj,_ ,RS"44 Bnn.rss[[[\xӦM6<<'NDQQF8#..>>>(,,ݻc$IRu5E*J+kWWJ+,, #F@LLL̘1k֬doܸ_8}t@Tiii~̅$ * &&&,eBDDddDQDDDͭ^Q:oW>/EGGm۶(**¼ytҚw{ snBN Iك_c={Ap-kN:ʕ+05Fqq1u7n?NmU@(P'־Gؠ_~h޼y!CȉI&ȑ# 7|VZ֭[y&ZlӧH _WWWm^ݥUcH6m`ĈeֿhӦ $IΝ;5eddٳgk$g߿YYY:;6GnHLL sssXxɩS0d={jT{„ 600 E0`@M&M=v6m@ UٳXvF}ݻ={Ddd$V\1cã~\]]+<*Zoo8$I8v>#&""r>5t-633vvv:p4ɓ' ăp u!!!r2yРAZ~!!!2dN]ZLL ƌ8X[[޽{ Kk!&M`ݺuZҪZ͛7ϯZm*++ 999''rSʒ;$UOLLԘT~ޡCФI :u 'O_|'/wqq?-["66.\@߾}+<CaJ*w;A͛7#;;׮]C>}j!(s"""U~~C """һhp\w)))r.].]Tk=?T-,,ݮ, _Զ5kzɉ  JʬwqqA6m۷o3mԅJ%^y Сݻw|ѣDDDDFMP[/XϞ=+󺅅ۇ~rJMB*6 4k @6mhHKK[|5dw5%ߦf?~  CϞ=m GG]vR;<<(ʳT*(011$*n+I$IU׶x۪U.e&<;}&駟 AxMwR_Γ= #׭k .(hɓ'(,,k EFFb֭JfUٲe =zIxbT*`ƍsرc;v ""@ɣ:yyy÷~ t:cժUDRR֭[Dpp0`߾} ])))Ȁ?֭[سg|2`Æ Gnn./_d2dGEHH`ƍx1xbÇIdO:SN(XÇŋ?IHH= عs<ˑxlذpe`ɒ%(((@ll,;ŋow#rJt w#G;QTT"%t@ZZxT*T*<1//Oyddd.IMMK~CE!)) #ǜ<%IJb$&&м&5ILLDqq1T*^E[l#QF!..@IT@ff3JNNFaa!$IQ %%@IK3KIIsX$ HNNPR#335IHH5)ޫUtM;߉:Ѭ'??2D}}%Ii5qqqD}xD5)kV󐛛+g5Q /}MWI&&nQ) Ack3g(MյmG`5999eq7ׄׄ|yMxMׄׄ|$c7WMX mKVٶv {M8q"5Fvٳghݺ5rrr"CɓrAE֬Y#G<}c??Ng1qD **J `^kQq}H777ZwD^^!"5FW˘TS;0)=E?̇㑆?^mmkWm5/kRIv&zxM5)ێפl;^{&eg¬[ٹ6R؁ pttuжү^S0fU)ޤ$+#//Zפy^^^r 9R'uq}A(,,ѣG1f̘26l}X_ޱKPޱ+{M*JǠ^^g/ބjYҳV쉡ZJ( `z>̚5 fffK9UEtt<ʷO^"##w2냂 A뫱Z_|qq\Zjذae59v}ž}55lP2Z2ZZƍ 䉈tEۤ1c(kt]纨 @uu}<<<0zhG}`9ɓ'ƍww2-Z  ,, cƌk]'$$`ر CÆ h"`8YYYxq۪';5.]2dDQDppp$"""ϙ;w.AÇZ^^ԉzkmߢGHKK7,--aaaoooW^dر#6o 333ڵ NNNhܸ1k.a˖-h׮Ώ]_0]bٓ$Iq]t{l5q ' IDATFxxxe˖K@@C#""" L6Lo""""c"5kVne]h׮<%K:ДJ%Ν;UVs011):w 9s‰}}}qe=ͅ#|}}q5JoǮi?UV6:: QFU+T+QZwޕGi .\кݑ#GS?CO ZrrrT*ѭ[7lڴ JRc-lmm K.gϞMDDddDQDDDͭ^^$R oUsK%V'qoZ0N`W&_0#::RKT?:t7ۇ/OMjj*f̘dy"*sppK1&Qu:""""utFnJtWen_U<@HHkgɿ+J|e$''cƌ~:F ܸq˖-ãGN۩S'=n(ODDDDDDDdH 1A%?է~G!::ZcIOO7thDDDD:Rb T*CBDDD7$!!!ALvV| <<<вeK% СBԩS9ҋC 5M gΜ)g%"""cRPP`􎣺0jܸqӟWWWn"""2(bΝEСUjjC 5.c)8A%8A%b1  5E0]vQNDDDdDQDXX:wђ$ <!W/I2?OHf?͛7ǜ9spm\zӧOpB7F>}yJT8}4Ѽys4j:u*~lcW2&/;wb֭v2'M4/Ə.]3x '%"""%I222`ccúDDDFeL IT*LLLC`` 4q 1cNև;v`ر rW^o:hG||<|MΞ= 3gjWW&M±cǐ4dee!00vvvx1}]i݇}w} b޽XhֶG3f@jj*222YYY1bRRRt~B#EG֭[o>#h`BDDDDDDDdH٭ݞ8}th۶-0o<,]ؠyZןòe`jj sssԩSx뭷piSZIv 00wFVV?܂ 7Ą SP%۷+ pH Fi0N+/q{ڮrkA4&ԥ(DFF(8KNNƝ;w܂IIIHJJҺ4www:twx]{˝@~޽+'kzҦL>}`ݺuhժ2331w\|7Xf j*`ʔ)۷ト̜9.]*wdwTTn݊m۶!** 4·j Ǐꪯ0Jn""""c "G@O0ZruuELLLn޼~~~j… QXX+++|埝݇z]K^Q[sss"==]}M]ZӦM?{wE}W!Y2"e@EpwTTp@meaWPA@DETTEQDQ"I% Ⱦ$$I?$IWWR\W]4ݵtéέsJ*4_hӦMz衇裏B۴mVSLQ׮]k۶mjҤ ᦰ;hƌZdI"wڵu7袋yhYff5kXCpiv._ o-zE|3F:t(Ӿׯ2m,Ӌ/(IzT~"gggsk-~qQfff{ 2$T.ԣGmڴIUV;wNziZ|RRR4dȐA{=FvO ysUM6>}nVoma;FlܸQ\rݫN:飏>:`{eر,|5Omnn233m_cIXzv[͛/WTTf͚Yfcג~:l©9x!8N:n*ZuQjխV G3<?P}^2MRyh۶me:ĉէO2meC;wG}'mk޽Znz]z֭$nݺ߰al.qEᶿݾMPɓ'kwEP쎼R^8Umkĉ_*@T@7aEgϞ"Li;SO?F[o䇿g޽%?e.==]=zЯ$-XFCsŋ%I\rIm%СCԥKbgFUVa;6&N,pO<EEE顇"fY6lXbpUJi̙>--ux۷oW=>[_|Ni۾}J.\+V{}:tbbbtyUVj߾c++++4[o-*ϱ\#v:s< 6s!eQ^^WHӸqcWӧOט1cԿEGDXٳG^zl٢3ċ1c6oެYfww$K駟$+|w^xz=;k׮ڴiu릚5k@G$/#/27NÆ ĉ5i$Ɔ΋buyL=ڶmҊ,3Tv@@+qr ,Ks~Vt5H:7 :v8~~,޽ˁJGÆ j*=#jӦ1Qt颩S;iC/Ե^Yf;fuۖ~`8999Uflםvi;wn+t*3T111n8?/QNePu0eYbccNj;wTjjթSGqqqj֬5jt(@8AM:U }oC]۷O 1煽믿Ӈ~իWf= SN۷ZEG3ؼ"?&Lv իϫ]!~4h(99Y2Ɯtٵk>CtMjܸ^}prعs!8aÆn*Ua)v/ZHm۶ CBeY~p={;T=p2ze۶a8ƶm3xޮ]_.Z]v BEu*))Ik֡Cc,{ׯRSS|r%''kŊe)))I .TBBByC)VZl&m%Ig}6msd>9990`9"XП|߯d}GJNN駟u2^7|>}詧˵a74;%%E})Ox(:KPci&riU~&˲Ԯ];-_\{.q^zWeC=7^?kܹV1ZhfΜYQF_|1_ӌ1Zx19lC"\wy'xʔ)a'RfM+#G_.W_]dgyunVuQڼysyDom[ .$,Rtt$)//heѡC Wً]vɲ,5k֬T5kLmݺtMǫV*s(+--Ȓvh+66VA0c222$g1˳qՕRmW~0<:Z =޹sgD-^Xm۶-#4rf@@\raԩSG֯uzlaVV-c(qm+///ٓ}#\ *33S?rrrTf&''Gk֬eY:NoBnnnyDz]{\\Kmۚ1cu5jPF}veggzƣGںԨQ#ըQ#b+Y~EiÆ رc6ƍS~~,\p8z|8l25ow',_dMxXڵUJ|Gp */ژp%ٍ׏6&loA<~B%Zb,r; XۓO#灟T6&=z=,K .t1 HlE)99Y-ҢEǗz!ApL0Os=)S sM71q4۶oO#灟޳eYWO,0cY>lri<ۘ6OHHP@6&T 2D`0 5~xri}a_jL`YIw} n`0g}x9ı[p.m޼@ ԯ__[l ]Mcݫ˲,p9* =x\r֮]|P@ұ*|Cp\jq<%z?~{k.tU+J]w,l/L<~6& SOSnn$)!!6&Tp%])vСC$IQQQjܸ[ O֭[.vR)..Υkתm۶m<E}"uUfԬY3 eYJJJRbbbgu;40h<~nT<_AYnbbbnVGvꪫԤI5o޼Bxm㏙ x9b7J~Cp\||!8~A4hcs= n`0_|x9b7J4w\Zri<r(##Wn]Cp9b7J2K/4۶OO#灟0A%`JpLVueO<y'Q ./Ai-_x9đ6&|r%&&pmLDZmcrAeff~+. ٶ>x9đbwBB,gyyynիy7n,c:_Z ֭94r#gy޽%I)))qpw-l֔)SyO)v0@UTё#G4qD'},0cYzI<~He˖=z1zG5{l'nƍy5׿zJW^{>ceff:uHùxm=z494re1i-Bwޭ"J)66[͛7;D@NNjժ%˲t!ժUa1Feq[/,rTuIIV͚5Kp%IiiiE>< 4»KLLt;ǥE< ژ^5:~O>"{cL<~HaN, @iT6&+?L\<Ͷm-ZHݻw?d*#r g8Jv>r#mLPy@.nh\f۶ON<~HlڴI_~V\{2h…=G/!w|7,0cY.Bri<ۘZJÆ _|Qyc,R0,MΝl2Y~Aڵs2DO5o}!z믿nA3gΔ$K:tЪUtwkѣGOyx9đb'|"X',>|k˖-O?y饗TH]wE<~H_~eYjӦ6lX}Ņ:t(\dee)99Y&L-ܢ? ,Ke'|R:uRBBjԨD_KcҤI袋<Ͷm-Yx9$ډ8p@tiyG =vS׮]zkʕ땞^4_5qĈO0m4-X@M6w}:@Ġ ~:uH3}z饗ԢE IFW6,w 8Po~edd諯g]<ڳg$ԩSuecǎ;|rlRSO,q?͛7P9 򋮾jiڴiڵk~[o[ٶ7|x9đ6&ݻwך5k9s_~~zw$I5jPN?r㧟~/Iܹ\lxM4I{m;v|by晪^)~'|mǎիۧ &իWG @$Y;x9đb7ި'J =z38mt7+??_enP*U ]vej֬G)77W5j(… SFFz4 :T<@~zNe<Gژ\xᅺ+eў={tꫯ{]xo%I>|!ŢEB{q, +V8Onnj]Vرc˼ ab 3f 94r##%W^QN믿j֭KK.DL7j…ZzcGZgyƑ~n:IRZԴiӓۺu뢋. k,GM7ݤoFW]u^}r7n>RM^n:ٶ+ C۶P@ cd [SSnv'[7?gexOs==;߽c,˲B?#{I =#˲dT {'TVMڰaC-X T6(%%E'NƍCȻK&LիC?eY9r+|޽[~uϤIKV_~ŖSÇK233uI޽{eѣG!I:|%Is ]?~g ~A͓$Zj$iĉ:p2223H֬Y{OGi咤_|QwVNN|II. ̞=[4SLѶmt=ZqF͜9SұP GO>][l1FFR0TzzN*IZx>sIҬY?Kƌ\رC/$iҥO$Io֮]+I0a:{jҤI+W?$͝;W+Wtlz%I?}]Ie˖I&O;w7n$iÆ ,В%K$ISN֭[UPPQFI6oެ3fHН3f͛%IFRAAnzO,Y H|MmذAұ%Ν;5ydIҲeB駟~=sdܹ?0L4I{աC4aIڵkoK>-]T/kǎ՘1c$I?f͚%Iϵx{`0QF-[h钎Q8i̙3qFIѣum۶MSL$}?$iZ~$'TNNvޭ_|Q|r}G{Ok֬$=3ЁB-VZ#`޼y$I/٣,?^ұ Os̑$}$}v'tl27xC_믿$M6Mm[FmJMMմi$I_ Io_~EO(??_۷o+"I駟J;#XǏWvv6lw|G!<#wɓ;b*cʵqa=zWooӦz)ɰJԽ{w%''KRSSռyo߾$ӟB'|駺+$I}eȑzGwuVZȗ_~K.D4h : ݒ|R@i.Xߊ=QFqa=q$pرc ٶ˗ .4r gxƆgee=mEu駻vv#_P.jժNt9~RSmj@ kx9$gy0TjjVZKjڷo_$IFvoݺ΀*k"Kffۡmzwh<~b޽{5~xuY:묳tK.j۶4hMo߾#RXt-/}h :̎tݺu&ӌS\\٪Yf<]}>|rss%]1F˖-SNǩ¢uֺ$I}b8p@tGҰa"cY_Rƍռy" n`PO=ۡ8~[nEs̑eY2(&&F_.r%%%^zVe-[Lg֏?ڦjժZl##7mڤ%Kynر%IǏWBBBZjn(Tu1w|[TN^ZcǎՖ-[$I>zꩰ,Txnݺںukj cur[/,rTH{ݻwh}W_gΞ=[wyeQΝ7߄;DM>]~)߬Y3?믿^۶m;s RxR+==b7,c8 9* dڴiW]u>S*tK7߬+**Jұ'' ?_)));v:vxUVM͚5S߾}h" e <Ͷm͘1x9đ͛7֭[&Mz4m4YSj%`JVaGv޽[eM6e*tKҕW^YdO?]mڴQbbbgu;40hʕ;:@eF?vbڵkW Km֭P ;vѣfT7 cl٢vUvsA?qݢE ܹ6=3Ja޼yz7t@et 7y'1ӧ$iZfMoKׯݻ+4뮻 ٶsO#灟8R߿%I RVVV뭷4ob921F۷oWFdY8E8FvG;(xÑ#GR줢𒄄Cp96&(СCդI5o޼Bxm?~lv;ǐOhc"@1A%?A\^f?L<~B%ԩ_ӌ1yOhc"hc hcٓ ٶ O#灟PF qUVu;Ǒ/ƤEY͛7v|/ H G]2OKKeY2ȲT :vmJMM `RTc۶M*GM<2bwY`0A8eff{}Ĉ9rd3cRSS` Y<,\]cǎ7n\ywsJ˗GX~wA; Yfn8rE֭[8b9c!2F&Mvn۶5j( >\QQQnr zP{>NN<~R܍~݈ no~v#_| IjРA؂=#F]w%\ i}8p 5"灟X&YO4QYJԽ{wٶvm[-"F?؍URwCp96&(6&"6&p_Wnof۶fΜI<~ٶTeff*̀]:JtRffY?O#灟8Ƥ̙3tRzeѣD@U6&۶mS5h %''+//OƘ2-!Ch˖-JKK+dff@XA= nr##u*==H:**J񊉉)RSS"N JTTT_#Fȑ##@cjժq[/,rTH &(---ׯnRD5h ! IDAT@ ,(vRŹ@۷O5r; G/ic3F3gTΝ)tW"^{4i͛Y(vm[}lv;ǐOicRvmegg~ڵkHT"LP *GeYjӦ J /4۶7ߐO#灟8Rn֬$)??߉#hW 33Gpɽޫɓ'+66VWw%BVaۘ >^顫)^cсmyPYcd#@ Pc)+OSxRխ[W[n < խ["AeQۘc,%=w* 1h ff۶MF<~o={º?Tp%Dq ڵkziYFw"灟8[˖-)vO3hƍ<y'1AEV'Dv50q4۶O#灟PFvv;q< ژژ4WۘhB-Z˺R0`Zh3<3b+ c&MD<~RbwZZ#bJKKSZZZĎW yO8QlCp\m^F؍ mΝ #Fp{ 4۶㏓O#灟m˗g… o߾M6Ս7ި!C~Ŷ[p +WJRh41F5СC5xpSP>::Z^cQ0TTTw"AeQa&>|:u9sh޽2ƄtM0Am۶Cdee_~˴r"#6mɓ'k]ҸqcCpܯv#_=qD=bo}Ϟ=kt޽[ӟ[o)ruY6m6mڤ;SUV-ox(={Jx1F994rIژdddq˓tsꢋ.Rݺu~-^X֭;v0Ұaôd-^8Ԯ䬳ȑ#u7+p8NQ8nG]2<̚5K,K5j̙3u[o8p3(??_TJ=zUPf]veimkźp<~RbW_}zDݻw/OpHqw(x9\mLZl͛7F:pUvu}=hҤIe=4Bz}ɲ,i椅nHᤤ$,K~{y vm1f۶f͚}rK/ѠKP=>j"m󿏏FG{} Fmddd:961mT.I%,KdR:6XI,ַ,UT%*言;>Nkf{U$pq!@ @ qIHB#w%wG0=$GOrv;۲\ef~JܴVV{?ygg>ZVy,sE1gY3놶qXU\6 d.6s"9IBfվ`pyΜ9c9g}Lt7B!ƍ(|r#ҚN4KjDdzȲF,6C%u{g>':PZGG}ȂUUp,8]v ^Ê73yV|N+ӆaqXVTU4r#f1u]7rfyUhho1l۶M>B1)… 'B1aRxP"M8&Hxȶ}Lɴܭ;եuP ~<| FNJN^f[;&3/pq,98G$c vkAӴB!ĸ4UV E !r0 IXjp?r<=no@ dK/ \JNNANNwrNAێ*2& 93ɘTUEQs=7b ._|EQ$:I w\tvvB!n r6!~bI`4I07:<`wuyZBPQsRwPwRx?GL>@X,FcccV455mz}#efB1A\.DwC123h&& D)`P;I .SRDFS)wٮcԷ7 ^*Ie|.)r#fzp0 jkkj( tnjSMwVctuui\tE?(}]r%躜 !buz~rKSH,NIIMLU͂êZ[UV`(XU[fn>VZ.3 `QŌ (dj&u`an{ yd憁n˺n RNZI ҺNZ3Hj:iMݜ>,S9L 1f<(^SU2 ~W z쒱|r#f1aIV+%KPUUE4eݺutuu1{l}]fϞ}}v!B!V2$$ ' ݙ@$I4)ʢ*m\v n݊{`6|'첩ff!mWZDš8w<OkĒiXR#1d]$Id Jj3iFZ6B7Յ .rSSfV[J1EL2&+C\]dW^a8ux~塇j_˗/n!BLkpi%X\1 hpY=İuO8Iw8A\͆a5'9e|l`{H0nnQ% vPUnU;m9ݷR`P<<|o|o4i>GMKM KN]G~T*\=[mIуIMyL2?W9}nuNUVod)y"B1USaD]Đ)Nw8i.$Hi4fﲒ N~ fwÃV菓HOMüL{~J}+ߴdR1[* .y_WB!5]yGW"i0 ‰4!3ٿ7"n;nn;C-\6=-,BA|mg O'`Olk7pEU-rst|,(qt"Ϥs1`w(bݺu]kS__?XW||ID"b osgO.Xn~gزepB!Ĵ( /s1{D(ϘA-2Tz}wڦUi!EQ8AxJ/NK0Fk ykov4`gW]>nQ[Ǭׄk9Ifl? 6t׭[ǥ^JCCA۬\;|ˊ+xᇩRD!B#/2${hzߠvd 3""b9/)ά+)8buH(=z44'VU9 ?+Un k!%eL`h?//?m۶~goϞ=\ptvvpWr嗓ٵkwu.n)?{ǿ˿pDzzj>M'B!4Mn韰XnN/fޢ/s~&NLr">Na3A".eC,u-Ȃ*,xJ9'Jc` /wƥr#f}wRRRI'Q}s@_y'rav;v@UU֯_ҥKϾ#)++:0{n=Xرcvm~ZZZ!BL7aߏP1*FG_~lG<Ԏo;C 4}}:{탁LǙc܄c+®̼;LGb5Ҫ|Y,{B2?m۶@ tr]wq:7x#ӟk7oMMxY:ko|QoTGr2=UW]uvw5554443p\ڼO @wwwVo]?=!B)?+W-3a#iTV$m43/']uwJk!9m,YK5==Q:BloQaN{zva0;:<0K,,tVU=r#f[@9k@CCm{WrosYb̝;vvVB!SY(/Nko^HKork_dzz$uVN{e~GfiBxJcWW{;B4bG>eXS5,o 1۲e ^nŋ.9vDQ.bTu===|{ߣ˗2=䤓Nlٲ]QEQ4mcXUUa1vyv?mw9k2S~Nk"|F~f&tO>?EQ5I.ΔnҖ֟7F[ox 0PP0zew``f@>mI(EP ՅPOO s=|o[Z[[bZ ۷?_~~{5ihh@4z `׮]<wqgy'xO>_Awqׯ#駟fڵ7P(-?7puuuW^᭷c_޽zW^y?p 7H$hiiw>?< !1>#nVغu|FLψO?JGU7Skwssk;?׼uvsOh}qu;Xx-ݬtntef8%W\K3œ IDATfO5j_b%ujs{$k3Kf=/:R` :R6Y[9:ϋsʜBZw>[͏?[?.γy¦m˗l|ˏ/25y"769Qr!S32KTg|>ߌr$WJ5D>#w/&Mc4ôh Fhڗ7J[!3ɎMgvV\9wSЮ,43g^5k2r[EQhF^65T.:lVN)s 9un1['k2S~X,o%12&snjj^bՇy8sַ96Ky|%!Bq:WK.<c-1d~~7WPR:;;ijjA)r]}hB!Ȗiy?bޙFkoloa1bSa|;V*=J= .iRA d9sG>Hоt =3g,_`U#kOc.ބOXQI]o\:d[^5}}@zP2s+XCYb;$4BSNj 90M Aw+&Kucpw)s 9}~1_Ģr?\@@΂o6vzmVbǎ& d^{5B b p1Ƀ>ȷj瓟?AB!UU+E`@`@`@Pb䝌nxV$SI$$N%$kI!紩渗؎Cp(6X4#P$bN[,۞YP;{ǧ.ݶO9@h>|őX`u3mܱϺ!}B ( 5Ej<\z,BVi>nIXJͺ.ެcg"N_gS]4K)g[ng}ロ̞mRwA^^v[7)y晼k973 _3%nD",Yd^{-]wݑB!8ZFI0 'h EQ(mq9L;ˋ)f8L fv%/ul, *]IeYfd`]ۆƜLYdQw?j? W܅=7[M?X 8.4ws|e66N(_bB9m8vtͭ|5ݡ?$_6P]̣K܂+.wZEEW_ͿۿD"7HYYY7)\ve\{w;h^bϞ=\tE*W_\B1]{~M2&}Mh&=<;9%O|%L )j G OGG$Nr/R|K.8gȔBJ\DeN;P %avuW5r{σhX]`s5dmmm2<bZzcXX6;etmf<M(4`< .R'MN\??0 |A.]ʕ+syIa\r%^_|& 쪪ӟt"z.VZ_!Bb/dY|#0Uƒ0)PB)Q!OgV-˒*,ad=* !؝_ |+@wxlВλ=[ m"9?_89 vwgO~w}bS__;3l]{{?Nqqce]~nvyYr%ׯk_yyylذo]v栏˖-(.]qtB!0ظq#K.ٹjo4IcG&z; r{¯w/c yˆz`*6`8)2~=C ^`5`־ϺIj,B{Z֎ Mo|`3߇όXܗ7bGU.qt+buaޭn> 8|#5aQN.%EICS˘=/Z^x0w;kwwc9;|<}x0=gy.R-2! .`B!50ؾ};{_Qt:j!B4B%҅=ރ'e~ IpagiK4`(f&,HaRqbo|U.feU.f*puX`w݈Tl6`:05b^5T`Kfx`~e9h}v܏acm>{3~pxwg͹s`'bZ;s}(‚r }\yR^ޭn7Iii=f[^NUe6U.fãchz?H+]dd w"EZI)Җ)5N89ˊe|?&<[7:n`q"CٿmH]Lm3~ DWgkg]Xkf6˛?u]0쑏۽>/3譥K'}?ɢGLQ灑ߧZ mfv:ziٿ}~v^q-N"9/4/@9 BD4f|֟}{VU9J9{a)E^wE\rLo|<9~7ٳgP[[gq='o?[ne 6 ??_B!g:,hd4MΒ<%XKKQ KPLUis7&(rQ,UDT~YYL׆ #?/ [6YGK<ڐmK6}>c wdZ<3mu>\p3ݑ۽1O UBpe ,]_$#Ju}Y.'nśu]Drsg9gQ..A. vHSS-nʬYrB; hiio^u]w;&BN?AXW'b~bQICY V}2H(DD/t?.K -p-q{ݴt!bƿ:WS}Έ%CzVbBL4]3vm YF$7KfyDOY?d93YYc$ח_9ǍV@]vTV6qqed4d>ub]Yf rʸ`Kk?ouf]{܄!g8ga-.9X-79a&.婧0 .b/c0b }Smٲ{ dv !b<"qwmMm$ҤV<"4HF,TjIx7xCٳ][{M Z%%egEUJ*_ssqYd\ !0T,K\0٫!1 a1XάU?;Ap?_3,yPa3+Gn׺7 lꋥxwHw{n-p2_RgI*3/Ob ."VXO>K/y睗ÉqYf'+B!Qzwз^})"1xFBq:X!Q&:[:%:E9[D=D=iwt xA>((s_[~c A̡3Ɇ k%-X)9 fb/jv.?T@|`9bǓQ39q0]xE9m[7RU|)6Ӟis=?\6.< 0 :¼׷wўਲ਼}c7[8ka)/)s J́Ōd2ɒ%Kعs'jn|r:(6oތ&W'+(W[!bt2E_}ML3L_'6h<$d`YX^)c2z WOo]o!jbcqq_G"`n\gn9wʝBLy=;!Nɡu$`.r3 ueà ț ypXLyaFEEŤsMF]'ncާݪrQ|r>E&UfM7D}}=^z`SO.'ছnk!8+B!2tM'E`{ } ]&D!9[Cjbe|PQd5:V=Ha%XEI  sEjU8\V (jf(9) ( nfMCܹZu#@Oh)ԈiFAU4TtC% c 6"*"*:KO\0ֶfQXrQG1>lpضkNfQW1yeS` ,5y&n?-ɮ]d Z@N|_L*yyYޱ0A6.^V˪Hi:kyekn`OOtTLu^+[; )%圿R3?,rޱcVUVn੧>W X"Bi'-!$H9H^tu<\eJ60+P ⊎#8\v>y|EE>|y~|y8}}N6ˤ͌20HttfH$biqs]"&NѿX(I"񴅤a ~O<Mo47G7|ŪRh.#`2]߳7k6|_f(Zs9Ƭ!>gNsw//Z$[6yE,W5_\ήnխm0j'nuOo9E|qi,);1)tʝ;w2oށjluN =I ?݊P:-0Cmbsm;`alݺEM, b@}}6K[0pbhxCM${|m~A.{:İu>ϗ|,ٻB6䇪C>_#۞q\fYy|7A'x{G7/ln畭7`U>;/. s˸Gڤ-c=={'?_B!&w vD Gm{Nҝ:i5BMq#EXSU6+6w~W;j%JmF1 Mu,EV7]70Xn .V_&*v~;e~lv]7&!H1HowH|| B_K_KsQu^X@]Zg~Bi}f !DN|9snfp ~yf9ϰ5bh@Go[pοmbڞ8m]\ƹHi: –6^AW(qKouf]jĊJ{L~  r ^{-]wݑB1C"lk%lx G3(}QtmrYQ DQXT[˙4f/*D}9 *lQй+پٜVqU)姐i!$= S* zWyg7P 3-4% 4gh|&ֶ/lnMmUtVp*N-_rLʘqL&XB!XAC'7=lN IDATw]I-JoH! X!)lލBk^{K64J9[r2A +cs-0ĜWY&-=]#pmTU@Q4M'cO?{O-B.xR ]`0{Zl攗74s5(89v)DSCAؒcy& t(*\mFm6@*ˮ]^hМyEPv ͞AzΣ( +,sG=_6VD{4YDe/-eU,V'  B1SA]n}[3ZF_H!dH[\=RAAT Ae;s>@(((c^FQNypAV9EL0 l)0+#*O}w?;h i9=#{#]ۉg;l\˖Xw 'oB1D{2`{>-v&Ff([b `Kk?nl/Z\dAeUTOHʘxS]uUr-.BH=H4@scZf ŪĖB1pY;y$sfPۢV8Xa%xwaojƽ˷-,ɰn ^Zw 9ۿ-JS[-?9g? #;*P쓧F󌎦|Zx~S;Dz'D=~XRx}097ꫥBi)Fi ojP&-ً%J;{ng3F(J sbs~` {vq~M4zWuwgs UDZ)XCyZ ]~hYj<f sK<8m3asN͛'CJ4la.6wN>˖ Q!mv͆(dž \ǭgj0>!й:6Cs{ۜS8g#k* +?#s ֶp^J.?y.s"nsog?~5%[!dNjDj Iu($,e#-•l%c7s7RC-AV/69m]2c~"76)]y׿*YU"KFvdϦRc׷w(\jUVwٗɿR~?ܷ㲺x+oඍ\ =s^yxlWI! ÀL{3=+)_9{GnૄYwif pۡcu!\o'pɳ 7HH[\.TB!D.#)Bt5ˑ#OUO፷5Q6PMo77I=gݘ}uFA=ӦrT>.3zwHBL Fv`'h}0ْTKe;8hhv㝃mPn=֬{ǿeusK8$TEBS] }*G@114nHUՓYRY<-g~O񧫁7gիfB!,0o~HT\.BgE=@MW9ʲ2n6vY+ئW͘6:}5-œb },(qt>fHP{B믿Yg%YNb̒4;wQQ %]P&}(%gR wWrn͹Yg/ӞOTr+{Bq`߆ v .Ϙv!<?/xf6_.8[+|\|\y;.τUU+ 6I[!đ` ~w#XI%mΆε$Gx]ܻīZh22ALp{Qơkc*pL`{AYSaړ|%LFOKdTnzΏQ &K_"ką{}s7щ?UBC`mOu=ndh8rfvy 8,{r39f־ᰪ\xl?2IvQMu=K/IeB~/'oasNla7`Vӊ6 * ݪ;\tYLvUdn/"mĔm%r?/QN;57Yy)a){ջ_! 9ڡpx} fxoTy5ljcv>")obsp-&a@0u\8oL谮dW^ɺur~[`6lduTƍ]7Bѓr~iQg%X@RN`\ Rئ:1t =:gX/iFnn.cǎg1jZ8U)wU[Bwqe<!='?I'Zk{b<>͵d+>LܯB @k7=PF%}\G[5 Rбӌbgwv} ǵxiU8SEsN!ݪ'E Bekwr|g9Khj׹zH208U';vQG|Y%:t|yӗyUߧSe-\p^yE!@k Dyli:v2A0_ g1$lNG+yo1rjt /Ӣ}nc-æC:o~_FaB!g2+>;ϋg(Fi(nr7w#oc6OrTIhEb0)̝'M&%b>ƐGW_v,={>1x",@>tBJqBšmPͧ?`MgvXa3   QcAJΏ'5.x~K[\MuEvS*BxũRS®UӘՄ>(s{%'01Q8&RJdсL "9:с9ΉCUUmƅ^^/J֮ /ZJ7?Iw\srrYs?o&!_ϗE_rw$%yN!GqBY:m*귊e9/^`oa_1:?ESQ` d0 5 5J)ݑ؎brTGŶ!DUU6nW\!n1(ʉ]ۿwP8B\x&34>u5O1#gyN!5ڻ3 MDM ` py_V5{O+S'~}M2';cqCdp9ic"C4k"V+v̶"t|sA6au 1ʷz N")*?cBNqVu7tNcE̹f ~ߠxwnx)Je%R-ÅL}Hr6‹wh8&,ċ4UV§G*x{W! }^WL7&ĭK"ªUضm444F_t3DqΛ;Tv !)N݇8 mXsoFA 2ID6 J1VrXKP@{fcc{Rd?&+ʻm&bsYL">`2i^:}WMQ}uo7?a[B1ܾٿ<4MN&M.xEo,dUz)O~h|̮w|Mt(J狁鼩سgO &5(vcTV9i,(?VW0U* U`ņ[moQL b|M$))IsTTtN@.u"ԿD"XN}}|]F+_Bk9qu^Adϲe\Iv.ic"hQTQCi`Ura7`pb*K0ΐ3H"9&c0Jb[!vv}G> p^9׽&N$7o>]/Ȳ-rBsU]>|O(d,,~aFU56l9QzWObcHtxl>Gӡios759wW(zyS7G%00pCBaA4*s[Yhԅ^ 7Fl8u듍o@^ٯNਖx9FD1%曪P?z#(x^0_`&t}H˫^ewn^UΏ>Os5QVży}/|S'>P~$R\bh9Y^ŠV5u\/\b_&#""d2QXXHddnySEEEq Iv !)r*j4 n6)-Ddi>A1*#pP!u,,VC̤u!HGxBB4ˉ1"8 y淁g;>"l;:=u*O=Orr=V{?/9itByԚ9:'6}hUvjs`•XG8MؖSÊl:^E3Fn'0:o]><6dڵ՗nyS=Wzl !0M?XNRg;xbg\GĔnVm%okZܿ~vZ0CS]2BT$k]G=yO}`WS]YoB:#z{l{…]\}yF7ULL ꩧx?0!pUQ-m"ia7wgob^IJY ž=nb6IdjL)-LĘpo!蝪ٳ9sKŐ Ma'O'[Hzkpˍ70WpO.}ɼw{B \Tb3-~ɷ;oJUJؚϞ=)vP_0fciMv|t:vͬY\=pΛj/9gTv !;yMT5RHUaN9 jvFDqA^ǤRb:)0LB s'pW7~BIuQ3_IMqVz6Op_4Xx^႘ }]!#`a?>ߑr=|UFI#ol8}My^wO&.R6o̙3ټy7B ũpbjbkݭsVL <}sQhAu3b&˯\.UB!Ni4v9&]SoFF+i; xwO m~eÙm(R#LvqsMƫʜ9}=U dM7믿N@`+\mMt3՘bQ}ZI#pc6-Ѝ#]O]NlwTmO, '!<|p fXƗogQUƱf[#I?ucd$xܚ|'/ڣ-HcƨBok{|$d~ -gw-pH13{l;)άݮm'_j+Ed7j嗿% 1yd͛GDDfs7z'dԩSپ})mLb([)mx9'[;k>Z6ޅT:8G:L-;&BL0kt_np)8{qaN*B|jRʎU9}j[yל^6Fk6ry}13#f߇B1B5tljypl5V!Fv uM#jl>QٞS۷sV_dwAA< iii8|S)D/SFmI 9T+Q!ĈPi4qs1ək^Yg#IIqW4pt,J^})k_]!9@Up;YQַDk.z'Eg+׶dm۸innzm St:Ivd~+x b7u!菖z҃h8gD 2VMc8N Kʼn&D0mtGb{z eI! ׿~C !:ơM^<}^1{DU~h$]|/:7}E]/g+#ڈ^(N(Q1EW7QTΛ; xww-6)=6ٝԩSim/K@@ӦM#** ~>¶|rW(zљX,K![hF}V1{?:aؼ@$rN̨RjT)3T4ofz+\iI"L>+ke㲣ԖqlTv&dAAܹD?'L.mo^po./yѥ !p"k)'`m8mduޞ"m++nysڊNߟ_~n BbwR(%{,lv|yv>V̶hPfTiV=ȴіڑ1*Ł!<^g=!ęDq㣳Q.6vly43Wu޶{7yg~O嗻$.USy~5%!p&k`qu|]"} WB:p:>ƾ]WUa_`50*ɵ1M,:?O-yh>}1cPPPNc\qBIge/~ ~iic"F g!,n7CwQ4\ş.Y]S!q#[3K9Ӎ~#1~C_/>-o>Y󸉦;Ps Nw!0u Cزe f<㒰:oYf_H[sP@rW4hoFUQsǛA،a^YuvJL~^n%=RUµձ#ZVsəobT?YW3Dbo'N$941!ɚg࿡h`aZzl/,^:{7oч-..!^H!-v&s(i2]u|^2 Z.xRk5a2HbFgr;`T!85մ jKZN;οm Ō/#DVOx,g7~I !#Upݯy:p0\d^b I Nyj:7RmXX,CL*9q;ƀ*JԔlVر7WA S8%`6ɣBϢ( ~ ?p]˷&RJH^ O{[kh5x7sínu{Bn"\`kSpQ7[>x|[Ӵ}Equ7/mm&SOO~`BShF}dnMC~&G lu4'0݆IT#uնDy-!pMӨ&<<\44MЦbv'}1   Xe uKq!'kPߑ>4yiG']E݃ `ΝTR-Qf3(,v%Մ9Ne*_a,_P+)*A !Mhjj"00P 1 ֲ#حy oϴJLNɻ\%!p7YxUMN| j/,&~n<6-Λjɒ%<uHBXvʜ:eS]Ge *4/k rqP)d2>:+L=1! S^xGyDbԕhvܴKcq􃓔)o){<2MY4( !`5jC6[߃ | _i@h9$-\N6bgrh4hA= TL;(7TRԵO; !`cŐB!\W2(i<\vd=Ѵn^۵O(9}[N!4 v+~q }]t#na|u/`dpΛ*%%;vt`BRU#ZBv%ƭtRJQҠ`BW` b4 RRRgLql~8wVv\Ը z`*^Ӧ1chSR#;dq!Țg6AM6ٷ+f;}ywd_5\W_ͤIzA:o[n_ uHBTBLvPQB5}_f[5NcSjTkzgaf\0̈ &MmQbPU+WrM7t!DhƾuYq1,|h~A^E}ǩ)&W_kܸ,nY{ Nh<{᳤FzBq&9GOכ`50;C]3 pB.b4LI!\ntK{ (Q4)^S m̈܎fbDFHR!&sG9>40ׇ̛R?w65u;`߼]s[9Q5:%/3~kbB1Bmxvoc#œA `}<"u> b,\ `X:d7W_ͻ+BQKm=?E8Ch5ƢnˈQMT79Bhf@Bs[R$+:V˧:ê:lao-;lfubbf_{<6=|:i ҤUcȚ_'A{} Ի`bwOlgы\>c֬Y֭[q8444c0 Ǐ6SAR[[;!Zk9zf"Ņ<޺FFP55v(MbB̌ބ`a&!2!!ɡ\H*k~F{cFҧҔX Z`AY'(n!Ǒ5ϹF<AMVOk/0~a⤯\AeSS~)k֬a}3IƏ5\… %#mLYR6XUAxEm.CW%C}ا1j FuUnDžʛ(!Bsj4V:Fؘ ! -DovFG)o-?إNB184 wt$kM[kh;< yިʶmXf k֬ĉK?88 pBϟO``CyS=1"J́6,{^LS񲖢'O9^Ihl3BX ޲B(?f mMv 5-+vRFhb.E7-7]xUi($k CCa7t$g\_xl۲۷oMh4rw;ILLtwX7Utt4YYY]72Ͽ$oAZ* 8LG:1WФm`OP('&23>Y A/@BnQVVFttTa alN0e k WܗуYw7􎧩ֲK^,!荬yFUaϿ 糁]aꍮMd [5k駟M0'}%%%u%;ۆ͘btnzņ:,3,Dž3;!Y ̊!2H6BiZSt(lx(kz|q2fȺֳ`LebBӑ5V {_oo}c;}އede˖o;/44 rWJi7꼩x ~_IqN[T5RHYv=MN3:Z09rQM4Ʋ%41̌avB03:B(׿<+RMi].g2oOW]ԈTLziU'p?Yl-p}Tg~{'ooJ|ܹUUu&z)|ɡ 'TsAkm E4P@Mq3'ӫr?'!IefBI dxB!JS56scONߛ=o\ 30ĸ+>;XuE.")$?_gbc:$!#A6*_ zꘟKzTyaRRIII,Yڮv'6lyQ&M}"i<̑w`w`r\~ 98M5 &{L*c3+!+ „b4,&N(?`:> @h|` u([cT$˗c{boᱭh Gjp'7yO q$8ɚGt 񢎯bؿ m]DwQ礘='o ;;pyf֬YCtm>2̞=[#iF}Y3GٽΚ0`ZO4WTTۋ PijBU<Ə!<Lم !Lw^&L op:nѤgE=TϖCunٺ%,+;[&^c f]珔v{%[|7y7##d#zd= /cWa};W`Pa . vk}qVmL~ӟh"fϞʘ6&ӨFm~ eRUCy7V[ҩϣ٧K<& !mfB!CE4gߺ^:?({Yݎ IDATBC[ mw׳d˒^?ws|1"![4L Wuoy?б~{vzt:&MbѢEqDE}pΛ+?$ `C#ҭhmD=~8To̅F^|[ȏ`ƅ˧BqRU>/^Wb8qi:=LZNH} |$)k>Oϟ/T\ !B<}d&]?qsuYIvkNCss=pb6MMu'H[]kC>ZMizPlT{~v4J*%RJx?3B¬`"ݓTBTUe֭\tEOaF4vkN; = $7I0j7~^?~PB<.U/}H)΅3?)?n:.tR (([nロsCGژw6Q%J(*mwM:bJQ$ZYm B!hƮH{۠9[l*UaّeES0ꍼmg~!⬭vҿsBy?hsb}!Ov͛QUſN|O8͉l0:o￟^xA*Yk-CFO1M瞾^rtZ.V Bhr=3G1+>[!7TU7`R$0i;Wi%I1} x|,ٲwڼBI<¥*®@\P#}?rxȓ'+))!--z]g^e]ƢE~+.yS%$$u W%dz|*덴2Pc>m^e4VP9JaV|!>P!iiFaa!;CaL4á/z `֬~U= |/lo/?n'k-հo} Zwѧvң'۳go&+Wco9 js2oα彎eo>(o=i<+}0zCB 3nAƇPu' j8;sݝk֬aŊ_1&LjspDtT>(~)mL, eCMUUjӏSqymT)ؽN}0cvZJĎ'jR*H V(B!FEQxgx'0Ýj|{+{@#ӷP~ Dw9 M&nl ?uHBaD:~{=z7|w}zjsr7swsy v#Vg;>>kמrSIeas`Z{˩(Q,}a7تh3VbU2{LLʜC}B4<ƌ#w88 kaJ:&2&}GqS| o1=ǛG/9 [B!S{UϧP ΃ZǽSR[м/zlc[㱄޻=$BrN;d|;ՙݏ=VسKzLl>LNNP"K.U>1|۝6RUGZZН ^2tj.m4F<{!pE6BTUe|ߕ*'!A>flF{cN3B~qkF%? ?k>F^By0a06,0j.sxIKK#3lfTӓy|W}kEUfګtYg.M%_Z&j'1k^@)bx8tlm=YS?y?'oC7O z>Q_dod\AE1ɚGx_Uv@yۘXVVZEZZ6mfv3gdѢEvmf#1^9q8cyGe^VDƔdF^ .B!G+iQ='{zf罁׉}^#`|b^xI KyO I B!;"/9h-[Ƈ~Hss&!=;CogѢE$''FX[:oE/ҽ)(D=-;~||--31ىaD[ܳB1TU%--Kb_ņ׏@/>^r DwCVaSla6B5.\vk¥s+f[P'!rJ,Bt:y!EK8>QMN^MO@UEc>cT,3,#11>>> E()U,E Y5|mVyVXz{2Շo)ǴN9+"'yXLJ5رc/G桩1$C(? Bʊ@IekX$)(tPM:EБ =(IW^y!{gk>>}GaЛ"Pg֫of dׂ5-EKW qC3mll4mJ6%F T>Lݶ /e ־E-WP$tX¢e wAGw8hIt_wƸW3zE5nc۹nZ7wr> L?6.T-#CVDDD6&k׮ѣ\CPaaapttwJ8= {"md +T E-`& l,yH[$I©SгgON 2sݱ5[n#q:>`ru9/5ϱ} ☇ۘL0.c(JJCHbW4וrXCRţ̽=CС#,TGHC|\gRWO$_s84//xxG>K%>);-"#y\if7snc|܋ܘry1 h,  _U >ѹ]+4o"\?>~ע(`-P:kbbjLE h`Q_ijݹsx˰UbYeިS"""3*t͜9Ө.(H'(MGSGJ$M\7Xù4*,[zmt ;+- ZG}PTN H>Hߓ' x;·msړiGB@LT9<Ÿ )l;F g=g=e61|˘a2D}~r\Q&9pC{,KӡRǠ!Ah;d> + \ ""2e$~IxK/)rtmwE$pOtvr!oZrZR.L'=McFDm9S}aeE8gbNGC@a%vh=*x|@<ңQ=f]jI#>k<ի+\ K2#""s6&s̩dvәťqBY- jE ڣU[w l  SEDDd$IٳgѥKN "i/R)C1 8* ͛CEUx;h,-cpCnR ~2Yi,!nq[`]( h=1ݹU}YgTWI8V[Ȳ-!u<}0>~hccpvwJD%󐹨u2lOF^ 2N˗?~jcRWCpxdgEEP,qPýWot7M\iWJ\.~\z5:g#X9s"o>s,3O4׺(WsF7;1!UQQ &@evJl݆y@iY@-4x 8Y܂l3;#Cx:hE,H;wg-D@f8#Z1~T2|]Ѣ',>Mқ7l |6 saKL [_)k$Kx{8rp){k#qCEo>ٳ+Vgax= l,-NVU@(IAvmn6<QE]IDXxպe˰?[0vXm܍GdJ8!sb|?sʎ.qqq{YvBtt4 >}_ƣ>?ߊ0ydcҤIu>8ʋ B(á _7Xx%"""cG?"C}x- I7sd(<~W4ܸF%h@j~MW7)ƲJ0>~-&O>L ̝;n[R^|E O(l }4vJ"DDDdX$I¦M0uTKD"懣z_Rv^j߯A&p^^H)Lsq'>aȀpC,j3//>N||< )t8s ֮]ʕ+1c $ʕ+O/GZ9e <ê,6E`%E C,tART>}:Q8ڠq&7#Rannh mF-ݻ͛1fk׮q OOOM,c„ pttĒ%K*{СdTm]8X:®c z||>YDDDD 2.\:p,CDuҬCCWORu4jx{bMvtS¡TXoڸW7ᘇ̉YLRcصkGU ݕ\]]rJ :$am׬Y36n:u*dYonO>$<3n"""2Y$aݐ$IߩwFa5OFNjQq ָqH_R) Dc2',vRTTM6維[|U-ow DDDD:׸qc}@D&p?4uT%x$<7Yd~ NiN; "1z} ?ͅ$IV ƤpB?y(ٳڵ+DDEEA$AV5KJ(}^m~ڶ2m+׶s{b.N={s=e]v,˚?'f݋"HA!k 4۵Fܽ}{z.X5Юa;|O =E:u q'7jK3 h"4m3f M9s`޼y;>(틤$լ)??_󳣣ݽ2777 YQQQl@QQ ۶mz_t)󑖖?{vڅ .>3dee!;;~)ŋعs'`߾}8{,`HMMEaa!>#wfoݺp:u _ 11eeeX`͛;%9i_#66,cPHHH ;~-[puEP\\$[ ,, }v\|' //XmϟǞ={w+V@ff&rssl2KcO?p5k",Yp5͂‰'6l[P^^bbbi&ѣGqQM?>q-{r :twڵk%KXf <<?;^t l2"33+Vм'wٳG\'||2o XnP\\E_-[~$!!jχ,Y믿pmё#G| n޼ X`ʐ/p)8puV} իWsQi߾};wŋO?g}pfQܽ{"""#-- Xt);mؿ?N> X~=n߾R,\7o>|Ǐ|W$I?>$IB\\+qa͛q … QZZ۷ocӧOcx9# b \r#x9 !Ew&;]BU I7assqtvDj __$y{~鏸wg&qشg|>=fSIx9@#j5,Xl>Gps.t@eDD{9sUʋ?\SN X`f̘5=}eȑ#0``/T6č7dWx5WRw 7DV#33Uk {mj,I7sd[)PY{(:DY2goux~O"#WQ.@xPY`A?dC{O 99^^^ݛ{R\\EvJ###ѯ_?%7o #))I&Snn.<==Q^^;jR(vgddhuMs&'O\-2DnGGG$%%iV@%"""25,#??/DDڔ^LviGN]YXJ-aTu*6'c"\NgQẅ1&9I;-- s\***v5JkСCFZZgy֭['>}VMVV&O Ήeƌc] >>>>pqqwjDDDDZ!I~g.DDB +~&ζhd PCaٶ]gDc2':\ܸq8u&Mh#-h8qs)))wwwwUfrWZlN8 L<.\ѣH,^7xZs{s9|"O u?N?C4|``+\Nq%K`߽pGH.H ;"1 AOƍ÷~ ApQ}:!BuW\ŋѵkW3f ;?( w8q""""SVfy^*!/BPxT2n޹VB㏖@_*x XC_^CB^R S08\Ϻﴈ^9 ""☇̅NгgO|wwNNV\z gΜpRV0rH,_ u ֭_|r}FDDD$aҥ$IߩTV5#~G^Ɲ hp!Z|!:SJե(Qoq㘇̉Nژ7n"#z-+Ӱ1|jTo] W%"""""ҒCplb7 #^oHz- |tj**/”Sp&LqFr*16&wk۶-Ο?bر,˚pݱcG̜9111Xp! zֲeK4m~~~U,teׯ_~SQaekK ߝGӈe$zRi.Ҭwvv|_󜗽ZB7C☇IU oqqqC\\\D""" ,w}Dн{wȤɲ3gpCDzelO51(+5}Xxx(n[Uk=G}VY~`Dٸ_C#}Edt8!s6&d\q=8Ys9)ۅ4AT*m ۶AHU/$YBja* DD&(ژq4h. """&I:1 Vky*. 5;ǔ7Vt~B7QpCnRT^^tJ)<|.G1&-B1sֻP)n_z&2׮I@eH2zDw㘇ۘPw.;;*q.RIDDDDDe%~d+/2#hݻp{TYX EmՅUϋǢ>`)Z;""z@hc EZ:M6՞3gΝ[ i$Iꫯ Q DV6ؿb=1h֩!m|w2yC"WT Y߾ |]Z(SJd8!sRݢ(BȲ AVu:+(M6EXXX+(MDDDBe_Z"%2V_BLx>=L>6l=Nĉ:| F,\/^Xo9l,lqCB3T~Lz9mX_*QY!IRL "z~+E^rIo|0KK -&b[X7nXvvq"S1 1ٸq}|LȲ WWW 0AAApss5p={V3_ZfϞUzȤIރJw:DDs$IƉ1rr{sNÇ#o~VhZ^se3m_]W?zٸg=fEd88!s*1x`K,1c`aQs}=..3g!"fϞٳg"=gv,'"2de%n(-Sxںk~/OKC!*n5w.AEzVs4$m=b pԜsX&tR޺u+Ο?A_iӦY裏Be;HcNDDDddYƑ#G8!"ղ'c9Et*9?{R^GEZѐb㐍pq:ϴ|FYbrb/"`(S>>طo&N>.] QǃHDQo1Fhݫbު猌||k!93"-yȜS/Νë ָJBݱf\v ÇejtNH222C?,_<>:/k@.7Xذ#VbDƊc2rI'88k׮EJJ qaؼy3݋3g //NkV7ȑ#J/4Io>y;[#xPSŘ\™}q=,Iٹ 1C!ڲEi4+[A4uh%kdZ8!s*8qJ""""""WVRFqŒlxpvPܷU|!##5ω{ܑm* :1 uJ=#""3*ɸٓWȤI'OrCDF]WcC9w#nԳU "mNYX{!ZB7,yȜM푐*}FDDD51 .-7d?=oߣ'D}CٳZD-yW36y\M~mU˗/wjDDDDZ!"FQ䐘J%5O튁,U\j^>_~0pCB ڱA vnKE.^Uw}y e:,-:>󜍙ZRc C;1,P)"Aj֎EV>((OV&"""2,#** mڴؕ%G`cN6ϜPYV-pq^|`ߧf +??gj$Y쓳'fT {/N8!c*uV쮍NI6>TDDDDDDTtX@jϧ.^Ν0` `!>8vܩyND5#cfDDCuI13goV˗/(++ x̘1Ȥj,]o6T*!"O RFp@Zn K:WzFMec~B7p>,H'?cՐe IDAT2':][3g֮] lٲ#G i}舤$1!"""%2Dd}wQo+z< sF譣rtJq; ;f?\m\1+1 m6Xz5.]=/_wZfV)\qqS "Қ.#`a5[(+LC?~x+1 V XB7M; 1 -vGDDh~c&iExՙ(x'9!"cmgʳ+J80''o!aPr w^_\H8!sb|zU[Px*}FDDD$aǎLR{s_6 sKcŗ.!fpsXE0e ZjaS 31*vC=z _~M m۶X|S#""" AA YX_Ř\¹ʳmaYC[S"8,"%#wWw*d8!s":,Pۗ#++ Ѩ[z5^{5mGpQQQZȸEC(/Sc{QWG0pr+w$1-lDQURa((L4/笈 uɂ?1Wcǎj,Aw}n=>}:4i'''}BDDDj}N JtJN|bZƹx>Z̡O}HIA֦Mp0A'9`ٹe!#4(T9☇̉NfvץὍ {1֭Qy )DDDDFedeeՕRK<4 Dcu]Xil,b ۣ١psI|yL8ZfǍwzñBDh.Yd҂ʄL,ˈ䘇Bnpt>{LFan`XX4n?tE/h-GS3(1 ݤ_9I;$$!!!1cF#$$ bfZh 4YqMy,T": U+$\bLFij}ce hΊ+SONL,g9ٱ@>87Z )1u V_2Mh0f ,ܴI+(#SGUiA% +Wh+ED'0|ۺc ,tpCD'37+ڶmÓi _ߔ{tcry9bF<[3vm6Z\ݷo_ۗn#6l0.\@DDD&M$qCDfC 5'XZc}V ݤm9Y2nNH眜9{آY\$ָӈnJ1VxwEDh%G"y\MN8QǃL(ݻ76Տ &@V; """"Q/+@R;""jV pzvXܥ drT~`jsPx8z؟ dYC 5yȜzJQD.3VW,֟F>>>z)<eaqL[yQ1ֺW#>} qq1ց߹Z-)':1 wW۽ ?T ]<3)(-q_]a߫b5Vr$؟`Xya%k)c2nc2n8̘1I$ K,YxK/AapSxZLq_Tx <K_ !!3NR S+}q to]uȐqCmL4iv""""""2NjFAVYV'lj7b4dr5Waaybb1=dEDTwzocBEL,˸q1@e\253DmZӰU>e2|֯jnPL B7DS[2d9<<5Ȍklvs """i,cϞ=y*}D幝Kx$!w?1/c6y6z7!afT]X=jGEEԩSFvv6兀tݻwGuC gp%GԈHC_DTؘw{>/۵ 鋗(:ڴaX<ZdØ2z6ĊVkS""*}I^wwJzh4",, ~-"##ﺯ3Fw};vT3-*ǝ/Uƍh>}:>O$IÇѻwoaIDT)q9XX\뻾^*(@'Q||D:d'n@Slt SLG?dûcCDfjz_駟ki&4j[=G+W HDDD6MjՊ5Q%y>t턈zN޻7}MmEysҪӤ*X|n1_ ӎNcûcCDfիWn\~'^u|ᇼlhČ3XU#w P]=hd1|56vzTE/F2~RFYQU!{J`0@iNNNѥK2Q={vSQo!"@SC7zAf:d%+"V \bl{v|tjΈ5U׿=xwƣu DDDD:UN/{*ƮOAI :WWŘ(ݰw5gDš*.]@eDFFԲ[\Ο?oz޹sgkFs^"""i$aͬy,Tz2!k aޢ ^Ї5ʌ5U/2gV\Ybɒ%b[nm ^ meDDDdt:x ,bbbꊥK"<3~DDDd$I±cXYI=MOV\n5gDҥ^, h2B딨 X=Qmfe˖駟^СC1a\p ֬YvaӦMS6l؀:"݅).33Sjv}_c+*]|d:cx#ZBV p_MϷmۆtWڵk899!//qqqDII dY 4h4hp+Vvv`0qFDDDDDDTm]pi>n^NUd,_߷CtsCDDdїT-Wwު1³5R3K.DDDD$I_SOAUᑈ]H0; 8gl;kQnվ,=, \t'jAЦM}R5Al \ DQ@>XX^f!.f C g"=lY̘MSV˙jUL3E* uZ_yȞ2 ^wnx0m4xyyi*F#fϞwy:NtjbQH-mN431B.,496n5{Tײa,߼:#lPXMj= nK,,$I: """"Hkײ!"z^o|y䱛>:6hc(8}J9/z:?A_H k'ʰ8DDDDDDd.OuъaotBPx*}L1ѿ?-Rd]9xyHO5m?~,..fFD5նCrr2"##Jzϫ)ڵ+M$ ܹ3$"ql5K|$Bn-޻7 (6MX%_|h%^2nn[`7|36krd=cuJ7y^6ɹs0|pTi A`4 1!"""""H኱{!2F=HfCݺUΕj;IZZ `ްaCM%+5j1!"""&I6mڄYQP3o!+%,vMtA^? x$YL.)Aڵx-LdX=QW_:`* IDATSN?ԯ__#Ǘ9QADDDdkA@pp0k""+ccbyHm9Ї:gJo4e u^}"/J%(@{֩<h-[ *^u̟?7nܨZAl,ˈbCD21J>Zq^x^9`4"-I4O>p1|tElk'7}xQRR'*<8}4Μ9?8TjŋcÆ `@`` zW^y}뇃mwrr¬Y0iҤ{a0 ]U$X=YEfz^~ #Kb@q\YLB wZXHtATF_R+%I¤I0tPS[ejӧm{}xq dddXz5I&~o߾Xv-bcc˗/ރ$Ix뭷nݺ #p"""i$a˖-yT&ZT݊EMCD~ϏSI޴9&yȞeO=-ZT]5ooox<3 +Zn4i*#~z|jDDDD)Q1j(j_4뮢|+oV wX?Qu.-[T9_'ǔSP*E,CAiĚ*bN:K8`z>`r8sکq%DEE-[krr϶r}%""sru@w)]HGcBVU:7ooX*.}M|秐d^Qy^nРIkK.<<<иqۦM˗/[=GbfS\pO>$dY\Э[7m۶ w7e,$ɴe̾w|{߳6|&Ϟ ?#ϤχhgcLTgҲGNT8wܱ @ g6fdg_~Lrr0qDYd] {gbS$̛7ϴmL O#oU@Pݽ{wȲh5p-gTf!ʊѣQ~} :O=u.] 22zW_}U󑟟FqiiieQ֭35k򐚚EN>-[6l؀gϟLdeeaܹnO~z֭[q)@XXnݺ?3`Ν8v`ٲeHJJBqq1fΜi~}LW\e3f̀hDBBVX8|0/PPPd|?۷o/̞=HKK ؼy3`ӦMp{ӌ `Μ9n۶mɓ'/͛7o9GFF߽{79XbQRR3f]Un_~߿f]1cJJJhL9ݻw֮]HW_}|ܼy/|$$$h4bƌeXr%wq۷?m3gDqq1l2cǰsN?l:_`0֭[ :u [np{;S@͝;YYYgϞ5e>}h""//fpDܺu;vK.ō7PTT?pUYw^:t If̘IgZСCػw/`͚5z*?GQQnܸK?;nbc@L8ӵ̃=_>֭1# /0#0(yƵMi͚5<ME=k"j](ƮH(Ux,ѣ!(2hQ~Ti-cM'=?aX=3gyҥ իW+A0S缼{gN뿿:t""""[$Ivލ!C?"j $Ggm/+A v[qt>>~d|p^ 6m/iqZQ+!{J{ʕf kYmT2jbHMMERR=뢔YRkATW#"EM;šuWQZd~)nvs)6Ww|y ‰HN.hY1 Ҳ%ܺv-Mptcw*IWj~*sNF`CD+Oư5N߾}MW۷/~,cwwwtҥRXΝӧO\ YhĊ+/Cii@O1.ʸTx,CpWόϓOߚR-] ' ( ZiX=a Fm.]fݻ1bD-kT\xlSEDjQC*'""o?g3bQ'R*4 !8:Z3Mezc?p-`X4h O̴Ú UЦM<Ǐc…fdffbĉn\NZ9Z֭[FHHHDDDdKNn c7cr^P5dvMĥKmy%y{8afcCB+k9r̶>oN:?{xx`f̙3GAzz:&Ngg7Ν;/)SSN*kڴi$I4T#I |ᇼH#-"|gb[:,zZD*?o6 7pB}՝3(cǎſ/ٔ;|||8o7Ij* \HC"zJ݉Sͫ?)JRL?6[m㇇@cgl """&"Țprq@hǺسi(.,#ul*JI%j*X=Q[b z!C`hҤIaXf :ڵ Bd=/j{""""[$I{e /Y1edgj;d3ر;wĴiлwoѣi]ݛgȦIC!"ʻ;7 ՜ :7G7,u:Vǚ*sv4êU+ϛ7]tA~~>˲  ,0] Nsu٢|S ""ͺ; -tI5gDQt#NC5y^βϸvA)SZv#G`HMU˗/3үQDB|]|NX=QnAiݺ5N%ٰ~/<ow)͎ ;_@vQ6BBtRyiVXPma+2t}||EjDDDDDDdg6;W̶{`,nɲ'A3g'2ٸC Ci[[Z-4̌F.^zm۶ -7o֩YhѨu*DDT)n,ĭ\7_Bޮ]@ijqd ڞ4 5?/xRNiݱ!{ڜT9s/^4;«VzsW`M:Q7G&ޕ(:qqf ΟGիpisIٌ3+î]ح7>>FHHHDDDdKrr>#")bΤB*?3OJGn\} IDATS9cCnRO@$ """R$Iذak"YWLs]񜛄µkXΖ-*=&هWf{:u X=a-\:N4To!"B;ցQ}}Ec]A=IK/EF!^!X8p!4ά|yȞM~#"""&IO(k"Z ?`vƲ&ϓS@o-&bCrRSO"""i$_~aCDT 88ҡb,\:$ 2qi.)Ʋ7n\RR1SPZLą ެyȞM\ANH5 e˖yj,4FtEcP1=yX4&ߕJx8p^ ]?TϚ ݤ… HLLD|||GveQM#:v_jpT&^#CpuUqJY18x WxO7 7T[yȞMz쉶m"44c޼yZFDDDdFf͂h:""'B+bϥAJ+ JIWK/se#C+,O)OeRldјD5$do|/k'lv 6p^"""i(bԨQyjf]rcјnݻñQ#XQHNe|X=ᷜ9 M$ 7ndCDT AP]p*A3zb8>gX4.G,LJG?D|.`CnRu DDDDkT|DDT9:qصOe=q@SeohјD ߜ[m{_GnqncCnRtiBDDD6MEtڕ5Q-լs]"܊1}c;wB2,2N¿)'ŽpSӢX=ᷜM<FQ4Tc41o<F*n{Uĵkxk[(JlɎ۟EdFddCnR?4Q1vXھdјyȞM2 \t nnne>>>"5"""""""3g#9.:<7 ^lݱ~}4ݻ efcI8z} :hڗpww<2ۣq )`l,˸psQФT&IzX5 6IѦMxƏl(xXو&)7R -ӹiStټ2S)7qoϚ(++KTu DDd%BT&3rҌ ^RGP3 Nw;5 !f7)zwJ/4I0g>q5fGd]lvC!$$ujDDDDV! APוj/_m;ofd0 gf$&"OTyn߂3zͨAf~)aÆZ@DD* PiyfۓfήUkF# -[g/|Ax=4JcY_kGG}}2st;o.x4"E"ݤ?-DDDd$I̙3Y٨vKKU[e>^~9eK&6GP!^!m:AD#Ȳ,k:%""""UȲ Y!2!"A,cտm>H0x|*!_h~ |}4>ܭ-{C3fgj!mw^1xe7) :""""iDrNjwx?r;vTil"k+r 1˔jΈHlv~-edCDdBiv"%&Jcv snT&TsܫquD*Q2Z+="b}wE~=vdz!"a ZY^Qף٦qUȚ]|u+2[IQX4Io>kvUȚY󬿺ȍ#XfZ!C"at}bW$7Y)U94-E9ѷ/G*GkQeԄgcF~H'iL k.@DDDDDDTvͶ7pǘ?O矣ղA@P mΥK^BT7::QdӘjzūȦI#G!"#LeqÀ*6ot,#oǎ*Od -kt}mJaorՙ:nRu DDDD/ZDDf7$\T&-[©YSXζ߫<>yJs~A<DgEW{Nd&E;v(ADDDKE 65sÇ+ #"P_ ,j٧g#<5\1si5IرcyK/4IvZ(n>!f7):s _摝ujDDDDV!:vANQp{LJ%$_NåcX!r߃2yAΓ0<;[|` 6IQTTڵk2yiUm-"";g7Ř52#š(2*ATQZ<b:bnp9W{.d&ESL W1ydS#""" ш/FcoY'"CԉhO11*W^{=<(g~d.TIM뚧wC`wQ_H I5( E)UiXa-]]uWP`퀢~@@AE d) B @r2!0d㺸8s}=3=gwfHMāf HKKSHHBBBtq;$aQZZ*_6׊a=8D:^IJ(|Pi?oOjjl,Rœ"7/)I .++" *Twp"r~*eRBOT.p'yU.rw0$}W͛79T@T#&1W%+u&c(eRsi'G5p@BOmh>BZM^좌 JmQUNN6mĜ*U6:K+u.(y^][>z蛇즨)HváHwPN8nR5*DAa>KQ^u+JxʜgY2}#6ܬO|RӐC_~Xc^^^@eٮ,T努^ԭc)+W*'- Isxj7il˱ 00IM6eESr# mAleX@DŽ:9]rͿwr|%X1xꜧVH-9[Zrw( ${ Fɜ*ξcιdXԪ؅d <]8`D(<“P\wpѡqxUum6B{8.eq.q8@A*œ勚z/o~p&$=b^ѬY@eSTww隺ݒ ۭl|Cb%y^er^JդՓҦPl"|)$$D`7G@q!oЈߺI/Ԧg}xcWR|E4?;SQyICZ_q1Fy햤û\XʤIOr8za q -I(ecS0c^ƭW~zE/;$\'~PFFC(qPU TXu62#MRb؂ dIҜ]s4|pI9p=Hvá~ܮ I999>}:s&K}F\/ܩ]6DZ_~|n?ZMQzCSLUooo3)(ٝ~>Kglk2YJ)s.5)3;3߱K)zs뛔4P$˙={hĈ"##?Q~Z՜7oOc2ةݸl^6ǎ>qQ@˖]XJ)s6۠OOzrTpX͚5K5j]wݥ j͚?~jѢAPcc<;>+vKݝ/ܿߥcbΓwhf Mn}L7膨 6OzcnZc IDAT/ծ];ŋgOZZBBB$I .(~\_?}oFQ޾wץ> t颪ʿAWxt'IRרwfs,W%_,}vnI p*ѝWHH rYffȧݗrtby[oY^!! .ՙnA_{D7\9OU;ñvHmp $=;xVX w.3;;%e^^ȯzPx+b}FWqXUƜ`^{X k6L>׉r`͚52ƨk׮JKK3Fqqq裏U>322r/((9 ooڮ[6n8<+J;h:q#BqTȟYF FK6M6MIIIEW^Q۶mUjU^z:t֮][2O"]vI_c֛o!Ce˖E~NUTnP={9J~(E.r4aZvҌ3t{w<*d;j۶m.+11Q'%%)))IsQ\\xsYI[o}ܹ>\K.U~ecHII?PUT92ґ=gpϧ~ĩdvFU!SeJ)7Xaaaܹ"##ORRzi%G˗kӦM9snIҴi]`˚3g.YfZh֭[oqO>CQa=-e4#wvFxq7F&Gs_ٳgj*5nܸ.I:u{=u]vƌ~I 6$cPqՉJ*I"##խ[7c~~~4h$iݺuN?VG8wt9wɵS[Y,Jsd<e{'V^ͦNLԙe QbsG =&sg?G8w29ixO<>je!.wPVV9--Mu-NRSS/\kR_=yVÿ$dS֥ l6Ν='_?_:`.|BY~f1 ֪U$5$)+׈ҚC[I;s礨3''GaaaJOO/ߝ<-62KoSqʾ)ym322pcLN|18pm/^hmڴi}gVɓ'(10Lddӧiժd_T?'O4Lpp 6LXX3LժUf3>>>J*F 4!!!F4hi޼dMJL̈́ $s뭷}I{b4i 7UT1=dbcc}g$vmF3&$$|dӥK#Ɍ9p fcbbbC=d$;ݻIfȐ!o43dZnm?I_~o6ĉMժUMʕ?n$-[IO>m۶FyGL͚5MPPi¸Fpk$O?+Gj30HRΝfIҁS`dUVMԦMmܸ}/]Tz$iԩ */^Ԕ)S4w\|Xu)y1) kϯvWFJB@@P>4@i-\T$!00*}ff]7l63ꃰ-XӵS!z$_իWt~La}^z Q``4i\Ovwx@>jv:uիW' 9sƍ'Ij֬7nӧOkƍԝwީELJ񑿿7oڵk+==]:uꔢ+**afpݻjӦ|}}թS'wR7n&M Xݫ;C_}vcgŊj׮}/^ѣ5g=Ӛ={#qg7JԶmԪU+1F6O>DfʭGN:ҡC`f7PD%%馛n$;v(Uޒ$???7G# %In.]IRϞ= pjv)))JLL͛yfmٲESn(&&H͘1C ,о}HuAFRǎKS<ӦM$ӧXw&NSNJLLԱcԾ}{y@fw9ЪU+m۶E&&&_~:x`mo\뻹 \,yrzUn]ܹS!!!N PV;111vtAsQttS2&@+Թsb}m6))I={.^#G˵i&͜9S7p+w+ǻ&x'9ƍ#Ws! wdщ'`8qB-Zʕ+P:uU֭[Alܹ֬Y#O-X3..3gԶm[ݻW^^^ںuZly>JY믺ui͞=[<@$|'E޽{Yewv&LРA԰a"}6={XvJRxxU2''GSL)~ETV<ǎӟ'%''W_% wV^=mVҎ;'PHvC4oڱc Ʒ@P9 O/P$iΝխ[m6mjmڵDp%Wy._W޽˵pB?}'N]vjР"effɓTE6wߕ$Kնm[… Uf(\96m,Y"IG3Zs|gݚ8qjԨVZRJ:~mۦTխ[Wsqn(%%ڮTR{n#GhӦMȻ/338+<ϟsrd7(MKǏתU3g(88X͚5S>}Pn-@Wh{k;\ŕs;,r|QFz]P ZYYY{WvʻesP1AEG%Zjjs2<cd7իK>\h 8@YwwPё$y撮|wСkݵkݬY *2ݐ$u^re1Zj$)88XrK*y@y|nH^k.7|$IR޽>(*2ݐ$5mT}$mذAof6gΜQ\\$K#b;;|߾}~z}'NϟUZCBB>kJNNV\\nݪA),,L۶mӔ)S~Iĉ ?<c\1Ƹ;\?P#Fp}tt5m޼Y抽Ǐכo)VP9(ׇ;au3fhڷo롇[1TD x,P x$d7x<GHv<n# x$d7x<GHvP/_{ァ={VZ ffSʕprYzx۶mk $pMСFe˖twX@(q_LUR%_?-*𜘘ËP;m'OƍQQQjذ|}}%I!!! (;vT``8<^~eyy9˖-[Կ߿nѣGpB-\P ٳS5vXO]pA;vЎ;4{lܹs1chܹŋɓQFcZn*p+>>^ٚ3g^xl6m՝7I! ;ӟ$Jb57N:k谟Lyڼy$zjذrrr ,_~n_tt={Xuė-[:hݺuLx?]bbbgjǎJKK߯)-۷;knFըQCڱc.^˗/W_Ց#G'8]4p@fI&QΜ9;v(''G'f͚z׮ߒ%K4`;}||ԴiSUZUڷoر4iݻwҥK5kxBǻkmnZN=VfMu]K.zjoHt钕PK;B^?ٳ%  PUVIF.aì*U2LҥKMNN&))ܷ~:W0`ٳg]l3|Szu]~ gݺufYm4ib{6G5wdUfÁ۩S'|Pb19V*o5>INNkfԩS 3s0̐!CÇ%%%:XmoV`;w4AAAVPkskk.Ϛ|Y}4jԨreee5jX̜9s ^y .4駟Z/gZ9iذaN/ߓO>Y9{@nEEEiѣ])oooEGG[?nW;!!A~7nlק[N wC\\1zi͚5`צVZ4p@:uu/K|}}W_WDD] Ml0HRdڵ|N$)88̔uw[/奄Ɏ;4x`}?7G**(18iӦYIo]=57jH1zh/tTnc>qr+eСC*''G}z)޽*[$#ݺuӇ~Xsbbb]ݷ1f̘:/W" l9ӧO[999v%*vޑ|q]I:$''u5pϯ^ٳŸ 0CU||222m6mٲ.b kK 2%㖔C瞓1FfSO= S.\Ю^I4rH7F?@pv4["Wffl%+^ 蒔\U\ٮ U}ܯ_?dܒN:I~mذA}$Ǯ޺'ضm bS򊛣p0k;22RƘbܹ]vJJS8ۮ8y<0pbrv ZL8ƌcmϝ;*ri-Z:VK{1ctQIR=\vG|i8q.C&MO?5@EnUF kĉ.K8N~SҥKNSXB8o{uOw +Sx۵kgձp͛'I={$]eսޫ`Iu=ŋշo_>|Xŋ}P[zv%OV\~[jemNl3g>))IlӶm[k{۶mv5ˢ]֥}=-]{YF%1KJHHgJ*ӧ"*#GjӦM$___͟?hJnUʕզM]oǎNɅ'8wtt?>otQ>zQ^t%;vL:twܡ>}QF QJJ9D-_z~yk]ɓ'kڵo%]tR=j׮"""}iڵZdiӦn&m߾=z|v\;t5jh֬Y%@HvLY6mڤ}j͒;w+v!!!oձcG;vL|r-_<_ۖ-[?SnI?kZW^իWk׼ysn;w{ѩS$I+VЊ+:4yyy/Ԑ!C4|Iұc+1cؕ01bb(=7ntmޚ"ʌڵkkÆ zwt7^z' lW~}mݺUw=z6lؠ0c\֬Yf9wرڴi"""W:t_~EO?UvͶ8p,Y▅4o<}馛ٶI&EJli\f +i&K =IENDB`PKmN؂<</NuRadioMC/SignalGen/tests/plots/AskaryanZHS.pngPNG  IHDR!wsBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxwX6{7 ĊXb7c!DI,%D11c *`AP@i"ew?xw~,fvΜ9ϜyDDDDDDDDDDDDeT """"""""""*.c<c<c<c<c<c<cD"D"A``CDDDTb&""*ѣG %FܻwvŒ3Ю];XXX|%Ν;7o6m XXXnݺ8p :\^)M5k`ذa_>Rw=zt (E'ݻ*\n]S46h@K,XA%퍹s%ֶHMm:uF777X[[[6dQQQ:OWj_LL rգ6>7C>"""3w|ۼy3̙}72 }/_Lxߏv킳Z|s}6m4hZ;vӋTWtt4Ν;'Ώ5J+mԆ7o͛7x9Ν;իWO>ؼy3TL0̵,)) ذa&Oozh%iΝ;rJ޽۠oDDDZ`ffooBSNt)n裏i&qB hذ!p=$$$Ν;ooo\|٠ZtשSݺuӸ/p5q_ѣ`իWqm;wBT*ň#NM{1iiixbccPTXYjFsrr߼y]ի{666hذ!tMSA*CPTwƗ_~ ###رCgm)ss*75l tD """5j@ ԪUK)-[&$P~}aš5ks犟_I\lݺUe{~~~ӧO噙cccUԪUK XZZ ۷f̘!ڵK?QF 3gell,t{ ^LMMmϝ;Hԭ[W[nZnee˖Y.44TP)?eʔkh)-֎#F-,Y" &Ytiu}++"##U>_m}f"N;vL:\v}µk״N]gKDDv """ݻ7aÆ%ֆt,YDTzUP!Wg%rqqj7oDRR{ᰱJƞ={ݻjժ%m;;;G߽{w{!""B/l~Ҿ}{R駟Jؽ{8d|g߳͛1|pիWЧAIM{k+9rDDDT0MDDD:ռysZomرcbbb aÆ<7nZn-ίXDX?ZmGŋ/+o8ydWJ١o߾jc֬Y|VVJ*+V8;;cy]v-,,,>)@T|}}aoo8t-_~`aa輍DDDeDDDT8p@F -?i$qҥKb =:F055EJy޽{E,Tz2 ȑ#Q~}jB߾}|ڵ+W.ܹSgdd~ 333ׇ:GFF%)##8?vXY^%k)))ܹ5N:Rf 8x WWWRJ֭nݻ:u*`nnkkk4id8Azz:ۗoGcIO7壏>9s?~Çlll H0~xqZhѶV^-鍅L޽C Aݺuacc bРAػw/%"*a vQq{ӣGqZ=z4򙙙憥K… Aff&quZ ;w.U#!!As:th?eaaahڴ)]vCRR޾}Ǐ#((cƌ222RIIK ~Z5jFӻR&%%%ٳ*ž?9EKtgΜP?utz^/Ç#** HLLĉ'зo_L>]eظq#߿o"557oħ~ƍ#::XS( Je,SJBbb"ݻvĉhذ!F_<@JJ }͛76"\smNj"߸q#ϲٳ'[q;R 6DǎѲeKovv6V^aÆqoʯ⼦)L:Ν;{*UB۶mw>|||YvUzkG9(U~}3}SU0^|^155Ef \*sSA?~ ///5j*iF߾}^jՂZhccczjʕ+1|d2XYYM6X>** {. e˖Exrg\F tܹXZ)=œh׮ڷo*Uh[ѫW/<|P|jժh׮QfMׯC{nP1MDDDڻ\{\.P'OӧOrҥxqHHH@޽{~J,(w-۷rß9s/_DXX+W'''cȐ!ynذ!Zl)k$..'NJwst{xx%sNm011AʕѸqcL<Gjky *T(pggg'R)u߶mΟ?ggg!...\@hh(?o{m 3^^^ Cll,.\xzzUF'$$gϞ SzJ̽L2by###,\P%}!;wT{3Eȑ# <|)+i)))Z*Ο????RTI]ȑ#!iEN:7o"00Pm$"2t viAttta܃Zq666t^@W\)Nϛ7|Au2={~{Ѩ-icccW^N8!߶ݻmaaM67n̳rPK.*FgKzWhڴ):uvCػwֶ|nx=MMy9y$:wD9:ď?g{{{ 8PѩS<2e8}%23fL~vjJ9-ɣG\`-4qo(VX!]|uVY֭7lؠ6:るQiennnݺiƍkN}Q=ȝ sssq:555ŋrz';[^*a=}4&Lqʣlw<3&7^#FP-[N:x={-W+l27nܸ7oy\XwƥKT{ """ŋ1vXn^'&mZR ϟEnݻw+W{bfeeapuu-0&tuno#F都{jРAsҷj 7oǏo-Z2 Dݺu ծfԨQ8y$f^^^2m LᡓԔ5 ='NetHLL͛7o DDDZ`ffTZǎ+%ʃS*V'*?^vww׸g8Cɓ'7XW\\8ݽ{>\^%رc*1fS 3p;=q:""*>\S) lQPJHH BS$&&ȑ#СC5(r/>### 6 W ǏW^ZReT}?ƙ3g_#228p cܸq8qC51r9r$>Sd2 >ifJ!ʰ"(Hyn`.7h W張lsD RT`]v:u ϟ?G믿"##@NoÑ#Gdy扽̙3GILLɹZjZSSC]#q>((7ncJqAdgg[ҥ >|(7}tT\9u s3cԩbnLaÆR{.&M$7o}ͷ?~<~G1h`e&MTD @ttڲ7n7|Q5¸q .,+WbmTiA\\\{{tԢECL&+ᅬ'Nh k֬AXX␚Ν;cܸqڵ+pM_:}]ըQ z쉬, ]tA޽Q^=XYY!%%O>իWqqq'Nʾiˮ]0a„\+k.ݻ7W-[`Ĉn  *_|_7.>%KL IDAT*WBl߾Ϟ=(mff3g`Ĉ8tٳgXjvwiLʑ%K̙3R v ooo$$$`ē'OD"""jժnݺոqc_]O>73!CcǎjyTlҤ 6mZLMM'OcǎJ󾼕H$h֬BtwwGU+Νg͚iQ̙3GLǢ] 6 ۷/H$q4qD]vjKRt׮]V=i$lذA)Aʁr9E5T,X۶mϟ굲6mڴiUVq0k" Aw#H;BBBжm[}'NĮ]0bܹS-$""*=O"==hڴi{ 7n֭[x%aeeGGG4h 67 KkӧHLL1*V:uqz-11vvvV JVff&nܸO">> H$+Zn [[mÇqe5j@ކڵkh֬'+޽ ###=ʂL;wwEjj*WOOO=eK\p111xLLL`oouI&%~!"2d vgϞf͚prrǏ""""$dɒB=A@d֮]3gn݊cEDDDTڰ[Pvqm""""*ϟ{yƌzn Q٢899i4 .˹,q=z1DDDDN4iS5s4H 6IJJ ^_lׯ_syaW^EgiӦaڵҬ-...*m®]PV-oH 6r>>>VZ뉊B=رcqq\|6mBڵׯǂ x $bccqgΜ)4ٽn:T\-Z@:u Hンgмg~uN6Meybb"ڴiHR\v 7Uϻ RjUjT622T"""8P%;nL>uܻwO tm6W~ztr+V={r{`ff+WqYWWWiOƭ[мys%"""""""""* 6ح 'Ng]VZƑ#Gsss2OY;"Nw)r:uۑ:t(HOOǕ+W Ϗ\.%2&6A7`w1oن wzx r $$$`ԩE۶mQN|뉏GժU6""""""""""MšJ*^qddd .. t[0Qjݻ߿?ѣG 4^^^pqqogggڵKaii tppD"1*V077 UTsl} 0ٳg+VĜ9sM6~~~hժ`ڴiVpB97 ѣx3aprr .] [.F ҥ :v;v,j׮ D&Lڵ+`Ĉpss,^pttԩSp 2y+W̙3-Z@~Gff͂0w\@ƍ1h @޽ѦMG}ի-4hÇt^^^rR8;;B ԩScƌI1cƈ7HPB8;;i{н{wѠAE`aaի㣏>i{ 4Huܹf͚h֬ׯZh9s&*W ̛7!C|}}Ѷm[ԩSsss,^#FI/&L# kرc;vD.]GFݺuK. 0yd@УGСC] .U&oժDӦMsAŊaooٳg<==1`@߾}ѲeK9TRX`={]v)Sf͚033Ò%Kȑ#||||Ǐ+R) J|||Fz,Y333ԬYSLk={sR]d<{DHDDT١ZjF7Qi`7irrrRS}ٲePy/==]`ee+̌وd2$''ŋ5j))*Yraaah׮[5vln_^IIIr5kd6""2XR*UBvv6`w)&yPg7(dgg)Wpy022Bz"""""RO=5tP Fifff rҚ_A%˱gy*^!aԺ~FHg'""ʿ v^M4a 6"""*xC9I;w$HDDDD"AF """"5v%.\LfL&W_}k"""*xCT E"x+++<'r9߿_>Se HKK%h#""r>>{-lق~0773yf$%%~D"K222`mm $''-syH$H$ԫWm[Xt)z쉪UYqb]㵳3:Tcի6m5j;;;ݻ/_uڵ+:T&*-bcc""""5 PIj>|\Rǎ3= ɓ'x 9 `ƍk׮-uuR}w3tuA֭[wIobb"v܉AիSÇ8Jl[DdeeaŊpwwjԨb`رprrׯիWkX6llڴ @ ʕ+c߾}055ӧO{n?s-7o$ bbb\u ͛7EDJХKB=})S^z56mO?4r6l@fmwG1ID"AӦMyCDDDyȐ0g7GѣGVyvvvZFLIoRT5 ĈBO@9 Ja`?|21tP~oydgg#""صk>;(++ ]vEHHn݊sŋ@=k"33ΝOb͚5E޾XrOf͚+Qϟ^z\._`Ϟ=9u/_Dfp}9iӦ8( `jj#GGrR،1Xt)tk׮EڵcӦMXn&MB0R6mħ :cIsw ;v@\\ѨQ"W޽+~G,;wΝ;%VUo>H$|g1c9s`ܹPB矘0aLMMh"L8ƕ+W0}t?߿?^rb A"`6m bΜ9n T*رcDDDDEk2$}`ܹ/~A1mcc~uԁ >P+Æ kܸ1<ih s խ[W*TKPNg92͛7b>cww޼yNLiӦAlݺvѶm[?~իW͛7@NUV-Z  PZ5l۶ :usd7w3^`RuqqQyi+ NBBc+++ qqq? իڻΝÇ+"cuk{B"W^PeZj^+W.}qttD@@nݺo"11iii8s Zn LsbϞ=yѦMt)]tΝ ccR֭[EjX266ƠAT)җ;yOM(MNN.T;KHMM{@,%%D>qPBF2TEYٳg#ԨQ#4G'NPvJJ LLLZO"`…yn \.ǎ;2Qik2$LcBj} oog ~Rl߾0hР\i`cc/^D۶m z튈?DFF"555@LL1xlft5W *cǎ8wq%̟?C Q{qjR8WʋU^zU+.]l v'j+ŋׯJ*eЅ{{{e:tcccdggZ 'Nj܎" ck׮ۮXڶm *0{l}7HxC=I-OOO>R(n^*oԩS011Q;]ZZB9򀕁pwwڵkq Fm\P/˗/<}T zjWΗ\P%u=}kժ},9;;(\pqFmnQ_ZŲwU/_ggjj )Q2335zD}mzĤ71|W^-DDDDk2$ vZOHÆ w[9siiiQDۿ]vjs+zx%3f 2331p@x-^zXoPsnZ~[X277G~ԖQ~XRϹx GԬYS<K#O(S,FDI׭wJ&zA |)?R޿ ѣG<~\51!߯ǭ6U5yunk&||| H > =0)̱_|$BJJ 4h{Mv_3f(vpʕ"[#=/c/sKÆ ˑ# mEGGСCrR(MMm9EOS"xL IDAT~A(R(ה"M~qm2LR w3tyФI<9uvefV:n(|8⢿CXRVRJ֭c cǎ֭[b Ejd3f `ooy%y\XYYUV|2;&RSܹsйsy7oիWjsg < ѪU+)nj/^dnR!qa45ֳgz_|333<{ `,ZHz*>}ƍVZBԩSm۶]!CN<Q+A/e_5A#:v,S4Ek׮EVVV^k=AW_N:7\fΜD (ŗr$eL s4F֭ee8{,|||Xre+K~~~@jjjN:"ױdmmcǎN:FӦMqqqyJJ  UVA*by)m&Nڵk#-- y&+V Q T)NX`૯W_}%?#GٳPTO ?@*ŋٳg\ނ ޽{XjׯׯZYY?,_+Wqɓyn T*EVJ͹HxCE R*&M$ܼySTyzJL&ܹ#ܹsGdzju1j(g?Sptt/KKKV=aj.-˖-jRyyҥK yM[9sagg' OOOaݺu^ڠܖ^*m߾]\,22Re]333A011߫Pwߩm@XlműTQX*MxPjUecc#.H$v>S}cccuOq{B*U}iӦ]/cuggg   +V$@XnPV-Dzž={sssRJ*-!44TeLW% !,,LϹ(X6dgg k׮""""5$!55Huk.4n*5ki}ss<>͛ѧO8;;C.###NNNÖ-[QˆիWQjUt :;;]6޻w.]ʵ\j*l۶ ͛7ѨQ#| u+VuaȐ!pss%^~ 3334mf۷1sL}7UEqȽw={8񕜜,.R(MNRRRPR?<>kE6UPRF("U[(*X"4(_M@U B@=!_"= ǹw3'g|Nǎ?~_|֭[CPPg̟?d,\.] (ٲe ᥶F\\&M"$$___RRR[nL<#Gгg"yyya,X@HHv~غu+=e<<wy),E<==4i<"""Ri#SN(Í8p!Cpuɓ'sw0KADD6l`ݺubBCC]0ap :v쨟􊈈H1-{z$''S^=|A>#"""\->`ذa}@lf5j111L2JMbǏטGDDDj5yĝhJ)("""""R>ZR淿.Zfgi#"""yDDDVӘG܉&šM6n<<<2d<"""Ri#D\駟\5j!8<.4-s9Ο?_d•"""R[l6fϞfsu(""""N1a#33bO2m6N]vI|):Uw}77nS("eOm۶X,W#""";d8ԳgOZhA``Cq 08tmڴ~"""Rki#DiL\@?>EDDDDDʧ*Ҙ//q"""Rl6vء1j;d8DDDD!8<.[ڳg~r-"""}qu""""N1fCO=~""""f<"""Ri#DЮ]Bj}j#""">>Ӯ];BCC?ILL aTgO۶mu#GcǎK->|8+VjV:ꖔĄ hӦ u֥QFaÆ[~[fcڴi󈈈H1-P)d„ mԫW&M׷cv СCs>>>X,8}4;w 99Je>/={,7neNKBB _ӧj*JX]N8A߾}z*sNv?ϼyjl""&OEEDDVӘG܉z8Ty?mذ̱5zhw^屌3Cό3HLLƍ$''ALL &Lnt[YYYY=zE'%44KAxx8ܸq_Ndd$͚5￧gϞE&kիWԩ~-iii1m4, gҥ5~[R;ИG܅&š~UI :III9\:vȿ*oԩSl߾%K0i$6mjdΜ9$$$T֭[Gzz::t`̙^bƾ}Sׯgt_~}ƍǑ#Gܹ31Jl-~Ϗ>Ν;^g`5~[a޽[c4wnqw%zӶ|kR]N-~ՕV+aaa\x@>cǎ RbYooJ]cƌW^4oޜ4֯_3gXp!P0)[R7f͚5pEΝ[XmŊѢEKX,.]Dttto-k׮ӰaC֭[C\\Ǐm۶HHHoltl_~|g੧OzEDDVӘG܉rvC} z*^Y{!7+܈I}GE`׮]@qyrK.qw;xsR5,, BXXf"**c"##Z/F6m=z4˖-cL:ϣ*dddW_0`eZhAe׮]V[/[)g<==f׮]ڵw}"##?~y׸999=zGl2vY1rH6nXhvޭ"Ri6{?4w.yyy:6md8q"ÇwZ[]v5s?sBΰl2 à{u]@vŋ7cիWS 4+Wpĉ}:uTl9j٬YԩSINN&99D˜8q"IIIֻe~i<==2e dffŁڵ+ΝcXV3gqF, ӧO'%%d.]رc^b""eDDDDNcqvIBBϟ/:4rY?b}aƌsn9s8<;'`4k֌}ꫯ'p*;˗SNl6sagϞ]venM6ϗ(,KVZu-#:T,˖_~ɓ'h_bz"++aVp 22:uУGo/~ ;fŝٳxWyWogɒ%۷vEDÃP$"""nݺ4iҤB[ƍLnǾ/==߱cxyy1qěW_-Θ~i4hMOOۛ &tbW^)]ZݩDDDDW^%99m5BÆ |c=c=V_ K o~C:u~rۋm>!; f͚q=9TxBҥK.y%~_Ԩs̟ 8-[T>dZ>}:jR܊4w;šٳgW9mYsEJ׮]cĈбcG/^x[.?@rrynY:thG_|~̘1X,X`Amdza -Iy^jU }W*s;۷7c+|'wҾ2'ڵkԮ#6%-YR""eĉXj;Q/KI c3f 'ܔ3(w;<111@uq6l#<]}73grbZ<ѠA^z2  gq[y`۶m\xXWm;v\/vR{ ._9_fvAJ駟\i#BА!CJo5`@m۶Ν;Ǚ3gJ,cZ㏁-HTTaРA PbYdΝ;ILL4w{aĈq+QQQ7-YcbFϗGpYfaM6塇ʟR^=3gM3mo߾j [6//\244rss;wf*.llڴIc4wnq>PjuVMK/]lj'h߾=㏋L2߸q]vѿ<`/ 0X|9P$''b}f?YO`` ۶mub~IΨQT<-bȐ!4N3p]w9vPp̙3׿i(, d{EcҤI̘13fҗ/_#1119_NbWMwvPPQN"׼8K.5˝;wJ7Fa4ׯoX,0ϟolhu\Ҩ[YѰaCۻk~\c۵X,ƿ/E`8pY:`Z5ZMcU%###Bunq(88!qRRRsCVi<Ofܹ 66mIzz:AAAtܙ_2r-na_"N.|^ֱcG?΋/H֭!((~zϟ===Yz5 .K.f}eKm;,,8&MDHH@nݘEDDDDDʧ//q(,,L H6sL飉nG}1j;d8tq,77b6oLrrܙ3gxg0)/½ޫ1j;f&(".a֭[@`` aa 44U-bЩS'W!"""T;ѝФIZCD|aøͥYf5LEVfZ9s<"""Ri#D TJD\tL _-%""r3}> ==@MDDDj-yV*i֭DDDD.;;!8<.4-=Z􊈈HfXj<"""Ri#DiL\@?>EDDDDDGiLi~_?l6_~<"""Ri#DwDDDDҥKADDD4wQHʹaZDDDj5~߹: ҘG܉f3š#F-"""Rl6֮]1jK® IDAT;d8tY,q]wݥ1j;Qqo… y>88`E%"""Ru, ]tqu""""N1-uޝ;rw}]W&"""R%V+sj:јG܉NJV! ; /?TgDJȑ#5ZMcq'u\LC5ԶmxꩧHLL4ۛشi&M>sjƍȑ#tܙtFArrϧ2ׯϑ#Gغu+GQFԩS|;vиqcyw]HAn4ZMcq'PxxZ!9fo|^r}cݻ"3f @}>9ޫWbOApN8Qxk˝:up3gf͚5X,NJrr2$&&ĉIJJ*-[Oɔ)SHLL$33,8@׮]9wÇΔ3gqF, ӧO'%%d.]رc^b\i#BPxxx ڵt}o/q3gNu\rFѽ{we/_mרQ#yl6|/2sL~s2Ã:b ϕ+WXvm㢢X,Zj)MVV~->>>ŋ/Y띒ʕ+>|bIbڵ9r'|dee_~e&Oljڴ)+VW^~dZ 0 "##iӦ@A>=z}v~_p1n(v꫼+ogɒ%۷|y%Uf`yDDDVӘG܉&š3fڵk@tqʕؼy3a0h ?ڻw/gϞQF 0>e][żwEխ[&MThkܸqKӦMܸqׯݻ֭V'rb޽;}'NH:Ecyxxi`r#TNFUd=}d\; MKK+W5_?޼G_YTرT/B W_-ݘ~b5hЀn;==ooo&LpqW^yL/ӓW^yEc4w=cڧwޥ.oQR,]QFUdСC o6qq24i@rrri &_{5}~\z\9˪&􋔔 µk׸뮻XdIh/yҠAu7N:s8p(Hr=օ ;閜\#^7n}ӄ@ffp  VFEEݴwݺutԉyqQ 2ﶵy..[7o&/^4'  PZL0Kmٲ%={nK-ZwGy]MQTn] ̘1cؿM}i>|rڵ2Mr~g4k쇷, _|AƍP>Sܿ)d˖-URHI<<<111@Ab7MHHs~.u6{СCVZ.)ܗƌSl #ER7n3gaZy'ˣAK"''aÆ{nضm!!!<3;;Vl; .\/,WL/Ͷ{8xuM)DDDDj3y]h[ڿaM/UHtt4jq.^}G˖7ߙanݚ=z\6zhvIbbbz} 9;Jub;v,aTh;|c vPgK.VR 0`@e?Ks9991;_y **ꦅ0ˢE^^#F`exrs3ԫW<̙3f[w߾}=]퀀rss;wcf͚U⹉7<"""Ri#D\_bNSN,^OOOͨ"wfffg1l0[l()a,_\$ݺuYfl6}ᇱX,8q{ׯu~ᇌ1駟̭p"~~gjTTrӤi||<ݺucEC>}8poVKC%''b}wS_ d۶mnݚxBBBؾ}?==QF1{l<<ǤI1c3f0'/_Gbbbs}[f˖-FӦM zyQFڵk߻wRc2e-[,o_|q1f_}U7}U~^`_|BXJڢtRs߹s;w\c}}}Fs^^^;0޽{1e }<ױp_*־}{… F&M-((oXvx :u9/s-&&ƌǧH܎sf7Fa4ׯoX,0ϟola_[rQn]oooaÆEb9.77l6ol6W""""4ȭ>/ f'5Ε+W\[dnݺŖ8p gϞeѢE<裴hFNN͛7gС,^sΕtGI&%lѢ]v-SO<_|q~gٳYd ?ӱcGNʁ ,W}5Q&M?>G}/!!!|wuuEgӟ;y$ErbBi: y/rLjjjcpq䔚<*g<==Yz5 .K.x{{)JlBxxx1ǤI ח֭'Oȑ#7ņ X`!!!fc֭V+o&GDDD)4[}^ ##rסġzf>|Ν;8J-"R͜9>}8u[n󈈈H1MvCmڴA7W$x dɡ^z1e~aW""Ј#ؼy3sgΜg1b_R0 N>1j;fٳ2dׯ_7l2e~""""fcԩ󈈈H1o9É/9<g޼yNHDD.\࣏>ӳM6 &TAd""""5kZMcq'n 0׫W>}p3p@s{ܸql߾CpB.,XI&x;yƎK=f͚UI=""""5ŋ]i#-'Ǎʕ+9}4DGGӮ]r3a^ 󉌌$44x?|Wi9sp1jLRļa/!00zWñ~ȗ""""aܹSc4wb1ӧ111@⌭Z*ɓ'С=zm߾ʕ+o*ӯ_?kƍٷo)))ԯ_&Mо}"~GN:wA֭ w-L߿6SNЮ];$FDD}>Wy%q˜Ua͚5gyrlْx6mDvv6u-Rf׮]ʕ+\rrMCA^s-\ """fc߾}K_HH1 ڳgo߾ŖX, *#880nK.^0"1믿cǎ%n]tĉdggm~[lMǕekZO?{\ztfϞ aVZ֭[9x -"11Oաf IDATӧYb9{`ɒ%;wƴiӰl;w%Kw^>sVXӧ>}:999$&&h"<֭[Xj9ƚ={6\z{Ç駟'70o<_Nrr2Geݺulڴ +Wɜ9sxG8y$1۶m3-^rssy7c޽ۼ **~06mVx"##طo;w473f ;;K._eV^xIKK#)) p6n 8rP̵kHMMeܹ;vkyfK>._LVVo۱c 22 .Ǵi8{,˖- ::h-[ٳg6myyy\p&gǎ\z,._|_~͛XvܹsIMMڵk̟?߼&6l`ƍ5Y`IIIopqV^ -[/t̘1SNܹL+I||}Jm/""BVZ,_AѴiS|||]v_V3S:rtؑ`|}}iѢÇgŊTNHH`޼y<裴j ر#/?Cꏊ*SZq܈煈Hyi#DiL*iI \ؚ_vun^z4iҤLe_N^^;*]vAq!9, qqq>}\#99Jg_t KϞ=K<ƍ>>@BBׯgZ{キR1:[BB-[,APPŋbԨQjÃƍ_D]xxxM}"""Ri#D|||ۀIǛ[hᴸRzEWV+͛7mÆ ώFMݫ<1cp!1cܸqd222a„ 濁b͚5(:Hnn.,]Éƍpu"##i֬=={,2q_ٿ]0`}IIIELL wٌ3\57o^bkРAU-#99!8<.4]A:u pBeccc;vtj\UYftԉ;SVR59r$tؑUƩSؾ};K,aҤI4mǃ>Ȝ9sHHH ((R[t:t̙3Xzu?}QN֯_С~7#Gйsg1bD`_>Ga֭=F =رƍ""UfqJ/#"""Ri#DԻwoݻ-gs;=paN8sl_hr6k~bHMtUj%,,/'|S!CXۻ?=fzEIKKc˟9s yKqƬY.^ܹs+3իWb7i҄|Vah"v튿? 6lݺu1~xڶmoO.]vg}haLOOO}"Ë6;Q 1bSL`ѢE;a;vpy\dq˚G4o޼zsϻyup ,ܒqQA?صkP0A\ޅ+ҥK}N?>>"(,, BXXf"**c"##Z/F6m=z4˖-cL:ϣ4l2~qS_Sxzzͮ]صkW6dfy???rrr8z(GeٲeܹHcȑlܸH޽y9lEĝl6 w"""Rki#D=~pAT넇L4Zc ĚަM'NdNkk׮fN{W:e˖aݻw箻 صk/^x^ʜBeРA\r'NTE.asٞB̻i۶-< Ǐ%ٳYf SLrr21qD=~˖->>j_ Xd tL8g.^"xC """;yXׯ#66V{Iw%)gʕ?󃽽=Ν;`ܼyyo>{ܸqǏ(ҥKyN\\5jT1r\...0aq!4m=z@׮]ѹsgt 7Ե<-""}ŋ@snܸpuup=Z^T8o~xx8&MTzJsvvvٳg1<~Νr9M6!88g.sf˼ypBin݊  !"f웚[n8t<<<_>>>X|9 00ϗkԨ6mڄwJ9扈*C&aH!cbݱ͙3G5v۷i&lڴq~4h=z4.0'O`ΆmVZEEEȨt6l@ DGGK3ӧcʔ)05ܯ'Nƍ055ȑ#3زeKnU^g UGU<+++4lذǗ֠AJIJJ >oV'''ahݺ5QTTX̟?Nœ9s6 }a̬Fu;&&7oD&M4GGGx{{cӦM8|0|||pae`7URĎ;0rH'""Z}2&F9]:w/bؽ{7_<4j=zԩS|Q$$$֭[eAtpp2.ӧOaff;wVxw\/((_|}Xl͛={ĉ8s ^ RL>۷oǁ*~~ᥗ^R7f,X׮]C||vFXxNsեag>x(((;6nhx4¸q,dffZ5[{СZ׈#0sL`Ϟ=P2xbaڵ *TDFF(IK]۷K7tլY3>}R>yC 'Pn]>|nnn*JNZ/,,ă4S3+BF53\z*B&gJ"""!cVNYXX:T*1vXw.3yQ:.ss %ԫW ) i'O̙3ZP(4i船sV8Ndйm*((ap1!**JJoN^hBzᝐ5Wzll| @InN:I`oo"|^tֲ+ Ϛ5 ơZ 666(,,ʕ+5lٲrYJ%~'yVc IիW3S :x kܹsc8.]6mwmqQSQ$IAAr֭o߾Rď?(ckk(lСtrss1rH,_2 2dHU?R(;v,+++ݻWZ!A(3؞.]`ƍjOOOG۬駟.]KJwkkkqテL&C|||׿111;P\|@Ix{{cŊ^zaݺu͛7 {{{j (& 曘={6  /Qݾ}[-}Qm> &5hh"IϙkDd(ׯ_GV`nn\333CD$G""""""Tnˋ4&q%X[[YDDDT[d29afFBa0FP`ݺuQ>vF gvQ&>j1a+'rrr :""""cIYfq^"""ՔJ%֬Y>j1DQо}JGiӦ\Ƨ~? ѣ#//666\:u{RիW|$HDDDDD+]%51("&&.]ªUtrn)))e QE/_DDDTkCDӌT֭7@@,,,mՆ^p-Z 8~C!#'"Ξ= =8r93gb͚5*yT*qaxyy*}2&zo3faooAooo| //![n-[bӦM@^^rrr ˱w^;޽{C Ѹعs'd2L@}5_>}`޼y;vɓ'^ 2W_iy`Tm ݖ>3f`ƍJv{kMC刊Š+ZG e^먪Qhba ==]J2sL888T<}ߵ}V TDGG ÇP2})c̘1ϫ]dZ;Cqq1SQQQpqXZZ(p #)) Ά= q5̙3wի+]-% ˖-ږ P(`cc?uj GƖ-[qF|WE&qi%7hҼys!11GOPOJ9cbbsss=zGP; ӥY(((qylٲG+v^QQF_Uh;v9Ʃ Lpj1Vnjj 6`ʕѵkW>|!-J$;~omhY[l(2dѣaffGΝ;ϫmҤ ͛3gѣGA~~>1frz&effJ]ԩ֭[cڴip3qeݻrrERR>s5 =z7l|\|ұR׮]Ǝ ZےjpgϞZO}ڠAtRIU^5|8վD/_;wB|WBVV9s 33SkԩSabbE!-- yyyx1йsg$''ǧ̔`K,Avv6'bMƩqƆH!ca[:f޽{akk AAqsbՒvj0¢ZCFݾrӧQ~}tU1Jfsԯ_ R?W?xפxL777lݺCFFvڥv^xx8A֢E ]ϳ<~Ν7cǎO?a011 ~m̙3@`# FC˖-!bQCk[Rѥ jJzSjU^5)}Iq}O}޼yXp䄭[gϞZo ) CE!((HݺuáCиqc$$$H3˗/b4j6mB߾}k+JK.ej5yȘ"..NGB'|SА61zT@ T"ddd[ƾ} " Q'Nƍ_~T-[h,2AfƪBÆ +5hРƯ AAApCرcҥ  ̙~Ik]vE߾}˼߯_?9s`jK&Ii`*;XՖLMM1rH}%ڒ*j"J#vQ߫&r\z]^|վ\Ç#''fffҍd27oI&Z9::[tݹ077G@@@AMI}Æ ɓ'6m2pTIS޽8[PP d#GLmСCaggk׮!>>ݺu!ꕔǏGrr2ryj?j(5&ì///`ff>}ĉݻ7̛7Gx}~饗R^4l*-O>d{Rݺuq}Ζ^׫WO8k]TZ/@v=zePQFZQ ߺuKz[u333)8(q^y\%"""7yȘ<qQL4ω={xݲ%??; @^^t  V_S/k֬瑛 ;;;i*fͱxb;wçiVzfc鶤i3wl[j޼9fݤ~^^>UR>>; ԯ__>UJ =yR:>U^177&n(ɓV""""}afvdjj0O?e!ۼy3֮]:Z7D(QU :%O@@AA\777s1KmKe׮]7xܲoߎ5kRz&IPXX#F`Μ9xWann.)SA.]7okfhԩڒ c"66L[8p Μ9x&fkk={Oz&ͅmۦ1ý{4}v|GYf8}tέ #m4tPG3giKcǎŋQTTk"((ܺRSS $%.t6mH?.]B6m4_*өJ+,,?M R)`.uqR*F>}j$!CD/-erV[o͛7Kռ۷o]vpqqQV^mЌ XvZ^ }<؝%wn}6W_'OMjyr)jA4vXիW ޖڴiɓ'qe( L4 EEEpttܹsuyk^mll4?}s$&&|M}ccc5$ȭ[V8fرTMDDDDDTviK.!99Ym5kC3Z_5,--??rs@tt4=gΝ;h߾=(hٲ%u&= i=z4ȑ#HKKS+Gkoo$Ժĉ!b Xڡ}<˝:u*DՖ1prU ?ݖVZmۢZgϟ?ѐdښl^U?,*mٲeENNNӧQTToVcK.Zo߾}YfPEEER$U666(,,ʕ+5l2qdx79Éj5yȘF&MBfТE R<<|8BBBpڵ~}^Ѷm[|wt#F`ضmN=6lܹsDvv6Ѷm[|ZnmPӮ\4dddh/JRzfCqq9999Aj{uwwDž {۰CN0c ;311;P\|@Ix{{cŊ^zaݺu͛7 {{{j [ X~=pU%ygϞ`'@-[4tDDDDz>A2FDU/AAAaggWJRLpuu}nR |M;v y'OFXX!"ѪU+C.`nbP(믱pB:""""`^qISeؿR qrŋ9sꫯ8MD xzzu^2 gj5yȘT.oS-9d876tF%33&LG`bbCQϞ=h"Сi}!++Kz6mDj!K"dT"""ڎ}2U٭*'āR-Հr!CÇ{ .nܹ\_Er\///CGRC#DDDTkCƄ/FX {{{ ?3  k6l^y%g6m#G"&&-2p<111i!""Z}2&UMWϞ=9xzzs&"FSNԩS  J%bccѣG$""Z}2&lQeV;%"""z<~!"""d2h0}2&$ƍDDDT)Jlݺ}"""!cn诿 HoA@N!""Z}2&LcB]|Vm۶5tDDDDz>&P( ( ,Y}"""!c™ݤѪU0fԩSG}888(*"""#GqQn"""!cVN...jի Q1tDDDDz> vF~~~HHH@rr6k,CFDDDT-J%v RiP}2&(beO/+|lPPA+qTkhTIyyy2iLT*qU+!"">JqIM4- BUUSKcjT]vÇakk[<QYbP*?;"""Z}zQT`wpAt8*f*JoLab#GDDDT)Jر}"""!c©ѕ+W*_E!\]]!""Z}2&&K*EǏ7t(DD&^}UyVc I9s0L 8q.[EUϬ/(( E+ DDD`РAprr ///|嗈'Ou:{YDロ[Pm8<DQQҲcy SNIYXX@$%%ڵk8r ++ U/<<\z޽{?Dxx4naaKKKܾ}oƞ={dl߾ڵR5I&AK.o߾*ܶƑ#Gp̜9k֬tDD/LSrQn"""!cVN>HMZf ݻ-22Rzhڵk2vX:u uҥK|deeA.#&&x饗\ǏsN@n~kRXX///l޼2 HLLD~~>CiӦ|2w6pk֬YmѱR`С><< B- '"* """+yȘT9(zJM5SN5٧++v^==_e|g8z(b]rtJ`AL P(`ccS?ԭZѣ7VrO 8P1͛7HmMEP`ԨQx_JG[oU|8m۶Uh!"dddT 6A AAA@ɀ1eʔJ/Py ܸqe3f e˖2999 >zYYYaÆ> |0|pn(**Bll,ϟSNaΜ9prrҘϼ[[[Lv_}(кŠ+: "zL&CΝ!""Z}2&_{5]ؽ{7~mJgΜq>|8~7(ꪞ٬Yș3gGoJaĈC۶m F:x׮]尲°a4}vKXi||<>EEE.H C@DDDw󐱨[:X|9n߾cȑ/]yT8 |A.G@PP:d֭[x ɸ~z( l۶ @I~mmjQ($F5~IZ m۶EAA|}}8?>!^f!g8qbnhRRRtY);g(ɝ]'aT?qe˖AE899O>^^^GQQ(bҥZ۷48?k,j=r\Xr-[,"P*ذa۶mE333Q&2LAd5=E.ė^zIPf[h BLLLEBak֭[Kq Ć Vh9sTƄ Db޽YߢEDQQQesKKK:}TE6mڈnRv;;;i R=_|y\3_hnn.gff&ZJk7oMNNxŋ~DSSSTbW:D[(@ Ebtt2~'J*\W5cccs kWqݺubEb\\\?o/R)?^T*Hoj\(+UF/P_lٲ;wģG}AгgOL0¡gѣ2 :88(ڭtt]=Tk kװo>*qwwDž {۰CN0c ;311;P\|@Ix{{cŊ^zaݺu͛7 {{{j (#,, W^PS|0`,XrDQDbb"<<[.cΝزe bccmmmm1bL0={꩚ < s-88Ɂn"R୷ """!cR-ݢ(ǖ-['OH%R&La`eeUՒ=x!'NDQn]%3-[0$" GGGC@DDDw󐱨R˗/#""[nEzz:4%nnn0aƍ''GKz4&D<155BPd( ,ZPiſDDDDDD1xwww6???L0;wJd@~4DDd(ׯM6o3fW^^` 6lCCDDD1nL&ڢE 8v4 ;%IӧOj*l6m* 5h!c%%%a9sfYC2={6ӘIEgL}:֭[#G40o߾pvvֺMPP:** 'uWx رc:tAP(UV+\K٘4i 666{bؾ};ڶmkC(7u)r}zz|cǎǏӓ3,yȜ XYYh?K>vdt]~_,yAk˖-4h߿_|7nDBB222t2dpAz-333sN( |4;,Rאjժcغuk߰aCrQg#kN:M6_3D}"""2l(SgwZ I<W^]6G1wQd._ &@R_~x"ƍڵk888`РAػw/BCCQn]ǵ~A߽{7cڴi;v ++r+[oǏ;wΛL}-l-Pgɓ޽{fIWܹsx嗑oo"oV8vEDB@߾}!"""62]/ !!A£Gͷ#V3vXdfϞla۶m/r_ ,0hL/^Ľ{кuk4mT6ꑷ^|EtػwoeW>{ F˖- {{{cҤIsN+4'A?J%-Z6m|߾}ǏGÆ akk ,[\OѣѣG4lذkX~=멨jΝ;accxXSpp0DQ |||*~Iat Q[/0qDNNNh׮"s􋢈~:tӧ4 yȤCL9  ɓENf?P߾}un[:_~-ZЫ? WhZIyyP>J0heeU2B&O 3]R",, vvvxwwz9sAAAxwWQǻ`,_\3(l޼^kJ%pqq DFF"**  @rr2U\ܺu ~~~ǪUJ]Z,YDJGGGL::7oQFaӦMܹsK'**_G S ʠѣnPazo:7mI[o 0j(|g8vѠABU֯_ӦM'''7ob޼yغu+|||pbGWO}:4iիQF^:7niӦ9P Fv+Wb˖-z]_ Je($]Gˋ@ݺu\-[Vd 8{,j֬.]h&88@hn5k_~EQ^>^]NEcǎrgB@˖-e صk~AAATKQOZff&.\(JDEE! ۷/NNN֭[1h XXXo63|޽rg3{⋐$y, 2zh^z mڴy-*5TjLLLb,ׅ:KzUJzdffԧM~ IDATg?[nnnزe zLT*B$nnn'ڵ+>zҥKnHOOҥK3gČ3[.6n܈޽{묛̓J·~64yȜ9СCvZXXX#%IBJJ 㑒"T2e >se'oQ-Zĉ *OȟL} >>ϟ]+ RmSƂג7FnpԩBRF(zߛ:I.]fJ%֮] "늍ž}$)0u QakkQF(xԹǟOSPnnΛ7GKF=:uyExטÒLfһ[h&XZºAK` nnnٳgѼysep%4iDk]KQwi;ڵkΝ;kn_%3oy]:u QQQqƕ\3^^^VJ%-[ ,wr)S|PKR\9,YR䱑Q(x7!"""6'O 4o޼ԏ߸q{tquuڵk:]hֲ5ku>A@fNw}TV2mڴA@@,,,p!kAAAl@d~޽{dRH`;SlY;wF "6oެo@\z| ={&?[($&&KT )))sXtOOODDD/^\i?#'':޽{޾еC_Dll,ڵkÇ0b,] 6lЙ2S{iذ!f1}t… pBCÇ3f aoo5.+++|P(D^.$ 7nҥKᡑ9`Xx\wBB#$$DgdDQ֭[!"""6ڴiRQz%Hn:EQjܸ@rtt233/h=hB ]x%RVbUTҵkפk׮I*5[@Թ́$777 988HժUxf͚Ү]߫Wbc3g@jܸ;vHO.OXX\ٳg:ɓ'K-Z/(EH۷֬Y*c)j TfMZ~JZr֘ߋsѺ`7RIckK-{Iuԑgggy r=|>'O;^c̔o֬Yzck&//OW. ֬Y#N|ZVۺudgg'amm-ըQC#ҩS4͕ nANjԨ@\?V (JW\DQ4v(DDDD6U~IRzzzʨC3vX7N^*)zs;A W͛;U˵k*Du@Ⱦm ;w`Æ xѨQ#4lF@@]]ƍ>`~:@#4III)u i;;~ztO8p@SPATTOvpttDΝ1{l;wݺu ڵkѮ];>}OUy ֭[CDDD&m2'$ A$IA~|<==ТnݺHHH#Ҋvٲe%f?=!C`aa!%5 ׯ_'|r222舚5kf͚Ŧ4ٳѴiSkNT~|Oʴ1ӧBCCKl2 6?ƸqqFFWm+[H7oP`Q(EQN'R߹(x[IVUǣV_Qۖq9Q*X|9P(xN tq99w?{zNDQŋ_Ts޼IVV!"#'2$$$ZƖ{YYYr)))<~yyyEQќ-\NMM>y$ >٩!7*>}Ebb"QѓÇEJR'!LJJBVVqj;'YYY8{,_Ss(JIbbbω:_w^<'ϾȿIiω8;'?{}ω$I͕sR8;'333S>NmDg;'~]=#`CqXss;99C۶mõkOg߻wŋOgϞao=?~4,]@_۷o?odd$`Æ >rrr`[eѣGq ƍ Q1o;w@O>EJJL<|֭_ؿ?`׮]+V@JJ >}5kd߾}_U>'k׮œ'O˗ȟzǎOxuo޼'D>y|NbccR0o>>0a,---G=^zq|7EAp nTUW֑{ϓ'O;w ]<'K,Aff&h>me2l[ !ÇGn Ipm,]Tn>|oFcg?InCgyJDԮ][\s>'ϞyNLiIիA9go^i$.nrJ [Y#d8X~=6mZ2jԨǏ6*'/*m̙c0~$"""""*._^'N;$I±cжm[,\yyye)*mʕ+XLbЈʅ$I8w%"""62uvw/^ĬY`ii,̞=۷GDDDyHFFI&K&DDDDU$I{.#"""62?Skmms Ip5}#N`v#DDDd !"""6r۴iH\E?Zh_~ 2dh0 FE۷m"""2il9)[: O?իWѿHǏC]Ցݿ!C """28y\ ؼy3jժI6mp*ٳ|֤IǏ;"") lIc̉AѣG=z4$IUG}w"&&Fcav;v,A(RcQ]gC4iDzJ` 8nnn <<M6 NLL4UN* k֬R/Jm2'7o{g'"&&W^EϞ=1~xl͛?zΜ9L\jPN}J%ֶcy)3g@DEE֭[ $%%ťLɯ[nEI&!((H-{bؾ};ڶm[+Bqzz:222;v,u= j*r=P(9r$ȤCjÕ+W0k,]("00 R(r 4/k&izj^N>^zF.]{,Gƙ3gٳgc̘1rnL߰y2ו;wvHٝ ///\]z IDAThݺ5~r͛8|0`ƍ>}$ٳ'-[88;;ݻw#-- -[ĢE;v@VV}>3DQ?Q C(/+n:̙3ś1B!-Z cAORprrž={ /.]_[Enkmm]G)LF=zaÆHMM޽{nm_0{"cUv cŊe՘!"lllc$I† ЩS'888F۷/?pbL"* L>m"""2il94&*G}dmڴQ VU:,ܕn]QZ_}<7((9ƃЬY30A,Y  J#NZl͛7ǨQi&`ܹ~A=!ZoSXXXǎñcǰjժb ĉ|ŋqElڴ !!!לR믿jPRE$\z[  !sbnif*ҝ} VvGaݠ~ž;/3X)>0l0թS'9'|`Ԯ] umڴ $K.hڴ)K,c hѣ)TM6!!!A^DDD֭[qƕ'OCy&~􄯯Ή<.];wB|O/tyL06669s&>C!//gϞɓcذa8w<`ѢE_!ϟ___8::ѣG1c"%"*$I|2Zj?dCӰV gܹ1c@$xzzb…u,[L/}ÇѠA3gĞ={r;`j/ڴiQݹsw=͛7_dbƠ PI&zףOP^=xyyL\p666P*B@@ڷo̔oL6 gφ [lA=>J___H@y---ѵkW>|åKQXt)`̙1cuƍѻwoCPLJm"""2il9UNZ曜Ȳ; 99nnnضm^J%\222t?O … ; /2֯_Rۉ'pXZZbĈKԩ; RuVwzඩzggg:ujU%++ ۷o3L˗/#;;Ϟ=CFFBCCѹsgT*a֭9r))):B̙3uw~ZS+  ק7-- #f̘i#"yȤC愝ݤUbb"bcc$'';41qD\xVVVعs'ԩ~z$IE.sѹ5,Y# ׿вeKK0qD*ձ}JBܺu WHJJһl5oȑxQg]OQ#wЏ;LeyyyaΜ9hӦ VVVxq t@ @~j#]»wK9#""O)iu{ϟUڵ+ӘQ;""""c;I m۶ /3ݏ?(l^|9^{ Fk׮!)) ;v@vǏǬYJ\nFFvZG6nݺuj5\|Y^*_핉t-Zkkk̟?/w4@5kԺN&77W iIS芻$70P(Э[7>KDDD&m2'IҥKXLbLO?___#GÇGDDZj 3Aڵ 鰳СCn}vdggOUhРwUPeխΝ;˯޽[uMhR (Ip"#"*O* ֭L z-r""""6vvV^u㧘[huѣG#66سgOQ ƥmmjԨ~aشiݢE ?Xh N:i-CRaܸqP*puuŗ_~w@ %GֶTNc3tPTV̙3&Mȯ;v ?W{RR٧N9a:Ͻ{_W_+&''k/ RWyDDJDDDDdJ!s[:g`8|0 +eGzz\#rssb /Y""*(Xt)z#A(Ν;# @c]^^鉈ŋ5m .… b̘1ָCP 22zBxx+N$ܸqK..\ptt?>/^,כ Y/>,,,W_CDDD&m2+Q]JKK+v{J%]vMv횤R* B.HjՒԩ2yd_ ի̙#7nC8ԋR}__}aaawiѢt=cwvv 7[ZZ<_Uff|lf{Y>huх>Ӛ5kJ{VVVʕ+'y{{ZXXHիWAHk֬7n,´uVN.ZQF SNJ Z w}'5jH EDD}*?V (J7nܐDQ4v(DDDD6U~IRzzz0H>L~=uT4lՐuҥT~rrrO<{r_~uߏ'Oʕ+x^xƍW^yDeG+ƍ7p}9 ^اϗ!޽S:u`͚5 $''Z믿?Xg ر6l pu)J>s 0˗//2}:w"99ժUCo`ذarn T}n:͛>}/@~0k,Кӛ8$̙3h޼y&1&"""J!s"HT(5kģGTddd^(Pٗ*۷ѼysX[[#==VVVHߏDDDDDD%S~Im :(1x N\@DڢE&REGaL}xL$I 9ʉL.Ǵ G"""""iLjDDDdDQ!"""6vvVVVVrssC 9 #DDDd ACB{3piزe +z*1c"""2i("88m"""2il91nQ}v8s T*1c>Cbb"`ժUpuu5tӧOs^"""2i sl(I JJ JR!¼dg̉A;cbb̙3d CUVAc0I[n޽{x...FcADDTI<*d)UCVܼ *ޢ6\-o y"rUby"*JQ(w`$ (!OW%Irv˞=%>ѴS@``Pgy~߷PPl,U;CJ`c{kK8Xʢĝl91Xgwll,zȝpwwGll,t$aǎ6={uօޟ3g+> """rR`̜9R\e!='ICZ2VnIKvO|M yi9MGK Ue+(GuP(DDT<$g"9S,%3sYX0^3\BbzAbկpO}iy|yޓ$ #W\]kO#:LQޙGU}g'{BaG( ֵBϣ*@تZۂU|\*?[VET\E5Ȟ,}~ܙ!!d,pޯͽsIN|nI4I4hH4h(E;o_#IC / %%]uL4[ٽ{7^xa<*hTrrr @ ӚJz@ D8T:T;T9=T:T9n`̘1C 3g+& ;pm @ 8. Lk]>-6˙tK\rs7;nULg";DI -5ΦԸ|Ը|P錩VHN1iJ)c#A IHٯ_?M֡: ].AZ'x!AHAA[laԩ=AFTrt3@ЇT8<׹)7\{()`}ڴЫbآM#ʞD1Coye5&~v$CLb__aՑnђnёfuPDw IpɄ+%h^xn&֬YÔ)Sغukn7k׮cΝTTT IMMeܸq\qp Xl2~arrr8vX<)))x<*++X,M|g\|rСVU/aٲe ;v`ǎ|tZ[z57|s***:4;L_x饗)..vĉk7o^>SQQY~=EEEF&LwUW]թųnl۶ .@v  6767zJjuiDf^Ǫo]\$+߄"1Q*kJT1~NFEFEPPH($ $¯}DI$Av>6υlT!d@(? '}MxA< /dXFl.OEvRן ;s}#NV PR[7k?٨!͢##,G =*fvA\ȗ@'VVVFERG{/7n[n&0 h4 ),,wgժUp qmϖ-[p8̘1Yd5B^^_|&M~͛z BAjjj{;Kn;իWG3Z-:.ڇ|M{1^}F6Z{2}@n6eӦMlڴ;3+V ^¶,jwouyM ٤m%լUI¬Saҩ1G*L:fV^BVb(х׆;=gl&sfdPA=lfP^?.o电׏hrscb4ϱFvV Ť [AUN/UN/K[>רQ.Y z-"Bt#.bwzz:G!??u|7~uEיƺu馛 2%K0{lp:lٲ_|z?;>rxP(?^`1ݽƓT9&Nȑ#Oڥ߿(N/\pl۶;z9s&}J;o#FPSSÛoC=4i6mY:g<W^y%=u1vX\._yYr%ƍiV@w-t5 ٳgt3@| rg%Y^RW1%zv6%  j5 z5  YE4?vu8ď% x!6 Q)~9F@Nory`Ҳ3:\{ܸq9rRvu~ W^5Tư7Oؘ2íJ .?QW\W\-[ޮ 6pW4{7ns%p} /+W׷[o3gN4 hL&җF˙2eJ}>CRɠLbb"?ϙ3g^z)vc$&&v03= }] ȳ&.]Jii)O?4oQcϺ& ꫯr 7A~@ cANԹ)EQM=uqM=z!9?j3rSTfRVr{lb]`PlԐl%5$$4QQ;&Aj3϶!23G IDAT"l=~@@L3Q_;@5.F/ 'tzqyvzuko8a|!/@Rjeۢ$= H2?@V^D2"v_q<lܸ]?c I'Nluڽ >ٳ'7` w(=vɿ&L6)SĵMv5A5[&b;q72d;|{M6QQQANNz+w}wH_?>]tZ4ח>̳>  GHk3"?S73͈֭ݐ{wgyl̙3P(?s=t?E1k֬6ې_6oLQQJsWE`0ȳ> /t7ロٳgĘ!$1f̘3 @ l.ǪT(trZj]ֺVONͲ1{\=>ddDu/Nz*`׏p{xz_/H/'>\YC"؁ /BlYTaoBB!IZVDRex_ 5J &V%/FSuwM;#I FEVPz?፾ѯ_;3!6Xw4K$Ȱ(bxd;ݬ;#zcٲe?~M6qmO|r~/M?/~k-,?{,)IIII.;S=QjmYDD!^ϵ^ ȢYzubww{'|2b#//kײ~zM֮zOG|>3gd֭t@II /"~)۶m#//YfQ[[jr!/^LQQ:|H_3F$͛?b_z L&6ܹsYf ?|;Z]~͖0`#F`߾}l޼9f+̛7/jYT*h4l޼͛7ُ^|Env|>[`0xصkvb͚5lڴ@nt-[ I=ztO7C xo,ɱ*a cu|_hTrtxEGY+/b58:!  Q PQaaF?vǏ#4}W CASu R1,*,z56kK}᥽>=#I juܪW30:7n_׺d(ָ/^_nr\Rl 'Y)Fr l$'H?A\nFʕ+ Blٲ 0}tޓ^Çyf $/k&Mߩe֭)X?{5'iK^f P9s`6#sF\fgg79oVVw_=Cl6 9x < ͋Z2u***0a?uT.\fRgyV;ݰa?w6l`ɬXAQWW}dz>ʕ+/n/tGg̟?ž/ٳYf eeeݻQFu,ѣٷo5zϺx ^{5$I=1͔p=x{=nVZ-K,n#337|ÝwɎ;kE/_~IxGYp!&'Np=˕Ӑ@ O<ŋ{ @ 8PHqOZNeˢSUG=VV=-ifGf B!l>9YKSL{EzYܮi1!@+HMtZI1c>^M(`KϏ;=z4?C}ȑ#CcǎK+Ի̖3G5,].˗/]on:㏛XpataJ .>`޽~;:p8x'Xd <@܌ PZZڧGPpwn@ nNV:ɯpp '|m$“$Iťm-Edʹg%ɰȴ闠Uڸ'{(PPRâvdEp?RlR!jԐmȯ}GUOEnёaՑރ5Aht{k _v7%ymb>^}=xA[bR}oՓn`rss}K8w\yƶ CkOUU '磬SulذP(ٳ >S9BJJJ;o 6f͚f~A$fϞG}HwޞAɲe˸k:t(ٺҢ-VD?җf̘z K.m/%&&R^^ޮFξ/z#~- JJJjɓQT9嗀l̕ 辝;wF .ZA^}U,X' Aqz9\H*W#+1ݱxjDAMv.;QOv.;ڠ鞨lOM-D<]C.5Ggn/HAEdD}X/dCu&Std::W(oq# w\.cUdcWq J9)N52(DIsDwK/jvmvmфeUUU8NV+ 2;"+Wct3a"[MMMӾ'q|Gh4f9N^uIHʗ^zիW7?$ ՊVh:ζU4 >(\r EEEܹs9I~5{~Cq2 usrr4iy4`QwvVVVhrZ3wDv ߽V%%%'N4AzciCfhHNNnr]AFTF-LoUXK^*EBB~erZl$xdd@,Oz̺67ŵ)i`P B VU+kTJ%:ՊZ~U+P+ TJ RBPk?qe8!!(q8 0H0^B!y ɉ+Ë?xAy5ǃ}.o'fB(xyO誰SDif-$SׁFrR X4rѠFݾE5.YEaU#Abw~eD0DtbF,:UX618ȐTf$K >hD>9zh $$$t5LZ~HEƂ)QM`ȑx<8$]d̙ az4z /lW_}+Vӝ:ﷲo_ŋ;v,&Z_[ni6yoV)"}IsW7[f|M_Ύ;ضmUUU1EjdggGFCAEA:2A!OF*Ϛ5{ ;v`ĉ·[ Ѽm!_Wǥm3i ebd`4E?HqI5]np?2E¤ /:&NQĤScҪ0^# jL p8<~?7`ۏVN N$jF;.b#rl$F׃R}oNdH!iM5H.U8VXcN \Tb40}Z/m_R08ĵ}3@Э\.ƌi:Clٲ.B"caԩHD(b=.veazl̛7/;ᅬngĈ_jVh)W_׿uۿS+E믿;SI_?>>(>z{WAAo [wWã_{e͖DGlSz 4Ώ=Nk8[ZD E^ryv7srkHn9nbw~ &L;/Kevẅ]T}ڈF$$$&*b'E~_Xj!RIATsǂBNo@]>j\rr*7CK#G^;8*NQ89R"Two,JO40$Mj oH4jZw#I   gg7 8^hJ'bڊ^uԸzot5B4ٻwoc]-h\y啼W bCh}VBlp n(<չԲBpZ@cFMvİt2, 0Y۷o'߿?8PLMmuϜ9Պf3>hP?^w 8cǎ[6%jDg ̜9Ʉ/ ; k@ Թ}:a ;NcMrWn\n;nILAF9+HUWˑѰ-@&L{G禛nbƍ7%K0{֭[yx뭷.oGk&P_~وS9ΦkrG^zH޽{Y`<III8N֭[wMrrrTVVF&ŴlYV=V^7 ܆p r-\zc~/%K_?׈= ҕW^i!k \.Wd6ٸq#ӧOÌ7kre`/~kBkў7>sm| ֮]gM}}=+V; :5ߺ!j~9sm6L˙ʯnb@!nfXaJW7_?9`0ځt:'Of$''j7pA@c|嗎W4: IDATL6m۶j] w}wbGUg͚ő#GXv-.;wC?~/;7n$??ZV+\z\s5QjzUV/FI..@_qXbQ*(!XDf#iw){HD$^9|hec1HN\3լI'J<)f0|z3|Q) H60 4 CU.U8Z) U9^Y^e(pVȈeatA&q` $I"٤%٤ܳ{cȯpvUħ}'?9@u,)Vu(,,dԨQ8$Ibl2nG@^d ~8I{}dd2DAAAa0 Æ 5}K.?gQ s=/h?@ 8S8|0h4G. }P(Duu5IIIUt@ ^Bv{K_ZǾy}vva\8QK۔'7MоeY!vwP(DK^],w_)Klt9Z,d'hnH2[@З<@jl]i>JFgY?@vzwp?wƭ/N:"G:rK%{ժUQ_~l޼aÆyބ ظq#wO<P?X,x4UqA}}=;v`ر=ܚiD Ng"oNڦ-[/0=A+@ܮrzUxbBw Z.ݢehzif1h3; Qp2;vyI3B '"v$J^-3JE8mS }2;Oة}c5|s&/ŤalvB#j8s ;0sqN^rUN"۬SiuI|nذ!s$t7d|l߾G}5\/~F񥢢 PWWR.sK/AsuqM71i$9fYhQO6QAp]w @[ E:9b=R %Q)jPY$ZCÉ{ K7hԴ=JD+s;zRH H2l``O8'YF2tbV@/=HDEGEDžS#"p_9|_/xl>P7(LIdD? 3~aqY}y@ℝev K&<:܎/3$)& CL B&'vz5sS+[B!Jlnvֲ.Y4.oOU!Y֫LI9p2cP}Yn<Æ o.#77Gf믿W_eڵ~&M+"f= vc|slI60iH pd^ EXQENGO7A  5/O݃Rۑfc^ 4δwL[/$ƞ:~(qҎ'DJNʂ ^eqi$5$ Hmߢ>Xq `L=6!E^S~`'G g8♧LʔxvHۏVmAMEAq^~IQ&{NN{˖-VЍ,\`G@ z `z{WL:UX˞b67WosǷy_[T0,,KXܶ2,ÌN[e)ǎR\T@uy(+Il dF_~6/c'S1ZMyZ?L^DsX2%/3eb^xhUJ~40 Lb!Sl}g'B!x#5J.c>eʔxT+F?tҞn@ AP*<= _ZǮZ/ gew=(ňYZNR0eQ{T4sFo#`?We!R嘃6%oԉRl3g1qZy i_ɃRQA aPYF)le@ քB!ȑ#@p P*WT}%u1NW:sZP($FgYٖ_ݧRH 0svvgg[%GlaA9WتXYaC.!þ]x*h]gd? #P؅nH=[9~ IgAH1Ux ♧ojWS ]TyU|qk:W8ɯpЪ?(Y2(xZ!v eܸqB@pZ صk#F8-P#m|_XˮZl1^6.f#L3,lg-[ R[(+n9Pnwƞb[xunUWƇaVOiʴB4KMM LFHHxt@ ބ$!*v⡩mN?V*$d[*M1ipg;J)d_=[:ݎȔb5;ŠG”!t$SecIO#c[Fr͉_Vsbk&[ˋX~=1kp#yI#tmAgII6ldy9A+ڔ-ɮ"lCdXtL%Ә4$ٝ[,_}cƌibٲe @ .FP0yn@a Jykx E5r4뿺ڬclv:p",:w‰|{%ASۮ4dJUmJI8LY(P"'BI85蒲 +;"-֮dn/l ˋm|.Hg_xl{doO𺅥E> JU.ړkkqsњOZ4'K%}d~՝n~W@ CTpޠd̽C|r*uu#V\Dn&֬Y :L֭[[=oٲefcݺuL>={jժnμyt7'>>\r%lݺ/mÙ/ǏgȐ!7n$++ 觳v³[p!7|v(~|ZS@\FIL42a]ō%=ԏָT8z!G/80Pk0?dDEa[ 9BvUAHM%l>-M^^{`,M3z[@T;d)N#ߨ5<.c|L8:KɨQ8AJzmd/HX9<\.r aÆ.}=qz{"rFcl?d\z [n9CxG_B~~>| ;m{1LL8K`}8u ۶m#77NLj#~GPPP);_W0LL0?"@QUSN1jԨ!(mpRPYϹo& ڍxlr#eGZ\^]G[ԩFH(wQ,1&2-j'1:2,\dݲ8lOp7_YoCcћZ/ fAi ں8vUv.κe}륣vGR[Wi9g߾j͒Fj>'h&IMf^wVfw _ A1k[p!< dI<)r(bvfw#H>z(nA\r%g]^Ԟ^k8 /pfZ?m6@GgĈ|kAQ%I[naZM{ʕ\.5j-bռjjjؿ?W]uUu B||\UKCCì^[yu8tM|g7߰}v1.PUݻw3rHq'k.' ׿3Zp1L* N!IؖJL ^ rd(ќVKM!@O#IH§* iOg@yf}%y s0CԸcS&j[|"xUP%5'lJjkJZN.(MO7JZ iv'j;Z`<3yz,196ɱ< J-d˱"txqv êUx7/`ٲe<\v)S I;V^L6ÇZѻ11#K/@իWSTTıcHLL'rpqͩcǶ[oرzV~饗Xn$y衇x۵>/{'c8Nσ>Hrr2_=)))"-[g}$I<,Y yy衇d".dY;n#.~̫"IζRRpF*lv}; 'IB©pGj9Iٌ]pIP\ZDnG!pfтzVPEmE3(ِLLd⒰&c53M0<ߐt / |4h}7 LAX]$ Z 8ť ޶R-۟=W{Ce TYzC.Ӵ_;4dԄ]oѱν16##1IAe_X{3ʺp+RA\y"A9ӧQUٳg /x۷Ѧbɒ%ʕ+[EzOΖ-[;v,G>s ᥗ^'w7 زeׯ@ P۷3g.hfabǼ,`vy:0>K u Wvl=EQ9]RCJ&_UO+' nq2X*_h]!Q=vEoք€(l(-[=NKyhGCucb\X3mI3 VP|L+6GԻaCNnΝjڌAAyg 3MmӇRis=-?d u޿yeg~t?}z <n{p8(**y}]yihhoqGT&Hs=] o9}4z$z+O<W>C쮬ԢxC˺UUUll&22- q] __v5>kmWTVVb0x8Nex6;wAڴ eo㫯r_}F.]zq$ [  >K!UvNysXǎC^ъCʮ %JJvT7=tBp*&0B.`_>(y")N(G+"-=p j^њE .,|4Kl}TUqߍ$n,5V@`2֒O^~ j!}=G}wɍ^^+AcA_kຉ1\71zNձB>^֍ke駟S!v.|!c~>``ݺu^ fbǎyygg4Y|9>(oINN&-- EQ8r?k׮/lS>@AS[o'|'OgOBqq1VsUT4{Ey}… YpmsƍGhhhufΜ^lpht8[Ivo;x!!m'>}:.,3gΜ>}eȶr(Z{>$K%$H,$ QT#㒴D.-T0GgeӁ:ؼS5dJ=Nb"FJy!3F_P U[xh˹C h0nCƞO/$ʐi).mEq_r\Tz g:lpzV̡0f{"??h'6BYz6dn;][q7¤5qyLs"ӥ/M?"JkzamLvC@.ac҇^+V0cO==hQ[lObǎ<䓼+j%\®]XjU+{Ȑ!sQw1A:6]?s@@=vIHLJPXXj{%njBSZ#HXXEQXjwqOys{:{2:uvFK$,llQ]BmAd < uZBD PC;a|-EGh`T)&l*b~rss۸޸ قGiVAa#ZGLPvZ%)8َjuVٚ=i;s89`?VO^qY1ku2%#5c9`INwn ĕW^fb֭矕swvqo*tϕWxR[o -’%KGtM\}L2TVZ/ܩ?SSSlkŋٵkk׮^dҦ]uU$''gʼ@LL ^|߮ l%m8mSZ`_~e"Ifɱ!H,3+g Y!壗<4&#ݒDԈ MIĮ3s*HKnݵHllGJyH9!t Ӗ-l!tmy7 =-WfCʇZЙ=~!~T6_£CSK-;q<@y2:Ya\4,ضt[7nےY`g:oYYY7x# $&&il6__<XVJJJ:mj*vo&|A*++-h"?7駟\O?բ.\ة?k׺o:t.$ UU9vqqqmkrݶ;픕)44}ZF{K=NG8;@ _ 6 IXIβl)D rcLə$JY 9bw 91@ RRT@idRc\F9I9smIlF͢vPa3"8pAU5iV(lyam8vk8뵨#k!l$L& cb#8ߐ-0(lL2xb, lذ?ss0߲_F㲲عS\xq˜?>7ndn;..+Wl2wy[\.N<#^]M~碋.b߾}l޼n:pW'O #GZmgڵ nmߓ?E]u'N>oEEgNܳg9sSOyZpn(*%5UNJvyHŨ@Wb!lx KzG D%F$Ug"bI 0E|'CB=FeMT|DjK6BQCX I6(i꬐(~샼/9_r%Zd i'޵[o뫠cAB݂6yXti_w_Oe@K8z dffr9rdu\.1k-VZrU'EYx17nd֭=_}UCjj*7x#wnӗw'Z]j0=qwpwt꘾d۷`/_UU8p _~Yk{޼yQYY/?j mwΜ9 :,~߱cǎvo8ܳ͛?555+<ǩw8[rXXfeJUU= 5g,fnЦwpN%) 6Bym9J( J#KHgL>5!;lds0Jj5Nii-d$-nWkKM5%PI\{ _+gE"=E b#OtYk$IΞ3zd%&&Яشi=<_}رc\{\},ZK/-2sϱgN|ʇ~h 44mwΜ9bXf =%@ܼy3s!== &fϟ@uu5w}7֭Ce{=~_{sȵV0ZGGz}$-_so=ſfϞ}cǎ1g-fs[,Y_,#KxA5,JomTbR% R6񲅸 5;|V.@ %l}k8j{`J` $I8b|/û7AcB. PSS%{_ac"hW_}oh\Rv72|N<ƍϧ@ ƌ3;[ Д+8qv=[޳k5t:[ӯ׹Fbb"Geٲe|ȤIxkmN'|{{Z9stR,X+=[n.7ddddPQQAPPFbܹ\n& ~)o6+Wt W\q='h[ \Ȳ̽跔40o)¶#cL 2c[;]GN\ K8cmU dlr(i3r5q1j;Bvݸ mW =xVE<9Y wͪ\Vk~~%M67<ȿ]_Y^ Z]By -hE.7n@pΨQ0Ԝa"tx~( }^zxUUO(nmkfx4IrIR#GC`|]NxaPs70Mvpl+;UUɵֹXU* ,,d-j{T7z8$G |8w/ѥW_AXM>JB!<-57@ YlgB@ЏE]n#9ʕ ;m$cI= FI%ch=za J!:\ +5l+YV=*b% rRrV+D%ݸ * 04hwp+pvrҢOmhxܵrwrO\} "[ЊAk\o;K.!$$"/_h^n .@?p)WI&[(핿kNCu0NVishvc m :\+e([#-J}98' OmUUW***zYN֡%yF9ҿ 6 IDATm38˗p&=W7 ]]-5nV@p>駟 TUƽ駟B@ЏQ,^Xܐz)*gI]hۯ5bJ쎌=S x|`3QKΈˎ&{^ivNOo6찎Nҡtn I:|t> f:3&I+:fج7s[mDF%~G&|DvyΥЌ [E߻~\@CUs!ӅG1?bwMM 6l`׮]?~ l6Kӧ{~!{~m6mđ#G(..nÌ3x$S1O;Wדer-W37S8)i&D(p6?ZՄԍQ0h ~aVop1-ld[)9S1SOda89R&#Dy^_~e}Yjk6FUUE#N8!^{@ps]$I"..qN*Ye6g?K+Yemp(r5a[Jg|RN+ `7 C>:jv`t9`6rVbwؔsIJV,SױOC,SamFQ[mi#bzbQ@wE'w*R0 QAzEzzIO_$DEM_DEh 6C`]Z)Ԣ| ޷jet< ʻka'<.#$&vf aH f$%xվ@Я Y@>8mg'fdJ`-{1߾!~d-A/{ RWcAWO?+WsM7qooVЃXG}!@kȲ~]yg7689 &lO%YԾYfDЛ4evH8\ HnFOβRVkT0KI)fqR&cLFIy3sӤܥ*?\kI 'WT^͜hUjGuYG548xT(!v A`4\'-*(D҅)%>[X%lޅ= V1+b^ذaq*A/]@ uV+fwۅFHyLO2QJg|QROjopܻ@µ|iR$%bZNs$Tl@/?H+ :_:Zq#t}W]iө_UU3؝u#řX*sr!ʐ U` hyޖR{=^*ER_/:IK f||b֛Yoƨ3b e#OHz@VU©8˦~:q4wS盛YGN{;W}{gaUwHZ #>,B E'߿!A$|V }Aew;h0f;@Ң=QS=ޅKTҘG NSwo' ̿//^ngҤI 6B9ܹsY~6jkk??+BZv4f1%F wQM*Z˼;MlX8oÌu=9S h;nX1>?9-dVPPB$Tp97c=,sYlL ``|X{Z| ss7gà3hl36R^_Ny}9eue՗׻#~oNQa=ЬYB;`,'0!bWXq9!KX$^YJOzh/a"@pY]-z%;44b}9z(z+|L>ݽ'Ntӧ{rrż@ ?o]GQ˴i1ݩc~[NSak=;J&ʚD)❧w6*v1SmEU۱pR !͙ߒk@^ (Ud!B|B)PS(};г~Ay}9QX[HBj(-V쎐oɐ!^.z%t ~ 5DE3!|#3!bCFc A?BkRp?77/U8/H7  U'um/{.tΗ1@=e `ҥv>VB7db„ j/,,̫z$CCCUUU^'Lm&F!v㔗uΠl+3!C9;oq2NքFq;V.nFeY4 XpMԎiƁ &K=X,dUe]MbX"^*mʩpۭ̮{-cL+9DNw'_K=ND8^Ed} 7N98z*ÆaQٸtu:\ ]v(vzcˎSՒU**qoSTuYI:tN[J3:>zz3>:L:>zV~z?0}^ft""$1,:.Ei])TSCvu61LHHMj j ؔ Т“8bFM%q@6ặa3CCTII !0ZKXY!Y^#`2ګEsq#bcn:.\$I۷)S)-X, 6#Grd'AW XV -? qq/~(RTT",,1]1% $giQI-¥4#6 r:IR&]IQ ^ܪ +h-1VNTRȨ 2KTYȫé:l>,$gs

q)@c`\wq+vOs*M3s:B6@"0Ĕ^E:k}BOؘ 0gvɓٱcG:'?_W׿fŊ|G`4⋹1;κDӇjѢE{x( EEETTTt@p`22dHt( | 7|sL]2(mJ0$Qb|r:S ʺ~E;142pQIFedVfRmt$EӉLO3NWjh!1T:>\D9]D9D;]DQO n衈lUU9mו}[F} iAcDFh޾KaNG-9ʷyr4X,=>nw^%.8pk`mP{.] V1}=X~=s̜9w}.N)III!99d8@zz:Mff&CT{o66l ==ZK{zhv%S|M{96oܩt1#$dY&** ???i@ F# G$l6ZEei>sSLO1I>UԶ/n˼y[dTrt; ΢ 4mf0 ?EaI N'.0GI1'Axپ*U*Jl%ۊ)+VB[ %u%֕R^_ޣ{;5[G/?bb0 !?ġ1.|a$er8+N QSUH^Kwb0`)|xcQ%i@Ptc\ OpcU>'yI_yIEvwAUU6m^G~M8C3bwJJ _=:K,^_׼{zx={6999&ENt:Yf s 11O?QFqA+ϟUocGMZ5 u-q=IHDM ؁1^6ᅆ|EU 0lR=I6ylwR|zAMBJ۾Ai])uoo%~M|hQr7Qu~GIAX$ py:6ibvSI8н_OnM.99V纅|˻ _/~z?| f|t>|0 |0F:t^#KHHܦ .Յ(8U' NT]v]4w6/]48wSﬧQKA|hYBxxxC i)to@ JCCe5 jHͯBQ;cLO2٠mK͑iGc4 !m\I74a`$ןtZZ6-NWn; (*%5(#q\0gmPnAYtb"E7zlkE JYO+a "OBO1@3F4!Wct'7TUWjk׸׫UX뭔՗aR^_^LMٙӽ-@bX"ǓDҀ$MtqxwEU**9\r:.ž}+Dz1-z?3 Q- Stt;$-ˡcTE6ø kj&EEي(-5kW`/{ jM2D{ g.}|3 3cfLL& ^h ';BB P|>G PÇ$Ilڴy)zژ\ql߾nT5h^|}3gN7p8 jܹsYz5~{mTJ@ sUU,m%nZ"Na ۓS K:!Lx+}LL;*OGz)]o} k9v2A z,# @^KK:gP"|# No$|E0SP|bJ9T4TPX[H^M{@Nu99j773)rS#25j*cBǴ+~I]w&φF]GBh _*rL7 U9@ =zBd2p86lȦۇtV쎊Vm/v U~iyj֮]붊뮻 #++ˣwӇd21tPdǎCQwrJ>^Qt:;Z\euUUEUUwݦznS6Qݞxk_xk"^!,|{*Nc|)I&Ki3p!# CAT$dTנi]jV'3 _6FJQIm@R%;:۴ViuuSTa;<6H`ћM/Ɏ}ٙf(("4;N$&m=?c>~}ovjTXȨ *Lk&u~v.j5)S:]/|7P^_ޭΘ1\;Z~5ss"5kR#|J.t(mKf E&-Fil[[-Xj :^/{UUINNfD|kRWWG`` tY JCCEEE@>-iY3(;?Ό3ظq##FkaҤIu]f͚N%4n vm `II t:ݶ)6mڵk9+ IDATv/[o 8xPKkQ^^jW__/`/Z/_@jj*17of`y8u~!۷ogǎZ TUraXXr%Eoݺ拉 /PWWG~~>.{/O>ѣX*JJJx7HII>O?%%ESVVFee% Galܸ~?{Eْ̖ͦJJP b9 wy= @}|r, eرY544pϟ5kx_555TVVO7?O>y<3S[[?-[xw/b<@NNo_5˖-k'CUU|At]'// 7xؽ;T롇SXX /ʕ+/xپ};>(nRvZ-Z|!_'x*\.O=7nl駟n:{9ʨBy/^̪UX`EEE|>~av_~G^~e4|M_o/vQTTĂ Xj/9B#9B#z9bxŷ\i\Λ??ΐD4BzCjq1GxNWx(.13-W9bsX)>U9 3Π;4joF @4O]FW`LepI4V\^ "hgqkY:DV7` or 5_y"H1Kf,=g/rUUů 6?<Q}v,YÄ^qt/"fԏxa \^t9 LHHjZVꈢ+ܢp~X9q}U8y";O`75,Y"5q7r4tKfqXv-vZL@fwEEEsq5mxb. xw6\s߾}8&M}ǨQ"j)[$jjjp8'œ#4M?7a( Sa^dPs$ìaVa6o6#sn|ps`/H?LA?ek!d"d&O1gRWTgvqfw5v&ŚB/G/R)ZS Š߃8Gt>q\l/ΪINeu=p0$~S3DF&ĀTm|e0%m ON~''^z>h˟O"39P8wg݅f0uԅ3 Azd8q89Yw]fwݏ>({/&bccz]Δ݅guV󓇶:u*7t/bth/R.\8]@ hZoB.WcPa⮫g]xn~z>f%r+Uvf;3(~QE8L=)t:*y|+= <8;.@pܨ.%#OȂY>a峰m: .{ wM_3k֬fQ tgwd;M7OdwlaZ=;X1KT`T PYc^]b{q-qz 9LsϰaƽN‹ݩiA)3a6]1lfbxt91j0eHHȺNZ@cC A~?ZSvd@Afn+d\ ^ӱ57DmID֯(vYK_G_8Qgq]w`?FD$v~5b!.c|<8qbbX8Ffte%6o&JcGH6Nm#ujj{rێ30b?} `9=t8H{cNg~l,ƲaY[bA6=YWpI&t1è{a/ec7k`k2˺|,PU~ V t؝qHVl߾ᄏmID0b|wQPPЮT`ذaǢ{G… ֶd޼yǾC@ ~VhΒ:Wf5U.fNQPȮu``bfbFѾ-2̜?oVzd2U[.Gi\PWh%`k ZhA" D$v[!&|\g|f/[0[톝(( 8p`d}w݃93Cw'a]:VdyrTjVX̓dbL7iS}zRd y_ [^`ᶅ\y7#Kp0_3x\!;7W.8.UwekVu N \Nj/$I/&Ow} PΙ38]Yt)v6b2XvF"[ AW4~,iw9 G~,M1UQئf6bE,ޣnQ=Sq29~Ԋszn,uP}2XVyf;fvLxmi|u f|6 w}evlLj:ALzEٴ_cr2Jf3CE6 |h>gqV{_+YQDCm ?dgZ4f ũ>ZvG{>~p< ~H_[1Tҕv\ ?Gdm;a%' v7 ՝{ pe1o<,XЦؽd 3)nٓ[۷/ǻ+@ ~(F_T߆5vmG4<جm?4_z!Ylf\%CbIO{I/J#@@}m#6h0pu|j29vLDDt-HL5puZ'ےOfL&Ȍɤ? Nm.ۮ(/s$Q#CO f>rMME A@@}>Ʃ|X"G[,܃ւKKq\u0@0Œ5%k!C )),8qavlfgƯYS ciR*<np`dDgp񀋙&V.m; V5>>;b.c#  pK0PKwy۱z0$tf@~a5(5~4M^஻6&=UcĔ)S'###:\r 1< wq!\.8 vލ,ˬ_#Gvy߻MT0#2@ ZPXPJfHe@RM+_ AޘђY1yW2:lënbL2$nCbʤ-m=Hun#zz] _q\>_{u-ם3~~D[(yaj?]!* @r ;08Q686NmV+RTQN؂5?7˅OSD^ظGv}cRað up,#F`LW= MRYίt[$3DfggaC◮r/]CMMmFV\V$\n^XLq ̇vM%OJ{Ϟ=,_e? ;}HH8Xx#**.v;v,7x#W]uNM6З?쮯e4T#F`Ŋ@ AKܾ U:5.1B9A#s;¶cX~3[[y&z ;~m~:٘SԮ^PoC-,@v7>e*cvw᥹р1.C|;> tum,d{b7]1}-89bw'Yp!7~7[κuK),lwϞ'jټ8ᳲ@ XŚ|?廨,4v2V9,yslu,#:luUL}LpzthT—wBgEP_L&A}9!kr/bz#&%c|<Ƅx q㐣SQ47{$CF+۵[ZCm(rH_9psgVcf +XRzӫiI7S0:WRu4wZMuȒUbލVWZ_V_<{:V`t"81 ;bb05>Tǘ1> Euu4y]w0ni[p|u" _M7^Ǵi żB2ՃSn©8;u|G`0lM u}N"-rsC9s&3gdҤI4hv:yq @ Vjn7b),lw+}B$(/ U>ż֐ס:tzWZjm$U"f\%\H? sH5/C>}Skcl&3&qɊ"+6Aq6_(\u:U!+ UEJFB`;FZ1&&bJNƘ)%cR2ƔdL))RS1$$t(c\4÷'^.]ލptLzۨQa㼻v!L32NQC~~Etm$YjU\>rLQ,ٷ7?OnMnmD[2JLy(5|p._>6*K[L6!m\(4>3fnAG q:L63g2}t |tP=W^yn-σZoo&Ev~63Fi#=X#a7آVlUvM aN׼_->]'T>:.#}*D={Op%lW0١nRzkSrDE4HKcm X%C g&kZH.+#X^zUT<[//?Zs,L{c s>zԧ iȖ2uM#?ޝ;›#,֬F2NS>DMDԔƎCyC9}{>&cF+!ћo}ϳHN矓gT$C ²G@cWbO+VS3ۮr45k0vX!v z4]O?eѢE,[@Gm08qbs;91+*@ =}eU|w2TڇAj (Y 3nhNayظB]8rޕMNJuw/&HP̔crj;Q 1eiiLH.sHN?(lfE)`I ROK A rA_9=sF: L0DUtnۆw6<[ݲ`鑙g+aӃAvVWwrIQ1ǔ)D}6ȿdsN;|+Z5$s~zį3Kyf3ezGω)Ap-|pTk?N6,Ae̯ǻϘ.v/Exb\.88p ]t3gdĉR頺;x衇nn a IDAT@ ])y`n$7Y( am˫Eԏ獤_aGO_ܺK[t._{UFI,JBilH.Mn]p  f0Gz3rY% B2vB·2` A(C` nϦMx6n Mo'[Iz6ofWsp3ghG=:}f -yvGeᩆO*ѐ< _=ԪGUUϟm&l=%vD4/_΢EXh!-XO̙36mV{MUjj*v:D ACtvԱ&5y<zh G}}<1&'c<e`,`> Sfk>z !k)ܿ?'zt1ATVo(CÙ{"sOἿ}d/[yHLzt:]X:Y_=|=s8pTQAУb޽Y^bq~dFI&5۝ׯ%hfQZZ*n@ z AUcZVؐ[wZ1F4y7y ο޺W+;ůӷCvߊ|;y~Ÿ[vS8 (8xgrL:53~VI׉jH0GZB|z['"SmZ֭t_2>=$||| >c^RRqiw20f o'_ ?N C/^<#s=DУ9!ʏ?؜{E\x̜9?_MFDJ@ ?ހʦjVؾ'SjF;+hd$ŢY1YQp6޽%;v45YJe餕BmHb9~ V[-(6B/f |fn}mo*;O؟CQD3tzIuAJUh\R #lJ,&`[`8IQ[6'2hlJظ? ݈%ʌneb7a2a6cQ0)↹=t]G$PTD@a!"r0v#Ӊuǎ6v,C|½|?{2ܸ}bԩGזS}| -$&CNϘ#o7&92Uūwٽ;^eLIoêgBna7_ k(>]DgǎUZd47o_W4T ?<⠊!&FT+iY5.v`5Nʇ Ӏ|͊F;dBo!HW379I/#}ZVK fPgjVb ܢq$]gTPn#ID{r\E|}@5:Ƭ6tOzߏx,q:GugswX0`LNƔ19cJ2IG1"!lܒ{mi8ŀ=FTǘG+D[q[:LBj= {߷/4ݻ_n+m8gCj5[WU<}oNo3nh-8hƷ߲ {;];#^ 5`wk痟{g29/?)y?7@CQSW _<,ИI_mMt]gǎ 2DOh~vbwK*++N+ݍ4Tr [l9yq @3cOY=+pbrN[%$n+!оIr}m |~V-3LIB Nl~'v46؆hbNLI)PY+4IbIÏȺN`dz+' ƔTL)ѭpVP_1H506lܧOop{M2x x+2F$>s>'jm-=r߳=xsrP+;f)Q ''3O1uҿw/u~Gݷ߆N:p[ U]Ct]gY2~#4&vV՘S:ddwYcFu!{-ol?.! ~*[W>ԑY]i\}aZnI gѢE1_Z .ZT۶mf;+Mdv @5G2_Ct~L!;KH3G6 O' fәsa};h# ]a ?5|Qr]vތ5 űu_ېu{aFǚWALrxWzWݳ44Gظw^KyA]a~P,r;wݾ/LѴ@2Ipb SNi$X^N_Sb֯oWVߧ]YS糾t}%ْg"^?E_ QIx`ssMm?NqƂ2h\ _渋ݿo3gcƌlFA5m4}]7C@ :N]f15Z;mWӿ2t2JuRBE%köӡ`_Jvac=K[|H[S&֥P/C8Z$ͣFrMȍGApo,÷_VR[ۻ3\3p&~O+suOΙ33Rm[VE|(zGێ-,Pn݊gV[lJ˷c#jdL>q"#o@e-YBx6l8Ļ"am'GXAuVOr[ 1)!-wKǷ߶bPi!W,oAAaK!/n]m;N|W #%KpynA+#1|0x`̙5\Cjj WAv.@pP\aM EPIn?;>T"-/W8-Չo'65`jlcNOǿwo]&8+:5ݐEHQ9\з\oyH>@dXCqw0Z-id%= Sz:=6 6*I1`R &QhL2OAau]]CZ2rMQj hA_#W1[#opQQXOEa!˭qHERhI֓Z78Ǐ>~|@iMl@ƍxo?bEGQGHf3q{.q)9k!kOE|i99sFDbc%+*LIIGA#IzO`||Wn|=wvpW72=c:?wzǨOGXZO;zuW:$LwoOn i-|>\18{wyW/\9nY$ ]ב$ Y9s1jOP@ 9:.?Wgwg3F)RfIeߕߑ>mthJt&aQ.ՉsO?:hPzp5[gQAx,xD%P@=9#t}U?p20I4c-rf݇$œ)- sz派۸/b5bR -FLfZzoh䟟k:k؋>[L 7?ڈTlF$eDhbZ?hXƍ.1pC}u]eoHuEdF՛o\`2=}q]u鷠Q5{_?ulFz+cSOrku&;Yf߹P oΆ0|$CY1ipݧ'l{'$**PKKtrWr3nܸnBpi:Νc=Fa7@ lVUun+Xy'Cd)t)U)ljVf򛫞 K>A;~%:.rأ8g =+a*<+VKfE!n |{́q+=z1pn(&k[ {> ؓc38P!]UU^z%n& *AF6ϫTUT -އ5U?$K?͡H`0up`l1o1*LfFE f-"PP]]]]]G}w`HQ\6H0 tMg$kG i&u@ f'*vO&44YK4l.7O zNV'P4 ae.1cC g?O?VwóӞq#L oEo=O7o?N6hG/Hl#itG 8w^{M;#++W/1Ԩ'tPm۶L ]-w:HV0طN2@d&M&B預:sWMg\UوǒuhMeJd7z[Dx׮D Fa֏gf{Yk0jP(,8+X$3JZ$c=A| p@Qx^1!HlTMv+nE"$pňbk|M(֦ Äal㡮xVzRW饶ҋPzаה7~[d1Ij#*z2ݸ׬b%ZE(DM⋈:,$Sd#7~g5[5y{(5~vE=a2qxzt y g>̄Aנk_h?N6CF[\8.NAAiii|)w%^_''''xcwӼ,˜s9̙3Yf( +^*Ʉb@ ~zVV C*BvoIbbfEa(.PfN66ז|7R:#Ubi`KL-k>%$Iq~+q"]969e+6r@ (l1 ~}P2d@93CL Al6˚CS_}M;WGI]F kra4آآXh3h38 X 7yY.m%ftnɂe?R4 ? qqDϸYP iuYk%+[8|$#)- O#w?*\ψovw{ݖG78W@1G] L&!v z4=Jnɚ5kXp!..+lNmN8㌮4Tsկp8|CLc@ Ndn?ʕߣİ69$H 6Y6) - &vn nt2@fIh|2W&C"--4>q1w066(WfTOcH0>,^ׅWE+wd$a%3Sh}&%o6dP맡OCAG2u&" A28 QxX D $hso> w,rSYTOzjNlmFy6pKRG՞E/ͅ-Q|!c Li$|3΋.Bz$kK#*b 0&e sOP!la<2ңӏAװp. 'xષYHCO}',LdřdřhÙh%&cBTQwv/B[OlN 85 Ϧ-YBݒ%;ݖd6v>gc=C> 쏬aƔn_^us0f掘Q6ܦgXV;>ff. GGjxJڎ Wh+ހt}D[RQQokƍConK.6'ǁ_~,Z舃Jdv MKy꧹lUxE,S@'P{UE~A\'am+Ύt?bmavg^Jaߩ7j+z*4N Lf1;hP*q|X1gOk!`$5R+lLH\/;q(ȆY𽷎}}z3ꬰm {Cytb/߾/ƹm), ,>r͖*ZXZZX n@G&>g.el1мA` Mem"6N_X&zILs4bmr>@I~ p u?soʠ-{/\%z !sT"G%bw ! -[sjXLS6Y{(~ڵT>j2t(w݅ IDAT}!@6n?="klPo}7?*P> M \ ڡ4MW_G=VnB4,Yk'|sd,'+*@ PcKQ5s#k9M0i/d!펭:öue@Nt"Y#{ᶧ&pH:CNJ|ƂT}8݃;0HJ306c4I>(`7?{_U}qu7{ WmۊZb8WVq"*II=Hr9?nČ|G ~Ϲ$9}m1Dj ~^pRKMtMQ3jhj:5N?USkUT ~o'y>xZx}xm?F&6BL<*ь"dT4RQ׎ezsueσ$H̲|ۢ܋?4[Ogk~4mQ7gtݲm;u-vx`SԓhU0p|oxWWݟBq%/lz֮[C<0}]Kqo߇}Vap8x7XfMށ@}j?>lϟ/fv CмgѵL%mz $4Th5DHGBEEѢmZ9`7jPkU(ŋ9묳,'3g}N/-Agwwe:,; Yvlg[֌8v,!ș*Z@pqK|׬ ^#]VQ7ߌQ^P7uzQH_W[j}ȱz[ʦMPC.ʸ'OR'+] Nzy~7eYG*ްasߧNCD݂ PkX|Z [#[UAJf@Yu@g4zW!_wFtzܯ6'ᴤ6 гA;HYȦO٪U (Dh[28ܬNi=J[j05Wbnj\MJC!&bhci5D"M0t:LMٮh;l덚3{#,+47yq5oU9uGm !;SD3 v$[ro{Tcyb<c J++OhW5uT_O ף<𸷴7ߠÏP|_H?']<"ɞOxv8}]#1!nol{ ӞY+R19 vj=\^<‘yw7oW^e{a`6& `kٸ;-XN|c0NUհOa`]vXQme$G8q^nu7Kh1`Jo]ͦȪTȮJ Hwq<ڂϕ[j^)}#-ɦeda?l: fmlahuhi>UKqFGE22Qlg;Y`%y<7FWu\ ''<"BۀZ?µd }[A2OGwq_y95/D';S?"ÑGxKCG2}t>)Or"sBn#CNQ໇a{7^c}-G#2nmm?f޼y,Z$eL<ӧsyU{a`*ATo^HbFNT#Փ7(0)E+XVFa`j[:*Fdcͦ1fS0 ,ɪiiٮG>Xi贺|W/w?*}mfRFF:6Q=κe ٿ[kq$[ܓsJRBc>$PWקm%W}ۯХxSXHͿ<2%g( ~ʓksȫ ;a('|HcTj#1q#){ٲe̛7>3x+R{>}:cǎi?rrrشiӁLAmKѺQMoZ#fl(SHޜ{Vɗrwe+5P /P\ab pdYAՋ_?7\' GJ0h\TTb 㷅cY:䰐$ه Ck~9w)9v/F&@ BHj8OMM-wRWBm5@h2&Đ2*c|WS[ziT <1Zln SI#kv411@r7DMY,f9(‡?. i3IN=៼MK?w1\z[?O~ J?.|_  ep8;w.V(942e ӧOmJjƌp ژDDD1D Q˺JJB%1V.CnWPWѥp;񲤢-vZRqYRkM]OTr 6.aۛRU ]嘛+0P: %DǚhkD;z|{D{;(jʢ@Ԥ&XE3hPf*vQ~Ov$L kG+oi oϣÏY h$EnnKWTKO'0(.N 'l;v{eΕ<0NA wٽ<>f<ϟ<1Ƙ+}@a~?ӧ[Gav+… ;w.~)܉p r- RTGAaa}A9;V.YE{ T{(2F:vGn\hPipTT\$dugM+; .@)N-pqzXЕ@NV2El4mo."ǟr|wqYqZpXpZh6'HʞPʿaSr69p9=T(d-r]`mOk**.*Ciے˜uص.UKDx f"fhGE8KP\\LZZxwr7y(Hv5tKS$RF1bJ<cȔ'U" #N[{6Ѻ/cYNeiIMB>7̾ NyӍݶ%Ptɥ(^okHxa0b ,Ǚf=QNH8k wǏEk3S\A轼[@w??9 ΄/Ax 0F=%y#Ð*C}'p6%"=rT~;O?46PAW;RCl#N-F z6D9}?2`|θ lweS!mG ւ˜ے L*-HdS0N0oPg@7x[oU{ pַRDU1!'ē>6 M/VWc'!r~oy3WQkP3$&5JV^>Y/++vڴ4 sy'܇⋈9S,`946ЪX\8؋2/bIɒ{~%53#2v~  rz .RM,y#ư >}:Gn!$A87igyK0fw+&] ᶁ2mpƯY #1Un W]Ϣ Q'|E*-nS.K2ns2pۧ&M0NnmFj1K[MjJ^G::8zq䞜D\fm_Vvuz\9!d$Ə?v{{(Iӈ~ F(465/ڏvWÄ(6OJ3apU ~;cXZn@> ύ8}ݯ;!ɰ Á6%hSrk?N;4N T G罌x Pƶ`{^O&8 ڣF*dWmN<ІaYC|O"}al** ~v$X2D19_ћ4D%J4h>ɦo,ˬXSO=UZ]>Jٷ}dfIdYGVTC r&1 C>ɭ4?Խ6=U*"9w݅&*ؚ_WG3'څSI|1-]՛g=T5W8.єIkq?3  !=ɤ_ _/V\)yaoW^y뮻=x‘ D-p{_Q_J$+ K!wBcdI۔=ض$wjIHYGOUKf), ,RΒ>exuV\b|C`ޤ ma'YoĄ _lwEkٻfG>Q$G{JcPNM5,xu[_#X\Al8on~7DvtӷGTV+1-Q_֢˵r%=ܫ)*GvŇU> ܿ~VqAm '2{wf>/yaon#ژ EPiB>:g)RQe0\LGZ88l88-3O=# 9lzImƶcK -vZ@xH$BmA8Z(B>Ej(XD{z2cNIqE%0O3&0LbRDp839s{.#`94fjxN,ouQG)⋉~411lBŃSr[mr2IO?iҤê[e+wٽ8=b=l{6qp)m>o&#t%_}5܋0Av a~Pv 0<Ȳž*`QkW(&޿=Φ:6_pnk6[k:CTj͜wLDQJ]l qoH~'#Rk@V8-i8ڭ[&@-؎7֊0h( 抋BݍYWEᦚ~I0FF"`lGM=D=%.1w 7T ׮xF_!g?CRP^jgϦWJEo'Ej{+ bG1w/ƞ/X)w/r%&Ś2ּ ҧM KnR Lmp4>8y'>Xv-$hѢAychc"0ȲF `ukaQfAF*H"#*Λ&k[m߼%Z̹R5uy{H.0\㴦ᴦ$s,`یҷA8|2{֒~]npf2NO`ʲBjrw֪pV /LGo:WEQp~-O=WۘL!Ggeٳu֐Ə'edNB}n\ c -ܾqvkdGdLA轕o߶h[ǰ0 iحR$ .?賋. "I@ =k?xf̘64 { B~Y=[V-ZNL:Bv6l2qH*j`Tip!Qe qM QrM\07pN [ >$$T6%ROL@  X#*{, <̘1zp[G'g}+VWGm{k*rONd⹩c;!Qd-5ru^`re=-Wdd{^Zko NSzB'F~ 熫|0Ȋ^M/خĨ1WitJwH}$ c D;K{74'3x 52DeïSpavdJ1A`̎:n]Np9MQg`0UCK+. #Lj-8l42pX3pZ˗K_7bPiIëo)I31)bSĤZIBE$ژa ,`C5o$:.)ey EQطu_^ć|a:~"fi^eeأooټ{g+.vd"gdQ"_~?-[Qe1yIG0D̀ 4cD x2N?8Ov a~P%&&{nv V/gc=a? j6uX]P{t*P%5.K Mw1 -[uCѴwE *m#*j I؏eI`[Uj%6JTNzGQ***HLLa0`Z^WU}iN͔3HUQnegE!ۛhjn|lf}M|a<{j|/n"OBe0 T4}.&= K. gBb IDATEqoȬsf1%A?,n8L*#j:#\bpƈ "NJJ.o\q&IDD{ 궗ǰV/R'u[(@>*x-&[.k**tU_~%*Uܿwcj}]>)D8i1%fథᴦ ^+AM|4p;"xߎ/@ /w!ژNױmi);}H\A.gm%k>ߋ@}YL8ϯ{,P^|YPސu$=$qcp| }@b7@_WxKHԿqYeQ ] EK@;lcrsS05 B/ {)"tAՕ~Gyd A8xOzMLa-Ij=NkZ-5fJpw=|rKkQ9va/NjY9>}$N[:k:J1H6=*`mЋ 5ٺr cgY]̎_GwȻo~9'&죚(4'0S;ƉIz t(L;b=IIP93wzpϏWrsC}Qd$r'UW jt *ҰGfa.w}SAc]/bʷ.(4dбQ֠tg?"V~ .Lg*v-uP(^kٜ~ vYRz%*]CTcr\Hà tEe .Rv C*ٽcY2,:t5.1ב42___OOc%q5} eah)syvó=4yxjUT A>x|pUuxXF R:&¯=yn i-qP MZ}GŶQJVmX&*FmiXs^1_SkK{ٽ d=h8lm5 IӁ.@ZNhEmAn)¾mur/PQSzy֨_D)vF8Q G T<0M3~I GwEz)دnB|Y%|vL9/zxs V&}P ޺JEQ(ɯgW(JZb9L oAԖ<{r"',ypT>!1O8EQ|!?n#@?ap"ْgjM ?%XF#.*~f=B#v a~PM0+WX Ѡg-_VyF' zZq`vjMp1"9@dˤyfOd) }`Dx B@*,Fji .fE UQr5L*ҲL(rmUVlȡ( [ne„ 0ln`W(zpU˳=9U//:n\>)/ӯI^Ѫ/|1dGْ*1w_Iu;ssO=J];v1X^;5r"s2A s:B \&Ogd~ Mtײe;{G"uKhEܡV(ooUH}$ϟͨQ]>;a}0WcNE\k?b - Q/-QY`nfcM`[{nSH}Z9m3M&*մ]{^ܦtlx+AZ"Om\ QLˊfZf9q1U8{9?f 'PWڍ91S>[LkN1tuh2'F,{T? XM\>`k3_UE\OEʋ/`4)u }Woo1v&7:om64 [*""D#ŋYm_{-IS+>nunSz+ׂӖ˜ԯpohյ4iZح6EeV qvSԬ(b"jԄnǺpDQdM5ƪ^m֪|a:ǟFNǪ _Yѫ}>)S}6"r/;vM9a0J|-(s.lv]1Ux`W&[*&&{[ae}z.1g>)S. 훷>DO &ŊٽWc!jɽnr *TZ* lRE$#L͌:pGD'SEhq G$9 5j[ӮAγKwֳ]8jZBcH纏&K!ǚO?'DkRgdw nk3j.N6TmvUks_aqb^z3̽p.c{F׮$ڹ[[@.M:avGyDaK޶-vU{ 2.Ie*rKW!GFmIa'!N\[K;6PfNsذVw4R#v^jj?-Q`k(Ӏ#Y 箻mL#φ] 91Ӯ5q7/9[E &]Ήev{'ӱ±*f= 6%Y/a9OA%w_IID^3gvإ08ZaXY1zO6co`֊xqEԞƮY%`Kv a'aije-u[C=:oԑV&۶V#ɢ.s{y|~եRKĦYIȲ J7Q[ꡙ8T_=/f^tqhlWYI&%hӁ$SIY qԵz~{UjV+wz2ҏ94T< .{l_DS?qd"駰suzzy$=4*>% } x?lycԒ Su,tظ tRsP0<ZC5 <v a~PM4K6& &n"WҠ)@ :Y[ 9e%dϦɞE=ìi/_.ٷWrѦ#1N|HlOC.aOR%Dk˨V)5hݳbL͌fZ[[{' ( 7ndҤIEpT,jbwS٫ Yvκq4QIP}|CwZ3ɨi@'h|?!Ƕ(iǛL!eKݷC%fInDŽ M;gxJGs^ofv?xµp+~n™ 2 N1IBصT?O3gVuK(j!o*jw~GM*5e)j9e % iZܖv- c)ᜟ??:IDXHȲfઠvnJ jp-L)=GqhEjkbK`=;̴hfE3-38/dYf'?A:[0GYV_Y !ǫ/Lg Y4'Gmk׍Bg8lK*rs Z/`.\S[t~ mXp(>Yzߗ|P72Q tG`oa{opp]X N~/>qF "N1al=138A_D򐳳̜;} i'x[q!ۗGd oiSƳgOcrI}EII8G5~ }NNK'l1*I]17 Dy3_+̹w ϝg8硁Q8&[+dܹbf f.?--aX1V 9qO)˶SWAMS~rv/]!a9h ޞ<2֖$nZENA'YO+nWwQSJ%1 &]iɽ[j~NZ݇~9~qLv)>~8ut4)/=KzBLׁsg>ǹTts㬄gEwx0( naTSLa }nnbk>H⺿ Pv (/jD.:݁A1`d)VYk4Y;*avEۂ0dY>пR±@l]\ʚϊ{m.69sN긎ws(͖֪jbR@,SKΚ@eҚOvd"W1M抅az\RBB Zqq T9Ox"xCCDwdzx y"ЃjǎL{FDD1 0L66{.ҽ*;YHbRvm߸_'[FD1No)&9z[k 1Xwecr`/Jj[zyG'X\Ph\AGm KEI^}ȱ*˳84T *¦Y3YF3攤}s|Giiq\=&[QrXh$1|rp;Y]_G#xwHP[?ov߀FL wƍ Yy!g8i?Nʚ5k:=# ~a }E_SٲZZJ OUgB>D|fkQ$bҬ$fIȲWٸT7H4#ސde?~C!f.w09p{$n3smLˊbjf4S3 @ /{jВplQkX-IGEpX";,╣OJDŽAk~>%DpOA֭ݎő7"pJ-6Tmi4޾m QaLzqγ>Xrw</Pa^_b&@ՉoF$$1#`T,]A%fv ±=p[6ՒZ*1Tݛ~߶- ֌ѿ_x}/= g$dEm'.JDź*6BO9*_-^|.`ǎ~k\6#h$An퐙QDD-É($I7PwQ&XY7vhn>lg3Չ HQzݴl9w.IO? L{NcTV+ioq؁*Wͯ5[jk x70h"Bx< `ΥPҏ{\{ݻ~suxqI2~$ow}U#f&±=h-[i8h(YfBOpF{6NkJi:7!_?DQi|%IBx#}m(FE7ҒCǩۋbCBd>'Udx`<5hȹlGA$$%3{ 0<(f[8)Bj O?'sU9mEQز1DězZP^*??q'eK-gՂϩL&|qpi▅aO?/<9TXKB^8+]ݷ7+| Ǽavo޼3<y aܸq]n&|L4u DB{w3gbن$AXeM {KTnvTk(HTl94ٳq{OUO%>)tf|MM bRp;ˆv~ʶUP]#^|x&sRn2{8LWb<-J6t$d?Ж(Fn ‘$?Y1 O.~w'Յh_%:YL/EQ{uj}qLRg61fHi_t T55b/(ukN-wwGe>ٷ^J笮G͟JO g؆݁@qƱk.$IW^aJ*]t .6KX`*"#J#_Ȗ]iq5Ti.ȨM ϡўM=?{sVq=W_F\_Hzj4;)~bܚ}4؋dɭ|6#Y#Ze * %% mA( *X|=ӯEɽude͘ӒMܣBSLu;]Cꫯ`ͥr֙XN9eY n%t't ,@Qng1 ?~|3 ]\8T<`E~bn;9l{늨碱ŀrVM3}4U9f).z0uo̕sٮd@Z%1./3Hn QFQmEAh#IcNI"yd$߾n}2˧ӯ}ع9̉7:J/ ML rL⛧ګ$<؏JtT^=U=\1qHb XyN}{O@Ʃ!. Ck@~C}ƌ9zwAAرcE-G& --œOo~ ,N3+ܔm)tc U^.c kY. IDAT-) exKu/q{W0O=4~#FZͫr.yJ2**)vnˊfjVS#p[jǸqD-?b5r=X^6|zxkb'6WVb_qߋN"w(v]˕].o^|I\#"G0Ym[zZRsI0' `u±O<WyP/"Ƿw`A8 $##b233),,|oژ,Y>Ix'{]D,PVQ _d!5;Qm5gΞ^D*#H̱fEQz)-QY3LZ=&ֶ$Y#SIEA-%frz$\A#Z{+WqZs~Knǔ ˝߆9-3J}.+/t~NH׿}V)gN L&Ғܵ.dE9֪rR! 0,5mQCsAaƤI>T'8~KпA\PV^N/S j=+dWœ훆Þ9岫BO-v[ZGFcgJ٦|. ?rJ8ӒFzN(bdžumg_{õUPP $'6d2 Τ@&$|g͜s}3=%Ŕb-gdˬ6ڭ!mŏ(GQ$zS¹-IjA"-C,|̞={ JO%ynm9aukۙ<+gdR0ֵk۽&rWWanqc Mδ .oQvv$>\I}7$ G鯰n| Lxy!|ˤvɻ ~yb_%0yn>Ol6lJ^nEF[cc; P{7y`J[ VHoH&]>LaԤSq=Jv s`1uGdl Qgbnr.v m~9}Am]R2ը*Vڸf0G1_IHh mI&F`Љ LA -\;?Tǧ>-/Ma:!8<oަ|{#{0Ch߮+ uXoAmӺrIN'ݎn!s28Tq'~ o$yBOgB6oԘkXBs"#HJǨd<@/;{2{MA8@~ic2rH 'iݩ'mL͛?$I|̞=mLR]+ر d*zUA4Vg` ˢ%$Y`w|nyuT*I &aD$q顨5*ʚٽjVg;XJ(/'$ N9V+)QhIVIGgr{br2ܕۓR"b,AAzĊ7w$<)׎%2~g EVX _uylhoO<{6}.?lSy<~ay@c4/ S"3y?lzak@cQK jQp$\_%;w.K.E$~'>}ƻKv[VRSSGVHhhh_)xyS]<]LQw}V}Oks)z'Q5$2P2i NtCj\|R7)»"4.Hq9ej VCC@K=s #K)I"6$V+vUr;nVb ZńpwH& rXp!\s jxްY8ܦ.i՜xhzj~|g'Q}SoOlL25?s<ng 7b^O?䙧w9Jea3Uk@sDUФ/hX)&RmL٘lpP.U=*: %')A(TUU *a?ȲoXT)gg2Ĕ}~ת|ʟ}Ѥ P3$-EiZy+Gi~=ԑ-{] }۸K(2zplp5φE 7~) 96-2Ǐ'77YftRO _v͛믿(Hʕ+9sf_(ySzD[hP;cX&]H$&\pgEVh1SUhj[5E&VUmkfB[JP%Ԇ3x#4$'[m8 yuD=mI&$ }KQ, z^$v`zoQi='z̗/nwJ#qUcȘsΡNQ^z_r^S=>?9OL{[e[%sCz,%;2/c%22p5ǗÎz6g@9g\Zk6x5(ӨbSHKtrKmWp߶$iEPk1JKM6C =HN%ȎHqHnG1=3qIahDIA+vPyNa>O,NY.=;.O-桇Ä}6nu ӧBT: e>EcѬEXnOoFϲS_ [:X4 O9Nxc> m6Ν˖-[\G@1o<}QTl&Λjȑ_^1! EylU]]͙,ZBh7pS|o]M? P #Xc XjʭхmVZJ4w.'/Ł>$IV.J-z9VMNZmI%ӈyAEQ';;[1> 떗.i9qey^s9e~x+ u]; rfA㏩$#T\s 95Y$>l Mm?& 6WzzX:N]FV ]5OϏ{Si ~_GrEʕ+Yt)W|1Jń 8䓹ILL쏐/:oK._~#,,+`UUu pБ), s_Mo/!ڥ|+$dG0zA6[o*6}l&MhWMALX69V+6v%5 r6 :-H& ,˼\|ŢBX~\^hUt٘[~yTvyiL==}HQ!T*zcK{߽C`W>vV,:)NRy\NX| ^}b[" LI!*R"XGD TTmzgUE&u`!T bCKKh0m6mJ:kqmЩIdzdžcЪEHA"#_/؆{?bIc/#<)š/Jm&2tiRj{g0yes.QQsj̭}!J',N }{>)wCTЅRXp[\ cAΛꤓN?!ٹs ~@Mh jH$ڜ]ZrŒ[g7M(@Ve%烛va"J1"JK2S):;Sq6;jYV%h6#h' )-IG2F$AddYfʕx≢[To᫗\ƕSNKgʩi$7(OxԪHz8RQs>%ŋ@aץ"{AjIy- &+Tw㔝:.9$O`wK+y>v|}<$^J$>'ژCۗF{j>?(6Z*2RUh*Syf"TLHk1ƀbU;^al'r0YѰETnocV*$@Hu%/ۂ  K槥;_SI1xa`] /eO*)׎%ml冊^ᥗ|I}]T\{8G}d*tyd#>x( X#^ /9o9,NFAC$>yS]}<쳢[tNmm{;zl]$>=IElHU^#6W]/mw6`( da2\vr,v;y4kQlcÝ 0Ӗ$ UC >Yy7+Ee N9,Y׌ES{^+PE(J%11wȃ(? 'm{oH$m{C{O8pYj.qF~J)҅A]Ckp0D}< uP3gܟzM$~~JKKc۶mL*ş~cÖh+H`5ht\ƕ߱~_;$qx  Ro&lV|v1:{3D3h{zn;p*Z6Y#b2r'ajzgCQ"-Т( 夦 nVX5I0Na<zMu|8.Ma( uO85# J5٭R@Q$I_EΛJVuֿT=q8]l 53dda ª!RUo_E+?é=-"8:1h*+T4SSb駮$MHb*ٙ 7EbmOvÁ]ѲQZykQlU2=0iLp'GƉ C(\.jHv B?+N\91)!~x!{ZΙM6#AKe/9G?aoAO`c"!nSj.X~ͶQxg;ԮQ|ecoGBS şpvГݽP/SW6G$WMu1ǰjժ?!pyl>B nB+ea =Q}\?yٳX'u ё4&a#c/oVdߟBpS1*rS$rcyzn;X %*qW߄%φO CGGVw }^罈8g:Q${Iq8̫WtQ$=<@5Wsu?Cz ׬YKG_SST`ok]ka,RlX)povsZ[[yillDQ"##93f QQQJII ֭cj?Yf0w Q{T۷oB;l[6}`HBÑS۳7ȕ\X||6Ca*'梮&z;"bKؙ,w)N'% {UndxoA˴ζ$Q&ۂ ]Qų݂ppԕb5~L.)--{?DR1|ϟ:o n*zv ~gs8ذi%[7~ C0۳@)4&ph+?>cb b3ס_<+v A\=$-,apnΌ3شiO_<HIJe8:DΛ+'$$`$Eێ 6Ⱥ,ZBӐ\`{)W.וjT*4RUЄ䟆$wn,&&} ;,%K'I S9ɱژl2j#M dPR6%gGr;*H=Jf A 2o]vY[ зZ,|fZ>Ƹ!]'Eϊټb*)׍%mlt_zww?#ze6}'?Lyy~c\yH/GQ tTw_|zjaEW=E=`};)#I&PCS"#Fv48 3n*`.fwX;eR$!]vcq$l%˴(z#=;4Or;&$S=-=̘ A# IDATY9cEe V;_<ʮg6/-M\Nr)TcjΞ7Ʋe ]b^='ѥsdBo,۹>֫c= !~JʚigBBLHvn}$>dw?!j/1JQ%d3psot{lhV_SR\[I=,q]TNdn77 h/xm|suO?s0u*)ow( rK 0(t_Oe[e хdQ 엕o3_O<€6`+d۶m4558OD}FϠ )@GAaGc dbioCoÒ -p lU'SIM#~=*ݕ"pSoivmavw36&VRJk1<ߑީxaW[TAPdYfɒ%\z饢 0AZμe"}a Zi6 [8։i$dbkw[cLuzOμu"ZЬpree?xuT?O׵lP=Ay`Q Bu<}\8egg$ A]{7} M=?f= ' _*O?t+$I⪫b…: &`6$u1Yl/:A>|86m|" mf3uBic*,ñqi;}{疗hd"}R:ð9)2QULk@8>I] 7bWJ(L",0nTn1( MJ^ۣWP: a-I$GEr[aSB.ޯa;y oa!qDZ.YVXv7<&ml\;zh~ѥ8T\s-9'yD_}>wWrI$x=HX|WT:r'g/ q}S5wLx?րݠ? /xdPn`JC'ga¡ |oe /EV-obUF[}ͮ\vB[J;*iW3nK,0f'j%jcNШ#VE^p=3Q$E  B_|4Vni0:-h,8!}Xr>ɲB6 T4S]djqf*6"/I&rnP`uTncPOb{<"%N3-]=-=ȾA_w؜[;{5>礍f5cPwTk|&>9L&ݕ]pFP?k~> Z]j4 ~Vh5rR}sRN{~# 5^9Zv1@.4 xlݺIL$A믿W_-ژ b3i7eN\Uh6#;U:vdBzgi| 1܌&.9G>xl.."c 1XG>請p7MoӊZFGa1,RU`_L€0(ySy|ׄ}?gwԬMu MA l/%Ww{nKI IqW7MrH2wr !.BZ=EX)y<t R"ޥ Ó܎ bz{C mAaYߙ1c*`#B/Ք>I*SoGaQUʺ/K}3ulJ54[qFJϿǮ]^U,]Bwb+^A,w\omg7>uL#ixg;}k7rFI eX< *v=O7wNc"-ΛSN>UM?Ԇ`Dfa1I1۹o]T#qR6NEMmi U.w?*AhKrXVJa8]LHlOHqۻhOy{%ӖdXHn ɲ̷~ˬY?Az|G#_Vz56EQ<<礓S8,;X ("vt?8 YjUYu<+:#233T 5OXx4>ЉFo\A%BmL_]}-?ZL kٳp鲰Fup"~[(BKB#UTiiρPlJ0n*Be/'?N(XKGrj##]!ǰVޭx;|Xr{jz$1!~_AA ײbO CuɄFq2 >y15 -~G-[ vAGA=ws7s#<m՜siuzhq1X2k jBG+o/x6ݺD=4[K U"-ΛjΜ9,X@Tvњ?%ߠg=o to(4״w$>f'0c1""Ȯ O[]1rcuܞbt!0OZyIngdž0-#ғ܎mAaɲυ^8pA/T }8[|Lu+5Zp†zi\xCaٲgyZ>l(t᫒{ݽ:)wrKp0 5 /OI~vߢU8t dW\g$7|'t=z4k׮`B+ߙ}?>ԮV͌MB* T*2biQɁ[=MEJR 7ٝ NSVOD 29֓^+hyGƅ[G25=(A(2zh ~-+}$L0μy"j;\c'6`ѩ8~h&w!Nq:̿:.t<뜀I#Tb0ܾv+= !~J8`w0iE{96٭Rru?IɁ 6*ǿ^ i$$DDfg젺Duf$ 7bjMds;b#Dۧr=Z:۝ۑA:/  zYaŢm9'{zZ/o@ `uIOZZ(=o8**kSSHxivͽgK/!{C>?f[s0',x QᥐI/oϑuB]wܾ^O3+}"1VSmc\ &{XBzs].Fm۶`ۑ$s91cu7Upp0բ L4Cjĥ{<ޟ(u3sΈi IMBU\N<5{%)5M 4s$6u$Or{mI ⃄ p(l&((HT !g6Te9xڔ(?15f@{ڇ9>h_:&/DF+D ~=gxP1(<<?xINx~_ ddr찆Λ*..Bv.oвMs,#wN߾+ޙSm|Rg VgGDcB#ueȲ~]`svVw[v>=]D{ؑ:y$7TI0:!$S" 3h>~AAOP[[Kll'~iiؽ*Ξ7t$kO(Bm7^% .^lcRVQo߽AJXp,tduϫuxMsߺudϘ.66 4TNIqZWv1!n Ȳ݉mVѲ;/'yZG@NnI cZ-INZ$azA.+_?0Ԕߛq9? iq=S's6)awA?ny"ЅoK_| e._͚p%7c(q47w@Fpo0lT)!1ck֬a;!c(nPY\߽I۶jJ4dՁ%j;c;UF ,4v偐d'~a-%Ԅnn3dȎvі]݄ cmI2"I$4P$AApC-+s|Xjg> v'k^e\b^1r,41h^x@NE֟o][x3*rN]Z%{ hEPk%{ !~W$۷3j?tTSN'$kOKYX ({#Xs{dHeG NRRFe)y)-W[Vv:y$mJbLb;6I D$AALe֯_ϔ)S{uA _>dzqQ=~LDܡ_KRžZqws՚^.[Ϗ!81 /}Cٞ߸qHv5X9%A\IdĸS&mrTgkuR;-J7a,"uc\$%%jFX\fcr0YFV$>+mZ%1.% ;6I$8`e ~9!gOIXk!55$0.rq![&pϣ}zZ/:^$/rB 12? 5Od:y zV<ǃZ,\?r ' I?8w)DQw<۹6E&#vD%1c!UFZ}ޮhmahͮXӒ$/Y#vXmXlLY dE"WIkClZp֨$%u%qWn  pp9d>n5%-^% NGEz7[j@64}f3;{y:~&'s/pӏ7jsRI<{~J]mcN}\忘~qHWvoذ F28[\~[jG}t;s=w?+QkU̺f,=+ |vλg a1}Jy-Nk;+'R > y //㖭[1̘AE?#IMu58{Z+G&tkf=/~zƞKdewMM 'NIo9vXիYpױZ{ oHe„ ^˹(gWo(nKuC>yw_ 1>U. &:UψP.2RUhl)ˁ 6ymG(܎Ifs{z>t IDATFpGr{PrM+/j (& 0)֭[?~|{ 0Ֆ3p9D's چm|:˙ƴ32`=W"&MߠYc OoxBOѪžMѠ\( sc'S@ *V+~)wDFFR]]V+P?̃>E]{܁DQƯ^dEcNAQga5t޹+x5J6gy~V;HĤ9prUE&XZ4n,$)N)$.;ݹ EخFy$l::#ܞ^'*AAmj~x+qk_/`ϻƠ'4{C"J׬:MH QsdBw9_!7yrA3u;z6_7n`9sf;(**t3+p5exCNvv6|W̞=˹7<@hh>2[ʖ(v k{ޜKov̲yoJX=>0n,D4Rva69='l:*{Un1KZĔpeD1=#I)jEr[A|q\!d|q+w6{Wi$ιm2⟖ >gQ̾~ܐ}/in7s< ;4ݎ_lO{w3N籣cD? 53 l޿P QPt{riqm1mڴ>jh[xyySEFFR^^dnUS;{`?o K~W+UF* TqX{L/Un*r'EȴߙN(l6XmLZk(5[LOFy8vFŤwTnOmAA8Ddd'5uJοw wdK=,|G?3U݇OXw+;<2{$^H@B:RCQPA] \w׊)"" A); %!!`$g&G@C̀ⶦ⛟Zd@N"-\ .gm(y͆ŚZ늕;*n{وiL<ܤ-BT|O?]nBT\Dmqx n Mn w_O7jAIÆaO98S?(9C] Ν ݯe0,fOuJ uPp&nj n5.'aZ[ uݻ/ؽsN VT+Wr-кuk\z̕TJrJJ۽48aw/xeC^x1#Uqg~}U)tc|zӧt XY q%%[[lZQu`g֭In)wQ̩S;v,#F 00]v[oĔ)S7߬ҟBkxK~lnp:Pٴi ~^j\-gw@H;W_ibp?{)<3v =46/Q4ؕ~!M4gϞnEQ8p ÇhѢc?YYYӇL&v⪫t ?_HH EEEGBB[vWPnf̘߹9JJؼq1WFM`س%^i1>7~77z:4]" ܓ3lTJ._Zъ$Zl([p)xiݬ6zZK7XVܶjTcجv`ڞZ⶷LϨҕѥ+RB!j,ZaÆ]ў3B^`[;CŶOUѿ;~ck:x>qQ]_Shv;GGutөu W}%O֍4۾`LifΓ>X vY*Tkۘ\ՋI&]1qFE_~bi߾=}b  Q;wn17p.ڤI֯_4>|FI޽ټy=Eu I\&G46V8.|]_>^!'Ͼݖ4<2֒{yٜ>V}qۤM&0;r#"RwYq;vvfaS(n&m!B!jB}cӍ#:q5Mcq$8;ϝ덷Ȕk-~7ݮogȘ)Zan+S[-X/N|DFFҥK)**bqU wɬG VV{.3\{1>'G Mv%#-#ny(& 7;Jw V+-p4[m(3Fb܀B̓jW;Em޳۾n\Ո-K7ꏛBZKUU,YwQW9 !D`7=Ў_H>Ε)Uzgm9CY; C\ųMwՍg~=H'Su'_Wc02Mqw;/~q+?DBcyB]V<ŲJֿǀWyZC?k(_̙3gǎϰ233qsscĈuMMPOwZ٭$8lFUK KP4[saKm c)(}KcM%I$ 7L_&Vtpi=lZj݁;*vcڞZKqGAÍ~ wt ǤpY+(|NL&Ejicgت̽.c'ω<'9B~9q8iZП9Gᄀ?'-5CmHC%I4 U#oWyA='uЬY_J4|Өv0U Q1afno9:TrNyw|</ۡC kvnf4irY0LhUM)Vhhl@3QM6460&Mzm{p*$}7o槟~oe߾};riL)ݴeΝ,^;w=333ݲ{djԩ8qŠMP8P2gʕlP9vv &pK֮]ڵk/9r &`9vӧO`Æ \sr|M 9qSغu+?#}{w%''L>Êdɔ)S8}4;۷o~mg}FZZEEE:t⮇UVU>}:)))8&Li$%%1k,֚5k={6 sqM? y*z- HOOO>`۶m,] g{=Μ9CVV|v`ɒ%l߾?SNo ϟٴi9l6&NÇ3gWf]Y3fL0UUINNfƌ[իW0g> ĉli&/_X*?w爏?۷d-ZĮ]̙3{ٳ tRm'|Bzz:[@yw޼y@żSӦMٳXfMŅYfiL0AJJJYtCJNy7(**"--MrsD-;GL<^zqA9G9BrJ1 Tz/iӦzsud6 9A~GYl599IZ8,s':w*}}ջ|7r&MJθxoQ[n͋[RoÓۏɵc>]Pudbݺuךs#>@V2bx'(ċ4e*cغi?~_ڝA1vX!=M&p-T]~zɩ 6MK*N|_xᅊZ6lܹs5j%=7SO=Ex xڤ:p/I?Vц%d^Pef/QI?NB|8nt:k+GռخaKY[Z%N`zG7o& lRմsmWR9Do(ωnO?d2sb뤡_Ii4%z71mKcWY6R udž4⎧`2C]|N.wlO|qY杳iE ۾A){_f !z׉|G<cs9,Wv`:VkN{([TT?֮ *M++vFaa!m۶5|%tPȨX5&˗/gȐ!?QUKII!::Ǘ6mʿn+K1<hէ;a1'z8EWr/#0'bCI߂4NiG(ćWhpjgXVv;& Wbڎ-j;6Ӣp` ˝^ѥJ}ș{gB!i:uM 5֓wmfd8JowO ]n7$Ns8H=Ց8#G?o4y #S:;Ö hQK}_kL1i՘ew-5Qsa{AV1_h&.[ؠ| ϦiEEE$&&2sL P+MEEs-QyBdddՐ+qWNqcq٨x7mépRٹ Tܲ$K7) §Åq#ndՕb6f1wRKPo<!mWXQdbwtrzPC(?aWa*>˻|V&MbdIKf +F=fp,v+U8n&[iI =V^d%6FdIiq;[aڅ9e+h  Dr;BQl6tBZ:jɹ\B!(&Ǵgބx3𾶴޴2}ƌ&w2:]9Ng;:{v]Kޚ]eĥ{.9b+SvMaB Րvc2M—W1ʟvDDD)))(!!]3LЬY3wΨQҥ˕g6mʩS8RRR*>02*Ѿ}{ڀxY|z>-Gq!#B!f BJJZJl͗-j7,[}P G++nXϕۭHq[!iF\\;v?+U.$ڟ^wDy~_m?%c0M# h5[s@F-/ ͍毽J=Q)}3u\ѩ2KY]P;3^yC!d_C?/Qc}J_+]sAe]ѩS'֬YC^^ǎ`M6;vX]Tc' ?9g Fn&y"O%%14F +-J(@VlVsXkQQnkaH٪>An[NB!0i۷:BqAn,ReWB,n3 㵡r^١A=H5k bT2?F8#ɴf^t;aӪ!3z?eH0$j˅°uW¤0`k֬`͚5ff/ay6bO[ +)EemIv?n=-I&>$-Bja25jTM!L&׶b+,?s͋woG&O>IUu=K[2tHUqO/4~lJDоg&\U<:Ucyic&y5B Joѹs>aX{rr2QQQ_Jo߾VXA1bͫXAA 2=7 %sQ|B@xiqp͢nFFOвi͟-e7I€aS?Ֆec)n !ꨪ9c?6+Tg6Άf}QS %sѴB)֎vBNƨl+Vz٢v-vCVm"ZB!0X```M CbbCHޓAS_<{%]50t(9?P9hSr$@ٕ[O5pC5d*ʙMfVsi|\fRVqsg&\U<"ðʱӰs?vlKikw@qy Y]$&&aÆs6i$:oMƍ+b}ݕL^`ر5vͤIHJ*''O6Gg_Ayhl8-C-+E*$67b;=VzZm)+nkl.kIYmO֜v3O-IdB!7n0Gg \?KT 09CҐ[q9> ucpOy׺46?~I.jw> %Eck_#@ԵЏ՟p*Vv7bYx]'6luz{裏j/{ѿnl`Җ$ Gì]l'mC֨%IZ3ʋۡ%B!j?/ fB!2Y:e1Hs?$q] 넜KI{_1SPs74i4r$|F)KqNJʽenpVbԜgc!3ܯ=pI_}s/:]]U ԩSYhЬY3ǣ>ZgZBCCiw'BM8L v;m5Ӹr;E UQ2-BZC4RSS 9!mᴝIQ^1&q{i+MNZ[iq(}no`VUŧ_?B?IZ4B!ĉy-BC>ww9$a[:+ dԋqhSGƼv%r(UXgW_3i$[Y>|949OQvnkdh VZF9sؕ:Xg<)'[T"TV&,ЫB!BZa[n̷^ GʷV;M\=aP 9rmЍ7}åsmR(w|v~?epVBe;%Y!h\>%Ar/6mt\>-LBQhÇiӦMøWa34 pHޡ;N1)4 3,,w*RC͍jO9+q!˒]ia?ĻY = rc/]]>0gY]ê- ]}᧧3iUխBQhƖ-[B+a1JZb[б8Mm!4angp9#q1.Kc+308#Lxµϸ>f8|Db5{*.BQۘL&ƌ#s! kӈ׵puAJ{Q%qɹܬʣSfEɞ-E{aRL?\oI/H70#L ~]-rզʅn&TU4B! *+W9J OؙX;׎h8?nH%2Gj'L4ܟ~~ K][ž/ Hisw/-#BRRR8z9.d+BQX BKetcmwBfj>7!S<;[&c]GqoJhN~ܯO?9{Ց8({Q"rl9f$isn_}uoR6nHΝ>}&Bzd21pwK0i;D7k:j(B{c0o?8}6bt| ^:Ӎ=i0y͟mfG誊b]4QsRRRj:!BEFFt Bz(&6iOb pwO+eZqoc'OFkhWܼtc3$a-ǃfJ" v\vmU!j_|+BEUU&L_fsM#GE6|J+J~}3LtƄwx|VqEl[L{$g2Ԝn݊G۶ wO~[u)4j̨vFXnq.sXj 3!s yV8qaahؼD6&~*]d2#mLBQoiҞO0\¦E{P7dԋqN/W:*=WL #KpX|o5+'NԍYbb(NHЍrO,#ɶf3h bݎ2M325Ý֍U-WO>axҥѩ 8q;w^z_~B!0@qqqM h<}ܹzxk~xÄw bmVTuiҩXu\xlI#93gNVPW׮]9f1u*}lvflL>R1n8GTf/Tw y_7E1ApЬrmLn޷ow@i EQ.#HQf3>,,s8ωn!B!t䝜818>CK7bܸ0ݫ1&8L.M7TaqFg%<$Ek!pEZLVܽ^!3!(mM~g(ίkfϫ݆ݻ}vxNӓnݺq7r뭷ҿZhqcKJJx7=Z_a1cNTT9RB!D}*gFU՚NE(BQmPUnV6w]]-(G~^mXGɣW=b/48K<:CjMGTC݅93eWT5McС^wESo7Q#s )lxPĐbÇ?~ɏt|ucy.MJnFQ)j^W]ߠA1GFaa~QQvɉJis<4vvlJ˫'dkq} 톅Wc՗$Ǎ+i̙3̚5oZOQXڷo_ի=zNM!JƍeyݘشH矱ˬx}cQK46/NM!ȅ|!DMvs{]%>T{/M|?%l?S,QQK7fgݷQ b<۴FEGKcgi(\"s\wvkqf6ӦMcĈ3h 򗿰w^ 3g:ub4nܘEqUWDHNN>{M&BQ%L&z3#WF7~,&J+3dH~uACqw׍ƣet5g$qat.=t6Q s ](f˅]_,fecV|?(ЩS'X,呜́h(x㍄_ӧWu ZAA5> ??NI!2|F!o5JS5LcyF5 [Jߔw%]Z'_ș OM4jH8W-B]~f̸eF5dUɜ>؀xj݌ͩ)Ks0m2*g+Vq g_T:ubӦM/0!BF4ر%A%d;;uc^xO7etq! WyN+ ъ*oiU\k!7e>ZڹCҹIg3ds Vxvm30csj@mM*}\nه0(BzMQ:u$s!DHnMtcE9AKO r7&tcj^3fVsFBo?fOΌݕ9%p^u}@j!_z%#+?/BQ9~m{9fsM#֚}% '{VS0<3%&CQ^Q+xX| j~~XW_4f4n58_gb1܋]9G 2>zJ<(vlxo>%\bHQw.GZZ1B!DiyyyJ'!DDv<kwusn?CʾLq7>܁cmvOpn,1ߺ1MV4,CB1yꗍO9e9Z#66V1uWM Ba"ޮBQz]7vhӉ){1.MP ɯ  Ftcgͧ}xmGg9Ց8Ko(C4vɑ%d5=UEf3. IDATzj:!Båt Bu8cyb9~ ͡-'QK*s bjx/Aƴ/pdT\qO#F&ӵiWz`GJmHIe?52LWc\39dehFQ~a9fFs?HU+6է_X?4jd)Y֬jΨ~90\3r.1^ӧOsM7r-Zмys mݺΝ;WK//\ !BT1EQhٲ9U!MEϝXf[~He&x[r} v,|G`c:&//ǎoWc ġ+i4,0^JbXj ACUsuylTθ<RnժoE57n+BzMUUf̘!s!DIa1[a WxxUĢ:sX4~Gv6 pcRU/n|A 1}t䟫9I4rfU+*BXtc_~fo_jJ qn,ӚI sΕ;] s*( F|Qta8CǏ{gķڵ!BzM4v-s!DkMN6:K&=G1䱫h)E=p?~?h,KNbY =v|Хq9l>TW~l|5ΐbw-OxW3gF(&&FNB!4M#!!A̙3ƒ>Ȑ!CXp!4M1 .B!L&syuˍ7.:سx5gT=69٨Oᖭf%<ݫtidSb1M\D%GҥKqwwgŊ{DDDlvɕUa;C6.B!D*?yuUם R[s !;ucj^eΜaTJ‰ e# 9Ooo׏^gR7qÊݪSO1h e9hvY$v8V )vkƽ|N[[n[BQL&z-s!Dp竻P X"#tn삫g2(#Cu踌 VFȜWCn|DC^gfѢEnժ'NdőGRR)?~<B!0`ʔ)2BIZ]Tž_.;7 %PboGsXBIFQ) >>ZdJdcEq,_|פLQ4\0ף( ss̑uDAA4k֌|}/~U!.4tBBBPg㣪{Ȋ,H!"l R+Tj?.j~j?#Vjuׂ(@}d [$d33~$9L4zcL|e2=}$[!"겆:Vt vmn_Oˋj͎lUQ1yQO+]y):lU_q8g,2s3*:Z{Z C*1F;BFOSʚl~~_L&P]] _ ;pUWW:xaM`u-.Q=]ƚ?cPss(Yv4,Iހ9sa=bV~I8QhјkU}2y4 _(n; |0x{4p]<AxJFHÇ# @ig.DDDEo19S->7vŃyH9ym(Cbc%Q$lSzރR XdUQV_q1FY(eg[Կ$LN[<<д;ixR$d=\ئ֢/tND̍ wNVD 9y40i]ߋRm8M&NgAQQV [G#""",cѢEeMDD6<ū/c!Q~"sŹUZF[>CpUPuND">>x߃V]N4c܁fd^DӒfwy-µkאul6kn6k,n\@DDDNMQl۶c"r >6ʈ ID[gwh^^^$.a*,D:'"K&,q=šB9yt0',7sJ YS'h!!!… #G"""+%Ig*׼ODDD% ЩqvO.L ݕӿ)¸ [v%xBPڵsB:d%mɽ&3flLۈsh?0]jڨHs Iՠ`,h|"\?555TWWƉZG֧\a"al$-Ž/ eDU?υm+w? P3#xB"cy;턛mM1pq@1/YUU[=,A3"95ٌ{c"r*çl/2;+"nXūG]k֨Xl+Y7H6 %ヌh+"w8oz"~PDcČ뛼h`U-hry_tuV,]14#2fϞ͚ȩ{!al$ܪ}d_,APc2*Hc#]SQo_#Gh=3ݸ={0k^1],a_>[P8щ$I?vƦZԭ4)cBv:@DDDlTUEcc#<</:PvǭG̙۵&x:jZǣ[|}pn^z߶8`: \B40`.]T(UU ;xY|DC`ʑ|U5",w I;U v&={r$.RfFiȒض!eqc#b}_nTm4\O?4jkk[&CCC sLL zN$H޽{#&&ZE߿'B"""rj,s9=Y0b&4 FukNv{ QCј뚵mO`#lۚZ@5zFHDG[wPh)/--/KMCzz:0y233qMTVVbϞ=Xh[WG 3g 33Sԉ'xeLȩ)+VpCDN/a\$|h@DDD$Iɓ9!"niuH;]Y43'Eaџb=0ϑӦ;č6XJ}i).wPXqlcm`O(o6'd޽{[kǏ-[@e$''_xd'"""WgDD8yͅ<&/J@pd0 G?7Z\Q;4LEmy$o%"(?aە1q/2B)[jvƜx ަ\]YtHd8@Dq[:Ԡkgɧ|䭫o6}tHXb۽… xZpfs Zې_<%d9A fJ4LEm%H!;W|YY؁sq[R&\IC#""UUU뮻pV9r$jkkjJf͑ lق{#555k6NDDDDDDDL|Um(%x:r.<J)0!}LKnn>>AbmH݀?SkṤDoV?.d4i;u;7T󒚜q_ƬYPWWתؾ};4Mnooo|'趑{SSV☇\ҠQ0ͅhsD7\D]z'A"""rj$!11c"rYæ7s{r'G UEťN6tVw{tuPM&ȃ}+lT1$`ď{p#Y$YI5:Sxv+hiF;2wv83@p݉r v]:ME쁠F~lRxgO.22!{mՇXо:onΧ6o!mqcgFXبB Y 'I.DDDEM8!"&ɒźܵ8W /_w!sjnhn=q|C#>"|#07p23tHdء>Vnf{aY 'Iwށ`e """"d0c"rywxz u7\wuwRZe< ӻ ]rSO[gxUc9~8s~Mָ9F)'!OOO[G """\C""L%<**.·l1NF9U(Ω2j)T_Q{2=m_e8J{yZׯ<=mnя~]zȩ)5kpCDF`Eo|$fw'"1ceyO4JC"O{#(w:8>SHrq-[`DDDD1 Xx1_߀jKmۡ46jD_xܤ#si1 XpF+~DDDEӧ9!"H3n)'_=.^ЃJE.3nrw/ߍƠQppQQ.b&Ґ$I/ bE|9~s7d\.s:p"CY:e*555TWWƉ+ūm#Q]=}]vr[bVֿ [څVr*spߣ c^!-v^#`| 8F\:yI&"""rj`ƍY~¶+ p X [jډۖ &ŤC"mq@,L&&<݅$ uƈ$IᘇI0;mȾXs" {y!pN竆oR&Tv8\4ǁGm^'I̙3< S$ #G䘇Fͽ*uKhHK( {eNڡCmq`@|:{R,$l6:ff3x y:톾#ÅmKP]Vs"5h } ** [lԩS'tLQglDps"0w.yf"Ԝ8a"jkbDvogNhc3B) 㠾Y '@CC/^ Im6q-N<N:U7$$9tPKDDDNMUU?c""+xy0a[l|UVt u_dlZIzk8BKĮSs,zxߎ:<j@c pqG@ }1Nv;DDEEɓؾ}{UV!%%gdwbb"ODDDTUEJJ 6sq1$nhst^ʤQi:~8(;0Aq[e>`7|ҤI2e ~_cڵHKKWΜ9!C^ɓ'QRRzdeeaժU}o&^| oG}'bĉHNNFMM 1a إW\\QR""""nDDe=!җ`otzJJ뵌g$I!- W꜈ڒ%fuxq;f8;(^ޤmᒓO<֬YTaHEEMa_1sL3O?4N:~… ¯RBŚGۉ|8֮]$lذv{;qoo!"""&2ƍ1Qy"fx?3h3!q*r5WwΝXxKNPكq21&٣C1e`|^R,%?/pB;r|UlܸpwgmקGx742׿U㑐`yɄ|݉`0`޼yXz0x뭷8!"AĥLLFg!Q>)'nd=3nb&Ή(.7s;G,e1ʲ\r;|-ϟz)fΜW_}v}݋WZ8|pźKKK6l+~DDDdY9!"A=!lK9q$!ZfVjn/.eb.)Aѣ:$IɩSYwSD݇c9y?LUSNOj|7ݞɩS_5L[#"""s@DpdcuQQ\c",vՍ*g̀-l *{`d*ؕe}X{1$KpեK~~~[_|۳̝;駟/[ٰa>3ȲR>>>=z4 dh*|KlPUVEQZv6?תos;ߧ#'}g ٻ{b4f ={ئnMPqx>=GOgwӡPnTU$ $j^++ͨc\v dF䴼'Git͚5r ojkkQPPw}@[l_e@II 'n6m(..Fee%^u@rr2֭[ضmN8x:6sOwn) |rdggl6cɒ%PUXr%;9O_F?;v ;v4p[vm^{ 555(,,;n @Ӆx ?gϞm'`8}4FQQtRM>sqq|<444W^b={СC+V 33`ɒ%PXbСCسicիW#55+yyyǏs,Yq0z"w?h5psD025~i`\:jc#V&N*e;wdfsYqSM5֓J_T{fL6rG8G ;?GXG'?F/w|Ec\'x߇6Oݻ)SLZ{MƎad=iWg}_>Μ9 aԨQxgq}Y5jjj燁($ $l6\aQՕ|ŧoۜo:*|={sf,{s|Otx0>o A|`0G/ACV7zp0ΟH{*7oBVՖ%U<^&8{bo nZS&IJ9W&}:{4MB8$9 _!i5[!ʭk'v9{RWW2Y]] __fq+&M9ny,X tJJJjek0`hW_KJ_WyO\{u|Oڿ~|OڿYq$&&q>ߓs]>>dnWnA#"""r6,G嘇;@a۵o`l0#ΞvUQknT0gNWŊ>3cg 70&rLDI'a{yY?߁󪪪N7׳nZ{v~+)DDDDLQرc"dE @Px95x<:(ږRU#G DLYOکsc'2hu.m;N߾)5Zڃ dgg#++գшuGDdb]v HqU%y(ɫ93I&-l۝**] ovW ^4$bIVeRRuNpDp+f)~ʿɓ'<߷o~b___9Rl'? .\Vŋ:Q0`6mȡ%2 ^_KB\%}y":k(>xHDVGLve91&ms)NvG ,hyXk.dee̙jsK{~!66#(H<@!"""r4,{*'")B|mWO@UUJq#Rxv+p.Kس%lەˡ.pd-es,6;8p |uq[gtbyu}/=-F$""Idqʊ:ȨDpI'kܨ,@'"@053r)4|?8~@+:.Y%'ӱrV7u֯_/:? xg {SbHKk:=>|\7y饗K/95EQꫯrCD $'n(;:.@TB{x8|ƍZ_ DL\dgN|w8!kWw_JvHR龋nrJj3KGѷo_?EDDDUڵkwE DD.a\Odwc K7,|'c/+=Ϝ?V9t_ IDATJ4NFfNvgUfa0)&X~~6H9yPH<9,n @]@\Zӿ.Y?)TUaiUw 8y$JJJP__,^!'`̘1j(//u4"""n*> DD$nh(<œ*n6 ¼j4j> Q[cCxؤFňK8qR;(e'_cd\r:f 2qqq˖-u4"""n!2q2DD.#>)Lؖu u&9fwm%!PPiٻuHp>`-~9 ?$4qD$''#33cŶFDDD-E޽{YQ7?&RxlRqX4odH֯x9v2 Q[3cgvHkuHu8~@qەf#&!www 66#((шN/M'Ss {{)ֿdBf̰XʤY딈sdz5Pp&}"""rj,cڴiu#Yot-/ 5 :'r fu宝%!PP$E$u^Kp/>,yO9 =㼽(裏8!"fJ*~H4o$ȾV9vJ Q[3c:/er!ԛuH58@pWF&ÇC:EȑI'rCDB{!8GY)edOOMj FTۧ] jǚR&u:,8S"q$r)@]d7 $HDDDNM$ۗc"n&I2)ʮByaMj|4=bڝ.2ڹK$$#:/.Bp< >nn\+'Ihҥ:t(Z=-[fhDDDDBewfMDD AD\-PUEY8[ u᛹ը(֙I>](}Y܁>وgg8}EOOi}).ܼCqdr)]wU㧜\x/u4"""nSPR):T(˫ӿqՇ"-2Qx#&F@J/^HN߾+e14mv\(M+UUl:d7 ͞={FlllGPPu EQsN(yg""겾## ' XoW7 ܾ]4$b}9ф"<. z<y}y8MB| ci`0੧☇H#>,lK;]EQ7)\~3F@rw¶CԺ{bo۝S Xc`pf[Wf1Nvĉyŏ(8tm"P}d7 رSe{/ٝ|35:<.u}Swhņ)'G}SSW昇HcD 7֛svLq5G꜆6 !^ox a1 0׺~)۴aC&999j(//u4"""n!I I9=&lK=Xʤ qc! ۪vjgGB5FdIww^JpBe+c&T <qqq˖-u4"""n!Ii&#B)7a2-2ɫFٍ-%S ۪탩 ;v ~w! NҵYS䍓j!M8q!~@)SL@'IW.\Vŋ:Q0xW`6m!&ń#yGtJd<.&quRkF8MBdhDDDDBe$7k""#qP^&cS)~"lʾOSl2!Νm(j1zs=^ ulA|gV8qa>@T ek6I,f7ir@LL bcc[=8MDDDd2:KR&\Qoڴ.ڻW$$2"b;Sc7E蔨5y\XlqU&0ho& q{1KDDDNMQZc""eb휋%06B[z315Aih0]vDŽ ^8qqmZ-"Z8MBo ci`0瘇FZ6^.9cn5ǏkڲTv}Jy\o({-uYtnJJJ.DDDDzPU| *@}h$qFKDDDNMe̟?c""3^_78MBO-DDDdYƨQ8!">#…*QQ)e'qrs{wey;3wB$ Z\8Vܡԥ.xZbϱbk(#hV؅v$ [dO9x&3If~ꓹk&{;1^Wc}mՉ),Lq^z<2Rq&(u3[ukeBIR)=֓ -h7ҷkQ޹Y2Y{dN:Hʶ~(>FS3#[Q송>O@H3ͺ[y "”?p,'oV'mI12EEU]hp+)29ee~r_!灃xPMM򔛛SZZ&222!$S5*<\Cǫu6 hŎc8V7bh\qn=ќAIR# cTQRLXz_"33n8VѠTe~"$iG;6:L;v4rO<+a;6 999!pշ[f*sqn+oWظ oXZocyota\&Icu;o푵>NzL,בxnZ~=_o!l6K.! 1Fn?.oe8f[\:v{uNOڴIMMΓV&kM΃DK?Q~$xreg@ YVk<d2>Cj.[.tksE2zx'e}[?N2<_by\mZt.rK(vb: X,zꩧy ][uZ\2(Uё _ڷWԅ<_jz&TΆck~PrI[jU})v\&? mn޽{y u훤H\Bu^fJmmI|Z:\g&Gfkr>F v?׾K(vЈ#x!nkƍ<-UBEƄs$\v{bZCkhO.GIƯM'ǶI'}P송 K/ifYwq9)WLNVIAy,ehA) ֩+֬a48ũ+n8oB= r*C*C\!2Ԩj&jepJk,.[ 5طծ]:QuBJx~yV+] UDn%p᫯"a!d2+$ .5V r9֡)}rrTwAC&ItG{~yШ%x,9N s1d(vaݺu t7\>XF7]EVw'}%A"b1co,-Dz)Bfs=GA.sqtM9޵"x~Ś>y,&Ks6lVkI^K}Yͼ<@2Orr=f8V&F&Nxn yG6:Z'z>yW}6xPfffC𹜜@pl1+c텲~(M\{U7oa48.vnrGJL3;ci04qD$ tvZZ }Txex>LkLv#&r_KC}]Bl֌3y> Yfp,ws+ͮ2e}zP:}!SXbG_=|V>~"xkrO@HlzyH(ñEJ,U_6d8+Nӧ JMU9^u\9e9-/r4IOn٥}\pb7 [N&qQx IDAT L&.rh%L&*RxE{%Ѿq.vU}и@SpL5_֗ ):prZ?GsyRFnr4,S(vO?-0|j귿-9"]{'),ܸe1nwH^|X݁6]-r4'+ͫ:u|DVoPei]Ų -(-]Z"-Q-M΃&I"u MZv!f?'VbtUbwMEN*UXA+"=]iick9}y,=/s?pTv4n7o,KŢ_<$D]XñEڷ,a]mmknnA/PG>P룔hU][ee;r4'}%)goh"04vX>!fiڵ< eX}hOf:J4oTJRX֢"~A2Z9-]\؆L&<9vٵ`S͒1F2d})vP|||CSN:@3jUR_cձxS>ЂRȋpUŷ+tO#;t;' EA΃&r?J) BK/ifY\s 9Beܒ!ogH6:ė%slb x>nj؝ݮ+ӯlyl==heRyB:xW9 z|4ͦ @+d߸H]ba8m2qշHUV> Ʀ*#!pldz'4"uDO΃fdJ A6oެ|::40LP송zKpIJJ th^a65sL6kVU+?*<ʢ.}VЊyzvY} JHЀ Dze8Vj#;4= KV[VeْҤ ag?f'@+)3AQñC\l:c/C Ja)ӷۿ\mRY^W={}]rX9U9Xܠ CsΕb0Ţ3g@+fvbbxR b"bЉds_C:QuْWPP-E[).]ȂSEvVwݛ 6OWhEM.9Z$2^:;}a;f6ӟZh%u1]h92R1Æy YL5nerVe}vӞy5v[kCM8Wx_mmΦe*\mRiuFm{kjT}AC&m:[o_΃(oK+04}tv!fi<"R):!p.5q \OzWJD Yj=9l2؍ K/b: X,zGy D&ug;_}7Oߨw[/ܩ]dm{nIijV&DJԟFp;gcgnrxGH5en:t(_q!nk˖-<B\2);Y:Wy9oM,cG_r,\DcdHMUZ|ZsQnrxUnMN-%߸b7 ٓ7Av!l6kԩ<\mDYpLg8ݒV&ٲ944xPuuh{\*Y:ze+{ewb09v{} JNQĞo79Γݒַqb7 = BfkF!}8ELJ[rzehA)2'$UfeIl55ܰA'^~YU_I jinrDliy|KahΜ9X,g,f͚E!d6k_׫;Jbr9֘,Ō0.-MTh:K?Gض+vK2!x;w_vS송d۵sNrQVoަb$Ŏ4cʒq[UM~N c!fŊ4iڵk 8x}Jt]1OLsy.9|&&YJowv*z/B6l}iذaZh>C 0@<\>DeȾ_Lfb.6.ܐhp[:=>1u~M;D̟?_uuu>} :tПgIgZ#@an.v*Qyq1.ԗa}TҷۯE ܯ'xҷTXD;dlݺU4a„FرCyyy]7Bbbby u䲝ǸmG2׵E`M]c| JLT來cy3ȳie«D;*26x[c2ۄU70G+6z.9|Ӿ~f_ǏĉciѢEڿO\ٲe 'xBYYY***RMMrss`M0A=Pqμ,Xp؂ ]QQdБowMeVkoW}^[bʤj&Fs]"con\r'}D-v7,<'&&jĉJMMmurssuW;VLϘ1C˗/WVV͛=zHΝYfy'x~t颵kURR SXؙO=}ҋVTgVii@&7i\(??kWbU8oҸ`z~:J%->׻Ťν}@{sy)16a|?ђЂ D ͹Dnp]>>ZnB+{l3fh…TRR+Vo_Fկ~'μ+zwtUW/ֽޫ7w3oD/onx G O~-kٲeر~mSɺ;5`M:U),,S? zg[U4.؂5`+P1~;t@΃V!I (g%7Y2tѤtCCtKuc4Lsy)1+S'V&|"簎 owW&Oyڷ Lʚoqc6ࡇj5ݫ%KHF3g7'99YsդId4g-\y={TTT}GwC#FpBeggl6k̘1:ujIR=~DDOۮ:vLDZ.H֑}/UB(DL&bF^SԣU6*k}:L-:Syeӄ Y92IƋ|Ie-v{'|8{\λꪫ<}駪VttӜo+1%$$藿mUUUڰa4l'犎 B^UUm@nt<町1VŎy{#}nIzsǛ$r^>1V7K}< -rJe]rde]{OڼyƎq曪=ܣF-pz[YYh 7q'؂5`+P1~m6T]]%II1VvDI]#ЏssjI[yHoܸYQN&NUVIrrrrnmmvk׮F??M"|I=s Ç4hgڵK 5f 8qBx?޽{7<ژ4Syy8>>sMӧO[\]t߯'|R]v))):~$)&&^N|n;Z4a"##ghl5f:v襈3qqq-:)::q\WWv~mm&LMmKRQQax.(v7SddǡCswgq@[D(F޽q<`m 0aou9nkŊX 6@[BnForޗ_~\Iu]紹%(v@5eIꫯ7X3gΔ$f͚5˯1@[Zvmŋ+%%{\\J^z%]V9snݪ[nE֜9stAI#^z9n߿ ox Q_ѣG+22q[MM-X@> X СCY Bnd2u뭷uuMiiit8=&rU薤K=pbH""" b7E$8﫯ٳ%IW_}u`AP^^-[hӦMڴi6oެledd4z,YR7n.?G̝֒;W4yfڮ`wy=rUW]駟xsM4Iz裏z7`&W'&&FTXX،(ߠ Irj1reg2ڼyCo<՚}5>fF tw٣GyD:uСCcǎ);;[޽,Xnqv~9 =:>V[[ۜP͛9OYYPF(vfs5رcZbl٢bj}^^pгvչpUٝw9u;h(vm[sUTT y@#A[GTǎ%Ir;lv y@#A[GJ:_~~~sw80`O&rwЖQ$i„ o<ݮ+VHbcc5l0-< ԑ- Iҍ78~7]/+I6>v< ԑ- IR5eIꫯ7X3gΔ$f͚5˯19u;hZZvmŋ+%%{\\ӧ|gKZv 5sLmݺUr9sGyDC #89u;@˘v=Ae}?x~zzk*ڴiFwꫯd255Tf#|hVvõsNZd8Jjر6:hy@#A[n@Vb7գ h(vZ=Vb7գ h(vZ=Vb7գ h(vZ=Vb7գ N>wyGW_}t風(L&L&%%%:<ξ~V\ZFco FUTThܸq뮻_رc tX@P0*~MFmmڵkwu-[򜌌 Ǽӧ79ۓO> 68~OKKS޽.I ThO?^юߓtu5xqٳ%Iv]}nfG2Lz]PVV^{M]w233G/_7qڵK3gT߾}kȐ!zꩧĉs}?##qʕ+=:/;V]vUddڷoC޽{=c*//_;V;wVTTu믿^~G=_|_ RD]xᅚ6m.\*sn6Gl7pCosxfmӦMsݺuv!I3fzؚ߻'?c'N;t$Ļᆱ'xB獕kzw5i$}GJNNv{^%&&1~j…O?TǏWN?5k8~ݞvf͚%ժ 跿L&܆<$99Y?O$)-`FEEi„ ͏6NmmZmڴIԱcG[6e{Yf^p-==]Zڻw_|qi͚5}Y*222رC۔:RQQ)Soqf6uSNЎ;TSSӧO_Ç{tݻwoVyyL&N:X;vf$}ܹ?6z>LSNuZ+%%EUUU:pË2Ǐ~iϞ=㏻}ox2dG:wJ?+W:}CzG?**J7tCu'{0VXaddOOOw;ڴivI={m6cӧN曎s%٧Nj߻wj_xcǎy_x֬Yc7L[iΑ#G?:tp!''&Lpy>/vݞ8gŊ.vmy~^XX4ss_ylڷood;rk7ncb.k.{LLc~BBw?۟7?q>}:ur3ooNƮgiڴin7͎=nqz@nDyyҴvZM4ɩbQzzcǎ9={-Z}:]l6nК5k IZd֭[g̙3e%IZj.9]t_W|:ydt oG}$I ?=j߾Ӽ=Z`㶧~ZnH=>ui,==]}RSS%IVѾӧOwn߾V^G}p|~A6m$iOzFv'4gOx/^lw &;vЭFɓ.Qb7|楗^rN3w\Gt̘1zgߧO=S_{lذAَ?C3L_vڹ՗pyuW6:o5\#I*--uhL޽ϻOHHpꃄo֩Gknk׮~9~oآHS:> ےTTThɒ%N$IꪫZto&yyy-OLOɓ'B4p@}GMMd!:hʔ)mBGnqܰYK.ugddhɍ^/99?jά|衇<:[ou=1cM'ǎ8޳gᜆ=/{Nj/vIJÇ;mxz]w~}j톫3]]]3cؼVSLqSRR駟*>>> *Fr[T\>|e]t颤$:ztǞnwWW_hYqu>I|:IgF+ɹ/{kjaRSS)SСCd}N(#F8k'&&jԩ~u]Tݗ?\~N}_@ŋ;9sSOu`Cw 7h̘17tbnn{1 %%%sE3ζmt{^]ZZG}p^IILؔН'|R)))˵vZeee馛nҊ+<|-Yf9~Ot]w964R^^9sxtE՚qk٘۲eM7xWOSh\Xf>1BGQ]]^+馛4tPkN:qℶmۦUV9zlujٲe *>-[LzUZZ/Rjkk5uTuorr~_8V[ڿf̘ [oB]veڷoۢw׮]kQ}}=q+ɓէOũ\֖-[|rk|I^Z_}3}oѣվ}{UUUZz>3UUU9]9rm۶9nKKKӤI|x;}pQ^^k֣s;u*4(v (tYYYY2e6m$Iڵkyf_3..N_}ƏGJ/_˗޵5-bԂŏV$*tpt)KjEpZ;X+h)N.~!ɢvق9h+빮)or~%̪-˹z$rJFFFj3<<>zT*7YrёǏĉiiia߾es$̫Wrҥ]VJOOOݻהKRnݺٳ秵]]] rvkkkLs!@{.cccϟ|Y&;vH\βeǏya>|R7СC|\y&[leJGRdɒ%ٴiS>\wULLL˗LٙڵkQ]}tݿF0_>33+a7<{,/_?eddŋ v7@S})VT*yymPn};w̺ŊqFJR`ftcݻk 4ٶkkk˺urɼx"h((8WvPxn O @ (3#Fj/jO;;;ܺu(ugeeðaЪU+dz>I&a׮]())1l{,%Zj[Ƹqyf<|Pes*ٸqbb[ӵ;|p4iRz Rͽ>c\=Ddr@DD5Sff&:v숴4CbƌXbERRR :V QV|||L??3BBB`oodܿm6pqq+d2}5hP5&mZl'O]ZݥzXJׯ/ڵk}U 0W^x DVVO#͛xW}vlذUڶsAU:ѣGJu뇝;wrj .WQͶfyL}^RRM6aҤIz/D\rhh띚𽇈L$""7n@ EJMMQݺuňqܹ;c49qD1;;[z???\he),ouym-Zd*믿ŋ ѣuƚ R޽[Ktqq=jp}.\5_ERQHܵkخ];m۶҉+H?>|vo $$pttD зo_|Z''~ Z^}oΝ;q=u!66VK.&>o߮W]_O޽{ѡCi>R4kds%qqL073|}}O?hUask||< '''CϐqA-ZSSSef6~Zܹse<7|0ԯ_@TTTK۷ÇGÆ ooot }4a-3f ֭ӹ?FGG46KWPPիWO> #A;4U?'߸qC綪z5=sX9bꁙnLIIƍuoio߾J''']tXG# @g]2vʘoK/IKJJZϘbzuFwk޼Jx̙#>e޽{U״i4җdeeU)~Io?Vkas%cqԩ u78)έ1c*[U3ԏWӦMM;ۚiL]&KeīW/))Il֬YNܴi~QQ8|JRDDX\\8Ҙ(_z{Y\Ν+U7IީS4R?o߮{\Z"2 &"˝:uҹN۶mPaѥK;vLz:t@ѬY3tصk!`󲳳?KˣG81CTT}vCFFѷ)w?ruL@ǎqa+o#++ Ç͛7x\|'OxΝ/ ۷oHLLDFF"##W\WVy QPPP$1bYcTӦMC^^z쉋/HHHӧ.]%^Yvv٨j3C|ƤϯAzkԨ:M2w<38}4 "n,լY3/0`'_,X`^6֭[m۶:1ձoժ{9iY 4й(JQ#KOTk_ROKKV]eMy8JJJ0sLiѪU+rO=&Y]LѾݻyI}?&MhkԨ~GDFF7oĺ/䶦ͽ{yfy&{!883g4Zl@6{nW;o߾ؿ?ԩxWiӦrÞ{9+;w.իcǎo߾ 6HmKR8::b˕ٳg4z績 ׯ]cnݺfDևDD&f%zWvm鹶T)))عs'6l~;;;\R]~Јx"Μ9#-^=#GT:ٳgdP'XT(9rd2W\Abbbl5}#I=m=qOFZ ZrppUPV-5U^~4~-֩P(W_Mg 33&Mʕ+/5jΝ;Gxg4҅/@xxQU!WСCQTT1bv WWW²e*|?<<\#Ç_^zZ;88`„ ѣGq+ ShW9:w ""B߾}^-%V=.6Rn ,, Gqq1wLH}T֑e؏5 ӧOGII DQĺuj-/XLIxCkGDѮ];>}/;wZ_/oRL *˒ρ:XJ۷oM6׬Y3?SLվӗDDD 00:K/aݺu:ow)O?Fff&._1]vزeQXVJǏGDDDe̝;7ooG)**ȏZU(:㦦,j Wѣޔ^F͛7k+2DQݗ/_HӠ> eE߿xzzgwQҤϺ-3ŹR( [Jߎ/]j249) wصkF7o1:н{wyQQnݺU/=?z(^}U}zNT>[kK$y8FP߹7o.=FaaƭQۢE \]]aooǏL2i-Mo scѢEٱcF IgRiB^zCɓQXXJʍ9gΜܸq+zmpWX1bue@S{,%ڵkk,?x@Xt3U.;B[x޶̙3ǎÞ={fBddQ~0,UU |޽MV>sYfC7o'wիWyXEFF7DAA6m$}1z*kmJezFU%>,1sUjJcܹs:M۷oxƆQiOk\>$$۷RoH)Lz $}(J%Aaƍ@ꫯA8|ˠ$X|ܩSj.e@S{,!www8;;KRSS,c ܽ{;!?iٲehٲ%?~c…XxQVUeHYsGo[NeJ?W\6XjՒ&U"Lkz"ğvz$-=zT:곲@XXX2;v8p<_y7Wqo>dddHy8Ci\ӯ^6%%EcJyyy>W_o-u 3h}kdsġzST[Ǖѷhڴo:pdtDyI믿.ͳ@Ж)LC=wNNOVD։DD6JΆ>,-sugϞu^uhܸq2>~gܼy꟯Zj_Z9Q|JׯȿYvmK&۾>ԏgppAeW#lEmڴi0f*IS+VhӧK.zXK>c)qo߮HR͛7ܶڷz={Ϝm۶eɍ%%%όR%E6m7n\r?W^7x2޽;5j$-{zzbРAժ`UJ/\>s:j4.\ИX3gH9Oˮ.** u67xlʍKQ_<^^^8pvr)C =(( @jOҘ;wJˆåM6iLYJP`˖-c8tP]oܻwo|hLq8G)޹s˖-4UVƍ:c5Ur疔_r%"|MsmѸqcU4&@'-[Qf-j׿4Yj&Md5ޖ~EIʹ:'%U6Ǐ 5=ubg7ٔJ_A9*eСh۶ohŚ(i2L}*-gʦܨJ s{/^1G&Da)LW((___h{wSKaqq1fΜKk׮Q5)=e[hA8{ ;ߏiӦUc)SoOOOtqqq8p`,X9sH~-Lb5D:tAH:yMOdj7 ""ܹsӤIZ'bݺu:L4)))+VUM]vEaa!222СCL<aaaɓ'_Ν;;;;ZJ#fYoN8[%8QF!,, ׇB@nn.RRRp ۷~9Vu@e IDATŀ 0ﱏёO=qTUN]҉8 {xxH=z3f͛Xdȑ#5F6lrTTT:譅=DzepAѣG>>prrBNNN>X\zUZ֭3.\Qx_}U#""x" ::Laݺux5&]"ٌ?X|Š Utrr[h!Μ9S{(ƍTѦMw,sRSS֙Q+]v:koo/\R:J{ozAu8+uo]xyg̘Q \ǏE777S\G˗/WTCP(&ƍ糲ǼyK:?~\twwYg^+WhVS"qȑ-ݻWTX1۵:hкIII f2JLjV۷묻*m-00PZ/!!ҲvLRDQ͛W9_Tڻ9OU];x`i̡VA uiv:GOi0 ___ݺuCvv6-Zg}V{DD5qYDDDHxչsg$&&_׫NBO>; s_˖-#>>ƍ5AW79}X  ٳd̙3 &RT:GaLq8:tsUxwڵ1{lٳǠѦjNNNůQF!00A.]B>}KUĘXBCC1di믿ݻweȴZh#FhL X;x12&{OZ1uTo,ek۶->:h}K, DEE&DN4&(..믿uaرzݦCDTݾ}GEzz:J%ϣI&ժGEZZP(ƍu֨WʲcxbL>0a9"27S{,!T>|pwwG`` z!M YrEa֬Y才ZڲҥKBvv6_dyI5jTeٮ퇈6ѣG?>_~CDDDZ]|wޅ xFܹsqy_|GG}$oV효~jl̙38uN:ӧOڵk҈TT7|m۶ڵk(((?^xk 3ў7m4dee޽{8s n߾]b4[DDDDD֢k׮8v'g6k (..ƍ7Q}8r>,Ν;Wtv9sCEZZZeNKe“ X^x[&65 Ñ#Gt#FիjȈH_56zop=7n@~ &`޽8qVXƍ/_{8(Ķmې֭[#>>,'""""6?֭[W^y:t@ƍZj?jS:='"""F* GŮ]}QMDDDdJyvkhiLJ( *rvv?|PgyUXP+WWW#""""2~񚇬MisN$??_뺖jPTrADDDd2* k֬54^PM*rtt/֭[:˫OJτr;vXA!""" sμ!"""kIƤBCC͛vb'''KCBB^\z7o,r2EEDDDd< YfrADDDdR桚#[n ˉ+ڵkgت+,, !!!x,YDЈBTbP*rBDDDd2桚DEQ;KCRSSTidivN޽{1b6nhnnnUΞ=[nJ&"""[!">|KDDD6J{!77%%%rC/puuAd8;;u5vd7iW J^xbהRlJB\\"""MDD&"222p=C!*GT2 " k֫1Fv47oϟoEڵٹHD5JBqq1rss k7Әɼ˘7o֑DDDD@Raƍ9r$GvQݿooo!Q///1!S(pss+/޽{fKgn*99AAA&"""f M6GDDFQXXpww9\\\jAPN7vMZ%''4A"wDDdDQR8:: &A>I 899?~ Q5I_GMDDDdJ%>^QOƁcdiJ'O}dncg7i|r$"""P(0uT^;"=i\DDDTODDDdT*!;IaÆDHDDD6MRa˖-!"""#wDf!LCj Qݗ.]*7['<=="T*7oYDD0ܨ/WWWɳ/iU~} 88XdC#"""2 J'Npd7?~<A@xxxeJ%bcc1zh4mk׆#ׯ?]nCc͚5AF'NAbŊ So:TWU'"-zǏcٲeFV`ggA0~j./bw,ejӦ [.w7Gu-̔;"""өS0f\rEz...@FF݋>1~m#"~g͛HHH׬Y1cU1zmS.wIZuu1|8ڳg`g7 BVs"""+0\rҥKqM#778pƍl߾1:u xgѠAe֮] QWWW֭[:6 OOOF =&MիW#,,ۘ9s&233>֭[g>>˟|I2h߾=v܉m")) G)7YJqt Һu5888yyyHLLDbb"+ڵ㝗;v /?غu+ԩ?̙3񈏏ǖ-[aMZ4j)5Z""""kgKlQvv˫T*ܹsZu !!ի2#Ktj׮Zl˗/cǎHRߪpttD޽Gvss_c1a~~~999ٳqMIIIZG@@ƍWuɓHJJ2NQ8jѢBCCXdܡJڵkRwk6W`` DQQk"+ѳgr#ƍ8xFuiM*Jeb w-ڙ3g믣UVpwwB K.ܾ}z3gDfff۶m35|DGG_J97|U222_TXGHHI4}}}7/a 77:Azbg7iuq\t rFDDDdvvv>}/.DDDdGJavZ={jMA~kgA-[{V˗QTTOOOOӿ(1Xvaȑwզ^zZ_WUѣGU ngEF` """(̙3LeBDDdZj%=?w'$njQDDDDP(/pvvVC dMDDDdT*vڅA0>h"wwņ Hšnݺ?#iʼ<|ǘ:uD搟wJx[wR>>S+ػw/ݻ'+VGx!1sL ;I#Ȧ) }xbܸqSL1z|uv7b[yӌ(Ν;rbѢE AZRо}{,_ m#a0w\PTχ/zꅯ .\O?-wd$IMAAׯK3Q׷\DDDT*7oλgϞرc#w8 {{{dggII; %"?~ {{{^Yzn,9WWWi?Ӑ"--܇ӳ IE#Ljȼp)@6md{ÇׯUut0TSNZix,YDЈBR믿J;""-++ ƍaggCR97of͚%w(UYpd7iu1\t ...sT7 ;;;{rADDTc%&&bɑ^;w.eJ>}O>rQ% ^zrAd&BCCѨQ#&"""%".]$""Ç i'Oȑ#戢b899l;I֭[s-EIIIhժ <<̤*s9IXN^@Z58 IDATDDD6MP`ԨQ!"""&>'_WȦT*ϼ!"""&"x?&86dL5?Ubb"o%"""P(ХK """2)A&wDfLjP*rADDDd2J| yȦiLF`g7i{n&"""P(0p@^c6)xeOZݽ{WLGL9`g7i5k,T* """2J5ټLC 2 AdRSPP MZWWW#"""""""l* )))͛3E ?7_0VM47}<==版l(r 5kA$DQDII yC6?5V Eppcɒ%rFDDDd(ĉDDDd,8p.]9lB@tta j vvV{FÆ .w(DDDD&R~ՋUfvLcB6WգG?~<A0qA ^xx8A㵾T*~ptt'7o>}`8tUBTSpd7iuAȦ) Q???HKvv6 'NHNxU\r+ 77*ҽ ;`o&ikARɨT*^v!9r$:vhXƌ'N| Q\\\СC1c|}}mSEYYYV58:p8M=z5°aC`FFJJ 0|p]\\0|ǰnڵkYXO$JKK;"""" ;"""ATbԨQ믿m۶۹p|y?-^bg7i^"""i* .ܹsagg'w8DDDOpYN{G0|֬Yf͚|oF&MLs@zMZ-X3f̐; """"Q(;w.'&""˲iw5}LK2]ؽ{7>SY0tPm}(7DLLU ;`g7i[z&HKKCppaׯ_Gtt4DQDxx8>,Z+VLNN׃1n8Y{E еkWt۷GNÇLeB5;I={r^"""i(">>&L$DDDCqFҎ]r%֭e˖ HHH1ydkV5A#wD&{6IիW^"""i y,ɓqyԪU [l^͛7(V֭[;88?Gzz:VZcǢe˖… 0ydEEEFWSuT#ʞ DDDdT*rADD v~&ę.Jdgg_FII BBBj*Y⨌30{l"++K+rrAd&4J~QQQ,G@#<7"J1c -- kƶmj8GEdggۛy汳:vn޼Y'<==exA@̟?{|h֬cHMMRDӦM+,T*qF@`` ԩcM̂CXHׯ#44%KQ͛Hf{… *K.]B-0dlܸ{8pz~;<2$F DV eAvAY "Ruwe"k-"EP)QQ@C(&ԴIHs~S&}&f:99>g&Ý Ia σnxkъ.<@p:zgCv~Y%hT̙3M7ݤSz-P9N-ZH-$+<<\%ڎ?Iv[%$$F# M\@lzᇩ 8qeddx5jO~zO_%%%/mݦݻ{}EtHVTTZjd7Xeѣjٲ%bv%Ij߾=RQXAw+/)IF *4Ϙ%Kt PGo+@@{f7oΨn/ghiꫯeYr81nx|[z@0(,,w@w>s&fO)0ԈA6| i3g},ҩS(c@L\aر#}"##P'(c~'0 ]| PDD#ѣ>*0|t瞣eYJII nx *@@l7n}7o:Aq{ gΜw>DŽ$ш#"4M͛7>xOw@ ^}Uv3v]&Laa9{r4Mmܸ>he);; *Hvã-[;_;N;O .Ƶl6 0|0 5jaul&<44`< YӧOa2 C2 C3fj\>$Ѿ}40ty[e[nө9shȑj۶bbbs9G ɓu2M4Ia(118f̘NV殻az7mӿ>JY\MjlݺU&MҔ)SI&iҤIJOO~+0t뭷Vy5kָ?Sŗ0jJ^{>ۺ~ ÐnÇ+|~kRf*l߹sg[>do>%&&+ШQ$U^—*b2NwmfO {Ga{- * m&IJNN.S_z͚5c}TS||bbbJ &33SW\qx wĉ7oz}y|KCz׵w^5h@yyyڸq|AٳJyVUƍK/^7;>>^QQQ^{*^R&##cѣGfiܹ/.==]/VDDXd7q8={$/Vdddm]%JJ29KH$Q .?@@,K{@=v)ƍziرc.#;;[WVDD*m\#]mnݺ /TFF.\Xf;oKnnq= mݺ+ݯ_?]y*Q׻:%LjnP۶m<50 i޽-G}$Iz]f۫]ŕTZv#GH&LP6]wO'NTTo9Sg" ϟVdt7 iFeUjm/Pnn﯈2<5k֔([RIE"zajܸI ԳgOIekt>}x,uzZ ݻw|hh7o.IJKKs?~K*Jҗǵn˖- (>9fll7J׿;pH]*((pw[κ5\dM EkҤӧo*+a2sLYEe֏5JahŊ:zhu8^˲^n_~E{Uǎոq2;;wJnO#]%M,VZi(OٺukuEwu֯_iӦUiKYfxlP?֟|С֭[}V+,g}&04d]/_qmO )t%]uKҥbcc_tum۶¤?Ut٦MX}GڲeNÇ[n袋d" 6n- l6aPz|iD*mVs˖sV9gVu]QQQr8Zxx6nܨcǎ[n:sʬ_n_͜9DkJ<׳gO+==]۶ms'?H{bO?T[lz5ѬY3#G[Ux{鷋kQ0=04zh=SzG$%ʘǏ/1.@q:6m}@2%VDyܾyd*Тa)44Twq$ʔ-^XR%L\u:tH]|qeرc%ʘݻwowWb۵sUH ;I*tĉzꩧ#Ks5kV&ɓ'+\O <^z%nx4~xPiӦ4`vZkN)))0aZn5nXׯfΜ >qFuWVdteە X=~x.2.+]_\p4ʰaԨQ#%&&*11DHJJ҇~HmذA;vTll4|psΚ={vm/B=C7xC7VFԬY3=z'չsr_;T4<**JmڴQbbLR;w5kVW_U{d7nx_EfӕW^0Z}:`P'f£{GNaԛoI4˲tq&FP >3Fvf?>xѱc; w@ }Qffy< ०;N{PLvv$IC 6sDoij׮]S" TFo%G\pfYvM4˲KAd7<+Ͳ,}y@s8$ь3 4ͦ[o>haiӦ2 ߡ>G>@mذA6t IDATMaW]u5fVXA4˲l $PaaZtz)Q@wL~Av[zjf_~y@@3 C1111APg`>I&iիWssK/hijy@@,K'Oi0d}:uRSS4;vL=$駟~wq5jH+VѣGݿH6m{0 dw޽շo_=C;wSE[lQǎ#oթSW>}4aEn8t^uZ駟f&l6KIIш#tuU۶mӄ Ժukw0O3fw} .q-YD4tr۸F}6lL{W~}q U=,Tyz5fI'|bBhh.45k,JKKӒ%K믿ާqO<ƪo߾jѢEsA =駟+[oe]}wE 9r!JH͚5}Ν[o<ʒׯ׾}+BFTyY _o~~HL;]o-{a{Kvܩ?XRxۥqƚ6m $4syWxxx_CFF+o,Ε_`nݪK.;zWf鮻w磌$?;IҦMp8$I^{kT!C<^4т $%%no֔)S4c n_a%rI}u'|AGվ}LYF<{}jjv%jT͘1CvZn]9&N8-]TW]u W_}#Gȑ#zV}Fn̘1׿3gHvܹS7nT˖-տ^no?_r]}jӦd9sF%ڬ\;vܙ[=Za!|OzdM ׫W^ڱcqΝkÇWZ̙3& ,PVVv /Q4e}ᇚ:ujW*p(**]@**b=f͚5K_}N{nkJڵkyyy/Զm[szҔ)St 7h8*曒P]ѣܹs5ydJѣzgѯ_r^p8͛K|vmI5թS'+Bzp%]WX#G{%F@^^dHem3?K/E]TE*2tp:,D[c_ujz\Q[opN8y9'#xߗ{9Q붮RvAuMەSN*VӶC~̙,KW|||FaZb=ZK7λeY:ydK'={cǎjԨ{k}jjv)mEeErU}㉉Q||u9C5{lYF111$]wujذ>3@Rѕ׻IrrN~iYYFV${ڳg$ua;ZK.$͝;}7 /l;v}wӦM:o}m&IzWӧOkԩ=)ŋyfI?~\YYYz%y2o'~rrr9tNu#N<_~Jo]b,ӧ%ɒd8p¶rիW^rw᥈}pX,0L˲,tZiZeYiiVaa{z[4Ku=U[W< s,{9{9{9Qۭ;v׻QR|}yXX?Wcoj:m/cǎ$Y}q˳,Iw]xqKզMJN>ݝ)vÆ $[n_wmo߾>^_\+<<ܒdmٲź;-I'|n3dKqF{q]qvͧsuٶڱc}vwcE߱òl$pX5RTyp*^վ2铘Y\3\|7ۺ!UN`9'rqNn9 䜔l;'Rh{k9;{9)v<ҏ+R|rnO-&m+z ;ԩS5k,=JLL5L,y+v]5Cu'5\~IVV?|ڵK~vE[Qli_o::!!\XXz5kh͚5Zv P޽mO?Խ\uΟwIJJٛO{:$I;vlImE0*5-gRSʛ%q݆Pz_.A46MP=#j֬u׻6g۶m}+}5הY.4|pŕnZTvJ_o|||+t֞={ԩS5]ϟ.%zbbb$]^#_~Y>OwH} k(>|'ʄAFϹ+!!AsQDDl٢Ν;kڴi:r䈻M^^V^[oUݺusϑMղeKuҥpA2dH%Iય,xN XnFDv.] ))I[袋$zv!/iɓ.zԾr 7襗^?PV"]C_|ݮXF헼3gh͒Ν;9-[| 0Jt;N;ػwϥ/X@M6un~&O/R'OoVllnݪ{N$=K|tD駟r%4Vɣo8qBw233euu;25qD 0ߡTa ^D2&3fmVmڴ=ۼy:>|Ǎ^{Uu#o+::!i5|p.j2&5_kС%8q&M俠eYJKKSFΊ?ʘnoKO?7{*;;[-ZЕW^i|f:t@?WZZbccչsg{1b Hgc&rd7+(Fv@YLPzc„ ڿǨn ѣGuJLL,4M͞=[i;:}CT&z,Ν;%IڵnsDڳg$w è=Tg.RF9f6oLPkaܔB}cY)e:+I 4-$Q֭>|!Ddd$)++ϑe;˲&hnB@/33SG$5o\1113tLTnnp8$It[o%C!Ct%..I*@@0MS .԰adq#v ?~\ǏwH[aaBBHlٲJnoS6oެ;y~ĉ4iReaM6uV? P-4jw^'ٍ:Xn2&(۷owsad7, 0j<2&x@ZRLLC өW_}U&L*j> #Q JӦM=eԩSjҤ lፑ Q<$]w%4Ϙwy>hyL(cqTeL3:ubh,ҶmF=LP8?E=ei׮]ر#5E2&(L8Q&M<ʘg Q( +Lŋ 4<&1GjӦ 4o!} ʘo.A_W9N3NS} 0%$$$hNV p6,K)))JHHa'lnLFFCXsy,Hvã￟Yz@@3MSSN}1ׯ#xGqF+Wz3Oʘl60溯kNK,Q۶m+-hs IDATl2!Q l߾]%)..P(cӑ}մid%IvR=}8uE)))2eijҥL}.SvtM7)##CiiiO˘׾}{mܸQ}TTVWaP+4ө~>hyL,-I5u]w[zz]ve(ҥKeNl6 8>hyLSzK'OvݻW={:#%%!\BBC9<~skɒ%aП'M:_! izgFİ,Nm6 Wvǎ:t8PaozjAM:(I`J>獼ߋtA6mR^M>]k֬_PP۶m eYڻw/} =-I7ʕ+umWOՋ4˲~z< A0YI4hPeLJ{饗裏QƤnQ@]F^2AIrߎ=:t{;,TC~44zjp4yL|nӦM?^5QPPd8)*'eLp*~''NԤI. eLw9R?8PbWw}m A0I6nܨ Gy P^dC<&*cOz3r=u:PK*m䪐kC5i$=wH>t:O_v <8[U/Sm ]\P>}2& `Yr[/XypTZU0 /TU$$$;KIIw>GVn4׃ vLԲeFVeLUd%QLP Ջ2&Lzhijݺuy@@σ`B1sy,BꧥKfZ\6M w>El&<5jff͚E4<&$w}'0]> eL?̗ haC 0w>t:3>aYU/dd?.^5(EFFرcwH>aYrrrm `•$á V{1GJNN.󡊋S\\𮌌 EFF; σ`Axt/VRRReʔ) +L,4 A0U'|m'M$0tkԨQz.}2W ۼQƤVnWpLMjQ@>T={|4MmܸQeq#LypF>aT;]Gsgƒf͚;;~C9<ka0y TGvD > @@3MS~!} PܹFa}y@@σ`R2&<1 xY2sse* e*(U‚KGř9;'G99*LIҾd%45^iL!-ڢB[(y3>5NV~[qTSNu:ѣ44k„ 3?_Oߖ| O,J`I^ڙ!4+9mKv,8GD٭*6Kv7\Ӕ)9ORڛ6Uh iB-⋒Z(4! q<&Jv_r%>0 >+zan<0eYr<Lh3#?LC !{T8*QuŰWGy#U]ő#PxzBRo3ĵX6hCFWnmuTЭ} SOv@7ߴYv5B:q.ev7ax7w.\Svyҋ^B!˲1k,dB^+0t̗`|Xa+?t8,Wsy9`8ph*DxCOoAmO=UH9!C 2> K]=5ruJKM-,*X**;U\4vb 37݄q՜WIh(uZ ґFtHHGF@>|26mڄ7"j&l޼7oưa#GATTK:LzFiiiowB!xBkpfvɥK.TVX,m($ F,g6Yg./<6iDCزEC ѐ?~~@7>>yyH:6b!;[ZX*+mw**a +m^).? >5խ6d@ }jjB__Ȣ =QF$dx*uC.1i)55_}mۆZ[-3JNNƢE0o#@-x-r]077V/_^>|&'%;\P2ioGF,2QE,z4#GBpIO i˘$\a۷wUSRR3f… 1c ON B!B Պ5k`ҥ4&%8ֺ: a,*ƢBa.\@FL 9 v+x?z{S9# 1>a¾3q?\+cʫ cAq:gdAYld#im\Hmm-lق7"--Aデz ,@bbbwut@???|QB!8TWWϏg6TzB`,,ǰ>ǴnW 4 ɰaAx||zؤWf,Ć g ka*˚T/^}Uxxxv!BjŇ~^xʘB{17a'88aAAy${[[XиoL0^(…6ev'IH '&@Ɉ=`wKyyy;w.Ν;g]ݽ&$B!cA$2#@Ϯ@2|8$!! 8$! @.ѾB8Zaˇ!7\ <<  Eb" BPtqISTe4{nlذv6o*OOOxB!8YYYG !Zwaͱg_Z﯀Or$<[% $4v0 I0 /P|}9k0x 917|pz+8j5@""OT v/ذaoZ al[n .'ALLL˖-o"Bq1㐓 vB1?r^K:}laaCIh=-:.!u{# <61VJ. ù,3`עqW)M`wqq16mڄ77aX`:+qldggCq M!B `޼y BX+W`χ!?{$8~҈~n qP$ap۟BooaHHcF(4< 0 , ̄!x<ɪ^YZ4:Er2D^^:?\jؾ};6l؀'Oڃ… q-EfΜ`vW!B˲طonh#BHj0?olx<ئ&6 ~vž- $, pHBC JyE{ʘ ,* xA[zr`ʄ>3 t\՞<1vϠliTMErT\8Ɔ {nip ~Xp!^v!Bwow25?o<"sY} P84q|2Xi0G #1Q6!T_r(Hm>=ta,6yCߍyy0?#ӥ`wnn.6n܈͛7ջ.-˔= .?SNQ!B4@'v7!| :]֘vJ%R?C}#m#x4xLʂ>=422mw 3f ipB$''ww,YNL"BV+֭['|BCG8 rsaͅ!'WvG888$HBC!4b$## 29~?p?no`#IӪV2p^Ƿj4`B׎M 2RAghh(y̜9e8GR@CTv!Bqr )DiDz0cj`hBH0<#GqyFÝQY/(Ərd(ol뀸Vs\ 6\. .o*\* vB!d8zr|}#8ƚL0p5Cn. t88QeHzc0y/>VAA8|W%?]JJe:ɷB1.&uW]2AeK]r}yҳ^x, B6,bʕ?/%tUAwٲssax$hITB:jd"!HHGFB|Bqd0yT3gc0_SttNÍg sZ ]zz妒6nBM`rtNrd s 0 ՎAB!B!Uq=s0VS{T$dFAi paYBM˂ Q@}|ڗFE}T(8hw@gvuew҇EEEQf=!B4㐟QFїBkC PL-T*!>K\'QQ-GA1̥!>h# to˃1/5~ Сp6(8nƁq<.C5n8 vB!d@8gΜAdd$}#L&RS?wa.-8t`mFR[8ѐ YhF( +>=tT8xu'3W9.1!PB!BHwL&_!+,2aXA5k6k Uh\BzhOh `tMYt4 w Ihh;2&uuuA@l6CR!!!7n&LiӦAB3?81!BȀƲ,֯_G}%psI YYgf Cn.8l^nyLDKu5Ct߄2ИgaUmu`NiɁ!'իVA:jɴiK3O8z ?3V}y{hy ,w Hi,B!8 $$2? qKuv& YП;Vt{$nt; wM!1@OmByzg23 #GarҨ(x̸> ]˾. v755aѢEصkۇFdwa鉕+Wb…]7H$B}}= !2`q PH_ H`)/w1R;(! f4;8!;>t :ݖ42{ʤ IDATwaz_(cRWWogϞmvCo@=C@QQRRRP[[kߦ/F~~>y睮vtkFeL!2,~(#WfΟIV&vqz p-o!}4; !h?JJ>xpG>IPPz'N[oݕ˱k.yna̞=zHOOL&Œ%K}vD"Azz:F.j~Sٳ&BȀq N_ȠeuT ٘1B yl,Y$n@ct GϞm^>v,Bƫ7A5k&L5{ɖ-[쿯ZꆁnG'a<>>>o HefرcGWI:aʔ)N,J!2pcǎ!,,AЀ o FD\ jA iDM!<$h||:Ч_„Ѹg/8={!2?? | K111ɁJBMM ?~~~P՘VMǎ;\1}:Rigt)Rwh{MMM:H:tB!@ MOtbugQS>6ƙuG:ۄјgptpj,^mXj:ZR;..1}t8p`7(n4Ttt¢E!B4eqF,Xn>Za,==n/;`7Q`R |ldEPIu !d 1च9B/OOL&88^m4؉n7 9szIwv˺>}:{O<'N 44KJJO~J[ Zfy/㈄BĉiCzUYӡȀl&ئ& }]xΞtرhܵrcN.XRF,FG!SB7 NX )S>e  4?C1aqhص`Y48' j֟odObM q\gwt CMM 8J+y!88ؾ˗m6hhhq(,,l7pBlڴ ##1e;vaB!Dz0ۺt feyl6 (8(k)SB!A8^n}Fow,&ρwCᒾ".٥nB> ?Acc#^~e;4 j5k'aM& aC={7CGV+E!ҧXVxWirn-ئ&賲mCYXy˷ 4"BNJ[9tBf7lXKsPq*}w @1~^.ӥf~)؃dƾLJ~n{7o?e˖vqPh.**a9i"HP[[kB!2pDB.8˗mHӡȀ1/<8B!F馵뿄SرLB!} yHG:.2lSS ׃Buy{wvIx~饗pԩv=z4|M̙3$qe;88999&BȀqJKKL_HF# -JdZSclŸq.mBCcQƂ\~/'~;ז}eLZ/ 77GAqq1 L<III:f3f,B!~eY۷?8=K2WVeÐ w@&e4!%@{aDÎPס,olz>$, >Y=2!2Ik~WPUUH(6l6hJB!2qf3 yWm%I,WʻB?_( OH<>1HzLB!>XqNRR:#5Aȓf{2&FAZZRRRTwFڵkk. [caJiv_O">>봍7դIo>wGW !Bz˲_1qDf>=jv:΁3B!dFңBy+Ѱ;4~,՝jC2b|Y /`w$$$ ## vCIII,]q`-[(L0(..W_}+Wb`۶m;w h~SM>|  !2`,`ڴioch~<SaaGR lccxM>gϞT*$$$ //qM7 xb̝;HOOᅬ«^z +Vtׯc=#FRB!2X{Q4b-JHB)kB! v0_ҩ6dѐw/y;lCrr2"""0L2 |s]m.]:L0.\@ @zz:ڴzpTUUaaan~衇gQf7!B,em6̛7K}=8!Cn[רovx77ǎ=6B.I!yHOV4 ڟpe|<Eޣlܸ,Xc_L^^=?MfL6 ,֭[l7bd2-01bPQQq`w >!BȀ0 ƎKc~8KJKK>= t.^ׂG+N'&uV%I#>!#hCz #B9y2'\Y;аc',;wK}2ؽhѢVv?nww"$$%%%ػw/z=rym~n';"999t$BȀ0 ƌ ]Pr;H$ѧ_:2wwLylZc!R !Fc{iB{cgzԩSݎazVZ+χ\.ǨQxN'B/V+}]cQ659ݟ ]W};F!6b (M!_1MP)SSDtO? Ofv}? ؂T*1|nm=''&Mri_~TTT`x233qXx1R)VXC,0ZYP({@ p-q8ξm~ݵmsmFۺus2X^'9sB\8,] _`?'y˥KФB(@uLSo @qp, }V;j,Bf[Jysu{@ E3kΤR9` gd1&vs:wߍe'8R=9`H<s0C P D1#F"D `ɒ%` ]#5B%OQk,sD};Ofv=zsȑCF4}6 .G`` M|ƍCRRrss1i$Xw{ :qX,(:Z7o|h4'|HII={vBzz:?F]]j*ٳgsN޽{q~J455`m6믿 d2߶GgW(,,qX|9V+JJJ~z'p!-[xwq[pi۷"++ BVk֬޽iinW^Z466bʕl7/v֮]rt:snn>qIq%f,_pElذlذ/^,_f.]'O["77fNCyy9֮] ?v؁Lʕ+؈Z^~Nv d͚5ZƇ~·~ طoN> Xn\^w}-[:'NIII V+/_PXX )kƍqo ɄR|_l۶ 999MMMħ~ 8s عs'Ξ= XjQWW?n#`Ϟ=HII|'F|vo߿N|(++h;8<6o 8|0?/QTTe|r,"|Ǐ͛7yF#N:k]#A׈ujK׈^F8v lA/98m:֞x]#>ٽh{nqvW^8A5}A޹Fڽ NBNmV^fewW^'k[oML񫘺}*?{58~8>;.tSbsfXYРmu8,oAxJC%Pxŧm5"P >NGŶ_^mGq)^׈>mw[£?>v7ek׮kWH`r+ÅBnb"` 㸾BCLcǎ555I"o&=w XtC*yyyXf N>RCT"66?y"SSJ%.]7|mݴ:ߞ Fп:'f֭SO=@@礛'ZӡMM1= ,pf3ap; ` g֙ 30yk>~N{aQCZ `rӾ߅e p-3?9y'p4 p-zqbL6 kX}) fܦOS8[|M|e8:(ɳ?=xH޵.T*qny33]%S/sڬ1kn:[+ˮH؃`k~JD}V a3Z- n؇YA&C{Do;Ba[P*%?nP3?AӃp4(_G55/-*]:!t|պjTwoՆ:\6y!pĚ`!!.7X v̙yo&8>?c9Z:R!К̎'JvTUyM\-70B3/G8?_Pk47״~߾* @!***z k2p.۞KOcxm'T\z\B*cQAES**_YyJSۛF~h`7` z =^0`zZx涕nd{7)u:࿧VNwӌOVaa6@"T}MHO`Zm (Q6T*Ő!CPUUR۷τmϞ=D!M `֬Yݍ~@ngekK yLLO!ZGQTʦJ{ [^mw?d^VIۿ5k)sn/hT(E_jvZmP@>6$ ;JBze2\^H =#qP DaC!mj^n/KVg`1Dnl]"9" [7j HP PHߵ]!V`ݛxm۞;B!wtzP 7t߃((4dnά΢C*R*| W397U߄~pW{' Ppj(# w`` ws!#z= >fs뭷ȑ##G`ѢE8G!))iOFlll˖-o"Bq1a0rH8Dz0L\VmAEB"IF'B.|uPT*;k$`78v(PʡNpu[z2 R%E7Ќ>;L$VCmRh|Hsry=x~ZKǡ\[p`wQcvn|b-| O*˖-|y,Y̻28IsmW?q\=xv/{HH`wXXߏ/_nɒ%BB!d0ƴqLEХ@]j*oNΌ@EBǎ>$(!OJzۄ *EE(V4)?j#=KI'N\$G"nO'}&}Bg3n&8mCt`$4ԞHJxp B\.2 /{Fc#LV$B6w2>" {J= }݋Bwm I(4\\Bf .j,jw]W$6~,~]hhDD#'ʠ @ ׅ(@ _?>CxxjC5リvHSSJ%;A%MRI!8?LfgNХ"B Ebw"D>Q&0[(ՔH]"qw@aaDk?B?V֊ ] oy=v߁wY!y'y݌zwumGD㛙<-ZnnRf#???bcck_g0f̘6˗-[7x;D!b!== }&[٪BEr2שe(=z:}j*bc3$qqt !LY/KKʀ,^+ 8Ż+([Ĉ yH3N1P L⫰HHޯ%6hh G"ғ&Mٳg[o߇^k[bݺu8qIzo4nB! ǡRW]J НI!/`Y ϗpHNreg8-H pBJ]RE$J tX_QnG""h"##WC(eq0gaw|y\q؞Y3u bbyCjooolڴ ?0z)#;;'Oŋpe֭x'LPIB!d@;wnOYjkmY))ЧtӜ& ( yR$C r,WsVmRJW7mWfoE-!g9Err+ȪBVM!#D_62Llu݃]UrU뮻p9Xf X0  Z.[ oFwB!ٚʠKIgnґ''C Erv,BHVgC^]'.b-ox$GzEB~51Taᄐ嘇𧒪0?j>G4qJ5nH@ZU^K(m27>`ף VZz=׼!oɒ%Xx1[*KY݄B( [ZCJ ,s 1cen'$@=";/{ Ufy^]UR(JWf݅ 4l6cr=!`Y~)^|E*cE* 7C=.`6:tU0t&NM7KFIGzq!55ׯGEE[ }/_ަ !B@Q{}$.nJ!;$(!;S2-zHR%Fyrί}^# v+ }`{`[ qH}Q$vFͺ|L 洍0U1̬ͺ<^nʂB'0Md۟8=acҵkŤa`&jP8twef'B!MB׷YOKg9Toȑ_ l+!wu !}LUEuwh|' Ĉ@G!+ QQ= ݇wuB#,b>}:z?3ԡ C'jZ5o+ gPIU8t"&Mayg&544v!BnH1qF Cn1NYl,P$'AlO`Z;*u3`3xeLGD;>kf{JT,Y-Kf0 $9# % /;r pr iB1UlYdYluj{1Į#iG|<汫)`k>So%}lBLh.Y,|x8w|O{?E'r>WЅ7O7Og?V\$I $>B!̙PW7|u0 r~Ǩ7nRR,Gw̸τϢ$݀0WH+*l)(1$]?Đf9etBIJ,m6 35:>C`׉{WTɮI[? IRs:::`07Lt7B! PբB@a7IW_ /~ΝصkwB!qo!:<>GBqcʶ55SnYF45_rIcY 7@O}188: B9[E,â\G#aѡ_z9 55a.̻Pt;wy|_ vK IRPtSӨnB!G"k!rM _CTح۶ @[] Ua!i|X,!da9>rx-a#y^T\5$cexlc#8F'mWڦӋavRg¼ o"(~\$裏"??FqB!o>퀿;6}uu0힔i++L]f SOGz Y 80( j]ZJ % {/CRfI=-!,tͳ|FQr(Huuc=բÄuÁav5ܿ4xY8^/z=$&BM>x| sF#?ypyfqAP a7y wn3ް[_/_2ٿ\/v͵)phjX44B~3ibHґKnTqq1>!B (v8?|%9ښjh$ yG[[.!}q1a#)tXmfQaEc+.u>BY蚇̔/CmodpɊs ?I~8B~ªBR;)&B_}C|vF"zzvM54UUgfKEp]k+/+@,#̈́1aY b!-"TƄBY~"CC9b5lm-CSV&ܮ2!!̹~o?8ڎ2sPRYU,'A!d1k2_1MUWJrNI;/2W^)Mtɓ:9L&L&Y"B\96j+_%קVUSٳ/b;wb׮]s!B!L<]x?ؔm>G{K 6[lԶ0r[YPca_~o"d:NO+o~%a=s82t55)8[@4#DZ!etB蚇̗l ]s-ًwO"$jI)I /":աo -. ҨnB!da`3!_]rg64I+Vvu55P//EV.2odAi;Nvh𐨰8JVЯFF[aЀ'BY(蚇Ƃo7rc_>$;$a~#W\V>}7|3V+?|]AtRtΝ;8]!Bu)VWАWWS2bE>UP̸ߋqO~-r,@/^vHy ˰(㞏)֎2KY8!5Y( J+Ns0,FiIJl—+%%F/^˲p\ 5 !^Qv#G`t+属~3wI*(Hwwq\kWB##x4 6_oPeR.zx附6 ^ZK!d~5Y,sIx< 'Đ2fp~-B4.|@رxq>G[SQd@>G"tvvb͚5 BfwֻntZڔmlnJ^!S`,4$yr!I}wK,C۷o B!$p稃@H;V|6 p0rhkbs:3${dGpݢʁZJ!gm 7Z7BУ\rk9ʭ(̨B!ˉ$eL╎!,tma oQ;0~?#W@Z ! i MMhlBP \}%IQhjIX/G~$ DAIΥ-5nŊv1 ;?_8(rkyҰYBGu//YVV~i0 -[$6$OO}ʕQۺ($99anݺY*lI"mln›'D!KQfzބBt5YN$ ;;;qE'rkZ###g={Ů]<^y ;0edd^B!#3t+Wv˖xiEvv&҈Fx'C&ww< D82t$^Ͷ);>.#CGPeJ1O߄qQ ~ ^FDDC@$(|T8Gϟ]+պ6ࢇS+'`2'^Y >*@^3Drsn0"]D[oEwl|?r\{xzf_{x~VMy{UUm2bǷ 6diY $ ? à1,˴ضm݋H$C .,v;y睄YOiT7!hiဿ^OYK Uq1mmΥZ.6j[-9EӉ<*1lv!硄gr|q|BN!s.$qt;qہƴ'WJs~Q|]fJ_8 #Yp"yd*@d u wY2'Djݯjs=76nFa8]!B54׿7K e~~655nd=tp[SUyffNg{H 2GW*&?8xωjckVD*ll݌rk9 J !iEF#{0;p+]U\ح0'0RݩtDDy\{h }O j@k4Y%ykldNYş4$2'']vٌژ_Dg}6iB!dPOWvL Qڪ*'o}kAfwq hh@p+^UQR9 7 .ǥ*!"055)ːL& Ikk6ӗR׃m=J8|'غu+^"\7vNN&lkhvY cdѤm !0bxWwͿ71@vK?*n?O-̇n^)p` `"f9x_NqtrCP$&^4tNe:s !녯 ||0־6+W<^[S<쮭u~YF]4~ctTY9rmmMMe-)5XG m娰 %I!o4,LI  OQ|fľݳ Ekߤ vgQ34\ՐsCMo˔$v;N8p8srr-2 op"vQaBZH~>Ct={w"CCi7YXu]7 x^>*{+lz2L/ff E&,Q FLip^Nx.>>~:u63 jg1{6J= *B(u«":eV|^q̧*aO̅WLO:y{ QqޟBu6q<>ZyV3VĖزbbd҄K$a͛q :>⥗^m۶twpSB!>>r;"螂ӗr?mM5h]uy9XHf8˸[&x ~',K0,M ٰliQ/S j2Ň۾ l}Pt=53@7n l \B+Z3vNms](Ÿý{3dI$?oִ' aP]] U;$ÇJ!|VddX]c38gȳ dƍg8N\JUSQa;&l_ B"6^bdFOǖI> #/u{Ƽ5[et@kәM,Ȟh'I' YP(X}U\5`uoߐ~ ǖ!޹a!PH̿g2Wlq7Ȝ$۱k.>}_p?9 Ec|I?cIEBss3}#Rdh>G]|vNCn(Wb)-M90 ˖EcA>ݞm  nƂ8>|C>*lU^55Rt2B>`$0|2ync;c{p}N/n:gm19p9QQ5E ?M=x"QaC8#rQN؇c*xWV~"ze@2,d,W,d,(,Tr*LxULz/gRLz/A`QȠSʡSɠWɡUɡUGT q@`Tx;xHIc"]Da7 ~ |d*R3WUAi8'J/~y/_P(7  G`\s n&)HR7 F !,M၁xs!t"ɬifd |洨Fxꩧcd"&G" yph<]&J[e򰻿Ay]kUKO6Cp0|Jx9U[S'6xKE va<],o]U\_(1 c;'''>9>;77RJJµJ^%Q#GFF FVFR6Aszò,Z6,"6L\ CDž%)kaլaT; 23xXtx0 >Q^^}h4&=HB`0z~D!d`VCNIrYf&B-5PGx`'frc~vZGZo<#o=~߾ZVBn)\iݝgΰBmF ¢Bn0p0 bh,P:!& eEYDN ^^ N,RxWQG/k?VO(=F|{R5Y=zÿ=Z#"P\<t:ݴېddEEEۿ[N܍$n??  '(=i3g$9lv0ʵk)&`PbIX"hv6&&eʤ3Tt83M#!s#Fg/%<֟JVta)qYX0Nz'ҖIL<.C'Uv;S:s"11`@XcASyQ238=!8=!sIuϵ`a^Ql6jej"S<vy9.@YjsQ~KlgTں KI.,E9sj)n,sI2&ɄB!ahh^(,YH* BY:ZIږ@7n@r%W,`ްa<ەK~}އv5amxDaPzB0lٓFj^+lN>yx3LIL+'&0Ngyrw3GϨDŽz`R2xYj4B{3iAI |cWKobK tyQVxH-2&(J~݄)WJ[حϟ]SCKE8ա2,sb~{4 41ppgT@`&ʤaw@\26_ Yz`5|p<8G8#Ėp4>>!".,uAF13kL>fhʬ-:6k2KUf-t9 ah'09i OTysȑnSX)E` m#RˣBlkTAUQ8Υ\*^s[[SENΌ!d$y~b Bc81zEE)ۨU$RgV w ڔB$ρ#vqe%M bgKD9.? qfćaF %E^n ZJJZCU^5JrY,f~(o( o0_(OPx F;01Y/{o(%l,QkZ@ݣ~?1jPf-V[tXkգZF3 $spQfx>rR`c֊;mf}]2Jk.F/v?̙3jS֛L&LB>Eرdu!rt-SI]OwrZhkp m6]'dA`Y_R9#G$lkhvYPh*D JT+@e7ш8cVoK}ut}v tt>kď3>̰0J;ek2dj0i0i(~+MZ4 }ς\"C"C33(Gcc01ilR!Opʫ;;x0(,a]A pa֪GM{YHO2aˌhw'b V"mbqa`ۋ^{ Ǐ( F#l6*++qE+Ew܉]v}!$0&9WdgCr%§'mR&mM5fKBq?⦛nZeL"\#G@VWGRUh5 4ug 9JŸnӌM\@u0Yz|[d]ThlK<sI?ECW@(I2;|\Q9ΩMZم{] Xm~)?n-O|> ig]'n3-&ֱr!ol ¼ 0y^gt^|E|D P);0غu+^{5deeI=D:f=%23\(C^/$~_rimyo0^{6Xv2:v|#}Xox=`,u*lU⎒;DM0IIGZ@{ xS{64/wvDim)kcZ@)E_(SN:89E'.@[!פAvF5lƩ!͠ՠJNdaro_.:'9:1Pc2v !P{, oIꃟ}+ہ7ĵ m6҉Wٳt䒒o~{i r(폯(d(1,/FfnRx%+'>'y g0|NFb ߷rdX=>T<=u%}aFڵ _ϙ744;#tag?YHbJVV:;;wS! p;t|8tߢU?R@u!JG Yx0-y=47,2<\u8Nuy)t~stؚeB IDATcIE#8 Otz\u(A~6fk sLjXt*K}(Y2' J p:z)<d ud,ψҼ dQ. DŽ%> ;F3xݴ0Gv?;''֭K]o{1wu }9f*i&dW$$G'M|95`G;>,c0 AQQQϢxJ{dnm޼JBgD].!>P+>zT"f^e 0=BKTxGSS6m4MwȍQ_4;q_Oyl& фml]sBR¤]M2>j?2vŅݶ aB cDuVI&8]#)BmxCm9`e&«y& hR:yIf_`)7~N/L9 öA|6_W`աzU&WerU&ZuxʉWT# wK,O;վ!m$ WXx;cWXni(**EFF௯>GǎInVUA[S-P_F.ɯhB$<(//ї|*8~haQag>H0Bf FU7a_;_z_\,ަU+M^aDdkmn_2ۨZ=ZuXccY\mBfi< {#?K+7LC hsH{\8>7BL1EǠ -2 TDe,/_bK)ȯq<>ʡDiBoW\qZZZpa\.dddL}r_|qHRxW_jA!s*22s8lm<2 ښj!ܮGrò,of۴DBƦw]e݅BT٫PiDr"LB { !D#gI ~J9fB% Z=XuЫF?!R5bVȰ)_(72.pb҅1q ʈ/wݣAin0{u&jVg_-1 `+&G#By0yHR7oF4w]?]]]ظq#p7_NwY?ݻw`0w!D2!u eIǏKr [UXF[8Þ={p 7eY<W, 2Tko}5W%撔mt{6܆ [LjS !x)KSk 0e@F |`4xh;6R{ z85Of3֪GU75Ϥ.Q,!qjȋ.rQ4w`dE6=+yk8 6Z-&KP[6l??OCcΝAoʕ+JEB__|wB$F+R82-nFn+ や,Q. Gc$8^CTtS,eP p¶Qaw>ye?*{ۓ',Z\؝ifaR/cᶭPN._-c8}O(A2EfQd7ȦG݀B6=js&;;{,V=n,\ZhӣhOZY?= (p^A/05fdgP=sF0ĺuo} W_}5|w\/_|H۶mK/DX:Bb'0d_qgN;^dr=_eHTrvgVjB_4QZ:ZpA0:Qja=E*.Y2|ApBl0 -۳'aVTի!Zzۺ!&,|]uu e>99'Mj'cd,+0U*PdrypSC^vHwpDž9.C0,m,6b}p2 c=!qO9pr:q0N:>O(ӎa|1 J ̸ȂKXmY~sI:A%Y|hJB|y.jkZҔǜ ˢO 3.cu ȘI !>vⵄ%Y%xWDO?#6Z6:U*lnVMww Y8p %HzZ}Uw9a_, wDI#Nw=.`;S^m#zhTBƧC81?kYK؊ \Ղ.cB 6PYBxGixkk܎[Tح۲%.K݄, <ϣۃz\jdW% ;AyjyU@-F/!KX/]tǖF NܯQx:U0m9z;[156扫=M(X-,-cvΨf-6!{̀ݨjiy---ذa}~, vߔoJ =9ڟ4uO:O:Y m( IR7oV<#t|X]@}}6VAn%,( ͺτ<YhzNY'0  R[vkykn`L]G&Qmnnqh+먔Xmj # jŜt<&,psT<ו v'>jwkdv5CQ!<1dո؊Ђ CeLTƄ.<#t$|:u":w0àʐt?cGnh!Zg{BԢ\'Xolylu;S֛T&فϯ|KȒ -vw=0x ,.P9&BJRHm}x±^7Bѹ 3 fL]`- !!>jwNowbN[,Te^blü2&D2^{-MPI:q>#VQp;1eHr'0ruFb#ceW`_׾m`U*ף.ۮWTIqz \s X qQ%%m"(.Y>AS(uPT5ҰҬŗ+Vxa '>j0ᙗxs#wڐ%6l_oֵfgbSJHRnB6lo9}_CTMA7! C8FP3ݥw I&0lG)xkfE^T]b.F?2u"x޴l(ydh&!q<.Pk!#[ \ꙅݙ%PjS6#Дۇ\p%9g)d l@i^6e`}aQ=M!tͳd锸qsnܜ/ya~w |nwfPło;.*,ߏvܜpFut(ǎM%'EͲP@e 55VUB!b!dA*(i)a[]n[[6JFPg˲>G+3/]awU}4B(+ez}[ba@)gQme(C%/2tͳM.yre }H[o< {^<ѐk7TGvM( 턆dq"( ؎uڝ_{@u"޷ki uj`;. ipd#;=#4ƨBḺ1r$#$B:Pdph5;/fdz212&"`~_vYʅ^7Z tϜADmCN:p&Dб;l,HAUU7{];ZI^M3>8EYS^vr=-b6@EAw9Vp bBpuGP#\ JQGo'Gb)BΎzQ^ϾC05%f2+-IIH-%GFabRuy48|zWP ͇VH-evZ HLL 7-z!z _j `9Sa\t!D;8ŗRZKzmW[!F&g?cjTWN^ k~hOQCdgjw}Z79֙h40qL$iCvZB!妨W*W7Dpt5cK-fҤIu!Ǟu!vؤIbb?^a֬pیq\LH%DC"љ4ZWPUS9ŌAg 79SS SLEQ8|0&M[zpAѫi[e$v8Ď::c5d =#ABq9sf9JRTHao"FEI-DSq]shz=ї_pXDξ^Olf3yyڶr]?J_§rs VKFQlĉ僟 C2>4eDwdH3u0f&( =Flh#Hi1d%{\ q?B wr#!=ȍqQml>\Çx;njmP.|)c"z2&B Q.Xk_?X 0{vwY9цB98GZe&:Nc7`{b5z\7>!>?+jp<_^ wmRǿ/};fxZ_;ͬ~c`^Nv7nj|9LjcI!"tXK`o%VQQp[V2&.R 6iːvЄa3S0{6ڰ@tYGuu93>ɑ{~؈ IDAT($<\h4Ρ%)ma*ZZ 02&ZvHKRDspر| ;w8:W/ރ*+Pz-j-\mمҊ'9?i}3>*]w?')n 1) 4w]~Ƚ=}ڣY5o ʟf߉FO]XZ7ی}ƜMeXfqB\jhU)]/E(-7,eL3ݎ{łcnp=CSmLc4bUW'aAGWcnn RɏV Sϰ{ݴ]gvy饗ehur'=r.m wNMSTVGaY~ɰ-Ũc3>q&CLyD0y\Ns[fݞJ6ߠAƍK.G_9q99hi&9)b-- wv>k ǎ%tf3yyOF/#vU*\fdztmRzkJܖ+FÅ^(G B ;fiXhݳXru.ב m!Ycf kS=9n2]ȌRLJExHx ;beee uP?awDσ<٠뱦IEvBDhgmuvvZ,1.Å`eq.m<v2&Bxjj^Pbou߾_88v$b|J-khkk(}?kwg|kZ}oPo]bo鼗AI-CRMJ__.g<+O]T^G-CC 玏c|#BJyp2秄ݢO+V;nT\ح]v>C. i1LhB ZepayLR#R} A-CW]XU[qH9@js=Rr8j8lo7շ;eKxi\pC1j;=HNz,s3>iфB!F 9ɀ+FCNN?sV .$<\n=҆ B 9W}:r;B% bb0MDa4 <\m"o:dI*+9k5Q$`J6t;9pq222l.5.e[l;4?>' Btz5.syA$@@t9pn~v^KvZ,9q{L!H'kqcYL)&&NB]犢(|,_\3fvV8nj;}+SrEj=v Wv J밖QPZǮ=>l_SSeI!mG&EMq"#[2B  )KvP@ %"Ȝh>ʊBft&g-iuWEw7Ot# +90.] o|;( ŧZ`:T7a!Zf27C=7=(3V!Ã?rI-xbRx'͛oOD% 0A V}X+h9Y>-~a)gm][g}\ 5,BG i|;pV $=L3xʑd1-5ZFm !Eyh"aF1//awȘ1=ʒfeI-0PT{GDF{mÔbb'10%dau0zA'y4&>2o_pj[Klh"a!Zb:GlǑ!BNyh!ajvU-tQD.^u{u$%ymLhfB C_BQUЧ66k{\8y?FZ-]vPwcdimjۧσ?^$jȝ0t4c-ZjZߏsqr2:GmCC\!D9M$}w#eLD먩e6jR6舅 } 3g1Pn #ЧK%Dq+nZeZiŔbi7xo|x IT;{TZ|  8ŀ-_nvéjmj]Wom/ O cAz ;Y@A kiu4vX=j{nzw-B$awss3Vb߿zv;΋h8zh{)bH'^<^EE(N'kzsҲeK!cS0wC&!Ʋ>B<˛M>ܔ\Z%5GFlx_9[@ ˶Ay>m6μlw۩s@k: JwoW"%:8r͐QB!KyhаG---_Qy!c/^LMǞ=چ1/R,IgдqJK^wVrםeHN'NĔlb^Y81bh4N:^:5.e[D|ploŦCT*4 jjII)Ir+l֒:*~`h505%Slf1. B!9I[o^x"7r u7(( Ί \u6/OhF{|Oaw-IBuۭVeNm,H]}SM\.<կtCݝPڥ[ԑSx4j9f`򢹭:dEe4$IdXsc͈ÔϜX"äzB#kcS'4_t]q4`Zn\ B!a{#$6L?$͋>q/Ù3gNKHHgݴ9حV\6[@6e FÁNn! {^`]:}X~eOawdh$⧱vouJ N֯/-+WTV'4X>J$NV/T dV.&Om)Qz P۔q1ȭB!Faq#$wJKKZL@Ft*--eÆ L4+/mroSnƾ]mXp@ aSb4ÐKL*İPX~^}&d'G27i. RxSj~;wv;TXh粭ϼofqp{uۛV(,-p'%EvN"OnF FB!F="v_{\ɑ#G[U>2M~Wh4L>}yv>z9vmwڶ8\zQ!20ecΌ';-p$B!2i֯}[x1;vK[\}ՔX^RRBII *~;?xTxꩧHHHw墋.;3krWSPPsv-o#NDq:۰NGeIrrEEBx6P\cS؝BZdǛZgv 14 CxEQteuO$߶Or+lZRpۨjl Rc=MLIBsU!C~#9{+++immE޽{=awnΝˁW;%%%,]juoo|RTTC=ıcx'1 <~9tW_eɒ%̘1իW3i$X~=]vOmu]\Wmx8ᳳqX אNaLuv^9"lAEsEQپ28~D IbJbxp\3gy{>8KK%u!!v5wZ/D;k ez-}j7{m㪉W1g)fGİj?ڕNTI~j㠱E>wO&@\2<0^Zڱذ#vNKvZ ,uvNB!/b H҂F!22'xo}[@nH_|mqK/ JKKYf m}Ѡ2gvl6"1nG[[o3z8nF'|v6yyf s5ȭBEQ_l묕VIq*OaÙ7o?--PtpWŇs0 evnjWטXn‘fmO68]0uˌgRRB!!y!v_/.tMPi&_|h4\|ż477SPP׾,ZX)//g5":w\_ʊ+M}vz~ӟ曞R1/"6l !!61Lw^n7FvtZ]5޻/Pvkۮζ?~Nz"V+'qɗ= [AYWhփ 2c2sv9w/<&g9Ѩ!/ۚMTAQ@  puhߞmȼD鱭1߽<&1p:ٹes#ДmC[wC- .t ѢÍ(hТF֭=jK>_^;QcκFݯ57ǤMAI-RuBɢr-]=WW{wРy[}HsŐK^V"sb1{=Ow/yL1 dd(EQZzD~19O11D9h~ȵQUUNNߦ?Qǯ~+.\τ +o&,,W_}H3 (kjjPONsZ7\xijjz {U(**fQWWc=Ν;ywXf TUUC=V\ uزe ?<崷spa^y6nK/q1EaŊ\.JKKgggs:pp }Ym_z-v >Jcc#555<l'>w!so?,{<_vo:85ݛ6yjį_͛72N'+V@pQ^~e>c>c^~e= +p:y͛7{x7ؿ?2 bDZ\U :R\ GN m=eY!' _sגIh(d}%I$UnKS(ܾY#=bļG _#t/p !~zy@#{7`hEbyE]'|l-?ugyygvZp{^@(/^̽s "##h44445*+ͅ8V+ݻѴB?e^6wt;zV4 w[Ӿ%-w/I=&@3VGvz&}dǝعǤc6 ?VˁF܊sT60ڧo;6ֈ9#89/@H_ϓAyL1-?1D#w}[Att4n~?% aC=/Kz=~wQ?rh .sL6nȗe/_?t:^zҰni^ł=?Ǟ==&&k :v{łlh6a9 V~#Gz-jUq}j{kGau!:3Ԛ&&%2;z[B >繊uh)qD:d"u2OPns_b#KIŧZ~讷mΌǜ)#Ro[!n7W檫B\p˗/ a}Ul݉ :!v12% -GQ&ŨcGmLpwB^w׌#C&6;X tnג_RFecߏ0+-$5XB!: yĨ;!!7|/'|D:}sSSYq`VXX8b~_jnQPb%B޽r}%~o !rv/*+J jv5u_sWZ^\擤Fzmc؅RI(ۢۥ[z5"l+e&<81Sዜ.7{*/Zj`ג93yYIB!"ܡD@ndʕ,_+WrM71| }Ԉ/@Kaaa$%%Q]]MyyO2~3ˏHjjYo۞O}i?FEa48-f~فc]QUkg>VYYlbR+˶o:lp $M;f.'j/']RgABX ~!Z:mXJlp+:<sf/Lb {L6a~UaMQ,5v-`^u1쐯[=bq:@f3r;/+xB!DBBtL Xs p5p}sϝ1^~=%%%\q=& fvzk#iTՑ m&܎Sp{D "驹}_1zsa~~ڛ >O#oAs5CןŀnU2b,II} =J)Q,IORtx@%BeL|_gV9sBdd$N2&#Is?{xyy$&H-DWs'wnU$y.n(W/?%A&ػjDEJ&N:9@ m{8!ct 2叅AvTD37i.[NlRiYxmCp{I4$2-aObİ:%w.P:/ +nn4 +&={Oj*9BKK )))z\xC~{뭷 飍-{^w-aYY^0^`LD^ Dinokkj{5^OSsϰo!j5.\,?K{4fBk}2mlC~-.f_#Ʈ8]؟F^Vyqe%0))V'BxZ뮻n!91Z&wy,[e˖xb)x?Luƹy=ur$&͛gox#o1سnwHJ'6%"7~~~JzvT;k׾K_uf}W,Pj}g,R4o @v )e3J@^f< r>!B!vy+ʜb"Eرc<#ۏWxJ$MOOՃa{^C& ]B}gom ^K|jcCGgR$ F&۟C N7mӋOƱGӐ5dfB!Ꮡ݃ OȺuXf k׮fuqҤI\y,[EAI￟GQط{nك)Ce[QZGAU*+J nͿo}/{$C 8G=< FuDZdֵ0 }EQ({ŵs n (#'=3܎gX RO!Ã駟?A-ӹn6o̚5kXf >iC\\K.eٲe\~ VﺞT:tWRgy9|5nɷq =v]jӞơ$rB=prHuD!k7u}2=@z56ǩ3O3EQ8R̶ŵT5 U4vj#V;ƠǜǼY^'4B1<)ɓ'IMMA"mEߟ9|xbO,Vu=F#UUUEYZJK~>v{~>UU>ߟ2$3tfuBdC%pPRɒ Kw> DL&O,9GGTK?< +.p{!f$vl][KFQF杗H^V<΋grRZ!bdPݎhH" te͚5[Μ6m'^`ϑ'կknG+B{qg=?AEʐ1<ӅwrxO{S|dFg 1zE]}GkeO@ o8{vB;fOE;Gn[Jl4vxqRc™O^f>z_}7!!]!"(\.|An)c"ڰ OrO==ݱկl2.7>EرeI\N/)q^6WRʪ~UZ好heսOsn!F&(=r3o 9睶@3Gm/1~_Z.v{jnprng%0/+8\B!" n݊@r}v8u=MF~~ ( Gt%Xpa'c4ڕr !m;?n#eMe=z>B ^x{ܳܟ~SW!GnO}.1{| }>󺳷wPXZZQ^O{G?~~Y$xRbNQϴi$B!Ĉ%ɦMXf r-Cݥ+(}aB?N aSN&i͕p[ p4*ۭ`47Z?O[WYcf1.r\*İVs] OW=svN~bN6LVìq1L27#B!BSC>G?7x#fy0xYd K, qD/X1/\sTVKԩ#ssBAQDZVvܞ?'.~Z\>.:K>\uy,ĈCm34R-E{~Vlײ9Nh9c;knǓGDnNtݬ_K/V6B!dP~iyNʍ7ȷmRSS71[Z§OWmI I!Ġ|X!Yfg3nōV$Ȕl3]vW;PW'eEC[#| ՚)٠:EQ8^6Jj~?A#7#SdX-v:B!bPeLZ-EQh4hZ,YM7׾5BC%nN]:i2FoWt:g.K.*T1XOn}z{LⵍȌĜbƔl”b"ɘ nYo{3T{R^Xc:'MQcZ/nhhqB0wˊgָ:q$B!h3eLF#v{||@LL _=7$e"vm7}{NaL$I^9"B(8:ޯgFt;{TZ| 'M Ɣl"ѐ8> 1:riJnT@"me,:{5Vm'+q:# ~LƩ6 Ψ@^V'r"$Fv8Q%կ|p.}; p;f@zU{l]PZGs[G@g /+#3A^( N^}B!,9EPݧ祗^⭷fSCk{DGG{ʜ̟?]~serI!%o>CR"RVn64h7S se!*hehwQT^YsFQyNUs;q'\.+V7+BKypawɚޝUm@X0,&%jԽ&굷kI[z.j6|޺&5H } $e&&ay=<399ϧbÆ + 01cIb:+3>zX4@b\İD.MSg.;Lfy#ɢr մ!*?+ zD|>h IDATx$ OƴiH/y-yhP"SzP'xO<>wy>Ν;lp8}vl߾뮻j*\qc5Ls7b͚5/~\Mw 7+-,awI]ɨG4i9잕I]2IYr?%@ЩESG$E9 5+kOtn&)2$I®]?kqCdVv""+lܸ1h4'>%g6ߌ~qAՅ8k/*= Ŝ9ȌDV\2dxt>Wj*.౽ :K@r6ng~Ho\NYޜ"i 6=B[-~V.xح RrVnS~oFQ}vU" Ic^R|7E| h4*8!_2a@'Oāpԩ TgքRx/pa yTg(Qb P\ Gܟcᾝa)PI~; H|YVҹ.gIr+;TND?4=$O?p;k]SSw}7nѣGg'J+x{\Tk(YYŐ'ѤV+|9n<1>* < ӯn9hY|LŠ*k*׉ !;Ml9јu/Fkas%cvwwwc֭ظq#v,qaL^{X<,cBFȐJKa׸g/Ȋς1Έ2r|Is`==> ?$\]TaEuПJtvnz4ņpӡaE6lUx^s vlDID_۶8]]8j9Q`}mHLǼy x&ݯ{hT@{=:E/ I;5VXQڭʵ"vNz4 }= `ҥW㜇|awyy96n܈7RC€[oիb a N:{qa5@< ~8nϝ=A~A.Ww{v &(fDc']a r %Cb{IpEVXQTnEcMk%냐v~vRT?+HL>}ADDD*yȗ(vbذav |?$Ihիq= **Ja([cA->>1}qSɣ_ Pxpk)6NIE[+m(7WH>!JTEQ±6gYf+=_bBVm둓HO9< VzDDDDs%ݒ$/Ć f9\}_ٳ4w܁A###9N"RV_Ȑ ~]LV| "/S25DQB@Bݟ h @jQ8D GjZQTaAaf+ZP´G;KąXh4Xf ,$"""9Qƍ{2%r V^nXDpp0Ν;ڵknݺ:jm G6 9^U*nN9SspymHI4"Pwhpeܦͪ@ )KޘҕK."y.q[`27֫ʵfƅ9WmggܹsHIIas ,X0(X$++Y+'[oO=&v՗TgքÖU׻=7#.Hf5yvO SG4vIAtspW/}U>'!}%Y˒.G?~zzEnFaEVQt סE_~%~a>KDDD^s%ԟTFv'$$ի1k,Ic!eL&'w>VipHuϬ{lγqw?~'Ѥ.WiZŏop?"ۡl(mw`fUXQTaAIevZ4 zD""""""O(Kfw@@LYK,]|@`!A7La7(taȌ˄1Έ,̌P&L^]m ﷲ;vOAvJ+PXaEQegӫ4F둛LCnO&("??yyy✇|ɨ^{ s"""M\Mւ``kFYYCl:&DF㞙iˠuW_]}$:{zQRWsۊgaw X,KEq9C """R<+FUƄ˘XknFI]\s΄"{js۫._ϫצ^pL_?Fw9@`2}_Se$϶WT~: #99M##% A:#"""""RÄ(cBgRC_>!Nj= C!oϰ|BbܷM]2[$o( /7Z(]Tašm#_(E#'MɑgDQᅬ{w✇| nrKhqn&YTnVZN(H8% `ѢEW㜇|Ɉe˖Agy{ رcǘ\W=z?iDC#Ⲱ!4aC6m{{ii% T9nH,x&L(-΄ ly fg=otyGȊrWp`ۼ =2C@WfVAC[]\g۰H͓o{7oFaErYS\'"Y=r6--·gԐΚx#B2V'1vqe5{vSz}$I٦.$I_3.E/&T'o&n_6%6 [KK թ?ODDD4QpCbaC)1Eco(שE|HGm32QZ_:xI] DInkr 14qc%y@Quߙ$lt$)*[kŅ ņ(غu+~ӟ^"""Z/$IrS5F3.`JAXOZ% >|x]HDFFH$Ys= >#̈_ T+$Vݿd,@%IUXPXn Zm_#v,Ijt0m""""""/50looGHHȰ4 $&&bΜ9C]֭:흸[QQ35S O>.^wk3&#I@<nm(sDQA5 A4=rӣc.Qw^dgg%y-yȗ8^v f޼y/wSqUF_L3n@f\v\HC&x$ + V7@#O ^Z%>]phmk_m +:_bBN R:DR__?C """R<+F\Ƅ $ :!!4{l>yxqqDFaJahR$ro3ɾvs[b(Q+G [>SBmyv\nDDDDDD{ƽ y;3TN$YsTgۊ  u{~V|˰ uuΞ9M 4n׹?@>p` O;_İHR}!Pu *(,dnBMp{V|3N#&4@(زe >KDDD^s% ɥcǎq w|z!՗aiR}}K$pat4'X'ysÿzzE8 K*٣&ς̎w$NCS:DJ3g䜇1zdVߡV5܊r 4WpO#`^RrҢ15 a irs8x饗OBՎpT9nPIę3gEI$D %u%{O>5C}^r\+hVcDA?NS(کy!HR鈮pۂr+iFCp_+`ar3^#'"IZZZ'ڈkqC7$KCm-6䵣뾴AV|$o:)'Ѥ":ڃ@L?m5y#ȣ:FX2u `X A<ӋͰ;O #99M##% A: ۫DDDD <+hK?я ʯCaw]f3yvGCGG_c8#MYPWpo&Y?eO,@v1an[pl zE@ 2Siz,HD?m-(bӦM~GzkqCeLh%eb/uCrXG+rЩ$KKVyvk t=rҢqyB8Nd.E$TVV"##✇| ˘ ,c֞V-~ bnq>z=X%cgDV|GAM@en_piHJ{+VnWXp\+M䏜4dn2&[o'79lGrpQ!{v:lq"81MZۀnMfM=(rX:vTdј mQE1V\ e~;qCa7t̙˜9l8pYs{~Fb-[=:otvjM$ɣǃXs|V,n@ )KLҰH4@Vn.6T@t9}%IrӣqٔPD*HNlSi"""Ɍs %w;~/# :~$clrK1A1hRkno L?2L/`x݆pۂul91:$Ir{P#RFz """"o91 O8R444(!~򓟠aaaGFF"22rFiӆJJqmnȌ˄~XYYȊœ9+=d80J5x~V.,sC/a]on[q^p;6, ņ0&c*qh*8!_xW믣zcȱUUUߐiBڵknݺ:흰t[97l55C7>9ɐZc`mj602* < Sʝ€ZܮhT'ܞ8hvjt0'DP@:%&yWv۷]wڜ!1w\ݻ55CW{On㣏>b=~ӟ"99=Mo?pl\55w"?XM ݭ@Up{ }-.څ?bgZu~%4wvTZ> ۷d>6'"|M.rۧNb=̙3&awsw3JK`5Tgqq\r-^ej5Zde໳ yX `~HN4R.RF$ UeI-iV:`WnO#'- ]FD$I8rΝ?kqCD `0hѢo755)2.|^#b}!Mu&>(ˊrvWUyWٝ ](>G˛K%rmm?ܶ܊Vuvz4rҢuhh4{DDDD✇|*aw}}=A`qIooQTH IDAT.7ۚq4.mx>PcYY01-rVoho74?T~Ks;_'$/ΓT$ Vn׷L ANdnSnQgᦛn4$"""&/Q%f6򀢾U46,ˈkjaЩn.]?Лŵݳ>FZxm rn7ڦ )RrgX:nP->Ў=}JUXѠR}ٔP4=1&"37pCB;..---8qĈؽ{$%Eðg5t6TgքbTTnǺܞ91saLu&;^}iz8Whn7zsռð{`4ItΒ$E4(~6(܎ P:D4yi4,^A'"""Is%9998q, ;\y:2//Oa%$ *1Lm۶aG4=rUmUǔ)nc3xde9kn'q5?Wn e*v.hi\r} EgiW~̎?r۠Gm"&F+Wv%y5yȗvz뭘3g9Ʉ+WbӦMnuvv';=j hjjrۦsHWL&ܔ~G}|~H Mdm=_'ut}:qkEQ-]s‘ #DD!so&:l6|>}:x,[ ---ζN‰'clڴ $AZ ˖-ScSO=Q/&&(p̭!{vh|W\2ynG(Q‘A+[n2;Z4yѠGDm"R(x饗f>KDDD^s%$IZo۶ {/l63 I|r|g1::: hooGHH%voĖ!Ǘ$,׿&,I@G}Y9#>HLҰPQCagmEqm6mFۙ(?n.*+?@QQVZ} C7'?ZBh֬Y>HV\؂T0a3">$~ FI4$ ˵+ VS$yEv}ю%CġgY *"ʒa4$"!$I1sLS#"""9Փy桴_56mڄ]vrPAn>(Q}umFI4I`9 w mp hoBc:쎙n& S!=ů 9Y$35 ! hIb̘1✇|eL.@LL z y IO<;snun߀m?W۩KQ bzzE8\]RلNmɑ %F"Xp\eL.&449p/_vJ"#I@vQ?ݳL?*:L -(n: S"53R'D4_=✇| ّK="\rĜTug2}=k&SH݁}gQT..jWpOHGۑgMDO``xHu2&4q N|B?xx;@YU3 -(,L3zT4Xh06)gҖ1Ga~S+v @<0,R ;TWeUMr]ažf8^ 35 iIƂ1&"""z-<|=(}{C_G yr9~<ӋJyvQ4P -izOΏ "n 眇T vXίܞ?DDH{iB"""Vd#1X|9N>X_w.k֬͛hsScxt_T?1䋊+IU=@Mـpw/?u߮ DKo\Pu Tȶ4}h\"K$ HOO~DDD8B{TeL.wqN:4|7HIIq{^ZZ>̛7ofwީ0Z )cB^P]Wo;8w*ӷ9߳;Xtڱn[pjRn1{*m"$ ~-y-yȗ{ƍXz5Aq5 }RSSQQQ"BWM*|kˮ~O/كp܊QVnϊ6y {ӦM^GtrUUU(((%K"q5@yLen@ )F?p` Xm*чn1c m"";wꫯݦDDDD^FD4xs|<+T #cپ};{=rmsY ځ+nx]?HΑqR a/͆ 9.,d}*׉ pMcZ,m"hpu׍0T9UTWWZ뇿7||;::ZV^ͻ~48St>ܮ.ޡ* @pږn.*Qp;><5a#/^̟DDD8!_"H$)͛qw;{1@@& ~;Μ9A0k,>|X!E()Mbݭ@U!P/ޮHuuZp@ʽ74w *KbtrA+S p(w`$ w}3N[PT!>ԥuAMK鑬vMh$:7,kqCa:u oR'o Bm@㦛nRkxF\\xԦ uG+H. K`@M/$Ik -(+MRݬNn둓 UCDD㫮= """"UqCB׿=x l۶ .jZFZ ?я9}P9 ;y#$#྽!odawp4|;[p2xnůi1!M#/pۉ> <%"""9ʘ\LUUN:&l6#..C``X\L{nW5ǿ2`|ǿvv1r0/v£O$־Եܟ8!firp!"""""""/Ť %%e/KÔǕQ{j倻v\@ ݔ2dJ_ݷz;fjfEԷnO:h0DDNE޽/F'&yȗyMCXXxvpx³$"y@[p;zjv$)*]p{F\hhduhrkmm!sc^Ƅ&61g5l.9ܶy_ܷAQۢ(d}$IQůÜeIeMDDDDDDD4YL2&49{,c2ZmYW쒢(x]${VXU,K>DuȻ>w}7%"""9UVA[oX}APa/ Px-W#RV(J8Zۊr,^͝vů#S܎ fMDD#,X9y5yȗRD( p8.eLƐ(HGWd\k۰H]DOZQطrlEKF$D8WngW:DDDDDDDD41L2&#Xf o2 $MfysȹKhφ %p;2yDCv!ȹ+ۺ{F%F+0dMDDr8_j=""""UpCDݿo=np8܌bϞ= 0w\ڵk"]DP;wy7\$ƶ9_mZH}{ Yˡvэ"z"մܶdnBMp[۩QcMDDcL$ttt $$ ,kqCń]=pk׮o/<nfGG`$74m\,,N]x̌povԑ[+K*ЮB0??܎FfjB?.?m#"""_9 6^ôiO{={0o޼QT MƓ:5{.~Mnō|ܗ+`u3 ۝=ʗ Xt=r`݄qCDDQG#DDD8!_J%,^ݻ{8>ç7$pY_*?}[[6+b澲$VT6ˮ|j0|(% A:%""""""""L2&Jя~Bѣ={xɧdgg{nQΗFev؀@Rm mjFQr v?:? 2#t=D!П6M.(YYYh4=""""UpCd†3gt]RR°{ǏwS`*t,qsn@YU3* %˪aU>`QJsHDDjkk{DDDD㜇|ń !Lx|A[\yn}'/eB rmC/ XP߃u(jBaEiF vQIFnz4$G 6yF+W0T9 vL&8aڴi\VWW۷#88-IAj5e!Cc@]G۹@PFWOmAQ4ǡ%_ ! 9iIy""y(⣏>7gqCdBݵx嗝? tR,]>~;l߾+WtywɓA!*+|yC=E~m@d> ynAL]88]EIp{f!h;y .lyFs%*֭[_ uuu(\};Io߾C w{\,"vߧ!052·9@`B&gm-CtZdʒ171ZDDA… {DDDD✇|*aeˆnjԩSg /_1b8qX|ۿ#;nW=힝kxv.4%r6_D[}@m8Tmyp1&""p_/~ hܛW6ܶD]*׉ p۹izL_8DDDcL$c…=LDDD^s%˖-dgg_QoPPPAc%?㋶[|9RSSQYYO?]]] F0)mٲvLl%EГ@R!@Jp;}p>Bmm+NիnO @f IDATNz4rbC hi4q= """"UqCD{ΝaX+/t!g?Ν;oe˖F{{;JJJڸ, ᮻQ? v5{|9ܮ)^:0,6P $a)0ujv]k7 -β$ \'>-F3!"""R  EJJ%^~η9jn㦛nr[b \}l+:_ZܮhT'ܞ($[phHHH!s6=QC͆:pt_f8QhK@qq1+4 $U{A/EZ(Ep8wJImϻTVn&CNh#RX1* mt=r ;%)}+.9cr#c g1DŽ޻?&$!;;$9_g?cŸc}FLL ?18.455v mmmηܶfJDAABCCrȡu ~hB$Ahy;na *ֆzd2O>lݺeeeW^yVMMMxG}OQ\\ xPWW_[Jb|'^3Ol_JK'n8)vA$M n,BcHдB:ZH״{G=)xj ~y 5?^;x/555x77o_*1`۶m(-? ---x饗-[{^u;wX~=ѣP+z-TUUn>}6l|7o6lӧ?sIɓ{nkђ`ҥKjժ1Ζi9rlt񎲾+VPJJ$i̙ڶm$iԨQ:~rrr4uTIҚ5kxbIһᆱoV/Pĉ%*}G>@6m$SnnƏ/IڸqchAZ~$71cH*dܹEiڵ)Sh׮]*)) / IںufϞ-IZlV\)I>}233eYF)˲ӧKV\e˖IfϞ[J^xh׮]2e$iڵZh$iܹbƌ9_TzEͻ+IZx֬Y#I:urrrtq5Jm6͜9SjY5c eddȶm9Ri*;;;j*-]TRczzyf*..9Bxx״yf#8GpD9so#LԨQ9s}R$gmŪ{bchXuxߍ,# >{4uСP7 >{ DŽs=ċD٣-Z0uLuLU~}Y}mLT=km*..oPaꫯn_RRHLTTTi~<$JXJNQm{ImS鏥|aOT **/W$.[TrDZ#eYq~iMlYP]#]ϷxSۖ|j[㘔Ŀ'Ǥj1pp䘔Ǥ8&=9&_1)H۶Uncg߳:bw߾}Cʶm}嗺.h:u)mKRPPPk_ײ4I-7^_zkQ3Pm+Pe 9vM#tAɞy:,ĉ3τ%^B?]JE+0?I}f͚i9.Jy. Z_Գ!F%32s-9 Ï~vb#5 EEEiذan(r۴iSnfwvv PLL7o~N W-ԥK 8PW\qŅΝ;+%%EڹsاOJJ.ȏce5B}0T0<}ڶ )mI;Sܾy.ݴ^#j.۶ Tr=Vgo߾@eMѧOЊ)))zG*ζjڵkUxޢԹsr>\#F8}ضm Ӗ$W2`K $HRgf۶RSSթS'E?X&5ŽޫÇKLrb'|뮻6oެriiVeں??Ԗ\*tݱE=lWs{bc5v}w 80E?q]6QFNԩ͟?_k׮믿7a*99YRɥH;Ժu3.iYۛuB0_o]#uoH )n dY-Zo=lx/!灟8R쮮JjZzuc{ դIuս[n?cǎիuA%''kƍ8p4hZ/222$ICՕW^oY.iڲe2+W(n 3zkmA\툿EP/ F*0c =}BBB%i0`rrrNzJzTXXuJW3lc'#CܲAFֶRԺdAA+zvInݴyfM4IUXX-Z?^#f'Ե|9*`H=[ۆW6Zijʔ)z'v8 灟{.?ϧ}Bo8lUV2{U _LVegn׍a˶mڵK-[W/r}@ biP*RĨc| &^:uϸQ.oTv#&4TImtEk{lֺuԡCE?af7Db*#u@7|Ͳ,0cY>ri<ݨЉ'qn8rmL|0T0t#4ڵ;ߗVaڱcGwUW)))Ç׈#> ,KӧOp#&ry_նmVuɡCyr#(^aG <~rmLj$0 Y%/:rHm[e),r1Y|5gVfYFg}VQQQnr T" 3_0 9jH+=*vv;Ǒ/(vB7x̶mO#灟a"qT Tt}ڶm>կ__͚5S.]Խ{wzDW]w233}`P`Х"Dz,\R{V y'Mĉ5ydmٲhzgtW8`Ϟ==>|p1pq< GۘjРAo%2 = PTT~^p*4Ʃ )...yfvjd[uaI ԩ;qƊQ~~222;ړ'O꥗^RNNf͚T8~X[Vzeizx9đbwQQ~fr?Urr[޽{5g3Fmۚ3gZ=N3ea80 уx9đ6&ǏСCe5c 8=zT%IM4ў={0QH\.#.=z9%~?Zn-I:tP2M0cyri<G[nTZ~ꩧ*zꅵ.)Θ1c<-g!F?q[^XX(0ԩS'EGG>v?T&Mx9đbw׮]e۶l٢'O>6mߥKHs4i$'|x9đbc=&Iӌ3*cǎ7ߔa8lZFY_<y'of 4Hm뷿>s~h튍Ք)Sgleee>vhCn~aضm;b "UfB?`dH˖-qwv;Ǒ/mcW^yE3gTvvy0 \#F"0 k.,_r#^z)T莊Ұa_J_|oݻWiii& 0 u0E?qڅ?8tڴiz(t0oժU+m6Fxi;vLt;ǐOY2>>^ǎS˖-sH*kߨQ#egg m+77W5^Y<)"@#3p:tQXT? _8Rn߾lVAAGxdYa8Ʋ,M>x9đ6&4fթSG,!H\.Qmۘ$''+..N%%%zWx 8+ 4۶_O#灟8Rnժ|MI_͞=ۉ:tIxmڶm94r#mLo?bzzԳgO5o\jrmqhcU6&e>Hk֒%K\mڴQLLFQ?OXxeYyO+v[~ZvN8!ݻעE Cp9‘6&m?ٶ-0λhmLӌp8ژjK:#d̙7o Ð$o^VuE)..ΉE%''3<4MM8QO=<GfvGVa4{lzoe#(-ZжmB)^c۶ۧ͛&ix 9jj@M$Iuє)S(t@n8/)v?~\a+Tx 8,99UzY &O#灟8ƤCP޽|H:rrՃjƤ{m[۶msbM4QRRnƍs;4m[iiir`@A?qcI٣O?ԉTeff݆ vha۶6m?~y'1J oڷo_j֬oPն$M8Q Ҏ;ԥK{2MөC~,\<Ͳ,-\x9;܉ݢ }3fa8&;P בOicrh:t(tضǏ+::Z<)ulÆ c^ie饗^"F?af7°@%n8C, <Ͷmmݺx9b7*tuqf۶֬YC<~RmL=ݻwȑ#*))9p*ژjK֊tP?7xC~mVQ$0tItM,\<Ͳ,_~ x9bԩS5tPKK i9±6&3fkҤ t16m(??_"6 CԪUbff!1P"QtdX'77WO?u}v߿_} mѣZl *v'%%iÆ ]2x`ژO,KӧO'F?q=m40 r-Ԯ]n~iZr7n%KnB+V0 Ӈx9đb~/V^{,X@ T 6,0Abb!8~H;--MԢE ]qtOt]lu1' >[Yx9ı݆a}垫UV~qqiq]wI*mFbŊLj39r$+O ӟD<~ȷlN:垫_~޽{O-[ܹ3\jGpݰaCIѣG=׬YF0:oYmG IDATclҥKyO)vwAm+++s_~yҥKO D4>ԩSÇ "q.F?q[޵kWIҁ{n&!I>}o^||W]ua ڴi$%&&ƍvhaY>3kF?uM*_~… _2\֭u뭷jW=4duMahժUzUTTZGN3h߾>cխ[7`0RDw1Cp9°hs15o\jժnݪ]Hmfz) )**J ,ЭqwAA]E.H:uhzu8K.D-RӦM%OIRllfΜI%=O,Kf"F?qdf*((дiӴtRܹS'NE]}'P- ͷFP:v/\m[K]i<)"1b7ژjն jg}VicLȑ#yOٍ0e#(ڿ?mLgٶbrI/,rc6lvs;Ǒ/(vBsO,K~!94r mL*T5ژ1\s #~,Қ5kyO(vB7v;y1Aژj1c~.ofY}]ri<ݨPZZ p; N:O#灟ahcov1MS/294r 3l~ڵkWh4klѣGU~}.E΃pLLL!8G؍ = <Ͳ,͙3x96&mLnݺ1<Ͳ,_x9b7*ԺukCp\NN!8~A F8f\<Ͳ,͛7x9b7*%01a(!!x96&CU6&pСCea84M<y'=dŊ뮻ԴiSծ][͚5w߭+VTz_fR xW C=D<~·#f̘~?VvӟT-[Ԃ ԯ_?͜9R;yCTjr;Ǒ/(v{@II "0pB[N6nܨ3gʶm 2D'N8}> <Ͳ,M:x9*=`ճgO];vTzzu%q_,P @%$Iђ$0θ]ƍy_~^f۶6mD<~B:v쨖-[jݺuZhQsfRzzJ;vIxmJOO'F?e|mذAׯW_i?Lm۶R4i͛۷P-ZP^_R{v7ҥKտGjժ222i&s=z뭷԰aó6&Z$꒾\w# 6h{<++KYYY5k5~7|-[kݺuZn$yѣׯ_},\<Ͳ,-X@wu.xD?7 4P߾}բEJ'++K~{=x`-YD֭ӛovI&LaÆE&xիW/K*,,Tjjz/~JE P}4kGe^{MM6UnHao߾${g7o^hagϞڶm6nܨ/~ڶm[nf4o\{ Ν;+ԺuFLTݵa-YDrMU6&駟}|wB5\S-I5҄ tmɲ,⋚3gNڷo:u{7m4sɓ{]kÆ ZbYe~4s 1MS&MғO>(p9ėHOv[nE G}bƆm駟^P,v풤.{<77h@u4`zWO#灟-?O+Vׯi3 #|AA꫈Ro//BptW+))oR emMӔm۲m;Ų,YuNڶm}-l۲g6gM8&~=9&|:&'Ne&DŽs=DŽc9ϞccbYƍھ&>{ by())Ѿ}$鬅nS(Un4tPY몫ҀtUW{eY1b:vx,**RQQ$:~$m['OT^^^hۂIƌ|߿_o$i?)I7o6n(I?~rssW_}Ui&}>(4s}ĉڷo /K*Dxw%I/֚5k$ISNUNN?QFImۦ3gJRRRBg̘ ٶ#G4MeggkڴiUViҥJ%IGVqqvޭɓ'K>s-\P{)55U+ѣ:p&L Iڰa>CIaI:tHGرc%I|}I҂ B'M={H/$i˖-|V^-I6mvܩ'Nhȑ;vwޑ$-_\˗/$;ڱc$iȑ:qv:&W'|"I3gl"Iz饗TTT={hҤIJ0X`$7|#I;v9C^ ?0tL&LѣzW$Iz$I ..IM8QR}ҁM6I^}U)77WǏ$mܸ1N?O_^ohט1c$͝;Wh"]V4eڵK%%%z$I[nٳ%I˖-ʕ+%IӧOWff,ȑ#eY2335}tIʕ+l2IٳuVI /ڵKSL$]V-9s+9Gp9By#yRڵUXX9s}{ DŽsiںukhBDŽs=DŽc9Ϟcc"!;u$0j11).." ʢ}+Q իWhtRRRt7J{1[ e|P'NTz eiΜ94hP(reuII]~bccC{IIII~\\#1Eٳ9O zyOSg;u~?|muvm.!"˲xbri<!&&F͚5TlN]\ q5; Av5UΝ|ܹEO%)))*»`VRNNNa0T0t)* ݻa8~ԧOng۶/_.IW׮]-t颤$%&&ƍvhaL"41<{ ݟ2eiO%I뮻߯͛7+3336dC@ [oŚON:{$]Vzmrss,2lذ*B۷O j۶m؍&K."Cp9—=o߮իW=w_M4 \nݰeƎիWJNNƍ5p@5h@_^|EeddH+ҡ(?J/4˲4zh=쳊r;GO ۶mj3fУ>z'$$Z5`O=^uQP\aa֭+I*((P||H%icru͛7_TըQ#(!!A>b۶oN<~˙8AB)e }'XwyG_łMyPSDbf7n9KUÇkĈUϋDۗ Tzꥉ'V8 ,u 70 x9b7*Tvm%$$^zngEPKr*裏ʲ,peYzyO(vBVan0ԫW/ri<ژ mLT5ژ1Ç "L_v(!灟0aFP@#FT}`f۶N8ڵksY/,r]+A.b-^ܗ* @ٳGmڴq; G/hc qjݺڶmv ²,-Y«~BaJU*^z1<Ͳ,\x9b7*ČnEEEn8rmL6&mL|[YٳgO#灟PF+v1 C]t!F? œz@ZZž nhc\JJJRbbbmܸqni^inr 3l%66V_~efvm[EEE^Y<)"1V7A%$$`^tȑrm~ATg?O,K#F? Dr czɈ4˲矓O#灟PF6mvۿ!8~A F8?9O,K94r nTモan0t饗O#灟aN\ --MqqqaAA7BQ1cZ%%%)1116n8C45fv(!灟0aFPׯ5k֔Aaf7 ۶u5hЀzg󠦈Z  N\#FxmL~X 2"²,M:KzOٍ0e#(m۶Ujjgydm+;;[ 2 pA΃p̿oCp\Vq< ݨг>-,ҨQyOhc0e Gxm۲m[apI/,r1cqn8rnTo߾b?2۶gO#灟a"qTmLn Yri<ݨPTT!8/hc01Phc<#O,K3f F?؍ _an0tגO#灟ahc,41i#F?af7”DGGСCm[ǏWtt4"AMn8yn}yQ;3UzY O#灟aX@U s3<Ͳ,^x9b7*T^=CpѣGq< ژ mLT5ژ1 ieiΜ9<y'W_};wA  .E9a+anr mL*2|p1y1coFa!C@DѣG4MCp 9S6Rn]ٳ猳j2۶UXXx.E΃p Enn8rnTc^ie;94r mL& @e޽;#~,ҺuyO(vB-Zp;ݻG @U X 9b7*m6v1 C:t F? @U ^icLO#灟0aFP6l;wFSƶmaÆ\ <53N~~AzGXxeYzwyOhc0,P ꪫxmڰa94r nT}ٶ ri<ژ mLT5ژ1s O,K'F?؍ ڵwy1Aژj1c~iv1MS94r 3lYfڱcGh4klլY3v8 AMn8v#_PF~_J/4˲4qDri<ژ Tj1A9˗/mݦ *..NW\q&LPѻΝ;qemk<y'=䭷ҍ7ިe˖K/U߾}~Z<@Nj]v'Aim+55x96&K/T릛n$8p@~+͜9S=CU6&ywtq=Ǝ IDAT#B$5mTǏ$3Wn].ri<qFIR>}=w5(::Z>@tx9oGJ5jT@ `0(Iڴi9!𼸸8ry< ~gW^u%(0 J_VϞ=դI*11Q?V\/qMJvYb8p@yfwÆ uG}nݺ顇?~~[׿',,*̿ʕӚ5kTJ-\PuUppƍkdKŊY%˗˗/;|&+ק[q8IIIyP"{4_xn9;b(c2AIS ױcGm۶Mt1 $iF}6nܨݻK e˖Gӧrڱc_zU˖-S\\<<<Զm[ 0@=zЦM}vEFF8njj$*ytL;$&&N:N΢h4_zn5b(6nXtB;*G|&+ק$[q8yPR%Tyxx(--M|!55U6M)))JMMv4l6Zק_٧H'sq}N¾&iiiPjjRRR @=4^9SSS%@zMsb7ի\$gI!YMqG2?آ&Ym?+L)--ͭ;#=\tk_X:t`$IرcvշQFy_XgΜ颈hTZt4nH2fΝNq9##ooo#TTl6i*T`$___`$A#L>ݔ+WTR<3Fiժݻdg7on$S`SBsIYf'4OdZli?IO>4̔)SLJL?o$MI&**ʴnH2'O6ժU3~~~f̙F 7C5LMdddƍgj׮mLLLdիgFe$Ν;Ν;IfԨQ^zF1^^^vfܸqF4ݻw7СCMxx3gUf&Ol$֭[(#4mH2?)_T2ed|AӧO#4-[4̳>k*Wlʹiӌ$ӤI3p@#˴iH2&M2իW7楗^2LÆ ͰaÌ$ӭ[7Ӿ}{#Ɍ;քOOOcl6ѣ$өS'ӥK#Ɍ9ԯ_H2f2ަVZf„ Fi׮ѣdl5jd$3fb$C'xH2O>i֬d{9SBlNj$͛~IwަUVFygL*ULrӍ$a d$={GyH2'N45k4>>>Od4h`n$];If̘1N:SN3f#ttH2Ç7 40̟'cj֬i&Nh$Gyٓ{#=4nܘ{#GH#GpQ:/ =D#$@Q1 T&%%rʒ~Xwu׫gϞh{ ܹs|rJNNVճgO͜9S5jpj+W3N<5k{?ʘPzzγٲev֟ɓ5y&(jή;x;k_g ](l6; WRY 6iiʄk.e˪J*nՐǭvڵ -. n=}ĉ\:tj7nܸP{ СCyceIlѢEw_~V{9o(IիG.4jH{$ڵKsνŋ-IӋ4Fx;wIHHΝ;^;{^r*Udm8<ɝwΝ;h߿_ RPP4{l=zT4e5k֬]6cqw駟jԨQN Jn޽ӧN<&Mܹse* ݮԲeKּyj*%$$(55U!!!j׮Ǝ반%' TJ<d7\n۶mQ=,ͦ;;,IMM՗_~#F(""B*Wڴi+33!ܵ7xCQQQSp=pႻ@n\ft:t蠭[' ?&N(Ijܸ~]pAwVFFqYFJ.OOO-[VQϫVZTV-w X}u:t\K'NԩSU^=#GK.oz%ٴiڴieZ]vMƍӒ%K/jnpē(Tqqqj޼9OvR#͖{˗/RӪYjժ'N;Bn rJtK< I:sLQPʔ)#Ivs$# =zTH\ƍ$ýfw)XݻW{վ} 5ǎSXXXƛ7oVZ*$$D3fڷo_Hg23g$)**@{WqL2Eϟו+W3gΨ]vz r@fw)мys~~nӧ?chwPJqdSOv:xwƉԒ%KT,@QI)`}EPP:vX?MLLT=ѣqFٳG}'JӧOwMN*sݻwkҒ%KHt|+DctYZJgϞU&My|&.{=U\Y-[TzdԱcGm۶MWVƌvxŋjݺ9"߿_M6uLR<ڶm .h:thNӊ|ޱcԤIUXQGaJ<] <34hׯ?wa&ئM;nlՠٳ 4@>9ϙ3gc)))Io6nP`us:uu:q 'PHvCb =nܸuͪǴvZzl9ϥKԽ{w%&&jڴi:ukȧI %P8HvCJt9~6z?%%E+\ƕstEEE)>>^#F@P9t㏒u,P$ծ];׾5ڇ*Ը\Us]w}^zi…ScWr|gƍZz233^pFgϪM6W"eddܹsM>Y[p.\(IJKK$ƪuVիWZjw7@~r3g[N#Gf;g}Vhϕ~ISLQժUռys+WN┒ڵkkɒ%=.솒vro~,NҞ={8k \9rZ*;$@Qr|gϞ_eŋWƍh.xHvaoo<-[jg=m/&&F111. U\9a#Ww4h7|uEݐվ~zZycJ;;בFeInsP1d7TlYUREt;i$͝;W6-sP1OvA˖-[ӪUT]v;vB%sP1'% TJ<d7# (HvJ<d7# (HvJ<d7# (HvJ<d7룏>R=Tzuff|kY?ۺu+r@JIIQddƌ 6_UFF?5FFF*Tp8k֬q0ȑ#Py;o3gݻZj~$+4Po^vppp_hztJ/_1J@=cvzzoƈ@iD9y-Zdm̙3P-ZvďXiu}iÆ vbbԩƈ@iDȑ#z$S?#yFF 9{6n? d7rtb.paÆYmg^tn޼)I>|xp ݸqj)Sƍ߃>IҮ]tȑP^TN)00P 4SO=M6[nujG^SvTF -[V+VT5m4>|ةq;dj׮U&լYS}ڵkv6lФIԤIU\Y^^^ RӦM5b-[Liii 2Ċo߾:^}~j#Fڋ/ε/Ij۶իWWv p@4|p&3>c JJJd9rDwﮥK*8881x Oŋ:pG~ t1c̙$]xQ/^T\\}]=z7s,SuQO>իWk4h/^,Oϼ!66V&LЏ?x{W^U||xbǏײe$Ik׮չsTjI! z$Jf%0}||ԡC;f;NFFqݻWTJկ__9w>}|MBCC7oV 6(22R;v5+XOg SXX.]xjȐ! q޽{o^PÆ UjU(>>^׮]~[N˝СC8peUŋWff$iV:޺u4`'===ըQ#UTIiiiJHHr۷Wxx~'ݸqC-Ҵi< Z-[YfNaVuںu_Hdq㆕Q:O6O>d*WñcDzCVO>$b1>[lɱߐ!C~^^^f֬Y&))ɡOjjl<==^cڟSŊ$3l0sI~&22[L'qǎs8WWf7 Errjժ;w{ʔ)Pk_u?\Ø۷vء@IҪUweCtt1:uh۶mzGT^]_|IߥJK.$yyy^yUXѡfΜ%KX͚5Ky… zxbլYP[N!!!7oZwzȑ+V5ul+m#FGҭ$۷oʝH)?u V\RZJk_DEE_wsT^Ewޱ3g4m۶^~\7h@/g݊׿rَgB yZKL6M]v͵ճgOI˗_x t 7ovwVB=ֶ}ؿ?`닏¾,IJJVZŋn:IRHHuvW[hQ<~]SU?**J)))-]4_\Y Eʕջwo?YwydwBBնO~:>}ZݻwwjtLqgY2233/X-ZsLg7N_%Vۓ}'ֶ}h5k233giƌ駟/͚5w:;]vէ~} \_wky)22@cn g\pjgff:ȏ+W8l?|9q_aIII_x{{{]tZSOe>}}9$7md-pYlY 6%-,Ç/,c-Z3f)W^P/ԩ=z#?@pvT/E llٲ. \qЅJn˗w}B}QppK[XBCCաCI?]v>$yzz:[/ 4l0Gz뭷! !!!2_ǎ Nlyf_:;l紘dA?j/[*rYz0buiIR]D|Q8{x Kp}%rqMPz[UZj={e gq;>Gu7npj9rĩ1ϡL+mӦUիZb$iź~[orׯ%9e/I%L]޽{ɓ`] %d7ܪUV%O6oq7onq}ŋyOLLTJJJ}ZnmjxGn߾ݥc7jg.裏ƌ#c *(**MѣgIV\Ed7ܪ|zᇭ>%ojJJJs˗;5vhh׿g9i߾|||$*y`bqnݺYիW~sÆ $iΝOtAIj]9e* ?=`ևϏW_}bΜ9ԩ#nݔ)S7|e˖ 7nPLLL7lؠ;v85S?r}jҥKz3((HGgϞÇ;;=*ϑɓ'l젠 0ڞ4iիBBB\v裏:U7oCrʕ+~oj7$v}U۶mQFiy.{No/_^'N}͟??q8C:?n|NmK.w֢y9s*U$VG}T;ws={ڲegp5}tk{Ŋ3fdv5{lƷO^vj)KX1ڵ}]7G;OwxxxhŊjժN>ׯkzԿ5o\*TPzz~78p@۶mjlَꫯj͚5'NԚ5k4x`oG)##C _|gzꩧ't?C9rDGVXX\^~Թsgy&kԨ˗gϞqΜ9HuEQQQjРSN)66V7nϾuQ9so߮n^~6mڨbŊJKKSBBo߮u)--!I~X<8`VV-u޽믿v"99Y?SVZU-*rDBjմg[{$w\bbԩcmHvvHz^^*I/էOB;{" 5;ͳ5k";#j୷r(;zCt7FJ+~A[/,۷ow؞>}zzj nnoiܸq2̙3ڷoU֢^z0a#@I@[髯u-[L>>>5 Wf͸eʔ)jժiСUVJu@ Ǔd7# (HvJ<d7# (HvJ<d7# (HvJ<d7bL&^IENDB`PKmN-Cβ+7+76NuRadioMC/SignalGen/tests/plots/AskaryanZHS_1.0deg.pngPNG  IHDR?sBIT|d pHYs&?9tEXtSoftwarematplotlib version 2.2.2, http://matplotlib.org/ IDATxyXdGPT@X[u-ZJqܺTjݮ^.Zb+Ubq)EPdQYd~07@d|?ϓ$gμ3d3DQADDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDDDDDDdMDDDDDDDDDDfDDDDDdR7n܀ ҃ ;4u8DDD&n""7NK{E={0| 0u8k֬1j<'OɓwwwYf;v,oXCJvlUa/|=;;;ܻwuݸq B/4`wEicc[n 2dZh///ۣnݺx1qDڵ EEEٞ95*CW;FB˖-1vXl޼=2u&sJٸql1\3:th8qbz TŽ:Cݬ{ ""딞#%%ԡ1}tX{IIIHJJBTTUVQFu[}ƍW_}x11eʔJQ 2JvT*DEEaٕꫯxbz?-- iii8wV\ O>1cPXv^hY..N= r o^:맵,N9QIu(Uزe nܸwbϞ=O1p@ƑEIˣGq۰3ϟ9sH[ϟ7j ޸qUՏ?(=5j #F^ZVkJM{S=ɰa0`h͛ӁLuf}Ǝ+=KF AdȒڶmۤC-w"(;;;k/G鵝[ 'Q^=_~ wޕǍW qշym߿_ܹZ)DGGK@t aaa҄<+99Y iгg vI˟~)Je35?~<6lGGGx{{__|qnWXDDD 00Av_"##p sBfͤdFc%-- >Źs4H;fYc}zj  رcƺd}lumz"3`$*DD9F7\?Xg߾}OLL;uꤱκեKdYc^yibQQ^?yDSȑ#O>zM6{=mVg'O^ٳ^uM:UZQȨTLT=RO<L" PWvmq-ǵP5jTU6^CL;Cx5nXS\7gk@W^Y_BBؤI2 qӦMСC=BA]co߾k(sݳgJ:vXf}]Usv:uJlܸ5UOouCDn""Z%s`vA:[]uGNp15WWWk]vE&MSSS/c׮]_UZ9r/F۷Ç:HOOǾ}e[MҥK8uꔴO8Gg}111AI+o߾[\%5p„ X|hƦM"44͛74t~VRp_^͛k׮ RgϞ;8>x}CΝQ8v7n\z֭\A]j)T*?* R.___KСF L:JdK~:z!Jkذ!BCCѺuk8995 ;j]|Yzngg',OruKKK hԨoߎl?~HJJBRRzxƎ[nUe,ʆ 4n'\^}زeX֯_/P(=zu>d֭5:+:t耆 T*wWe"-Aйsgi966uOv.]_8$&&ʕ+ڵ+0ab^dkzµkאX$$$ƍ4hoouq 'γF9996l6l'''}_~4oSsMGA.]h߾=>#cY{=ddd`Сy&˗/ɓR?Ɯ9sh"o DLL n߾Ç#>>iii^r%^Z2;F^^^2scذaF:u*rrrн{w\xׯ_G\\N>tt(qMOd~MDd eSmٲ%Zns}- /HL^GWuT*5F.>Q~rPPPS_?%%JuCk`QQf̘!- ؿ?ZhQgALL BBBsV9c޼yr^믿QF4hz[]̛7OcbW_}`u۹v}l޼(((@^^n޼| Č3 #ݻѻwoi޽{cU^gff^æMJ{4bΜ9S;޽{k쫻;6l [*C4?\̞={ ;en砾>|>} &&Tk6Jlvv,%%K2H^f͚sm,sN-6lPn666XrtO?x"Μ9#-KcÑ#GʝٳHHHPrF,* >T+W >>Jv7ٚ>Ƥ$۷oǝ;w<j*8::jVB5tnW{hK;;;|ZB7|V8q"V\)_~لQ^ бcGt =F",ZZGV\.QQQVH>#FiPTTQn:|Z˪qss+39nݺihڴ)ڴiӧOxcǎZ+M\)~nnn:J5P7۷oUVפIK:ӗ߿:}||+`ݺu:o w)OOQi?WdԈzYm99rDz޽{w gΜ)0p}\pAz>v2GTٳ'OwP2F߾}s=}Zjغu+:oOGUв/Ӏ&wvoڴ K.{rrrcɑy u f̝;W|֬Y7JQFUj9>ݮ$"yHf>>>3꽞zYmSWYFlQ,%>|Xg__ i {&O"ױW7n88zh/d7[M!::EEE>>:˨_EW.01V;}̘1!"֮]+uv3IJΛ` hWᱳ|PbV˧Jty?±Y{b^^^z5ֱ U[=I&MLb,spuu-/w}IjnѢAn=yr:uy39%GizzzUrr%wbc * iiiHLL˱{n<@tt5>| y!޾uqEΊN:aʔ)zoOjJ+KՠA"..W\.Zj3哵)b l/NPIDDVK=gg}Pq\@#?jei#44(|ߎzGhuFmr{u666i@6oެ1dS|FI(ˢ^fHMM-U?cǎJǘ" ~I~r\GӷKWGo}U41) gϞصkF77atk׮ܺuJqo߾G_7瞪D꣺MVL}nwHMDd\Q1se5mTz|[kˢYf9;;O<2i%Mo cqa…ٱcigRqB0m?SI&!??* QQQ裏J>|8Μ9q~wٳ1^Zcyذa$^uXfMrr%Gh;/;;6ٳgرcسg`̙׻TKzugeReڷo/=?p@">_{ oc>|߾}HKKpj+c qSOz٤$*ၹsJo*{'u Z*OkTˣO9oWZGrEƍ5G}ԁC%&&j,W#\+ϼy?7ߔY Ж)L C=wVVOmz"n"" o~>[~pvvFݥ\GL˖-ѰaReG}미yf#꟯5j_Z1#|JׯȿYfM+m_300Be[#lYԩS5:afΜY,+V8MN:cyx MkaiQ*ؼymu~8޳gضmAmL}lm[TT/ Zڹ&"6m$-7lذ#\:t,-^o;Mk׮hРTNK;+_z~kmz"n""j#/\1`IgΜr\W]DDj׮ mo'Cɔ}y=<<пiyڵRTAѸgժU8qtxWPA@JJԡs^ҏ]E?Xisrbl'vvE9xHR֭[Ko\iii&äIO?TZAxx vZիrdʍʤ1Wŋ#~L$::Z(X m9 4Zٳ'RXXX3f`ܸqԹsgҨSp l֬FYTؿ?Nkw~k{AKu -[h`Nf͚%MRXPP`iۇiӦRh" \]]NE795}͟?gϖ{LЮ];L4 !!!ɓ'_Ν;ZJ#fIoN8[%8#F $$uօB@vv6p ۷yyy~1VkF~*'`c__R#y㨬.;w IDAT6Hq.ZnnnǏcy&,Y">|pņ Qzsbe˖Ǐ1p@ 2F:up]ܹ6lJ°at;O8xڡѨQ#h>>>w.^Qagg+W"<<hڴ) "+V>#O~~>/^%Kcǎҥ Zl ///888 ++ OFtt4^*gccuUukE}{A7Xl[0ŋ1c`8p <==[?Ƙ1c4&/鉬H>_~e1 @tvvf͚3fݻgرcE~jԻ`U9NZ댋(?ˮ]Dggg۵W\WJR+o~~~zAt8U+u٢{WxyO^ T'O...RSLp._\kPYB!?(;vFlͫ K?~\tuuYg=+WhVq)ݻW*NC?;Z7!!AAZ̙ھ}{?+u]Ms_Z/..ܲ}v&O\DQ͛W5_dwc?yNWwCɿUWӧŚ5k9RM4&dܹ7z.] 33 .?=""kֿ={aaa-%ux7SP?ǟ׼ys|GpnƍĘǾd cƌp=gϞEnn.#Eg̘Q:5J9̓vܹse]fM̚5 {hoDGGLj#{{{xyym۶׿K.W^{^y)M y^Jpp0 $-w #Wf0l0I/^8F$ǹV}>CioŔ)S CUo[ÇѮ];{{{cɒ%X~}h`ȼD]Сx7n:=Zt۷qQBT/"5jTzpQ 33 nnnhذ!Zl:uh$s8/ƴiǏ_GDJk`rr2>4ݺu& S .̙3#SCd1g?^/_ȑ#駟JeyMTy<6Çq:u Nӧq5iDGrr2*Tw}m۶ڵk˃/^z% iOJ:u*222p}9soFΝ{n-"""""sѹsg;v 34i777ƍHMM(߶m[9rΝ+tv9sFJJJeLKe“X^z%[oȑ#: aÆapvv6BdDDDD/McPV7nO>Rw^8q+V@Æ ˗/LJ~hIEc۶mHOOG˖-k_~֭kvڡaÆpuuE5_|3f3g͎n"""jjGv/[ kF۶mѸqcP:t#ñm6Β3gee}z* Ξ=g}T=%Gct&''e˖իW9Q%Y[S`*n믿:,_aaaPT/aÆR5jT|kֻl`` ڷo !!mڴ{]""""""""""s`݆eoYf^z)))ؽ{7 Q NNN{ɺ""""""""""Sڜ݆pAyn,'~nn.N>-wh x:<("//yyy 7DDDDDDDDDdd*t 4(l-牉ܹAcٻw/1p@( #33'OFzz::tƍ^^\]]M6 zpԩODDDDDDDDDV-//>>>ťup]LE&˗1uT矇+p9AXnzIII2@""""""""""ukdJzx$ty˨k(}ᅬ ̙3ؾ};  !!Ag uqB!.~M,[zrOu(k-ZDŽDŽDŽcbb?1~o_DŽDŽccbز k׮giZRIUpdw%Ht6&M/r=Y"55U|""""sRpQڵʍj"""ꪸͳsNyZSOcRGYQ$GGGGt/**We ſ߿pvv6qDDDDDӧC """͛7NLL#*z*n޼Y*劻;M&M: """"YCք#K.2ˉ83ڴi#{lU j<,YbЈ BTbP*H6l5DQMDuCPnDiv޽{6l6nh ,//...QΞ=[jJ&"""K!"=z;;;KDDDm2KK#E4h?_]LVVLP(cevt%s玩C """""2|#!*!jBnn.>|___lݤUbb"EAAA,(P*{{{GCIOH'O@E5~M꣏>QY"R?m""28pS9mz@c}MZ-_+Ȣ) L2m"""xަ(ز'A DDDDLR:"`g7i5d^ȢT*lٲm"""xYYY( {HM^^4ҥKfuww)B#""""""T*M6e,""Tڨ/ gg oW_Ҫnݺ B``cɒ% T*N8DDDĸq BCC,T*#GqƨY&Qn]?޽[jHqY 5  VXQfݻK_^g*DQDnnnXlƌ-Z `ܸqU;44T:e=^~U VZa޽rwsT7YtS@DDDz:uF+WH iiiHKK޽{1w\|gxdGEPfg͛7'-YFҫ~C'Oڦnٹ9jժ%x8ڳg`g7Y BVs"""3\ruҥKqM";;8pƎ"l߾]N:4֭[gieOZqJ"""t>>z*ѱcRȱ I)Sܐ/ŋѣ~zغu+:?* ݻwǭ[PfMw2_ںuQsGBj0qs:rqs0ٶkԨ_K.źu @z* xw@¤/e:=|5BRR?gAИ֭[կ(-s[䳺Qw 8SnjРA,J®]0`Y FNZaddd <<111]vϟ?V2x,y P꽼Siʜ|g2eDƐ{IGxZ722Rʇ^_|^{ {׳b t =/f̘!Ѱ?9‰,B/6Q5Ӳ{8t4i4_>t k׮#jGuJaҳgOity^y '';vxϐ+ڣG 2ٳѣGL8Qg;vңXoܸQwyBa͚5 ;ܤ}4irrrаaCݻ$Iw}JaFTbٲelUţy / 116laN:ի/^7n`d>|Fl児:oWEܹsGcRh,\AAAQT*ڶm˗~ed>2d̙nݺ* F=7… xgM* ryRx{{ DDDDFEܽ{r$""ER!)) дiS5TIݻwGll,F(S!77Eff&L7igE'O֖m2^%眳si?Ӑ#%%ԇݽ IY#Ljȸ p)@VLMi{ţGЧO.`ZNZj  x,YԡJ·~ JePZFFƎ6uHb޼y9sCw:"nرct4^n"""666MՊG%6g0*z^z:Ju1uDFn*88 4`n"""X(ҥK bJ"""xVZaҤI>|ò8(lcg7iղeKpR"""d("!!-Z?""" e:1#7\DŜݤUtt4'/ """P(0byȢ OOOOV-{Ҫo߾u(fQ IDAT,J¯6Y4Q;*1uDDDDDDDd lmɘ?U||aFP`Μ9W{ZzC05A8*`/3geV۶m!DQo(]vt`g7i[z 00aׯ_ǘ1c "BCC\g…XbEecb͚5ػw/իΝ;}h۶-:t`Ə=b* &wYzȢX?TU3GNN֭7v,//yyyʕ+Qvm,[ EEEC\\>I&70 *dMZըQ!ѣGԜ:u `Ĉ2e#zf͚2dѢE 5kGss'[zȢ) aiz|uӯb(Gff&^}U!((V2IqttDDDf͚ldddbTA 2 vvVcƌ~DDDdT*~'DDDG~"">j:MNqRT5jRRRPfMl۶ FCqٙ0Lxzz2o7Y}h߾}o~zܹSΝ;pn߯N:uߞָqcoT r:$eff*44TM6oF,˲tq5i҄QN*1MS{$jՊQ,҅ DժFG^R222*5I-W_tm4Mo1ijy+ZU$LJc>0 5jԈQ $ 7('L?@4˲!*KxQFpyoqL A. 2 !iijy;{Cn( axL@@ƎK40%0 q$RN|iڴi},Rff&T/KM4v{;v@v,X {!wl6y PzP-f¥H/iij޼yyO,KgϞh0d9RcbbdNָHvå2qia/@ 1j(=znk̙:tZhpծ][^z &ɓ֋a)3S:eye>˹/mT-vگl۶Mqqq8qWIS\\RSS+=z0 5Y*]6m;C_uga( @kΝOWn/? PpزeڴiCj̙:xrss$-[LO=bcc5i$cY[IR]9zV^\vuzӪU+jJAAA>߶m^~eMvz嗫쮪 (**JQQQ ǵh" 0@C-)F45}R=d7\vo1v]&LE`ժU֭ۧhM4IGUvvRRR+Wjȑ)qT;mٲEIIIkմiSmeY ujժUe{e)99٣eL٣={I&\ۼy o۷$i̙]׼ysI'vi.͑{n4e%&&ȑ#^޼SN6M#GdRnj$ 2DϟW}v;V͚5s]z쩩S֕W^/^,IJlH$>#;eMVv=q 4(a"f?iG}u]?Oڻw~'m-[$tMXD.eggꫯVlll/>v%L|M:uJuW_} ھ}O=WYэ7ިaÆI*,'Q0 Ŗ?C̮> c=VsWT_P5k\xyũUV VF4d߿cKHH?+RPΝ5a\Q/2ѣP766бŕծ][ $ݻW.ۍ1BJ9QznC_Ç ƍ4MM2:T]r쮓uEef\dVٓ:$g&W6|pႦL"I>|x&';m۶)::Z;vt?$w}2 C{VTT߯ 6\S{iIRZtKdsJ[޽{2cRxx3>G]iǫVZIOO׍7ި_~ٙ ?ufϞ.].tRiF}8Zj)''G6mSO=.]k"_~fGEE)44m%e\>|l6f͚BRSSh"k՝Hvå?P_~bbb "##[駟V@@CW}]~=k.btcߚ3sȐ$q^QwXVV͛')?-=^I%OT5 C7v٣GIœǏ ˓w^IKv''';'l֬u 7[gJIIҥK [NM6ٳg[СC4hԥKm߾]iiiٳm۶iСn[>|m޼f'''駟v~"!!AR_R>iӦٳΞ=M;̚5Kٺ;nt5xto,K۶m@ {nWy{jܸqen&ӹsԡCnɜ9stbx>OVVHv_n#~Dk׮$lRn}wӧdԵkWgYE+##C]v/_vI5x`͞=[rJX#q41c$ꫯVHHHm%J2KH$Q+fYO̙3ׯLԉ'J}L^Z]qv$:v֭[+--M ,(!;;s VZZmܑٳn&;wP]0E>errrte髯$= +-,H|t]Vzұc$Icǎ-u(,,Lu)IuG]z%k*piܹoM6M i޼,*娵]Nի-?r֬YSlIA&MNa~2&jR.]$mwԉc'tAAAjԨ$)%%C*)?I_Dz[+ѣ6m$Iz'C~HHn]p91JѳK~;5f.\HK.q?{#CY%LeYzƍ[>l0+Vㅖyx-Rjjjي&w8p@m۶U-?q#ɳ#]vSI<#2մib}E15kkV?֯_ɓ'kKӧbP3%'ל6lL}e]޾}y}[yI_͚5sNXtJOώ%fծ]BΝLVtrpIRzzz+/04p@Iĉuܹbm/_7JBڶm+IZ`˄{ァv7|SO=&L 4IMC.eddx;+H/y5sLk֭j߾&O\h4nNNV^QFcǎڿHHHЎ;ԤI]{Ŗϝ;WUzE}ݒٳg*uus1J{ӦM'u7o,IUf<5SSSp [^/BCCuQG;w$iܹw^t7ZwРA2 Cv?I?^sxQR6ӧO999:}tsz³>w}WOUNMv覛n*qyy\y(wyի*R3gBBBqFmV kƌmݺ~iI^zjذ^y+j߾}~衇$ U'V8f͚ *]C. v>5Dnn$)88N:iݚ1c* @-ܢ_Gѣ_iÇkݺu] 8EKH;^0]&BڵuP0])ϟѣG+66VYYYJHHPBBBBVT~k.=c˕ZjSNzw?Q#u~m}gСԩ#˲ԭ[7-^X/B}饗[o]v2 CGUBBRSSvl pLM6駟x,˲{ni24MݻWԪU+惨^ziժU>|Mp %\@9sЈβ,eggN:yP*zmt%uVx\}5\3IJ,m߾>5eI*l,[LݻEvv@ f̘hl6J/;uFth0?^ns!>f馛nv=zTy50 Caaad3ң>*0|eY:y$r/K~-#Ol[jA.8q!x\TTC𸠠 oT p瞣niiꭷޢ|^rrCaQdff*44Tuz9"j64w^IRV(yIp+d,Ҿ}fY/K7x#A,҆ jA.M:ǮOl5j} P dC<ڸql6 иq*7dM+V>Ͳ,% IDAT4nG}J۰nbT7;'__m^fԳgO<pʘ/г1յkJo^LԔ)SfYN>2&a0 9rR0 M:խq1cƌQ``y*mg͚5>0 uޝ>5ĨQdzQbݮ3gjСjѢUvm]z۷&L'O[/..Na(&&8NLޖaOJlӫW/2YPe ]mۦ8M8+* ՠAu]|Wcf̘Q~v7nluU(NFۇ,^X .ԫ*mn 抍vl٢6mhС9s<\())I˖-SO=XM4XoVԿm=իW;"#yk.~+UVjժ }m6^MvWUxx09sF֭wuIN*uR/]T'Npg~/Νڵk{{U˖-e*ŹsoK.jР#Fhݺu9"4f]s5=zt7~x>4MyZJݺuӾ}I&ѣVJJrJ9R999=Ӗ-[kVM6u&>>^eiذa[VZ2MJJ1מ={g5iģI&)99YJIIщ'OKvܩGyzWVXǏ} ͛=vnݺGz5k,߿unݪmgO?3g(;;[G_|ݻkر$?qQ}G ^{5&k>f_@ !CСo߮cǪYf6kVϞ=5uTϺ+=ŋ%Iv[mzyy2MSӦM+u8ШQ#;1b$믿vy3!((Hi>}mh wѸ_ &#""ԣG5nܸ9r맄I:.[L?>]~咤ɓ'sO.ܹSF믿-,$/9v옷Cex7u)խ[W_}6lXjO?x\e%ׯ_*&&F7x &8\0 =C?S> c=VsW /IJHH(Vz͚5.c=ԪU+QF2d_1V7)ueȑT Yf)''Gwu vaÆԢE SO=>И1c?kРAҥ߯w}WwڵkWl;111΄yyDEE9c,K>[oU(ɲ,}wzPc+AuմfpႦL"I>|x'[ǎӶm;lK>޽{+**J׆ t 7[SǛ VZj*YXk֬QΝ].޽{1EEEJOOf+U8oF/]l6N:ٳgӦMtWPdKZZ6_Zlݻwk˖-&t09r~O2=v*ocϞ=?nDC5ydWi7t9W\:u{/iiiAjHϛ7O۶m5\S /wLͦ~aPov{~v͛7+##Ctwx9?8FuM,͛7OR~[tjĉ:ud'0B=z8O=Ǐ Wzz֬Yg}ֹ<99Y{TdwrrN_͚5+yǏWdd.]oYa~СCu1=3gNs \W^F/޳g6mڤ&MW^$/0w\o%[Լys%$$h: Yre9qD3?~Bt֍ɚO3MSׯW׮] @ {nWy{e=|)ɼyt9uA[v~>l0M8QsѤI}Rl uV7ˬ9Fm1BӧO? nڵ-[zxNN;hY׮]5qD 8P-RnnQO>?킆f͚ &(((HlN_ԍ8T𱎞={0 "22Re|9.˲JJEF\(ř3gׯ_홦0X+==mdffj %w(XY:v֭[+--M ,(סΝ;+88XiiiڶmsGިgϞ馛tܹBy0Jt;~2 C999:p_رC#FТE$I{ou/2/ӧJRI+]=HvWҮ]$IJmۦMwj˗sW 4ͦ>}4o޼AESvvzUld$9rDk֬q-)Qđ40,RV-uER݆a{EKr.N:<((H5$xlI5ԩv/$x裏܆#ͽb ;vL:u*4UGϾrrr%CJtmS()""B]wr;S-v(vsnbYm-*Sm8:ޗy19N{ k߽ ./nppNFTc޻z^MPxҶzEc(8̙3UUcDmry||,R^UladVXǏuy,KO.EǏׁԶm[իW9z۱<99Y{쑔_mY粴}hhhBp~E'<<\QQQҥ^6mhРA1c֬YR'I PݺuΤ#\ xom˺Vu J8w}XXX )nMfY$I͕$:uJe)//y'-++9yٳy;wN'OԿ/IҖ-[0|/I&ٳJIIqN}v}Wkam޼YGĉo-)Y$IK.Ն $O\$߿_ӦM$ RCɲ,kJHHI;Iҗ_~霔7O?$Zd$iΜ9ڱc$SzzN:ɓ'Knݪ J,X[J>9sFiii0a$_uNp7hӦM?XIII[o%Iߜ._\$?= .^$o+33S'NpݼyW_}۷K}ٳ4i$_~qNh"mٲEK'OԹs;Hdْڸq$>Ǖ_]o>S+Vкu$ISLÇe^{5Ç;g_nVX!I>}'IzוǏ>$mܸQ%q5kDͺFԩ5kGp5b߾}:{$)==oӧO;=$)#y9g̙3QMqI4M%''K/8δ4effJ8sӧO;'),i/… :uꔤr"iiig:˓%''4Mɓ)))Μlj'de۝=Γ'O… Zd P t;wyp<5od}LL37mڴB߽c$u5##YZq&%%4IJJ d۝đ^nLt^Wz術'Om۶e۝ר-Z(44w_PsR/wX;IRRRdpI<'E{GL$++KgҤIھ}+WjΜ9;19300Pׅ 믿VZԻwo7bYV9ugYq;q:v*r8}~r#xU˲,{$KuR=zٶk׮en{ʕ>" KenYev4M˲,+//2M2Ms.nokfj񾴶rN89'| { kDeYvv\FI IѣYWv w,;w $gy f{==S_!$zPvmg 2<Zv?jh͜9Sںuڷoɓ'رc6999ZzF;:HpرCM4ѵ^[lܹsZjen?'ߤ9v;jMd_{pkf͚y\]uUk=;4uR_zԞ2p@z뭷}+ݕtWKx$e?k~:rHW"+4p*?* Uy^ziڵjٲ4vX5kL_ԩ={*>>^SXXC45g <*IlذAv['Ə8,RJJիwQ;Q/Gvu];w?ueffqƺ馛W7ڵ iaM6y\(""B۷c=!Cx;,t1^*/Gvd?ad71ƎCȑ#^ -v~mvo1e)99Yw? >kN^'Nvhna#0 x;ZP.iڵ`^Krrr1a,pij֬bbb Hv_af̘!4 G={!Ղ *QTP1eiϞ=-[* i?O2 LP |iڲe }@LpS" 5eY̤ ]vv$)00DK͚5v>"$$Dt9/Gg,RJJ eLPeLt?~\ԨQ#S1MSJIIQFF$)&&Fe뎼d`׀_߿>9DFF2I% ij;e#j4;?ad7 qAiР˚²,9sF\r b᎑Q<$?,4ǘyOB"(ci׮FfYoN4<'K_~9RlHEFFz)*,K{U۶m ,<'1A!pe񊋋<ʘc;vÅ^ƍvhna-ZdM? \JMMUP.k.ZHo0 IDATGGGvC'OV@@$i޽ܹ35/W\q*zM8ۡiZt)5F#5 zղeKs=JKKSJJ막'jў=*QFZ`n/)/d$[7nTuAi̘1ڹsgߨ96nܨJ=.p1l֭(<'-cRPVi&CR~qO?T}QJJJurFtv>3<?d$իWO˗/?lܹ[ K.V?jeԧO<?_y``>SM0GvuE˗/pP$oq_xθqxb0 &M䭐P/,7x>iyO ˲,wof0 GK,)ݻumx:tHWaF $edd0A%sG^zڴi͛7k׮ϦL5kx/(E}ò,8p>iyO얤kʕë!vw|eYZ~=}x$۷2&Ezu(cR(c#/$9oWxݧ~Zmڴܹs*gϞL\|iZz8k<'Iv7o޼Jz뭺[ *… JHHpMqTdd> nĈn灿v.]*{!wl6ax}piذa<|i>}:}K? vc:t@4<'1KA P6mG?ad7\zd۽vyObXeUǎl6 P>}dɒ%*!33S щ'<²,eee)$$'Ϣσ#/)I[nAb?HEFFz)*JKKSHH(<1K]vjzM8ۡi?Lv(CJeL^yra+4lذ 祗^hh ڵ]?Fvp7w1RQ<Lm WǏK.Z|¼GM6l6x>.HvW/0 'iLаaCoq'OvG#=0 FvW#wAn4="fLԜ9sFB=piϞ=p0 CZ|}*1 2&]< %dOzwF(q%22Rλ)Ʋ,)""zϢσ#1灿RF_uWj׮]>|8f ;V#Tfap1A%V#ʘXWmuЁs|eYFn0<2?@;>Ͳ,%$$>>ʘhĈ8ps4oܭC(c#/Ydw@@,*4;$$D ȑ#ճgn^Qu]WXXC4pBq٪#@D >v|MnY_;33SӧOW޽ue_Ԟ={xAbbCf͚y;QϚ:uf͚3go뮻NFҐ!CT^=w@# ر&O]wܡ@-['Pttn-ZHv]74ݮ'>>Fvr}嗚6mnNo%\CjĈС@84lPrd5eY:u6lXD_B OPYvԩS5c %%%iF#GO?]Uxx?N,˲p|}\,jT\uUzwoVV:ueNvڥg}A}Q0<4M}yORm#]ٳgܹSe0 yTnK;h׊+HnPmڴё#G"##饨Dz,رCm۶^T[~P||ΝtIlR~]jȑ`b?^qqqYݻwꫯ~g?h#G/дit!I$%)66V#FЈ#0PصkBBB -gd7weL2224w\w&Aiȑڵw7߿5k0oijɒ%[eUۼՊ>[ݖeiŊׂ tydt7kȑ뮻ٻoߓ=]ӕ.@iKK)AQAёq.*(.8:.+ n(" ."#"8Zt49ҔҤiΕM}s?zwm']Jv'$$+aFd74Ik.?"""Yl?R=,cBDDDDDDDDDݭGPIa|(!"""6&ɩo@DDDq:!y(uR 33q5HB$$$iypGn$pmaʕ}xN?  `0_ǭհT*jjj&"""%Il6J%#"""6Hvwޅj\r%Xr%$Ir$[OZp _+mWSSYfjhO>$˘OE/}:F#RSSgt:*̙3+Vh4ٳ>ZTIIIطoDDD$IB^^,yz>1`&`ҤIXp!$IBnn.>6#""|rxłz+!90aBI?CDDD>m']=tP8pRtjETT1~xlܸ6HMMEyy9t:***)O+(DDDDDDDDDD%%%C JCB$:t6!!!1cd2a˖-] e]Ɓ ȧ 6CDDD>m']JvjuSTҙq9?~QWȽxADDDԛ>"""lR;** $!''Sn6}qWVV[t~'(]z{h &Mb|b|m']JvvmcĈ?>;fǏW_矏bNk>Ӷm)))] oL0 t8u4 3 ; !"""_6UWv{g뮻 ={1 88 HH>6Xz5A@DD222ߙ>}:-L9_l GlxOppn"""Yl?$IzEt$GRzZ[l.^>! &F~~> pNhjjBPP4  zI`6hӉ|<[%ig^W2 9sqF3i+V5 7tF#F#^:DDDʼDZCKeLN7vX/8x 6l؀!88}qtaӦM(DDDDQĚ5kp]w^"""Yl?qKZ˘<(//JBZZ::;n """""""""SƤ7jhh?^{ 3gDjj* c͂NW^1c ^Dr-ؼyg~{DRR|NcܸqMDDD>MElݺm"""il?q[fػw[kEaaa(((~s7@^z)n3111(((G}_<믿^ֱ='QOQ__s梦7nĠA:}~ؑ~7tRL<Gwߍ]v!%%ꫯbN3`G 9SLLL~h=zx{ 4Q石CDDD>m'='|-s]>ơCrJE]s&<<oLQ1o<|KNNN}( d.ٻwGKy 8!"""6|=v+V8gϞv'OFBB zjF6XPSS8p_DDDA!CGCG17m䘟8qb X؈~ӡz٥Zfy82""""lx饗!"""6ٳnD ۦ;8qƹ5_~>}:Jc1c HYfA:/o !EQWf9EJQJPV$Hضu?OmO붭m[w5񗟓{&|M߽&$aܹsk5w|M|5Q(3gA$I5޿^c:W=gƍӆ S& eee2}6nø)S/ F .ĸq/>^@@0 H(܌Fϟw޽}`ʕسg7@uu5jjj`}7V^]v-Z2455W^`_֮]m۶,Ycǎl6^pVu7lG!//$矇fCaa!.] زe ֯_ϐx饗`4QRRŋv؁5k+dff^{5ףoUxZUU:/k;w}]8q͎׭[[.]"X,<G?p1= xaXPTTxMn݊u>s_[lq&lx!IG]'^xfǎÒ%K۶mڵk_~%8xWԄ2,Zk.^7`߾} x7{qwawyhhh/<-_?`0LxXlয়~͛~!!"y||͛7㧟~,[ _|& x۷o?w#zw؈;w#~GwĻ;7|G̚5 ]!HPw &cn[YY$ /t;?+̝;!rC᭷Ž;p1 ((9s&.T;755!((sų> Wx5WRkׄkbXxbs=P(|M<>񗟓{&|M=_wysql[^51 (hll=>̈́N$;}%8>tdÆ ;'h7kMv87Qg#/#˘z1ZlL&c> #1ѣWU|(_!"""6&Qppc5ܷvDDDDWZZm'^ !99ۡtСC{vuP`Ȑ!磠T[[ЈBEXOcדo6^zc~Æ n'I6n \غjǎ@bbbi…-A@JJ Av(DDDD6뮻1wݺuPPPꪫ nS!;;m|ۡ >|xm6UWvOL&Sǻ[vwJOOӱj*l߾o66TWWcܹ5{1oiѷo_x;""""lX`z!(JoCDDDl?.Q(]*zfu9r[,cf IDATnml޼y̟?uAAAmzrѣQYY 5kfΜPݻC^^ƫŝ0!((!y$IAXX{:bzּ$466"00pK[Nº#gW$dG}o] R$gڽ{7Z;v̙~QXXd7,IP]]F#""":WlPod[jv~PZlz#G"++ ѣVxشiy^rmq^"""i(?f|=7oތTHK/ڕR!C 11ʹpBoFDDD$Uwu$Fm۶+FѣG#33m|ۡ$I?~DDD!ҥ2&wމ;wB;/Y^I:eLN7tPl߾ ,@`` DQ|4|: uӧs"""i(bժUlOcے xdggcʔ)$ 馛0etADZCmeL :O>$yT*,cӰ uUęoč7I8e/rfy; """"lx7!"""6>ݏ?{=g͚>ɞ=@HlڴpGz֒{y<[ݧ+x (bҥP:t(L .vhDDDDnDZCے `Ȁ$I覎Isfz[EAEoBDDD1l?2&gZXt)JKK<7BpJ"""""""""nKTuzraСuODDD>M$dggcȐ!,GDDD>m'ZƄz23DDDDJ$dffCDDD>m'^+cB=˘QwsG^=ɩ+OE!"""6&ɩZo@DDDq!yO=ot}pb[CeZmgn%7>נ24D17~2"hxPEE8xhy?!! """mDQ㏻^j'a-+ֲrskE9,:}l[w9WugIvlZǪ ǤVC M|_Cpjۗ=É!ɘ&{9<cJ%z)YJ68ˉ(=Xki=]UGbNKq1,%'N%ORVX^V+g2y"WnorAӳ{v+Y%GlN<~*.FӖ-mV ݠ4hAmR{۝anuIvos?Cׯ'NC4f&ȧI_)))ZvH۳[QFH\AjΘBj5J AR'P8e IfVHh Ym,Hf&3$ PY*^dVv ZQkE8P6) 4膤C74iP|m& 2  22 "f" 1?Mwo7+q'!sM+]ngBPCb 2(Z <(Bll mR}lfwCt2(!gd@?l DDDD>yI+F_C5'SOv햋MM&EQO?I&AS 22H""2"(¡ 3@!pr]ʐN5 I߯1Ȩ֒R\ كQf)'}c7A)8mr^DGݱ8r?@bvDDDD"MLv@( aN;~}v>гjS>PEGAݧyT= ehԽ:vޓ$ ZGrB8( H&}E`0fm'W%] _Kc]:G"ʊcljh4CB@A : a:߷DԳi8& $?|>|lڴ+c$I| `/|XJJwEws$wRX> &LcJ%`#iӦaXn>lݺQQQ8yի駟[OgGaˇ9(LGN=V9Wn[AEǠh'Nt$S} eXZ9J P@qc%|r!dg%;^ಓ;wgD}`ܷޅ2, )Ʉ$Ih4 T+a)n,Ƌt] #g :AlW]% @epbגJA~oA TkpA'{׹_#.0AG\P0"Zgl2 駟bڴiؽ{7F k^YYYF=en"""&67K2> ӑ#0?ZKNx||YTZH&RAMh,'$$811n3A JEDdeL8AUvF{w/v؉[KdjQכ%5$-݂ @8Yzvd_<٭WUʻXXjTT#*˱|rd&m"_d> 4irrrPTT뮻QQQ3f ,;aY<ׯBXۏ/&0>Hn[{hj*w hcc!\7sEQ?'|J%R"(&%AHf3,ǎA~54.ԭMXR6Zl-xCKt@Esu:Fr{vX'6hw*i,q<>(^$?a`@R0 td;/aGg?0$ rs$ͅA"Fo_Xk\& :yx|IyHB: M_?oFW pX(4ٱv⭸o}+%IYFOT%5P Jؤ֛%;݉dAkRPB@<5SL{WD(;I {pE3L6RTAySJv79Ovڿ]tD~xcH M Qo61:򎰞w"""`--E޴22 &&B3`}JLo_L@aa!=z"oFbb`--m\xwhg?P#x$\y%\خ $I5բ%%o.{s:/#dl0Vtt%+.= ZZڭk07:FRh MՁP @alάvm;cbtk1om0fX[dP CFdjZjPkEdE麸8Y8R{2dCA}"tAK!dR7 DDD3f3 r[U\AA=Bu&%CMcb"^*&I6l؀YfS-t$ZJ )IN69xY(b?~Rz˥X:=0P$b~sdEVUd7*l?aRQ #>嶪(CCakΔ@;QMLt$))u߾&}6f!yRPb}zsUˆ/i8T,֟l8Oc AA}tJbc'bbd7`T@&%Lt䛮J BH"T&/}GLӰCnrjGDD ,e0:rL\THRn*} hޱݺY1hSJ%4 dv 'OvD]fQX_|TP_1cȇ]B娧, T`LyZ(^L: p~ xDJ 꺿@z:ύ}Z5enJ1o(j(‘#5L{+:]THHůLl+نc;!ҭnш}uuuErKw@2r-,cBDDF$ZRh9mUTvOˡs]T4mɕ~X[i(bٲe馛xzcEv§RuG6S(܉Q4nSj濎ڷ!dڕyC8V DBP!)4 I}Ϊ#rmZ|rmi0&n .$ryȟx<-"/_E_fkYo*+-\.V"۱c{S#Ia)*jn>٘D8UsuӜ.7;I!FP ?ApC=jD~]> @:N>gbh#}–O'BliAMn57oVǗZZPJ} t#BNआ8QO cWoS伨d_5~^'xΆm'7p~WMC B=w'$'rss%HDD$dHh8!6:-N6XҠMMnP*A2A+'$bM=#Gp(7 K'/.Q M&`)t:L)S`FPwhٿݾgӒGC٫"`zzӮiCD=}b> HpiK*Kl?33nRXXqơđ@jj* QSSArA$;7oDDSS#oFpppKyd”lde99FO~c`/ۤkQcirbLfu_^%D8/r~ï'~El :y~S^VD`!mrr'ꉾl#7 klPoњF`&%nj;w^{ ӧOJԩS?v'bӦMPըrYo*RwOg$0%+ Ƭ,{A%Q"uf!$d2A6rzs=FuK5.O\>v[Կੋr(hlv]2ӒɊ$?گ9@I1{6C=$Q7ۦa}vӰ5V +\wH~m-ܑHo;w 8p ~DF\tcǎŦM`Z~\|Ş:ЧO[ݛIKQѩvVZ;=[W! N6- gD||à^BnM.rkrq HI'J*$&BP`@!!$2@P%paYd:Fu:Y#.AFrdEe[%9Ц"⮻2u G%JK^K^F?&{śbki\3:6 RRνڔ&SsY_|1#""2[CZa.(@،.WEp0Ć\vAPt(b袋`d߂CՇS#>(ō~<@@"ِǾA}{LOmw&'#kT/ RYrsQ#x-$~JށJPgN1GC?]!`Gݭ1:ݏ9֚ԯY0ffœH 6ejA:jRS2>CVۅ!m+ކe[~cR:Lv 7Fz;;D~:T-CdMNf|^ [8]7uTn|Ʈ]󱱱:a͚5GDD=ԄoBВ1c\C?tٓJ%)) С  T(N z'BiӦy; rJc%UJ{E9]WEl:Ͳ`M04J~OV#t4\y%6oF{aܳ,;z KȿcmZV[uL㼵- ꋩSS&"l?H{8z(N8={`Ĉf?w<;vC$fΜ2&DD5r]n2, v3e%uCz"$'A?d(tCB1ڴ4(t˗E^l-Ȫ8PuWƿS]?8|6Ɇ#G0$bc3#5,1 eA^aܽG֭ *z!B6%%oC#ۮf~d뿽?3f &0ƓS6$*|6XvmQXXA0rHDEEy"L:L6Ή[MM0feøZq>X+*}TaagW2is[}[2:~Q{ oHpװpgƝj7뫜`ZS-f-GabxdðC#3ggAQQ֯_ٳgwށZԼys<G="/A""r;Ia˃q>q>MԒ`g s6ffɊIn-A0trԽjZj;ŮV&P*H KAfefڟǓ0@݉m'Ivk4ӟItRlܸ{/&Nl6ȑ#ŋ$ `ʔ)k="cuiQ"""VWLl쵽?bc}e&e[4MM$!͆GRv8~QujpzD:P!L?Ɇdap` @5 II$IO;OQr%E،!ڏArs8/'\Jm=9 "NNc_}x7p. i%##_|#y<zlSرs>^Kf2232ݰaP%rIP`Μ9]EEErjr0"?nFKwfr.#GP}'e?_#<"S#%ddu7Kvlv<@#:MƅL@6`~w`$x@y`4Q~m'{HIIߎ'N8 h8qƌXd Y3kzC "L$Xw"1Ӂ,Ø)W*<>[1 )@7/Ձh4[wꀬdLFQ\.+MA$pGPt,͟ЫRtqh(?6@sWEP\fywAյd*|UAh<-y]C#B&Q7ԝ}kdtwk`Cleɓ'#//1-[]vd2.22_~9z!)J#y̌3^ ""$65޽$jV] ki)Ա=/Q|r{シL6rsUl:}0pdz7/z; ""I`)*q^4 }08Dҝf]F#R*{tno{@nM.ձCےE?w(X߷Gk%N8'U@ = -  jlFs#޳>̀OBCpK]=nk@JgwWLql+@ _-6nj4 5=D^{VSٓT dOjyA3`lSEwȑ#Y*=Lu8xhi3h3Vfidh;FvgHt&5D %TeIϼD^ì55(uGVB?<;ϞNOB׵[tܡ!(JdWf#LaQ\n$]ݩdwl`l2$LtS(t:DsB'<8/zBKP[禓%(T:R׉{rĨ4W.0R1% OzéyM= A(@ 8? ?7k4O-x%M}qAq; X'ߵaaZr{vL TOg҇N&ON@H'_.`ԪUp1q``RTDDNJ'<{mݰaPGs8y O0*:;N@fe&WljyQ}U.ellz p$@(!!$@(/$@ B'$wmlږ{U]wc$BeG깯kY9^s$vB1{Ҽ淏Y/"A`0&&򇇈8JJdz(Sjj#"fzj?N m;!(v9W>Dݻ7Mhn0׎z߅ / >L }ZU|떁=-?G}4'tu,^%K j뮻? @ EQ<(/'чx$IXs˱T0ϟoEb<>(|#Ȳ믿ι;cwyqۋڷlإCݛ7k^'- |l#jn+$kg $W+ֽ;ᩁ VW#Bb '1V^0>Yp2.O+x} W{| veȕ8}V܊JC`D{N_0%: ^o0X:F=IZ ΣӁ-Zb3/˪U6=tnܷmLImu78Q<"XssYYY~Eu`"IsΝщYYCO0,%1KxsϛX V2c2YI'I=X>ѡMX騁E4~a:4qtt9M}Q96ۋ ۲LJ;t1E%ݸVcMz* !faa#aP0Q!&̆}gt$KH $v Fjhi;o+uRHW-qR!jfAy~t:QIPTﭮ祗^7$:::! a̞={-I$QkotQVIPÜ۹XsEIB$G9Y#u ʃ+!wBmruBZu R CXL1@=W^y%,?[,:(.]JLL f.ƍٱCf( k׮gݺu|o1_ $IXAeedg >"Kn^qے>TLz />G}o޹XS5\؝J9jH-[4iai Q {Q:䱶^If bTaOnsche@؎ E -Te-\nAiv墹ESCͽ}ClΣ>0#v GY9ReGXarYFɧ %G04Gdm f:/|J{WJ4Hܤ/[$!褩"hEqq.&?& A H^1{*ekwTYϣuF{CAÎLf:M\XK}'uNݷه)X(|CD) l8Ǟ&Ht8͏=Fgi~o 7"+}. ;$Qsnv-} A/R6 ᤾u01Bra{Gi;W)?= n1œXu-{AC[M;@>U됪BIo2iL/«,p`Oj/`\.>c=@) Y"@0].j1^{j^ZoKV =d,I32utNGeyn Y땽lHyS9MljD9sȍSء=^{08˸,/L$I";!t*z>Ί {Lԥ]A XV;9}W3^AdڝԴ;ԭAMums| 4NA: N¨aKt:z ^¨;fKgjV ^Y קe<>{:c׷U0EEglQ}y0~lb{Ip9q̉17. d$1+چAֿ_?x# HdBRAWWTWWzkIM7(CChh(ݢ@@ os3mgEgtKfu6 6G2*bÒ\ L^|/:vk\Ŀ(Y <Ϙ; \XB_S;64=׶b>11QhkWkYд~# cfIpӷmv.'3aaɠ#b b$l b 1뱙 :&=VYz6QMzFο8P]Y= tLBǭK#4LJ=du7MMBYFFB( XFJulW.hت),@A$ Is 4LKg D 4( {()^Z@a+v²xsӟy'DE ouzbX_~бrM}&,fS&z31dfEABAC=V17>:Y<oa'|JP|OjܦM[4ƈ) b1!fKNek-[4tj+&80$"m&lFl&"mFCL"lF{>A;blEdAQSQz>zܴiqf?MC{qZֺ6 a,M girKS"H0#vvB]*| ?(@9`|BKB<Z=3] "vuVzzzǡצ",(b@  rܲE.)QR4{i&[  EQصkه%v+BuW5eMe7c/O>㲇QES܂`!#*.>"~O|/ٽT%zQٝ 몵\!!j*ffπ IDAT(WNeV;ZlO q,t1&Ć 5:64H5D205,.塍UWx~1)I:Y`6mtMKCN] ].;z&QVNYU{Q/xrKSL 3)ɏn 9G[=ͪ]S@uxTmMAbsfR_Flmag7V¼adL""vtIlݺ͛7ADDĨ/0 s1Q^{@ L8޶6m/.e˨-IF>6[^.ּ|BVt\pm>x`7lp@fGp܍F{I MG~(,%.5B7n XOQ! nd"eeƐCߦb*-17c;j6L?dv{{þmvDHB0 a_GZd07b.8T~/Pd ƅ2/n{FnSkAug|&p<>N*j;yHmI !(#OdnljH,,8E|^@ztUpAz<P|$v2gQP}Nk~ [g??𨮯&++N?|^}@(>o:^xI  EQ8{jK0C"I,-/k^T1$,[oqgCO+_^9VG^Y,Z]+bI̒Q%F[7BVhc47g$^YMcBBUk(~ m(BcM=oQŎ7 Auaf-$EX}Bqz[L;{2<պ)(Bk6Gϡ[뿓f1/Ei>?9&]Z' & ~ȯ\GuGg#a4Э@0 &gwff&[xG 宻c>l:::HOOF?Ot@tm؋Kp`/)BB`ǚ5'G&?|.zHO{m1ٶsбrMbw9|MÒ%،ږk apvE#C?$A|;! .j2$uTCn֤v06Ǫަv7u=M'HHJUݢ"$EX 5S |(̍5`~V$I"&LLܴY}YzW=maorzrW3_jo1,sIG;11"R!*4< ^}p:y4UN-dvOp7rXp!^{-z*f:::ذa*?<^UVK/ q&3(@0U'tYjv~>ּ<#O L8Z(k,Rl%%4]w/AQ~W |EQo-~3e;h Mhev ]KV̭n4b&Uخns0J0Ić{l[ڻOjJ>` ֞W`~|?~2c2'8ͮ.vw]Դ;iV}Pc;L&@[*|/8 P0# .{܃VoGf2d2E!#HĞ={Mus}>! Ah~ y40X/V5/k~x d`hG||!4pH_i97;KHx K lo0VU 3Pk-n<}T)!+CeGovnq``3I1+FztBzH f 9oC iObx6pˮ.wQQNuHf|bX5?sygjmŽwU=k-mq2SH;"0} Vtz;I>Q盼K"}oDvɎڱ{q xO=5=7Pyc.$kn.ւ|5s;;Md'Sj.z":Lac'>1=M=l`Km5Tv4![02X>70qt]>-?"P3 _g^iŤ!v7Uhh(uuuBt)b==ZE{pclHJRE_1ZgbĹiy^q;[~@.@uW5_|MiS)eetYnEQXwrM1HYW>x@R]Oh/x᪱( o ۲eZ[=7M9 JTe32WĞœ^a{vl6(smAǮZzՌt:yq̋ |~csMmxCk}K(g̋\$Bс6ǻ9nA/D4d}[#!luSuUۓR/8U^|. (P)b\ru,Xsra/^l&=/n{7<8ݬ7u^Ax>c_ +M8vAz,=Wp/!8=>vUyݾys̡ܿTj^ǜŇ0/.?C{Nl6S/hefQ7J@m[Y Z:YQ(3/.t:U> C8m}=~$,d> `x&`dD  ,ڵGI1${rp3Xo~M%ՅbA2@0ըhࢷ/ g@N\Έ+‡?Bn|.yqy2?r/%>/:hAR[|vmx9w~Qs q)$fCRĤQgk(u8^ɶ.uM e{sxg/l`^|(PŇe5@0({( ֔E!ֺN+} um엣懴h+'.Jωgۮ ;U7{ I/!Ò`yu$3^0LZ'771"vܲ{q1b쥥ȝl6E253de()tQ\n}&egNJU;#܌s^ jV1XYc&iOc_ Q<и2*dCwBB>rF'v,vkC ]I>|:=OdÞd/FySE3'F8nǫvC 3()$I9LrsױOݣ 6iK8miE[jw3_jfWc70wԨT:xv~]H'pzV"b6h2`m6`kuQE{ \-1ى {Q1b6#^3ƺt߾#-O=d4b&Î] `S'hbCA'ğSbf$OkKjKTaۧ/' b{ >@!j[z*BMuop-h7Ic6$,Kq-m$ !P2˜BEDMhKD1ipfULS="lE4ca3!yy^ϽDkLNDf h~@@ 3Žv ;b-݈8J5!Gs'ւlX.Eg65t@0TvU~REє;HNK'9QYYy92 GQu*lu{uU\uK̂<>ݍTvRQAEm':rzzQp܍ܱ9#tߩ~,CFB(B4I'fo8sޙΤ$16lX2BO CEK4PXmnӔ]f+Qpo}=`,k`+W8L&dkWv0mHƂŨcaBYkC 1P3F11~UL)@0q\\elk6=+6Gxo-O7FghYIFluT9@Las!^xLZ-8}o뮻?0@0aM؋(+Gq X,ZXcEk+$Ɵ;{-]GޥvoI\ p( Zl`KM[z ըgaba{abj,?ٯLՏ9h&I$?{!t PaXBBX%`Jڻks2h0͞Z`+,&%`ڲJJ)m*c'>1Ssʐ|9>@P|>?wq1L> ۵]zꗭE~(q UA;9_1p+E6մWOaۨXƒp$Gfk[O N:ys#` 6rgh 9$`y|BV\;hfT.(Le^/]ݰ U\;!pSE@'mA݂7@ v;;X=XX/VP [A-AUWՠ5qO~PK[;F`Fණ>5/T? .UNs߻EQnl5t8ϊ$Ĥ'Q{Ir8a H 4ӛٶxEы&:'(Ê]cq\<k6!ukܦގ6Lv}?akꖶd Fؘ lLvc cб;C﷏5k'C3a[V[a! `>67oJKt~/񂦇m-gcϝyyY PW%p50Qаy#a܃ 4:6WwPVΦvʫ:t$JVJ(@2%oc]Sb@ Lwŋ.c-=P>9V I.]1NTH|^x4:-U7w6&qI'!ˣ[f"d²hAEEA6JVPP"8}Ŧ҆RMbCVzd`i/v˲̚5k8Љ?R9,L \~5Xhw-V\Zօ{ d;Ow|I IDAT ,#( c[\T[abEQHŋ1Ǐ9v@0FPaб }uzrr)mT<Ɋf/F8;ՌPAmß_SMN)Th GD* ۉ` ߧOVM!v$:X`Nݻ-IPo=v+"'$/Q?vzsϛfbdtDzj~,8=W6VQ^ծW敍Ub9(}j4|;k;òa{ 1ۘt blp6&2]o,^T_S3 wAeϨCч@ =4u;7ܤiXcZ-D#߶@T6vFh )28/k]66$}vJn2ZQj;+no=>VscCXAvjK{-I,?r./mCVҟe92`jDBG$v@xz<=}JK(n(ػKZɪuG?܈w:"2>,W\qŤvLN)Vzڳˆ$>[<^Uۑnw9}vJNGk^T4]2IX1A S_>|=ik8<]NoJu0KW&>2d|k|t,PC; ,]` tEQ'ß y#95++BMJU.lcKm'Q+!&S#I$7McBALGx6?B1\^/Դ\Oͬ7)OMa L4,s}_^?,^ۮ.?u, a .;`;nM}¶5wA,XzR"I '-HR3gFRzX4>Ȏ3^ cB7L1Ot?3QZrLQ#pq8:#vtg1nOƿsh[P4<W1?AFdv 7b0hkk!xvQ;yeI¼x1?3A@㹭QҨYE_aU|* %EQ|z!MUPSxk;VסUN]iG@r>7feMݔUSZFie;;\*ɠX+jP zrL L/\u\y)g;k똧|w6eNZ$78ƏEP}{_g*8/fvuYHD~~X5+Wbo 55uC&O]AqX.VXm2yyEqX`S|!6r\q~(y:;|6 }SDnS]]ͬYEֽP TWm ] 9/Yn"}wekHƅ=$c;;%yf?rQqD#&2qyyecO種] 'fpJf2=Nժ?AW#g`}3@dv [0@k>z֮%5zBBc+\mY!%KLK e{v)i(A۾7=;6bC7ݍ]*׫Bp8>Xy7CCE-"YkIR1E$-F٩䥩$s#I Le낑Qd{Wl?4܉K TvV>a4ɼYV߾ΆQ]8)O)tcyOY= cn}3!v Nߛc݂iMޯ>2۲ެB,!M" tfS&Rʚpk֛Y{ZLzRn.Fi |}،,,,_rGO,IMsp``gpy}l@%mh+E$ŅE^*n/J >3_m0ҟ%K&02`e Z͵9NÙ:eOw4{ظmT.ISr܂{]P"|*z`I#1݂Fmٲ~4w. @SNϺu]>[[? .?a`hK4  #,t8[*0럄́W҃7 NJvIe:qa5I^Z ;A~Ahjf=挌 N [M݄Wx|.~))x1N'qN\@Vtkk+&YQeE,=Px%|pBwu|0[[0 Df` D0Uv7!Y,hkZj2mۖbLK`╽t󽲗U/{c\u>dEuE~B>g@A;ƿ)Of[]gNɁ6j/< :IEwzcl3F0,/H}Wec={0% %X%?䦂eSu;do&zq8n=u!K#Y/ϜUߨWqw lLMuec Ƶko}c z0$'f>|wy2l;v@87ST_DqC1"qkamAG_OkCL2dY_K.QKz v1?__ H:_iG@rU0mn%Yۛqza49Iؠ |6:}ws II~y))@0ܴ3Y>)#x1`tOvG̜dn>ysb a`N SƤ_m۶ގnG.I{,D ƍ̇`>p?=[[F VX8P$̋lBlG\I  ?m6E=VP0]XO i:#I˖-cPAڮ)?U&v-) R !}*p%|lOVQEIe[+>IBQ$FLWAz E' yʫf/a2YKSc(kp>StTs==CτC냪 l߾] &=ւaً vXk%ы jZϜ9~ȏ?m֛Ɏ&?>?_IXhD1Qhۯ Uߨ I_^[]uz x{(:(lUB^oɼH&" T_zjsSu͏g J`HΜw&ۿ2;̹gr{TR ϒmu<.MOVxq}%orq9Xx?==r0D8w+0 ElLV^3<9{8$I SpNxxfb߸TV1jngڵkP{taS Y{섚Ba+wy/8o.H~|>Kb`ԋBo3 <ߎ^?uX Ԍ>K-{K~r/x콖$!5_a-tH}.7IS*oz`%N'&A3懳?1aj8 #֛AlL)--%88'NyA5/<䓔H@@DGG3j(nj sl>R_( "]vvڴ=f@ h,rJr(Օfc|;5?Q[GUYWuv c_l=۵kGzz:w}77w*8s J'''vɠA eEEE?~mC5h كcC[B4bb/ #"盽`iv( 2=}A}gr&?1$%W:d'y+-sW Nlj'8p +0n֖˦ c8h 5̸-I:ZO$BXh7K$<3 DUp:q&aJIIKǦ?ifKX%~<@n'1$A=K5n`BpP>f٭T*߈oUkQRRš5knlllL+^G3}h%Ix8Q$.U*F! ͚O>aù s*TzɴsVzM,ÇoWYr˗/ʾK,XݻkbbbTZJ)Y߉%zA,| N̋TDEIfq&+_gjϩFG+GrKr+T&ݮ6ڸiA}dѣ<Ù-zqZMmsP7.@[O;{׫RKU ̨ IDAT$R 2q7{;(MKCn]E͵y dBj$(i{q9rf95l:| eyo4G7Ī$֬o%J/aۚ^0~G{<܋ﰭ}Rv B A۬#RSS)**B.SZZJLL! 6[쮨;;;ӿΟ?OjLˈgر0}t&M QQQ,ZX/_- .4(GW[ZZ?Qٳ'۷oK.DEEw^~ڜ7oZm=ILZ\ &b NĦOXMKOUݑi$rH \=o[驤c-hhZ/^kBiu!k 6={|'=x5L՜Ki}*_cdxzz"̿,Y///RRR*뭷Xp! ,''' )5}2Ip<^=/kvRz~b_fKbӣ2w+N[WmݍK cUmn].RS-ޫIɩ~b#˒I5f?]3J>dp06ݺ!A!$(ٌh%-_{鍅܂R]in7:] h.,H:O&pL﷭-sup0!@{krKhVq|;VG̵TjԨ2Q;6%@l+Ix t h$}-ر(,/ypr6){cQ9,Z)xutWמo5*S}zlfh6BwR8l~ :#C˶i{…#ppp`ٲe<XA?{zGϏBCC),,6?#o̬\jOQmFF%@2|Koo,۷Gs wwvYu"!@Ќ{:2/T:amkaK/^~k LAz AKEӱqF̙S4H,CTJs;I'xヸ]v7m@4_RlID%fQi8Nmz[Xwt)I?Uqu oٌɩ F( ؃ǔf)/wakpk b޽{ ό=!iR8`}ȑ֓d95k֐GDDC5X  qqq$%%SXorK.5jy"h$]A! 1shW(Up3L@]H0VT hAzV+vJgg3һMo< _~Y6.,1P(+$Ȍ :'(v ^ތnì~so$9 ,LJ?W\q$AaP{߯$>^g S oB%LcJGckDvvE%k|Ho:9"QR]ګnc|osAk׮!#nڇӣGgϞ5mii/|ٳټy*f͚5۷wwwy۴AT"EToLL :LfZ/?_ӡP( rh]I$P[>TSPt-6m`;v o$JJJtׯ`k$I,X@w@> pASXXȵkXj'N`˖-9sŋգGI<'Oşp! NAe˖Avv69lݪ_zKoo<0LWWG 3xݻ#GwߑF1D_ru__Z֭ʕ+,XFCbb9rİcƍ;w[Š+ _`֭DGG矓MFF˖- 22۷c"##X|9ׯ_'''ŋplΉ'Xj׮]? .a>l& hZ,X$IƲvZ@;b_K.RRRBRR| ǎclڴgh"IKK믿 < %KDV_esNTeV5_}駟6o ]8~8W&99b>#.^ȏ?}8t=qqqt:,XN#..Co>~G.^G}Dqq1ɬ^Ǐk.@#nG䥰l2oσd|p_8aǎl߾}Xl,;aWjǸq2b RRR(((`…;w7l?{}Iqnt6> 1؝וc} hO |>%XD3 `-/2^A7 ϛ}Y|9Ze7׏+FMȀbU9io̝;IV;acp0J% ڄク&:%Ib/^pILү?i^ zդk2anvuev<1m {qM5s#U]n+'g rA!I05-,&jD$dMA>ly~b_hrDvNx[x:ۊ{ĝ}D\ cdg? JccE?Ǿo_1{qM~иP ~ EYk&uśk9n;z#IRݮIQ6=o;rd7]OX zM qrrBӑW4ؽh"z-,--IMM] Æ 3 ]NNmg,۶m ww#X[3y)Kӱ}v&L`͓RՇcY%ƭK6D7M7ޣ& {i7wPb"b O6ۅN!UxJAxIbm~4-F J""xˣXZ马R>>G&ߤ w=[zM'L8!->S6=Ul!b(no ܮ`$I$ W~\7KUfoϕ7nlB< Xx1IfRNa=r+V 0IXN}e8͙owN5H2 ???Pș=3{xhj'&,>ڛ{{֭Ӟwnp&~mխAnwww6o̘1cX|9;w̗bsnn~ַۜc/s+,0*2qt4Fc~ |AD'鸘yU Un]ָ}KYmQQ 6¦vZ2XpBf\zŒ%#A,ZK/nGn;zehuSsS^Su#ߍ`Wntjc/z(ÆI/&ӧIcڽ~#L hky[O6}ޯL&#(( m`=)T}#TL?zmw<3D=1z]O-\4؝?6mbƌlڴiӦ1p@<==ʯ)I kkkڶmKzz:IIIFWLJ^Ku̝;Vh) ۾} Vbm~fC cꮩVRU&N۸Qqq'J6VŢA2q^K5~^a&ܸmXMղ,n^'}7|^iN"̒$2!R_ s" +nx:1@P7ܦ=Cs <{p1ydA#97,4k.m]jYl/ ¬m \ƌۭ-|UB6#“8v%[Ki !n,^}B} bqK:o/ -o).#2҆yHm<^C䄄Eӧf@AwPzME7₋K7ڼ< #" \EQL 4/_v߾ȭ$x׎V:>`VZeR|+YW 2xn{z{AˠRNݴ$I<߮ .{ ր$Id\ݢY%Xn.HCDB&aqzKIٔh.k 9|\nuƸ@ ̙[[ዥtyqQ @^!`EFadgX$I"##wwwI:t%\DYUe:. yom)\>cm\|ᱵ]nP[*DtYƈ0˶jYgyz$ѱcG㱷x~77?Tַx3XΦ "2[s/2[[.$`l{B&fCD߈fZi&M=-_D~Q鸭-GRn\l*Օb!I|}HU>J$Idgg\b՜,^ˡrIbgϵ,rۍXYm@аh҈88s~ɩG&<Ŭ3gw6B.3kټ4Ҍ*ΒI/0l )5SXA9^&6A%몥7oV&NhW^]ؽw^7n\+s1sJwRTwS|_ϟ{=AcMϞ,E@\4DEJSJU}=>tth g՞ۅ8gߞBvbô5ZE7ꫯzKorV!aqeѠ$]lIF6#uӓK8m:/gɍ Os1";Ž}Hߑ _}XAi);'wt.(`BB J^IC6 A'UwyFh5 i0Eڛ2 zxW 6;A6֩,}2IW%ˑ$+ $aqj~2tt4X(\i2%A@gE@`X[̻GeVYtr@Nfږ&K 筱ݰb$Uǻza:,Цki֑͙˗/sȑ[LvuV<X}Tܹs]>}4(ո?6mxEm`삃X!Z VtwNLFL2U$RaIW0|v64@b$}4u1 M -^e$`p"I-ZĹ%I_äX)q֋nl'v `fEWusAf`Gwv2;K9X5˟O6L&[C_Vg\k2m4HnGR#Tg/l7oIsDJAxs$1N@aؓ_}7>j;8`tfDvq6i\ɺ>3M:Xwv]mm۲}&ݷO!tp24* IDAT}90z6b``>!fغu+'8q"rcܑ8;<#sX{+?ڇ{gyz˒MW΀q׽]AÇC1n8uVfs999Xm۶qebС̜9 nZIif&&Ia G0FM2vJCB ƪS'!h ͈MGEBR%CFh0g*~{7||:fE-dGeU];f7ަN*ci>7-I:(|VyťD&dJJʢɩ<F+!trD!@ f&198TO$b-욧5i 뺵WFr uؑ3~x. [(1c駟>`常4$$qyݔ^^mtnկ,nCC&Ό33vf# S&99RI( lHlz&-&}vAXQ1\ͫM6=&gED饤kW,2)7#¡I1^0^)مK85'C"sڶut ߍO;gLR J^%(>8$h 4, _=sZ #$$Dݭ×3winX֒%2[=1H7Ν; h4 HB!C Q]tkwF*&&;[Ww-I%QN~x87k1\ Bv@ ht$I"9/UtI{]_^x.l{.IVDi1{n'ig*w T$I"F$<^M"} (2zw2J7/@ hK.WHƃ۷cnbN T&>;r92;Y#WjW?ʎ3{D'^u^ )-o!*wr6]vMhh(vBV줂ߥKz!Əϐ!CĊR3C/d%K %)PfdTW]FD͘,LUs;5? Ǧxt;TYvxa\l"Z `?`\2 OCibkV'q>5`Ii4b:d`}=<'ǥ̒č8X@Pb>6U*2oV#A#=.|ñcY8lavkZVX/a;$Vg{.32э/á~"IDa:u!Yt9rPBCCx+|]]];v,Ǐg̘1fVCծ];.^XɳH:.裶(TE2noӫ[6޾$qi0Xu]H2K϶@ hX./01tbeߎm#9/1嘧'J/%/0-V'rK{m q6Rg,I2P%d[Tsyӑp!2-s5X\=@;|/ryUW0|Y V|yT*J%cZΜs8t``{3R $Ȍ+K&y @V hv-O\|ݾ?XokcVA 2K5'gSjlev%$fâEx7Ŗ^@ 0bL[ۅO[dg3I$%W*sqgyԖVe…b#Tcɾ|u tDz>Waȯ;\/(hybwEZ-2D}_rBWy?~<^4H%%7aeQQH\pjƒ@ hRR U(4y8Z9rxar㓨u1LY kM9B$~}>jEe$fkv:'$W*9 ACSO#+(ٳȄ&ԚiJt%cáa+v i|šWO^08 k('gWݷs9}qt[V{xS.vwޝ0,-)&̖0RQ;V(`%!!pt4?lH9̽UGpoդ-u11LV\"3}g֋N1ev]p}`ߦ];o^n̘@,9 Nv;rhD^VM#IΝ{b@ P?}}HHSG hl;(d ô^Ӑj7WsAU$ xbl?lxOH;ScCp ݬwޝݻ3o<222 v'{!7~ݻ7ǦLAq2 \9V-,[L28Q8}%ѷM_,T&\6=Qz* ٺam)鹝xWI.>k IH( ,N͉ \,4[Rl$ sƲ㍌[nO ̈83R< f౻#.;_~ujCyUfh~"&j;$h.X-@ A}$hΙ33s y]tp#8i%$^g!88>ҒQF1jԨGp{wb㰻h/۾} GnƦF*J\vvNh\&JOebwDZ$&oף>G7IK!,Nɸ 3Q?YC &ǹ N޽{=z4r3Z@ 4'ĜGP2guG;'^IfA>_<?[:0?v%%vX+Wҭ[7yҮ];sMЄ{*-vlIlAn% ͙KXqzEW󮒚6^J9o+}E驤X[Xū7X;Aqy5#^7D;j:4Z'gjU.2^N6a;$m1R N3@ 1cpgv8Y?Dp6gϤr58>SN[.nzxZR/\L&3DrFŴi?;[mLT]®?7={D&oEQ-#,hG4hK`@^Jz{J!VHZoGp _҄߆^)}?7|k}E-W9AXL Jfk"ve¶;j+vA+DU] 槰D˛Dt>mi%wK 'ylL%v;88PPPo ɓ:u* kF\~xAOvAA؅En̢Y7Z5ңO };&udyOJJ(7(;2q?5Α%o~ +3ϭQ[ JJL",.qj()ՙti7mϺFVw}nj3P#@ jEAdn/hk/s#=n "sAm$ՇbdyjRm-,܏{^-YT=bwAA[ne8pև/V׮] 6'۷kwF\ei3x^ ! ͊sb2bJ^iO&6_\鸯/=Y+hoGA]yygݤp[؂O^-m7 idٔIBSd2Ή7/$*FDhb7V'+/ILai!>gӅMwyÆ21ԕ?Φw{dnޱ/~{qx/\z?p}er>y&Lu{i픋ݖj@ h~l;erN>ݼq zT2T2D $v#7IkF0uzZ lyݮX (3x5'cՄgpZ m̀n p# g[Kwdf$IB`ii)(IH yEGr\F_Cpsk -gy[e`gaև9~\u*Rj_>xgݓKYqp]0֮]˖-[P&ۜ899lNh!H=|ΝSSI TClv,*˾kuf7((tsB.vqZ:\?_fIRfKV6-lD צS85ae?r+~>.e$nboʹZ- ,?+$Ic/VY8z4_,b@`"Z51k*+J[kӏ5c`!sAI)bzfXmY6?vVu{6KYh4BCCYnvTŻ]뮻 6' 5 TPT₋KS M .FB[7ѹj"$qϖ{(ʨT6tm w!l^6spfn@ $ԜSw#ATZfKF_l,Ń@ jOAd$ |`_r;? q6Ilv,wNDTYbwV#JpRϧ-:z}}\n:6{"7n`Æ _(}U؜9iӦ &CJfff7;ȴHAb!퇰rJxSx>lxp*ܑ ln6}n&81[Ӓ$QO& ~E-PIvtW{g,<[#Ir :uQ@Јի,;;1t'm6ɺu|2 م̂N'K,RX;-ډ-JHLL k׮eƍW94iSNeРA=VK'߮-"M7,ZV鸝GRnvM|xCn6ny1@Y+$I%krJ֯ Hĥ<}2ɲb_;KBѝntoB~?t:֭[ԩS<1_ +'>VÈtXI:fIXj-ڵá2@1yhJUp۩J}]MnŊt:ٱcrDC%LT)Te@6}W"3``C)d#P :bڹA}t׋~w08ۘ@8S湝Ax|&_6 ($ pK[@AY<#\yG%LRSyd#jZwsLp'sJ"zRβˤ6[]lw}ɓ'ojM=VCjȑl߾GGǦ@"HO{nnG=G0i+g44l )հ2q(\U. /BU-`whuI6$ W8Q.e¶>zٻʼ}ItߒnнKeKi">"6;n#QgqFqT^T^tJV -tMoY4mM =i\s3]9߇7`[x\pW9@+D+<3&ߍe쫒Xc<^s=y[V7c電p9g#֘^?ǎu)DDzr+6mJ'< UJ&%LBAe1}a7Q|gw}rpMxJ׹;}fwحO%rVt_LrwY=޹noKb Sbܿhk|-:r:&#-.˼ r BF'F{gb[8\Qpm&,>]})]WÇK`M;Ƅs) 9 |f~ڿ ^2,|t:'c^=)c[~!'҅UX$t:ą]&kPR; Xsiӳi@x@'N6{vM{ B=؞Avr4T^WGg&If3T*h#"ł~CWF/X?7U9O؆?ώ4|tG =Tekr=F%D;r" 8իWwEuu5;88W^y%.]K/mJ\UTT/_O=Ft$X1WdPl9uy_E]*Q$n7l(}NpRVY5нj;=HJrc;vhKRQ.ؿZfj0nX @$8qiii D(z4O5D̚5U6IGMGw ;oƇPPXjmors2VdҤImJrrrmJ8\}x衇uIdb vWFCg1#= #1,|*[+ [m,el!wSřTç?cfw9lWokGnlmII*;d#ml(n%QqF~lcBD'Bƍ;`XˑPF}B4YE+$ZvX-cZ17c.h@r24X׹X.Ե~7ځ7n[P oK.رc] <9 ({?+u]o}ˣ18>;@8 ]9% nT8sf@rfnmb# J((6v)g)9&Y{m-2a\%LDDbg'Jco IO~" \Ol}ll 2}CJ7Qr韨|ݦdΜ9lS2H̚5 x~:D@svډ` ALp rr0%a P)E$eۀ[ͳ;aO?5͎$Jk1{\WҵaۙZfi["??sX""?ưgA٢m7}<дpb ke7;;13 LJw p9M_ԯ{ŊXp! 6\M"ZppՅWiŨQnw&ф"VfN٩ϺfA዇vcm^ ÕMUۅFԷrpfje `杍H¦NE…=烒O! T_Q۶x2IHhI _ SUWѯ6&4 ?[m`ѸEnon? |MZ&kDΆ_E+xc}#dbq3lp#gjp-( X**$I>lĒKpS4LX.U4z]4uoanf1!|b3uz]_(V*8W|0!nrr0+;e56 ăg/N;X`8pnK)-H76} $DQ{gnmL2"ÞZvyW5R25yniú1NVD};rq[]V/ ɥݻwss-:]eؽz7DIBp<\u9Fǎ.IyW 8(j}9? @R=3@eRŊFPPbzE!GVn0ס N9=s믝I3HY?ˉΠk3ޖd GnbωzĈ} 0y!R8'%֖$Ki鱈lj?wP*.NC/T??Ϙ ek9-ۋ=?K/}Q_A~L!(t#Q Ä _ IIANb5S+P^` ˶'wV"'vc.sj޽\@-N e$E 0[[T`rj r4bjz Ԝސg ~߰_7Q]x#?:TWGc2"9 %V,Mo~$=،<]eح{e؈tgawʴ_ @sz,1`gO6*n)05-nOIASTb@uakE :q#S) apmwEkbAS{@_Ǟ=XyJD#ܾ/')돮wz 5m5HKp;U#SDOoK^hUQ(=4XFx!FJ ]F,r35✔h1&y 6`ٲe|(0AQDO#czyvVĈruDT '%I '%=7 &F w:,Xo qxaۊV`V,cԵ<1/kl J_,_("Pr H-&첯.(1⧪&mqfj%tsRe ar6?>ઈjYgl,݈Yܬ|] !=sߠ48%''cǿ/_zj "+`08W= BҦR@*ACv\%Z@B=1>awpvnw=l;Yms'v؀V6vO!A#ܞ0< A i]vaaID HzqTw}Q\%i9x21fw=طm6_Q"'{jQ˗Yl|׎)]{$6nt:v6=ow3:I1P*8 1UelJA|`K]'$Ha 3l@{mkMrU{ Sm-r357, J?)Fԥ%YbD>Z阵5/a\E˙_Cۘ$4;걻z7z;/u?ó:ؾp;TܼII{m B E/_hO${$ivmv@ƕ'm((1&=i՘q m"""'Sy9_dr>(nVI!h]]pڃu\ E>ocB 7 *\cg#(*tzpğv=dW3gR+Q@/^]/um$9^č-ܖ$ #ܮoe_ vyLDE~!:1!" 0ThuAIBW_2&s7Q)TxctX;YYЄh`04!u%0"f5=IK}vcُZ ďveBQqIRCm嶽-ɩFrs35Ȍ   `̘1%" P;@㧟\QxM5|8 ^ʈ'sϚ/xÕ5AAPU(>cHpߤ{vge#XN]%K!9"YhqW }ZqmIϴַq\XEn7uXdQ $YZL !6 -wshK/(.cPRGaf,[VQ׸CTc٤e .7 A*.m:#<ؔ(cawx[a#{lqd#֣֗;ؤH76"+! (b͚5xƄ-yh(aT=IP\ªBǫ{<^zRx}yG藬jw}b|ެt?^| ibwK@w1YDU4Ĉ.GI}0~x߶=܎ S~""""""bSAά+ݨiu!nIqvWVKfr?P= ݿtg'LBblI@Z{Sf+78Vn9QO(&@ATJ $aϞ=:u*o0Ѡ9 % ɥ n*|Uc{܎1-qݙљÍ.I`6a5ͭg?݀ Ph`5i65㵢װZXD `ݑuX<~\nr%x!!ڿ kvZF`c]GG8;c @t[@P36N KN6p;TĴXfjŤh1&TAD45mڄ?X{-hH?K{^UE`D5>\vKz~Яp o^7&=]s ]DGa9ѠcnNp-09t ۳lv4@rFSSM^ J24P DDP@sOC SIӱ{嗈? <9ܛ%R]ISO |ag`8l8 }UІhL3oŖ-N&K_Tgjm"w+)܏'8 rS ukh3aW%ۇ*߆ѡ*L 7S,- Re$IE||<e'"Nh߅hn] w@q"<++^3?)7Qbl藹rss{A^<7$J%&kD(n7"9m3mTGiy=ɀ;z׷PcOU cT"7nI6_ f1",GPm; *|]рcγtR|pԵCqߔ`(|J}/Fss#9r$&N]vԩS}%Kl6㣏>b˖-Cjj*-jƶSۜ^;=[) ]$Wxd_= HOUճ"⁻| -VnT,=iՎ$yYZJ`M@DQĪUC  CU445 Sp۰ddjbĉ8rA)Sꫯ:_veظq#Apϟ LrAJ 3ߟ ǰpBcXD ^+z SbR$zT"Z߷pە:ooOյtkG{!.B,-mIF&D тąڵkANw}г =\|W$ EEE={7Jvj;-;ªB3 >}a0"c*Gaw"LOuk$QCbcjnG#/K=">6 "I8l~oѠ%'HĠWO>+Wu {<^t1l„ ^/oj`]M[c$&tog$L yPԁG[V)1+"/K8D$I8t&Nu"""8硡+a޽{:ujh4Rynݺux׽z=r IDATvK;vWvz 5m5HKp;.I7Q`rduIʁ C6#P>&p܇8L;܎'k]kvIwa!Vnk8#B nF_ADDDUP╰ ##c(z&sOf/ط9/5S) ')RΪVZmg~Rǿq`;##k}ݶr؈%dPfigP2UphE_~%͛kIDDD4pCCW`tvvctʛ`S Eau!vWF}vSRR(Ž;û!!= (l]݅UgS.\ mxݳlHnkGnKvZ]li0eiEn)  f j-۶/!$>47/uIDŜ?~܌z]"ݹ8z( lق;сw}2??es=Zg<ԂNX#mSrsHLK]ӷ8!Ԛ*+ۆ6NV`C>ɒ5>alnKRlY mm=s"eZj*u]P*.XQ_Ѻ}㵺+}UPF2"y 䜧Vᣟ?RPbjTd#W+k֬<ضm<ԃ>Zٳg#**e|'xxidž}a?9]cGCMbOڂby=QXͶgT$I(5t۶ %ngŅ#7KXРP(`$"ׯGՓ˝^ 06Uy@y;oc>Z`sW&LC`Ym6<׿xFF}}sFČ@lp,;-.( T#Q$;L4VLه$ uVn4}3n_E^ Q H^.| bl!!:i| oDVʈÛsI(i,q: X:a)RRv}v+ Z _|1:;;_cȑXd .B466:=v=ok֬`$Ir .BoHnޱݛIbK.I~iq.(1$=I$bzq h`Xp9{,sP0/NjT"O&\ɕ8r]FŎAeH6t++\uU(((-܂} B7T*Yf[ 1vdRJ*J8\dUbDcBB^mCD6qgU"b aW1S#G.铰W՜9s"22% I[k6VΝ?0 } VQ¡SM%F4wXdB&&GVngj :6Qi&\r%lGD4IV+J ?sy<6eWE$y(P}n \.$ s{+P hgҭiOu.,1Sp[yZ2bp[HHK ""J^kWE$/yhnmLhHy!pK ܱP?0[E<وF/G +#yIPvBxo#on m,LE =znONbjz h\r 1Q(^&$ j?!׺ B}}"dUE^ۥ[@g#0f}7ϧVәI@F>17XѱztBT`r-`JZ,BJٯCD($IjR?""(yc!'"As >ocr69y7ә940z! 2y111/#:+V P(o(yb'|^v@wgÀi_=(3:V+.6bωztZn)05{nuE>,x (HDD@N|nupA|-"/y7gdwq{Nss3~i HF.'NVEpp0Q\\]vбnܹsrK_J>yŕ˗㩧hhmv@6[mjw ;y>l0|Jp;t^us޶d{`BXdžRn$I'W9Q"+ǂGF'C`c 21ocOa@v\6ޝ.a >bΜ98~8cѢE :bFv<0;e6Zlp,LXhJ][[ hjj=5 ͛7sgj*vcnN q?0O:p;=H*knFaѶrĈOy'܎ L[,- RdDDP(p ""cqދZխ\諯BAeD9ϝ܉+G|h-WhB| Z HnOo5ퟪndžk_ŘH(n-A0c y-C'B2;/{5\s &?Os.u 4 $~zx㍎o/ߵkQ^^A0vXrH!Ǯ:+{q=0zZ P\)߽7CK}vW,=iȵ$bTBm""""A?\su\#G.镰.B|w;%%~;Ν'",'OYYvڅ'|I IA͛qxDr'C=(_DʶVoW$xGyr]G[r`GȄ3NDD}cZDDtFJs)bu*5#BW'7y(Pu]WWK. ZZFkk+zwA+`ٲe(NJV`08h2ϧ6[H40m)p Gmı Ͳ%bD|8m"AD$L&j|'""*\]ܟsU\g8@a7455[ow  55+WļyUFUjj*:İ{{|[ g{n' W7u`gdqmlcl[Enq 3IP^^T'""L'q|\⼏:=Y_~fqCB۫DEE_}݇W_}| jjj\T*p-`Žڜ?>DQv4pڌ@6 YD s~F~0->Șe 2\kvIwa!p۶r;]_DDC(/qw^""rKW NLeeh+D_q*#:3yh(nWN8cǎBbb"2 ܠ2m5\/| +3'QPlpe6)9&Gm-R5 c2lbqzd}?+ 5ͦf?v7>_CWv,|G-ݛInj>tgawZ (7 O@z>?1.7{CrclchIEOQ7Q}v̘1 DDuz:~tt8oD͝ʈN/( xolccM$?m}=vڌ &e m((o(YlY mm=tF_<ˈ(0&\2Դ9Ħ6!\lj6&n&1'{]gaw_$ %umIjNJ&E?(XnnF}Sw6]]oGTc%/NǚM臸e->WnWAo!x}UV띱Sꕡ%I^+k;rZejp#&M9Qyh޸h۪nP}TQo>nuXU ͦfcK/xBjNhGd"B&blJƦL;Ip;{ܮkN=*!W[`\:~ %W] PBs뭈i!Du_± pBhBD:ncҗ + ^޹G}7Ζ$$n6GT(/ZP;ݾdLZ_*vI%\b_m#ZLӘH[K,-gjpj /Ru9DD`BƎE 7@EπD>sEaՈ -o5AStZV444رcL&A5\'/_.wt]wP"""PYY鸛B.H`,jTa;3 k1v4#lvރ(J8R݌b[[]F[nMDL-4||G$"<< ,h 9OQmiAP]p˗/ǫ7bɒ%+d<I ǁv)m,Nuv԰ (pU mmIvfm.Kr%A,m""3lFDDDCA yΉ?% 6&}+V`ĈxᇱpBرپ.mȹ!-I ǀ*[ճ󒲁h "nȤ VQ&촯.,5]p[!G!/Ӷ x7(p=#DDDD9 %^ic"3f`Ν}]ΐ17$=ܶ&iX`*M@HT߮*Pehfi.CPDDDDDDDDt/^;wƸq|]Ґ2}[ڟ쫶Z3(2g?A*&{mh?V*{A^XD0&"%" BrsJ63fwf=k_셁 q"`؀*FehBpNmv^c?2eDDDDs*":u4o[oy=;<}gn_ڹ2 $zog id0YD8ـ=6U񻨔&8VnOME8m"" ,X2hD-}sU%47rh✇Mzaaa>$01-ry7oFXXNxAh:?"V&gCPIؾ"bE-nN=%5WFDD4t>^{ODDJ20::>!4Qg"- IDAT]X>;yjymP+ոzվ._UUU-MȵYfa,~il޼ ,p4yw r(?*. :mF]D#}[P&Yp;$uZw%{Nԣ,R)i1$LME6 ] `ԨQ?!"!vva0&,*K={*<5m5X:?HMYC>bL$Iu]:::a<(++h4TVVBp_3G_|y\9v=7<lr}կ~~̃ \P't~n"Sي'PPbPrtZn)05-yYZfj1%-68vŰ \^$^DLPZ t9*(r<ȩp'(HJo $!ՄȦnBμ -urgvdܹ1SCPuzfcɅ%ؓbQb,3###EE4 PYY歾4gܹsHHH@1lذz?ot:ӷh]uFq P^T_;?rZQ={ w*tM3/f\ⶋ [mX&""NEw߅Z3T..{%ܪqz5]~>7oKS왵*tT]ܮPwa """K`AF;y~k,t"5uJe jժOOOk׮p0ApE+66&LT]ӦMŋzСCF|_(~6r-}h㪝֏y+v7PqY%bR5%~+@h4ܝWՖ$yQ6_^""|/͚${8M}))kyB}B10h eotN1d##KeQ TS^p%7zW";;@gv"<<7oL:=|||p|'HNN5k`֬Y9sfc*+GN.UU_A}G;I3/g@'Cq}CGV^p`q*?^BPQz)uI-vh޼9:@DDDȑ#_~guV1MVk\Ѡ_~HLLJ… гgO㄄ }aޘRСC[ݻ7=ڰo瀂Lפ_Yk T5hVppn1NΥ>srfdma5fnwk69I .wV׿=$ 3VA6@̢{v[wyǸzcK,SO=Q1o<_`ť7o~;v.t귝zȌt倣;D@x;8mÁ B!VT=D J*p6U3ɹ8_ e)n{8 ]U~ j#CDDd+$IBrr2zeՇ< ``JAVBbwdd$ ,, k1ĉ2ex&i&7x `aΝ(--k}L=~0e͛7cյ7k35Z%uPb;ж햽LZ/)Ǚ $Wܾ]9oqs5sK DDDDRaĉJADDD$+!j_Sn g999g}N$IBXX$I~N= ?#9sRЧO{go_fLe.@V4g {zz>p|ĉرc}hȇQU?HP PWch7 .DQQn޼/;vn݊ ./^ F<,Zp%lٲsN;w/e{S f͞GħƅHY0 pvb8@K.֪ wx!#]c T|o0>1ncJ`= s碴YYYOƞ={7nD\\O?Eaa!nݺ%Kbcc}vm[\`…_~7oڵ gϞ,[ 7n@II ϟr~1+V ==={6?3~gw}ׯfϞ cŊǏʕ+磤7negϞŮ]T_ .DAArssɶm۷oן%K֭[(,,ħ~ ƍ{ӧ_5PZZs]cǎIZZt:fϞ IZo}tt4> Xf sAyy9222|rɓ'o>?_'@"''K.PuQiΝ-[ҥKE!///\pA ;/qMa:ٰa`޽8uoAff&n:qQʕ+Q1{l\pQ?/~F3BN9s //Vg1uT4 IɻT*ÇAAA())AΝ?EDDȑ#ԹoFF~?>|C oMiZxxx SKgkAPA 8T!!}B`j]9YToLJΤhrƬoKOgx5}J* ?#s鐛osyNxN!^;UQ QNQ vyN 97n 00 X9Y)V"*= |>.>[Cii) "5 mLWh4,W$ HJJªUj!}Ѧ( WWW_VV&KLTRRrwڿ~!E7jq5Y\ɹ8swAܒ{yՅl5nq-]/ԿjAvwT>7l̾>޿O>~OY9quu9g,'ωxN sb_gERn_sw1$ bv6 Q&>H[97[%)a6%lǔnSxN,߇wc5&Ip9<M:~S˥mI>R/e$[F.@7aSe\IZP2]soq4|\ Jk6~F߻DDDdDQҥKJЬ f*xz,l1|2QQ*#^TVd]L@$vC1A/ <)a-Z͛7k.JY-6o<@!@΀ ДTN[^Ɏ]S?WGPC?˟QODDDV1c "";ci؝_EspS 2u35؞^'0@"Kbw۶m j5za}̙5kVϓ$ ign(#K횹(n7DDDT$!..ݺu?Ȳ9o=r`8:ep U 2e`HOo0v<8 @d41WSZX'b̙obFUkqKKue,ynIr[ɚ=sSX96wۖ"}PT4ianЬ-?#"[g9. ݮ: N*'"R쮞'-Fn0n8l۶ N_|~>ӦMPb-=F6m,)Inך}Hvn,n {bĈV'""[x8vEٕ+c۷)d^n]*Z{]Ǹth YݖdMIII8~xmǛ7oFf၉'g…8~8n߾iӦ… 4iqE̛7w}z;2|ۧS48by۝< JCsOgY^ZC"!""2AcRY7nB7@ddl1>.* JtHdzj+?88hr Qz-|IڷU\m,%S?s;=X&""""""'UT ɡ1s@QH95pwwo1dmO˗/cٲeغu+j_5lN/޵W⶟;'rt:P9Gpt /…c99(ȑ DF9ٓFk:ǚI^WPZn jd[n- JDDDd9$IBff&,;""=yyHxRaP^ DE9Y Snt[Rtu5UcT{a!TNT9Ca<to孟hxY.IPVVgggGDD fc!6"٧g+ gvS-BDDDDDDDj5nџ'=f#"N$|ylL؈iQ!VT88 ]3I6C(JADDD$Qqs2J/^4sDdk%AAF6]QcFFFRSSk}+IT*DDD@bJLDD}:֮5c$dk)QԘiѱߊéSf̭ѫ2: ׯw{F Ϝ9f2@DDDD&&"V\SDDdٜCC>`Ǐ?p T 2v0_^be*AxPdd.vBSb@$_˗ (i HDDd1h y?N7Pd-i O}R<080`dJ tfy-}SJ DDDDF$Je7eD#F<-`L?Ce't1Ɏk0 J. p3>_X(={6CV+ /9s t DFs}7a=lgvYNDDdtZ$ `̵wo^Ț1!kaݜOF+Ҍ&NDD$;Ǎ5:Vz\b0!{b75dp?2IpabCDDͭ_?8kgt,fHw9Rs^nH.Tz?ӳV,X8STxEjVyyD5APs*t|αw1,rV AЭ[78995}u<2f͚)n6~;+%7+uEhcMt/<@g߭6_g_E PTdj,P٪U+$''7QjaQ=(*lDQΝ;o@YqDDd^^ݹA25sߍ0  j=c;pT;* Id>ظq# .\o/_F׮]M&j(..5B2]\0E]R6&* //Wnܹ Ge[?8gvME'N`CDDD69Yqɓ'C${8tP[^^^xIIIpuu7|#GHKKCjjj|C#"""26DDDd󐽐 bԩذaj5^yٳZ-~'|ᇸ~:n: TvcfΜYf/ """""""""yhc"K{ԩǻv۷ (G+W$A< +V:|Vzg0k,·|||tDQĆ s5iau""""KƜU*Ձ_c!եMգG:u꾳$IGY .lkd[Sb"""Y$DDDVƬY߲ݵW/BQ%bS?4װvNލA)1EYfvsuuU:""""ٕS0Lpr2(t@ŋs-.;)Y*<Þ=؞W4W?7G7d?QH6(bÆ y*>lc61tyv;;VJ+Kq0BQQS bH~/ <=x6}Uxrӓ*2E]3ɨG}WȦg2!""=jx !8;+Ymj^_,+c̘1\l(ؾ};s"")nU+cpvbp*GB79lmQ}VEz)TTTm1_d~%"""tDDD&%T0XYb"ř9"yfT:7c$P%I³>/VٳgR:񟈈HQ* yLѱ\0iɷѱ){ 5,=B֬Y[Bھ}{L:aaahٲ%xY2iӦA)lt:.]z jZpLƱU+?8'Nލ@ڌ`8#ڍ@B^Bm^z tjϥ%eرcn:޶Սo ODDDdk$IBNN4lE޽|=c-΅qfœq220rHto=!#ů ϡL@,n7n܀_dR7X&"""%IZ-G ICo0ַ/׭U *RsƻNLQ'U^^AЫW/ԴiӸJ/4Qd>2 "".;[7c۶AL_,W_}p :tH EDD ..)))OthDDDD&!I.]?Ȧyot{Ef&Jbb )9YژUUV}8qZh!ːv""""""" yyH40?~@TDD, ,]'O#`ƍtr؈#p4Qg} NNN: Xba})켼Hvǣ(vQQ7NȜ󐽐J U̽3͇mLlTQi4cnn"bb8){̵w`mL$IU}2|M^d """W_1!""'8:{hc%gΠL3GDĜ4DIĹsGq<&_ߎ~BXtxt,mLfΜ)aɌvލ (lT*F JDDD{8hXh[f̅9iJ?3خx DE YuHr8995I?eWlwl翇69iT bcJ+K &vqoSYtn3f*DDDdDQo|!ʊ ?oh\󘆛ltP!2MpJ"""""""T q`Ұ(3GGTZV&|rk&tؑ M$ yn8cEC,)1sDdyLg@:Cz6`dTM*ߟDDDd$Iɓ'ѡC$""3~2.j(:xc(ɉ9T*0,dU&噵Iaa!PPPz?oРA2FE5 ˑ88<1Cە+4uIgvgdd/ۑ‚ H/)דO>Ʌ ȦÇ#22*}5z֬5Ӟ:8(Ʌ9Y˗/G׮]`$$$@EH/2?NtDDDD|DDd|ƍ3> I(ܵ˼Y0!{![իWcԩ5k ŸsA@۶mQTT|,A[""6&DDDDDDDM$$1NcQ3E]R:㑔7obpUSRRpmfΜ[Ȧ>9-1nyӧ Ʌ9)ݒg h߾qiii5jf&o\lJ¿/ċ J]^}`K8;;c0:֭[+~7C ""RC"FXRbH.yQPVo~wL?=űqEs9%9txvIb/`E׮]5hLСC!IaF$DEE1!""5fRI 4s4$<.-õ< DD;vIj0ֳgO㨨:qacoooG|rddd 55W~~ҡJ믿[zȮyѱ={ Ɂ9|xǍEdyp-dee{'!`ʕHJJ2x/J{#Lmۢ{h׮]>LЈLBE9r5]5rd 뇖V@dkhPoho >7ѐÃwiH}QtϞ=xcmڴño>!<<ӧOG߾}!;/%%%E.}ؽ{7<<;w"ǎ5>}$gzWIVc׮]>|C:hZ} GDDDDDDDDr[!y3M:٬'"FbH!Q60+c,3]\\_puuՏw {ĉqMk\]]߲Э)S"""i( /DDdXmy7dDm@{5YfvWqq1VX(-[DDDx ҥK;wΠ $ ׮]CΝG>,+5s+,/ߎpa<IppupU:46&T ۘ7AWP`09I^D\9TJ>{3 i;D,ۘlyBDDD6MEy!89󩧌GQS01/_g_\\5(t Dd_X&!aFt֍9ޣ6ض-_ dZFDcѨ+an2*..DDDdA@Ϟ="@HJx CV`ߐCSO q><@T3ɨJ-0NO>9J5ߡct4Bbc~Z37nR "*F^^^7'"""5$^^^㝈lseҢ6v x*6ڨ)%HveeeJ@DDD$;yAppfݺڅ U "/ڵkRADDDKRaʔ)yk+oDilbΣ˷/cІASԟzdg4w4ptrzjDFFb رc]v!22k֬i*++er88p ""򈌄dtp>3GC GYޡ(וΈ6o06nPVVӧCٳgΜ͛qY$a騨1_uKDDD6ME,_9Q==<>hѱ!MEbΣ<7G7 7:bimPPP0Q)SsCJJJ`jSJDDDd1j5}XlS * B"M,vۀ.] ((gΜ޽aYv-]#G6ݥK~M$ ׮]cCDDjwx 6,@с(H\0 2G=OF7nJg3EEEELL bbbpy$%%SRRҠ-[ [nERRZ-1p@k4hL0~xhZuHNNƥK0n8|}qZ-<<<pww;t""""""""{"]=f戈Cfq&ZQP,)vApE+66&L@ZZZHMMڵk1m4,^mFbС8x Ə3g̙3˫A=z4. """&"vڅQFA DDD1x0E_" IDATWWHc{maX Cyv9 lqRSS1b}{ԩؿ?Μ9 %K`ƌ V1p@A".. |{AǻuLY-Z(Q#V&1!{amL>s4o}E """poc3`֭cN6ָFA~J .gϞ 1~?kУG gΜuN!,, ؿ? vc =H_[x o戈ڱI#;M>իW{̠ ~~~Xd z)yao...~͛ 6ƍ3EVc񈍍Ett~mtzDDDDdmt:-[?PJCDDdU<`p^-s'vY6M6u7l0#-- ;wDii)\]]ksС&Œ uޮh}-[`ܹMȒT*L0+A'@cEQ!͜ Y] @ Pw]K|>L54 999B4d!۷/}]ǣwޘ0az'BE̚5 ]t1KJJPrV~~>n݂$ID^^~bUë/,XEEEy&K@LL vغu+.\Xx14 h"KeΝ;3ח.]hZ|'."}ɓ˗###3g 11k֬>|X?KHNN$I={6t:Ұb cµksEii)_N>={6n܈8~Bܺu K,bm۶!66@բ(((…  6o صk~ep `+W{8pǏX;?$$AdQ6A kZVik]Z.VmNX,P* } Iaf~<^}|>۷\=$%I .… %IӧOw}'IzT^^۷^|}駒Yf$驧RIIvޭW^yE0%IKIҳ>"C矗$]ַN/^ZK/i߾}*..GI?{w%Ig֊]Q1m4ܹSeeez%I7no-I7o,Y"Iz7uVy^=czںu|MIҒ%K4ol߾}ꫯziS"r8˹ HSty6VgJ }(H g SjeJ~a$S^K۷׈#$I+VԩSs!I2iҤf<{U-]f7&7;QJLT~NJϗ)gJ;Q/݁Wvo޼Y?Z xϞ=ׯtjԨQgU~~8<]VGVFF֭['|R[l$M8Q;w3 _W O<~Xqqqv ]>XEgޢ"9!yK,c;D[O{-Z"իWkȑڱcG?~N*˲4jȹn9NI6 ?޲2mGޒjc\ƿ D@%,u]_}|ICSRRZh믿^-K/Zj<b1F7o @IIr07wy2,h jĒ582f=C)233D׫ӧ릛nb&蜹9a߱ӧ+g'5"E ٍ**yG5eʔ[R};Vm׫ѯ!H4&_^[n3j, @9RR;V2w7yK𔐐-Z(--( >*]Rv!Y=ZoV^;/SIqIvG4ׂ D5áK/D\Y 2ƊΥb9,f-1A@%9Mrrr -^,YB5b n  y+U0 Pc 7[@Tzzy1cJ7l^Pǟ'Q i͚5,AcYvJ@'T@5ow$tﮌW؜.Q 0 u 6(%%xff233"ԁikVp8: }(aiL4SԲe*?=; Qϙ;+… cy1Fo[_'lqe78UVU;• ZcTRR @cCT}{1gn b5O**+Ҋ]+l2-߹\JI6Wjs ĕ 233բE  U eYJ4H|ژ{ryn9jL׽\m{Wb\ ӘUz@TzzyAnWjj #y"W&}n/=Q/4iLPE .cwQv6R9ssaw, lPr*wU6 DՋ3~ y^\?w}e4C'r;uqܽ2i"new۷o)Vy"W&0B4vT4&iLh]pz5MzF+-1XAd|C!:\s5|D5׫{OF@l-3Z꣟}dw'~}7,AcYڶmK5b Ә_ذaRRRgff*33ӎhT 1nէOuA-[s <? hyKUTAIOO˫An-1***RFF_ Lx$cG!`y)XA-Z>`ĉvG ݫ7OR=ww+P V0 z4^W3gΤ&E\r{ 6hQiLPE .p*=߱V (q'`'DtU5kP`8V_6~eggsQm۶K., =WIکoϟz7`CC=JOjZ{V^M7I41JK9U0 /NՁ^>6˗).##0~zc~] qb~3.Q>Fi.?ȵ4?a5OhN{%[kEӄ'kǎvGf͚ԮkXҵy':9ԳQOc+w qD~^ZwN,R~\K?Dч'nʊB&)_&L;@x<=s<y%~{].^4ч'YZ3l=R'JmH^XUTL-[&6߿_YYY,8,s6#]m׫ѯ!U.8F5Ok{Gjlbwp1m۶ڇ*33S6$#DQ9Ɗ.PÇE,QD˲~uI;vT˖- z9Ӈ0vf)/{ٲ<؉cZ{}9-fhSƏ/cw xޮ׾mG4ׇ~?~ӟRF,C΁-9q"ĉ"5O*9Qެ׽{W[Ϟؘ>|Çtuֵ;%ݞ"]4с':'z T_Uz@Tzzgy3zJN;V<AD>j֣qWY%2:[9rr:$˥TX}^?Wm{B:YeC* ,۹Lwλ?~&ĉj/}I_ڵU[@l0o 9^w{:eKD6j֥A[U'kPA1ǟzĢ/8& @0hժUjӦ Wf$C3FJ:|RE&j薒^Mzɒ{Gj[Vl^4&iL@8(YSm{rn6$LLcؚktWڐ*hvïoV;vGՔ)SB ,Rj&+.3S %QĶn mvGLc&N/R[n3aOv8i*QEDNSwM m1rJMMk jQĶ==˪molgrQs@,P4&&7-" 5OjHMMLpK.ְ4袆 4W_* y^BV JQ_#ĸDcӘ@|]D ,P z y^}< Q _5;@ٳAG̓X4&iL@$3'N/ZD)_,gvGpїdJ y^UW]%/<N<(ҥr/Y"ײ}ovS _6meYv˲ԺukjSu䝿UZ/ʊ&/5bI֭[AD5˲Թsgj3CtlÆ /<%4/cw xurQ`-ʽ|yu.P-}׆Dၚi*[}ppӵE>XAc oؗua׭kC@IZwWmc6egdAՌ1ڲe 5Q$fa nN$r)55Dgnwg:;{! D_+… 5dխ[W)))袋/ٻ; cW_Q~l8|8iC̓3aQIy1jfwy7t饗j޼yj۶rssc{コ֩S' c~zj__Ƚlyh؈'s1ٻF^g-Ӏw;V1I(,,T۶m%I| $Iڿ5khƌO8Lc1F \;vTO'mH빂t{l}BiL3}t?~\ƍ5%)++K?$i?d:t-ZP,Rj Ww/+yP 5%h̩~hvGkJ >U޽k۶mx'‘A9 @4swg}m؇t\a%n$^z233%I_|qzR ꥤPRz. qPF8߱ֆ8M`짼X/3<ѣGM6r8,Kez+99Y-[رcdɒ ̙n6MyP!COײeꮋR&LtVb}-h֬Yڸq> m۶g8/o>I /?C5h@o?|իWOcǎUtJoS9sXȑ#2e9bwE-\sC.2=p5"B8PE-3"[Rv;c>7yPsQ뺭«M\ۿ T9jŒ[*;;7 $I{7w\ 2D4zh͚5>^zvyYB GլYn:9W^{yiɒ%ɩqnܸ\.Wy ղeEh\4>5w8+C:H6lp8&*ޓ'[8gU>k!}BP RTKnذA۷?Lj9ɮljѢmۦ>HJNN)==]wygm%%%ZrNuvZ(΃hwqc Μm=#5bEx]a-Z}%ԸeYq˥5k;ZӦMҘ1crZINN ^II 51 OJVa{P VpeYTOokWgaڵ ,:衇Rݺu攏Qq+**RhիWx<{^r8#coߊkߊ<VdyFkvpDżaveY\.n7ɏY%{}"5rI+sas͎cl_9n\}N1JOO_8#%<޻nI16Z_?'.G򿯑<#| xoқm7kY%kY*Z&ϻrωUFFJJJlۡcD&k}rgFdnz};۷}|w}׷ɓnݺ AQF:I&==cݻH2&55H2&11H27exSn]#$''i$ѣG;IfҤI&--4h{F͈#$3j(ӥK#w}^znݺ7LΝW_m$'GF352N|d:өS'#<&==dee &I{g?dFivj$'LI /4\sdJӫW/#s=q&%%Ld:ud:# >H2Ǐ7M416Lv̍7h$Io7&>>L2Xe;**OQ`TZiB hvRRR4h 9dNe۶m͛7Z.E4Bǎ%peO_ݡCXC, 0w{5g… %dn݂ b 0j(iӦոߧ~BIë,n 8{4B5bIҊ+4uj:tHyyy$áI&4#ĂxeϯmϞ=ׯtV³>|8p@yyyZvF [NO>l"I8q:wg2C᭷7|h7ɏ^Z#GԎ;j5uTYuQWvRW_W^￯͛7vQFׯn*Y+fDD<GxbM2ECUzdYrss0n[?tM7cǎr:JKKS޽ꫯ=+ղeK9N%'' .<9p;w_|Qeۀh"{ثKԡCmVʕ+UVV+B~YDx%%%cǎjڴJJJTPPYfZl5kfwL7x`]s5ٳ4`#TBB.w}jժoM4h }'ztw̛ۘ7O{VRRo۱ctwh̙կ~3fؘ+T֭S.]Dc,;;h̘1? jܹS{5k۷an 薤.Hk׮P8IRbbIhveIRFlNx2e$iС~9@qq zj^Zk֬͛U1C֭[}F+͛vըQ#nSLj)5ϋ/(I+kuµޙ8q߯"h׮]ׯ~iAÜQK.Zn]gr ,((ȑ#m۶?үV`n(\Tx7u뭷yڰaNi \*3gE1Wddd(77V_-,,СC}[nEsW_}UwV4iR`pyV\{G 9s&npµ),,1F{￯={SNZ`g+ /,u]ZeYŋ%YJ1:tHzҦMp8vZ]x'}L5ƍշo_o]˴g._M8Q 6T.]ݻwkݺur\j޼fΜ'%PqqvZZ)OVW7*o+++MTZ dSTT]?4@(6lvޭ @Rjj:t+RyyyJOO\x hv?))wʦL)S$@(N6mSO. %''n?~W*b]pGbnrZs\~ Ψy@A %%%A;vr bယD;:ݐ$uQgo~}k:5@ QhGXFn/X1Zp$)55Uݺu z6@юzf7$IFݞ6mZ}*,,$ >᎚D;2ݐ$o^#F$XBSNϡC'Ir84iRH3-jwyfWٶg{Ot:*??_P^^֮]ѣG+##C֭ӓO>-[H&NΝ;TGpv,c;[oooѢk*?zj9+?^SNeYg֨y@Wvݻ뫯+_7oVFԯ_?~U:D< Q qe7 @% D<Ghv"n@ģ x4f7 D<Ghv"n@ģ S:q?kСjҤԩ#˲dY233ϳE/[1@ I\.nӜ9s{nIDAT  1Tnjxl~ƍ;g{powɓ'kʕߛ5k֭[+!!At:E^zgtӧkذa?O9rH/{ii,Ybc"hvFGӧO^'O1|ӧOWvvv_Ѽ>)~*E;Os^XX-[ژD#1@6mڤGJ؜_ 2u={hܹUڡ ╛8s4PŢEdY,}۷m^зϸq|ۧL"I2?u]6m(--Mei„ 5f(**/Çe˖JIIQzzڴi[oU;am۶JMM9眣Ν;jzny뭷NgѢEu-[w맦M*))Ist|P|i=T\\^zISƍUN{9r>z3gƏN:)++K Ѕ^nIfRIII\lW]u{U@馛|g̘q}׮]KVZ5ۙ~:?L}iر9OǛo_:p@bmڴIo W)'У>ZJ:tH_|{9=zi Ǐ롇ҋ/X%$:tHҺu?I&LSO=%cYfmٲ;w>|ѣGkƌ?2;ԪU=zTׯ5c eddȑ#5k$飏>޽{հaS7nҥK}~O(\4i<fΜ,ユ$@@_.jEN:0`@>NYY ^ZԠAnZ^&Mzʶ-ZExvWFFF*.K#F}ڵk ri:vN8~ZyzZ]weY.5lPz%I7ngy椏krv||ڷo뫤D7o(**r ._kzO}^p URE;vPhh{ܸqZtj֬inݺi*Y$iʕڹsgkg VCq2Ǟl[t钥} sl[Ήq`{Ν;PeffcGz;V?n/cÇ? X{*ym͛g۶[)1cÇZpF#G_ׯ"uVڷo.WsdĉƘ9sZh\D.h;+WZZT-ǶO$?cvsp<݇'AV{\}ҵk̍?%9=}ш#h߾}BM .+(\U飱c0 ͟?_#G,S[:T111n\? pt[n9z[[]Jλo~~~OnTi{ܵkW;庮VZI;ݻwk…"EXPTT}ֱcGM<ͫnURq dF+%K4ѸxAmCdddC~gd^ 0/^lrZ>^/^tZ(HvءyÒ۷Ӯ|;""­sc„ iӦun\@(v b7lؠŋ?sΈx|}7.Y۷ow(S?SOm_vM}ݜJRLLy}f͚ewsft :4˸k׮)<<ܔОQFL2n۶vaw^rrzD׈#˗憒YФIo[Ts9.,SvWtt3ؾ}{M2ͫYw/ըQ#;wNӀ4uTC 4Pҥ/ڶmc{Y0aVZenP9h ZJ={TPPӵa͝;WwUDD-[fwz7't̙Ǐ+&&F~vڥ9sjӦ;f]R%-YD:u-Z]v S5뫌 jZ~l{]QF)))I7nuԻwo5mT}N8$%$$ۖ"yv7nzkUTQhhfܹCs˗/ji٢ bŊJNNVxx~IÇ5v<ƍղeKI֯_?[n]}%iĉJJJ2{IoݺU[n}*N:԰aCkN7oVnt%IҦMi&'OOOYFQQQ$iN?`K ~Y63Eٳgñ=R@QR%޽[sQZr-VڵkoFÇ6Zj_)//{{{+66VwVR^mۦ={#˼Trr+I-Zбc4zh-[6XEFF*!!-z{{kZbիclHHH u5Ǟ< {79s挒u]~]>>>*Sj֬uUk˖-JMMT֭[ό-\>}Zv󦥥)11Qiii*ZM6ye9Vh(ƌ]vY4Ɯ[UyX 믿.nݪr]/_J裏RRRtΧ^j3337`РAh֬:uUV8q"n݊bZݾ}7oDFF"88...@zЫW/̟?Űw*]֭-&2P; hѢƌS:l9ʑĉOWm7{CDtDDd222о}{) ӧODzeʽv9;w8p VX___TFM[}cǎ >0eʔ*Q* #G4[UQ Fx̚5u޹s1.\r#=='NQ~};=z4T*_a̙عs{/o79s@dmJJJ, >>7|nݺ)]c{þlݺ999x衇*_\\^樈l;d.]MFd(**1jO?$=͛s`ӦMHKKT% ={4iݻwpƤOӦMOȑ#juv޽;֭kBVc͚5垏rg ЧO\pAy___+W`ܸqHLLڵkQ}[:ϩT*4lAAAƍ{رcHLL۔W@w>222_A^^za˖-ݻJިync8qQK;k"cnؿnc{D""21cƈDbHHH.]QڵŘq͛~̙3Gg/%Wѣe 'Ok/Bg)))&q:dx۶mbݥ\ߩSD???c|gŃjZlaauVM6:[n-޽{\XmذA :88}7n(fgg+{nI&:_7k,{?g0cItmڵZ+USr7BBB{l\tzCCC]G>}1`)he?Q 6˸y&oߎ{ hOQF᫯ҹm.fϞ-=zj*_tIh쓥޻AAA8qNP{_"""uԁ3֭#G۾Ν;1x`ԫWC.]7H6۲#FYѣG[Mw+WG A͛uL6ƪ~MOd͢BDdz`\Ν׺u nlsJ˧:uFߣnݺ2V.]z/]d:+b3<#O,..6j;s188XfF߫W/i&M\ڶm+3k,ɓ'KwݨN*m&fffV)Qo?T[$ &^9sSLA]k.svZTT$1U}5j$o59noŋbXXNN .bƍ+.KZ 9X"gwi޽{K޽m?.رct]wQQFzC:jfL&!"ypd7٭90;t`p֭[ٹ:r|jb͚5:7m]vExx8A=~y,G1tY~ 5tk׮!** ϟ G׮]uP9r$~wh4J黂SOC:)0uj5_Y..FnݤTi 4@dd$Zn www6=Qqdw#BL;Hqvv5Q5lPnz\~]5lPLLLKJJtʝ;wNѣTGrJ˖Fv/YDgm:gΜщ믿6˂ *Jzზь3xZn] H _V+6Q6Ԑs?nŰ0Mׯ/Ĉ_ntW։cǎ3gtʜ?^ڵ@皭+\׷ @ѣxE2iiiO?mRr1!T*iѣGd "Xr7DRۋF'\ؑ#G:uHeď?X III:ǚ#_<Qœ,9Hb^^^߿/D1''j:sbJJN;w7oyN{٭dDD2 _3f݁Zjܸq~4h`v3_) >bnnn}?&6[nݺT-FsOHe#"" ҢE 3%M駟+3gƍWZo߿ rrrV]hݟJJJVZI  V)E>}TBEEEb``OmRrJJJBzz:@RaСʌ1BZ><7\ C1p@ m۶:|}}dɒ _Ip=|'[Ǐ8`t,rD;P*0ѯCEǖ6=uRSd닞={-ZNh5H&//}6&&FM[u"""vBQQ<cEVurJWDs?l0L6 EWol||gy`,r>QQQz;"4i6m? xǎW˛1+Sv<:ʲ_~sΕֻt邉'u ::cǎELLLEEEذafϞ+W~w9z~>""-[4ƍgϞ+-'=/@LL BBB*300< V^mppƍrTRR ={FzM6ذaYXkM)joTf…>}tL89T*ƻ :;O>$Ο?AUZ]vٳgMu<.\={իW ;;۶m೥*ג5\UѧOԭ[Wئ'N&"+tb>c:QyߗM5]޽{^_h Ǯ]ǎ+0>u^{5:uJZ3fL#*KuӧO7:NKP:ۨI:z!7nC[_gwII ֮]+2DѸH_Tȑ#czc/\nnnb,;۔Xgӧ1h j?;; ҥK\]]1j(ݺuFo޼IIIz#GH~իn?CZ2Ψ]TTdpR׺u⭷ /`(zSXõ&r7*[o?g͚o`O۴icWGuY>zh̙3G[Nێ1JΝ;+J";dh P[={QQi7I;uŪU6^6ءQ 2NKؾ};222ucSu;Vqr_ȶoߎ7oJڷ0+!!!8p`e3f@VHLLİaʕSŋOT9 .Hm.^=zH?xyy?XLHLLD&Mŋ(|nTƔ.**yΘQ{)_'O2UƾM%W{C_]I,\,+00`3|AAA3KG~("..Nf 5lP,Ү$"cg7-/,ŬOF3Jɓ8yɱ{bF嗵ԹAPP_[;Iƍ+Lb)lPPsNi[}͚5 G[XG6mjrW\AttrssÏ?X%$$C:gۇbHeʎ3nC亾cT=5ǘ4 ӑKb۶mE_}ܹ債ƼM%G{"wVt SL1z)lU={8t|||W˖- |7U,mz" *ni,#vG*}uDFFBEq/]dvGhMnmr{m:i@{weS(=ٳ:i'v]vڵkUV͛cZZ$U˚]~R`l޼ G?]v qUKGÖ2PGoc;9T*ԭ[ݻw֭[uW[_}YCsSިH޽3Dڣn+DJִ;Dd<&"Qw6UM\UM4PPPskmE>:yxx%%%$Y& e :IMabs?vX,X;7oСC;99aÆ ѣUe'6u5j$תUKwUrr]eGh;/''Yf~3gDllѝX۵f CsSި̙3Ѯ];irUVA\RC{^z X~pttë\-^P:'FEئ'^&"QUl߹5k~ &]f0k@@_Ab6M==l}Ѷm[)F||٭$::Zx`F{zzXn#uv?s+uΛ7ݺu3)IVV.]*w,);30++ ݺu_k׮E~̾*_^^^pssR5\tɨ2r\nnnǭ[<˜lJVbɒ%hڴ)JJJpXpY궦kX禒QGo{MUxzz"66ɑ~4ٳQ+b`U899IjO [c&Ge:]""[O>$\]]F{Vvz o^Z޽{w5"?:Ǎg<#w܉t)2J(vC˞;wNJbΜ9矛㫯*u 3i{k=zH`T*gU82RSSuuh@?2ƔqeϞ=FmclQF:G_~ԁC>7\̝;W | &L ͳ@З)LC;wvvړOVmz"n""el~gS5-suxxx ::ZZ_fm˴h 4(WF{O?$%ô_NNNFfs?l0)Zƚ5kto֪U >>߿괵kBBBSN,o\#lY'vv]9|):v옔Fڵkxp/iP6F޽h,K{___4qqqRz{hh(A ՞177[lM@uttLYJRaÆ  _~طo__ֻw5+((@>} `ٲe P%Kt Tc(7n`ɒ%ֻb \|庾G)-..Ƅ e^z\yhР+t&@}J1y;pVX'ZMwM~EI999'%hU>,6=ubg7ٔ{J_A08*ehݺ/Ś#GJԭ[&M[;{=i=)) '4+((@\\5 IDAT\RʦܨJϽv))):#~LHH&LKao GA_~Fݾ}ݻwǧ~ZKaQQf̘cJSΝ?HNm]qq1y߿_znҥ0aB63pΝ6m|De^^^xGu:z ;vڅSVRr]>>>:Я_ryį^AaÆ :w=XzK.>LhowŬY 'Oo"c 8PZ޽{wwP>}FuZMOdnܸiذyo /իW,3qrϟ;wNvŪ*s(((@zz:ڵkI&!""8r>3ܸqVX_|Ʒ~ wưa:u@R!''ΝÇsNnݺ>.sJvӧq=111 *7:G1[:*ҹsgY:'|_~Euoooi>}:\EI:TgyA鬏9J`عs^V-l۶ͨQf[?jQPP bѢEر#t-ZƟ\pAW΋%K`޽1` 4Dpp0n޼-[`ڵh42dx|ӱg$%%xСѰaC4k uRRR "|rQM4Asl2P82>7\ cE|{Alێ#%%0zhڵ  222իW=zΤ6=]f|b߾}PCtuu}Qqƌ[Ȯ3FPG˖->yt:٣So5*[(._ܨ:jo|lu5 ץKTr䈮6j也>}zz})))===:LbrΞ=[Ϡ*JEQ4=1fشߟ=Ν[Ν[C.]*۔D+&&&u ٭[7:UF뻰P:thu;vй+Ӝ׵6/$$ĤmO>- m?sLTS>JCFHHݞ={*-ogժOu?~s%wK\?UyTN׮wfYBٿR?Zj>\CD`2g$''# =z@.] UVo#"g#]VǎqAS T*|?п6m7|&o֭[)@,yƪR0zh9~8<):c (%פR>( 3YZEk!%%O?Qk'N6Zj᭷M-ꊄ/6lBBBmq7oޔ,9ks ~u떂Kho>o!2ec5uؿ?ڵk,Zk֬1鉬 Le+݋:LpQTT &`5jQٻׯvj5֭'| 6V8pҐJooo4h-Z@ppʲspBL6 0~x| GDڵk8s 233wxѬYj:tߏtxyy!$$QQQĐա`̜9< zY~JCՑn݂6l]%5+;k^z:gQ3`PT믿#(!"Ñ A~F&:^?DDTLcb GBDDD9p`BOc͝;Wvvvưa*,뚨xQUݿK`Hg֭[o٥X̞='Oٳg1|p{s/R9y]U""*Mcr];v GѣGŋ҈K.!44ԤKlڴ /^D~~>SOGDDLGRԩS۷oرc~::wm۶bqYΝ;~`ƍEEE|2]Sm۶_DDDDDvvj 'NuS:;"--2SLŋ-2IhhN,O=V^MDDDDd"""믿,' +W6v7"##dr=/_F^cǎ8|0-[ .]7x<(M-Z 99"'""""6?#V^qơ]vhР@<䓘1c;vt@v;{ɒ%]6ڶmFADFFb߾}M6Iu=;;۷Dž Rpq}` mqJ%.}Ne˖h;&sb/sss9sq58 ss991oYAеkJsb/i:8 eggg]\\eҸqc|Gծt"KGGG\vͨ|""""khplݺڍj"""ͳeyFNcRGi*vvW|=勋,W]v  GDDDD$^z)!kSGi*SE%ӻmM5vXh4 """FU!"""6vvW W^5X^{RJc&ToV_P ر#ԩStDէOKDDD6M /!"""9s7oVGv^3f̀ZV: """"٨j,Xm""RTZ5QV.<Q};X7niBJ 6 *xEQDFFNGy.RRRPPP\?@Ϟ=q >F>1՚5kgggSNqnٲ7oF||<޽<߿AAAoÇɓ'qmܹs}RR܇Hn_s*lT*Ə *HQ鷋{R| AjjܲejwUUZ`=RlܸwE֭ѴiS#GbѢExblg-ﯳ+舶mb˖-hݺ5N>_d;S8t邽{Vix"\c=7nC=>>>www̚5 HNNƆ #q;vv^("-- :H-JDDD(++KZv}7nܨVسgЭ[7eJGn.զM4mgϞ͛ޥ}Uݻ#55(*խ1EFFbѣ!z W\A^pi魣nݺ3fL&Mgd>}|E0GExx8t-R:4""""h4FܭDDDdY!!!EGi/(**BtttpeݻW'mҴ&2í[=w1L0͚5T*A Xx1嶛1c222شiZּy0zhI)g|}}K/!99NNNHOO'|Ra͛7;f@@\Q~rrrsd$vv^™3gp%C#"""2 L6M"""Gfgg+JaQ7eȑ#!vڅk׮& K,O<+Vٳ(,,(韟oj6m`Сw'88XHCe߿_0&Zj#44T&DDDd+DQıcǘʄk֬| #y@EO}z||<`ΝHiGhh(DQFʖxEQD~~9{,MFɓ'(..Fvv4{ԩҶ]vGHMz5l.>Ј~m""''`֭ G9r7n@֭QNr߿ߤNӸ8uXZ޸q#j5z?tȨ  ((JM{;Y/NPIzmܸѢ,MRgU: ""sޮJQ`oW{/ի#44v*xv@W¤/:ݽ{ 6Ĺsp!o<+ĐW^~}DQDrrr˫$5%ÇQj>vv^O?4'k""""huV_/DDDptPah:֮]L")) k׮ɓ'gaŊf4s˽7\i*XDEEaǎXj xEQDnn.||| YlY͛yUzM"b#? .lՓ^e'H """En?&""%88 pssñcвeK,]T{رcѦM\pqӨ[Q6l@^^.+66~zIqrϞ=۷o{'MB>SLљ(p-q=SrΛ7Oʇ^1n8رoߖe{!((3f̐bMzDDDD6MR'di}qHOO+z puuETT=Q݆Rt]=]gy͛u^3 v  򂯯/0k,t 'N49˨](=֭y_6bZ 111񁷷t&MBnn.4h;vX=+@V+lj5,Y6Q Q:MO<RSSvZ 2aaappp@~~>ѣG,\/_ɓ_eݗ.]oĶ!xEQč7t&NHH мys899AѠm۶Xt)~g8:FAaوBHH4 nݺ?ǩSc)* ryҒOOO3E IDATf&"""5(͛4#!Ν4i҄w UQtt41j(+<YYYpuUnNS8::Cegci$0y3 ]AAʽ|||*`ȚT4r,GlRh۱cݻ^zYUGw)Ctҫe˖GXXcѢEJFDDDd_|4ҡٵL3w܁tHxyyaܹ9sҡT͛7"8p>>DDDD6AE?7 JCDDD$ QQ\\ yF y,ZHЈBE>|ёl]^^!YGv^N™3g>>hҤ zw}ThaGv^{!4JH ""{ 4lvv4@deeO>8|\Ď.\/rrr"ݫ s{3IF0dhrJyxbddd|l޼YJ1tPo챌1>C\v EEEA^^ۇӧ# (̴DUőݤݻljl b dffbРAw7o+W}ΝÎ;| 󺻻;""">ӭVV-C *ɢҔHv!!!J@DDDj 6 /i&xxx}?NWiYk%*vv^o6o%"""hcpppP:""rd|V.`DWkw]0ќ9s{nUиqcyu4lPXJzz:Hv&}]L>]0dR0{lNMDD5SCFM 0|q`۶m?>`̙8plj۶-A(x饗oU+În&xK/ك4)cE n`,[2z Ø1cj*ر?0:wۣm۶Сv߻wL.􊎎,DDDdDQDrr2ƏI*jB"77uuJ;*w]6,Ybٳ{^0i$c\v +VQдiSp)L4 ݻwGaaYUn vq[Wdd$'$"""hw^yj˗#..'cǎ?<㑚|x{ŬY,WUw~ &HvS:"""rQaÆaʔ) G@Z0h fnv_=FkRPgj5\O?+q'88XC /$>}%V0 {; RKÇiijƌ:t(7UGގ@ /eR܍L}ݧ8iUVQyV#)˲tYխ[y$?cǎ?EDDx)*1 C;v}TZl$>S+=#GnYfE={$iӦ]veW!!!! aKҵ^|ĉ[-Z˾;?^S JwW_k:qs]ffVZ[oU6m$gm0 ըQ>#3- @=} P  @.tMr>4MyO,Kiii1nf(0A6.{< |i5k},ٳg)c@.ܹ O3 C[|^͚5P)(cv?O3 C^{(00Jnsn{; zfY(c@.eJl6FE x;RгK< 1!7n4x`~O3MSs̡|޹sP)Hvå{Oc4f<HP# :t('L͛fYә~d7\jԨC!x\vvC*E@մpBl f PڵP)f¥H/iijyO,KΝh0d=ZeNָHvåC1qia+@1rHnݺnk֬Y2d5k0U^]]vz &ԩSa.1S:%ye>"ù/}U-ze:l߾]8qWIɊUll˽nݺ0 9۬]ʻT^]7wܡ嶎30bk׮|xrzd7\_ia]vyDlݺUZҐ!C4k,:tH٪Yl2=SѤI<eYo$I}uرcZf2r]kjժ>O-ԢE {z饗|6K/饗^PիHEFF*00P'Nŋ5` 2اMԌ3iGK?d۽vM0>իWK.ڿ4i$;vLJJJRffVZ#F(++QuV%$$Wƍ]6m,СCUV-^đ{ײ,%&&z޽{w^5jcǀk[lQbb~M{$͚5K6m*dnw>p嗻9r Lx=z4;Ud4b&KHHukN;vИ1cԤIgի{:u~g]uUkɒ%~ƑH|GԿӧ_OozJ{ZZ .t~'>mo]}ڷo~'m-[r-XD.effkULLL;&T}N>Zj/Tm߶m[}d t!EGGoСC%\“(b~Bz!gmfW G}Ta * /I+T_zڵ.cpbccբE Al7|pI*:bD$C=_UGɷ;ۡi2eJu l'N\쮓ueTFɓ:$'7|xL"I6lX&'?۷+**J۷w>$w}2 C={Tdd87S{IRjt7Jds[ߵkcTXX3>G]iRZBۤoK/L>}ZsQNt!ZtZj>@TjՔ͛7멧RNJ5giթS'hu###cWޒ2))). 6L6MgVvvvuZx5h N$￯+BozPpeo˯-_V*u #:8l٢4Iwhݷo_OeddhrRn{TD8_0԰aCgݺuT8} :tș.>11QTdwbbs&M8J;n6ƍSRR.]tijܸΝ;6w߭ uI;vPJJ4gEDDh2d/X@[lqw޺ىzrkܸws9gVffN\ Hvå뮻ΣxeYھ};}={8_m۶WÆ ]J̟?_ϟWvԲeKR&sՅ  mr<>#ٽaÆ|O9ÇWDD~|y[NԼysEEE%b Klܹŋ @~W/\˗/W6m$I4h̙#IZjV\鑸4͜9Stתf͚Eu()XR,a"F*|eY:p}g:_שS3MS'O,vIMM-vZfu뭷lHn;o^-[TJJ.\Xh;wCffuǎm߾#ݽ{wr-:|e)aR^Tf 0 eee-җ_~)Iz'ZhnYőUZnzǏKƌS6 Phh;>}ZRnQ]vYd7\7o[xfwM?ҴiSYU⨵]+V(33S=zPpppGڵk-Q֤I0 թSYƤZjԩ5 P׮]]:qv:|?((H 4$%%%9?|%&Xm6wZe3<<\ݺu͛%IO<zbY.]x91JѳK~;5f-ZD*nݺΝb$(ɴidYz衆 Z?tP+Wĉy|-Rrrr &wJ:t蠐iӧWټyN<.+~:|p7mڴ|nOa ^NTF %''kǎdgIrN _k۶mR<ׯ|}";Wm/q oMRRR*fg W^yE>KsTDaf5v]'OR4rT^CܾAaSPP|AIGj;O)[xK8p~JJJ*r9v옂:x|-ɓ'1^zݎz]tqq$WZ+PDD$iժUE[z B]?~s. Q_|r7) :&Ϫ~JOO]wUb;vGH,zݷ~{u?$iРA(riҤsĂUz|]xv,={86mkX?oڽ{{1]qRjԡCՠo>kN5jԐeYҥ,Y^xz7ԦMcǎ)..Nn;7aBuMzzBBBԪU+O< |eYڳgZjre'IjѢAS=zj 6LӧOv8nݺ ٳg󍈮,RffjԨA7WV2__tuLE,K;v@pmݺU--˖-SvvzyI%222P)Hvå3gr'4ͦ!CN>#F(55U0`C*$44Tƍ3}6{ IDAT 44tRݛ7^qFOΝs[111^ʵnMv(˲0y$Džy;VvvmO>nC|f-0[ݺuJ`BCCP)f¥G}TvaxnG}D4˲t)&_ Fvf>yɓ'EFFz; v@ {9ffx <%&&z;R{GzzBBB$IiiiU#j3MS$hтY6#/ɯ/\ꪫ4˲~<YL< $7̏ ieiƍyKKKv@ NcWl69>ia^z2 ۡGGmڴI6Mahرe[oe&Lʕ+fYRSSy ~dѣ>Z}v7EPu1}ĉ믿/>֬Y?Ol޽;} PXXeLxjذaܹsH/iijʔ)yO,KgΜh0d=ZeNָHvѣG+00PoVvZfvJ*bȑ2 Cݺu+n׬Y4d5kLaaa^.2[&LЩS m+0]bSNu&oK0 }GEѣs_|E̫[PHHH.۷oWll&NKer|fy@իWO]v{ァB3g{ݮ :p e!K,ѢE+(22B:r䈛bbb([UV2df͚C);;[5kTBB-[zJ1114i,K|$o߾.;vLk֬qwYF.|W^G-ԢE {z饗쮨0EFF*22R:{֯_СN>]ӦM+vҥKuIw2}y[N^5o\6܏\?^o:uz)88X111>|֯_( ##CGu]QFUxƍ^L+BKիեK߿_QQQ4i;L%%%)33SV҈#1mݺU ոqcmM&˲4tPժUKWV|||v&$$Kk޽ڻw5jxäID%%%ɓz%Iv#TxǏg&l6KHHukN;vИ1cԤIgի{:u~g]uUkɒ%~1GQeO^~=qQQQ=-Az뭷4|pIW_}fBPP $45c JJJҒ%KTfMu]_e>o9<<\ݺuSÆ ˼GO>;eO?飏>W\!IcUR{Æ :t萢u7kСJ.kvo͚5e~Bz!g僟~G}Taj a$vZ^pAjѢՠA ݫ HMt;ԩSG'OV޽e^u3^y啪QF!%%E?"##uwkHϟ?_۷ou]W >S Rc{; 9tAroAeI/GǨ}iKMvKR@@^M8QSNu/ԭ[7gr :tHaaaJMMڵk:'&&j߾}JNLLԩSuI&#oܸqҥKu뭷0 2d?^s-{Nށk.[ӦM˗޻w6oެFG$/0o\3f? nݺu͛{xVVVXf͚9ܹ&Njv9*}GrPװaٳ5aIͰa苺W>ѽ{"\REDDDȲ,q,ZHe9*33!b={N:ޟiE-#==]k֬Qppn-b$|/^,I{~Μ9oFMZAv-I _^lVZ9_CW-_Jl6Ջ>~iӦE,8x(+VPffzQhd$=zTk׮u-)Qđ40,RZ5uIR݆ak׮Kr:|?((H 4$%%%yI5kԨ6m?$|J܇#ͽrJ?~\:t7GϾ%CJJtlS()<<\7pR/R)Ėvvݹq7ekxxmk'=ׄko]/?ng5Qᶎzj)n,Vm Ɛwtٳg+Os+o[Lj~\?m4Y=z(22C0 \R'NwnYΜ9 &O8u֪]sc}bb+)mqےeq"Qŋ OXX"##.LZw߭3gjڵ +x4`ժUK|Μ9Lz>߀'ݶ؊D!]ϟw -}6y,RFF$)99YْӧO˲,8edd8'O3gs[oԩS+Iںu,X_~E4i$;wNIIIΉ1wء/RRn--[H>C%$$(##Co$~sN|r}:v.^K:]f֬Y#)C$IǏŋu15|rI̙3oPBB>CI͛_Kʭ]믿J&L={V8ZhL}8 IlO?$mܸQK.$͞=4ǛotIҦMwI7~#Zo:t蠽{oFHoD#߯sIRSSF>s r9ϟw Ξ=,UNRNNLTbb_LIIQzz\#^}QǶqM %&>5);br|y'JNNw>&MҎ;8ZJsw!$oq۷.^{O_}U={:o˲Jp\lytMgQW`rro,gΜ^~< `YeuՒdI9Rlcǎ9vܹ}ZtSĞfI ðRSS-˲,niYeXiZiZ999vmMSm8:^_'=ׄko=ׄko=ׄkoDyXw\GQKy_g2-y+굻ۖ6^WYy#FX]:feeY!!!$G)wgZ;ιnݺ֯\ҒdYۧ#{o2X{vm,76--Ͳl$+--*SzLy%ٚ5kz$&w׿c y_]ζzHն_'פv\qM<&Ԯ;wy &F<&ގkYuqwSnܨmU_mqǫV|AM4I3fs=af];ׯ'nvkWΟ?+RO?䬡]i{y[7:**^թS']Vk׮պudtlӵkW}r#e6U޶%_=ݻ/ױc$I#F(v剽-hF3)/[MPPY˒8C(mU;ͦy}Yկ__뮻ec=#ő KOOw4h"""\4iݻK*r֯_/%W3\5 C 4(tzر#&b5jbbb8a9f!sݺus?rHٳ9Joƍ][lz-I{4{l Q4e[-p3MS?:uDn@}IZhS=zj 6LӧOv8nݺ ٳg󍈮,RzzjժU B*o#/)ժU׷ZjK6mڤPsiђr'@z*5ƊTӦM8;w!I.\֭[%Im۶r4-[Lٳ%vv@vpA}KLLt?ի 8~&L^gΜѣ/{Uxxo߮_]$=䓺}Z?RSSx;BBCC5n8ۡa ^2&SN_M6ѣG]ۺu "5jKQ'|Poijܹ4h7BٸqIq)66{A ˲ڵk_)o1ˑt 7h׮]`HmڴQLLLeĉ -l6yFW^=oT jvåP[ |IVVC8Fu_0. 6LM4Qtttd7ij̙2MۡxԹsP)0A%ecY+Ij޼x_NN8 IeF홠s 70 44uV< 3 ÙD˲N)TLIR```nw! 4i<.>>!|D͚5%Iϟr$@a~Ʋ,%%%IʝPPKMMՉ'$I 4PXXL4$I\Ky }ȑ#/CDDT`.\fG@ń*<<\))):uN:DkԨQ·.mݺU[.q[ajڴi60԰aC+))ݨRIv:oVf[ ݻ5 @,bB@~0r& <'TƍPn4Mo1iO?|}ʘ w<.eAxL6m54˲c<?`\+tBTFDD(""KQeYڷoH IDATZndMg? +ƍSlllQӻwoܹSGɷ;ۡiZx15F2&p)99YM6UhhC x;A,(cy'd۽vyOn㸃;Y%̲,%$$(**Jax;σK#1)))ý灿 Ǝ,I&>>GʘtzV}8qFã4h :80O"<OvKRϞ=i&WRNNF]vcӦM)ͦ.]x; 2&yhB7oVn$իW/%%%UV(oJ>nO>|}JKvKRڵ|r=֬Y;j߾} JtRlT6Mz|}J?ք dTN|EHHHv<>n;VK,Qhh PJJ׿jҤI y_b^LkF4<'eYwjdzoض{Q~tȑ܀ C<>5k0 j UtHҘǹ#/b=ZҖ-[Թsg{SLڵkԬY3y>@aYͲ,mذ>iyO4MYF󟝃5| }$6mZ/Ay\xQqqqλ)RTGʘҕqWƍ sG]KC Ν;uȑ|رc[>m?H\6oެbGy\ PΝeC<'*c/3"⋕rq( w%+lrWn{R'TXXCݮGJv=LY1 dw%r|t9ʘeY.^ >>.UbJ˲J*6𞨨(oq _T(mfGweڎQ|iZl}TIY8JK~me*[(cԹsgf֯_O4<'$#?vG"jZtl6eԻwooQyOf¥Cx iijƌyOB.2 axaj׮}P.ofZj0<> # / 04M/$cРAL\|i;w.}P.ݻ\.aEyOR2&=1Pټ^g iv]o}08DDD(>>y7XX/Yyp`d7<&00!x\NNC8<hXmڴÆ c^L1c( x} 1l0 >U"&P٪D˲<7*_vY>iyO*6 #h>,R\\}Itt:KӦMݺ?2&*;JvȲ|#k֬hĈ޽{yw /q|NM6M #LԢEtwfU}\*^zղeKg}t͘1C={__ڻwoE/vפIoqy/*4;YSNٳuܝ} 7hȑ|퓍TeӪ_~'| }\*>AeY޽[SN̙3GG֪U+1BO?te"8Taaa:qn,RjjYypReLJr5護R|| 4H5jp9ٽ{} %xGe4>>Ive޽{k.Y%0e;oN9ڴin-P֢,8"z/?:6rE* nTdqqADdMd-t_ӦY9?҆&iӴzWNsN$<}<_NPIDDDDDDDDDuIjfg}kb˖-,nP#F@NNN7llSTDDDD#2>QF^""" Xy(t[{׮]Xv-6n܈=yd̝;¡vV/^K,|Le;v Ïs &1|u!++ 7bΜ93gRSS :GEXXX9|G1X,ظq#֮];wM1w\Lr 7`w(DDDD$ _~%f̘m'"""Vy(-2lقk>juӦMܹsFOK**//wDDDDwDDDDcCKmL?u?Daa!mJs;@RRRף%r"""""""""{#GB̞=s_ܕÓ͟?(; """"Ոz wZ!"""Rs &]٭hܳwn ^xOG5AIJJBFFl QeHJJrDDDD9bZAT9蜦7hDII DDDdYjh~DDDPobϧ`e'KcQ{G I """R$IxWQ@cC#&{Gw#NPIDDDDDDDDDTfggwew QDDDdYFFFKz(`1`ҥbwrrf,vQ@eǐ!C,<LƄۘQwTR`k8q4I70!""Ɯ QCCC """R]hhC """Rs lcB- u7_%4A7/p;v ٨Emm-`6cĉ>}: P's=$IXf .h4s &>ٽcŶm ~oO|ؘ̙3?8㫐Π)DDDDFe"99E^JDDDHPoዑ>)v;ħ~ !j)Ap,f3^y̝;aQ'4t:*++Y&""%2DQV~DDDPobw]ɓ駟Bewin\{iqJ̛7O>dWC.xƄ$IxgQ@cC#olܸ}foٳq"225558|0>clܸ,#::~-ƌ8z(>;t&_ʢw7k:"jjj8VӀ A8ʉs-dǎ+ F#>S\s5^߲e f͚Պ!C u?^^^cƍ` :M5p@:tn""" X,#++ ~DDDPo6&}{}Ŋm`ڴiXr%dYɓ'vbÆ "uԩSN,JDDDdY?s &]ٝcǎ!** eeejt:L2}mjjj0d 44S QG}dwaa!Aȑ#@!==,ĉĭ lرcGW¤N+9q4IuV::6}uu.@-[@ۃGh46ms""" hy(t]~W_)믿FQQA!CngQQQ] :;Y?""" h$gCDDD9.:ދ6Žyڴi^=}{(ov H5 .cCDDD9.N 0f,_-;s ^z%;4N A.&$33_DDDК4dCDDD9]Wv Ûon -¢E֢ ˲3xm۱i&X5+aYf!<<i(2,"""EEjAaԩN& 0L ev#(`1ޢ. `dĉ=kظqcn;`ZaZYI'""`P\\TǜEژ4wc׮]8~8n݊TWW#""ǔ)S0n8_=,DDD$I—_~{QbC'mLghjcO:Æ M7݄~):/. """""""""Ƥ7?_~gƐ!Chhtx/"&N8FbΜ9ؾ}:/{9x7pB 8Z1i$&""&Ivɜs &>kcL2ɱ~xmqNNrrr`xWU+}݇'"!!999x+D߾}q-(:VDDjq555Huy(XmѣGСC(3'N@QQ ;;)))'''\r JJJ-ٌ_DVV /? k֬wߍAԩSmn6&DDDDDDDDDƤ ͛ɓCv8}يxy 4I~z}:$I²e˰~V 4;>>^ `РA())AQQRSS\!"""7ApE1!""ƜI,vy->j}aƍ{v\s M6jh4S-N;/A""" h `ȑHUy(6&=mon'qłYZ8z(222`4jy' ʑ(xQ@cCGz~pd2 .hs#F׏;I&4]vf͂Vu믿[o,˘7oBBB^/h4χ=z$_$hZw(F,CeMmS?cܸq8~8&M^xAP__nBe8NwkzX, '/_Z7O~)8xWQQQJXp!lڴ Z ŨË/u;믿Ə?xwݎg}Z5ߺu{ᅬ,ȲKBEb͚5;vo|G_~={z-jddd࣏>|رc5ͅ(Xt)dYFVV}8֭[L> ݎ|;_5;;xQWWbZ ~lڴ X 8p{??7@II jkk|rO6l|Wؽ{7FAAl6{9ɓ'lق۷{=dggC$,]$!;;`زe ?ɓ'=l6 ovލ #~G˗bw#y#Xz5#1o*++a20j(̞=std2axg`6ϦL*|M;{Mz-h4|MTz˿{&|M=_H7xwo[^5Z$IX,lfv؝=ydon݊ p]wwM>T7QG.#ۘFѽ-6ͽLW IDATJL4aY"""@$I˜s &,vwRDD{zZoOTWTTTǜߋ555iQ BBBЧO&i>) -?w!""" D3gdCDDD9f31h a\#ܶiT9rq̙3KUUC#""" IqF^KDDD9gm ֭[n'2{@xx8ƍzl]g5 -+W;4""""iiiߡ9Qnɽo{np -&쩊qQdggX.\Ј|B=DDDDJ0`֭Ul^7g=/1fg}ݻwo?ئ ,ꑴh"aӟпDFF;""""U+VࡇVw8DDDD`CD?DtPӷuQ:u ;wlq߲eːX|9܏L#dggc„ (++̛7gFTT)v+)X{־,CU>~+>99݊|?nF{TT111e,˨@LLLш:9(vgwiɎ,Mzq,[ &L@LL BBBo۶moѫPNKDDDM$]94<L|䪫›ov())l(#Ϡ=zaaa-70Gvo߾C ,0j(!2~^uE!QG1`ҥbIp!!24<LƤ#Gƾ} A]w݅^xͶlcҳr"""""""""{ӱ{nX$ . ?WOCd֬Y$IϘQ@cCgn> =ӧCe;ӑ˧#;""""%%%;""""1`6&|GxQZZ A~>(t:1iƄ[jcߎǏo,˜y """R(xטQ@cCDՑ}75{޼yxwqqq4AömZA1mN8JDDD[4ӧAw8DDDD`CEܵ^#GF$IXf ?d=TMM ӑbYrC#"""TǜE ,, +Vݻ1j(ȲnXN4|n,\ߡ$IXj$Iw(DDDDaCژtb͚5(***?DDDDDDDDD|Q:(OS;9ꞈ,8z(FzDDDP06&{4!""" T,y(1`6&3 u7_%9<1c'. ""&I0!""Ɯ QUUC """RlwDDDDcCmL1!""""""""6&y!++ 999-&""@!"V^ Q jP0nj JDDjkk[=xb,Y#"""1YQPP~ACDDD <[bdAQ`8rH7{<Q wDDDDcCmLȣ{  @JJJn""" $a$ߡ918A%u7NPI2dx,`CDDD9Uzv?z PiHE'N 4Yw^q&""" Xy(D@š^mL6&MAQuWs""" h$ay(1`J;11up [V!`0;""""1`J5zرejmxFԩSQ@cCDww())~S~!;;999-*FDDD$w%DDDИP0QeJ>}:6oތ4ܹj< XS#x챰xb,Y#"""1YT3CDDD9Rbwii)zO b ̜9LpMo*ApVo* 興|GeHF?(`1ngy0m4ddd //7t1qD 4 _ڰxb 0H$aҥx駡j*P0Qed3EMOә3H($.j_Fj"""@QNDDD Poዑݪed@DDD\@DDD:<,Tic2w\5K誫""" h,c֭7oG9QbCD *wDDDDDDDDDDѣۘP6uTH0T#ImƜs &,vGz!n;""""1`6&ۘQwumLV+كM6?ĺu̙[(Iu1!""ƜN'$ 6lUw^9sFYY`ʕQ;L:Ϟ={8C/4Ap%0!""Ɯvmػw/)>d111Xr%A ?Q0Ƀ'OK :t """Rs &1ɓw^Ȳ YѣG#::}^h4>B6>ޗ H5 `ԨQy(1`J{HNN|{p8l2\G 4AΜs & ^{5h͚51bV\_vݽnDZc#==O=$I >}:nF5Bv,ZKt(bٲey(1`"Ȳ,u7x}`ر&I>Sx㍼s &? 6m(^ꫯg,ZW;4jNÑ#GZAn"""  `hADDD9Uۘ|Ȳ AA^?111jGr"""""""""mL֭[yA$PL4 鈍EHHjkk### 2~G\yؽ{wѤ~͑DDDD(xWB;""""U0`|9 22K,wfE_~O>͛7īɋ3(111uM!""" 4,111s-|1[Wvg<8vX|xG>jjjڠbw"""Q0`CBb_|^1tl2\r%͆-[4>j]wIj$I{ǜs &1Bmm-p̙Nw}AK/ᡇq '$""""""""cۘAc 2{=L(ɲ2!""Ɯ*Ceu߿/¢HKK 4Yɜs &1Yp!^{5QQQ>ƢE/B#??}uۘQO!2tBEN'lp=,:}6vlkC׻x|Q:({j*v<3x;3g[oA̚5n?oN\@DD&KzH Z $K$KuKEKm,Qlq~1n |[q5#G{[i*|z=4FFBk&* ڨ(h#oͮ[Md$Qf6, $aӦM/h4\HDDDwy(R1b^x<#Xr%L&/^3g\pV^FԎ"@DD~&Y^gie,+wWVAuֵ¬]NtZwϽv;e1xպ㍅q8m>1 DOL66Q]BBC.=(pN_5YZA q5z8CQ h5Z5sz<,T)vC=ш~K.ƍqkEZZZQMطo6l؀>N&MVԆ}lQ)} *pCwH-NejA8%;\n(BXY]b¹"xb"/Q/ hp%|-}ikV=u:;Q﬇aňx|㊎q`uZ[ݿ>3*3Z Q\^{ 5zuF`qW*:FFWs1`J{@CCCN8  f3 jkkQ]]^e\L2OV,XQ8""?Ya=xΒRƢub#/փ!ΑGvCa\bwv;yp浸_?`OQQj*̟?Zo RP/@ նjT۪o]C=?cm:2B:D-J OxsqY#(QpsH8k^#%!DF#64q80w\F*P0Q؝bCuYaP\\ AZ+{3gδMEqRƍsGQ$V_zb66N|FmLzF}bDK .DIKCH`  'vh4j6De2ZKQj-w\ZEU6T**vG"<_T~H6NIa+#/?= h*[&PTWs-orc#6L`J`K> 5@m Kr @u Z@ixB]K}fyZEl(هbwDDAC(,<9壏8IIy(vv8ngǷz=NIYWvxS(-vOBΝ۹!e'бUg{m _g -s[ުcW{}9nG7nonAqFe'/2Wot,P1DV*:j[ux[]6Jӻ}o]Eo}c;:sځ!@hqn؈L ;+1?_'v{[ĚZU!U@nxiU~Iefz_leH$Ixc^@~m> Qh)t./W =Tڪ Nx MzJ1LzHwddAkx(wװx4ۓX3sWJK ,pH=j$ˮ"Sjw:1)=+%`wZ:'ZV> c%c}\WEHm 5KSO=0zY!VVž {N678 !V+鍣Pv$EP‘m1BC..ڸ8bbtMD ڍm!$[[u&׿dQT[۲^U ^] R8 q,d[Bcs:#mLhx݅Θ8Nd+QkiiEz\ S>7B%G&+ڿZ|umDRx^E\XFI4P{ճu[[X\lWW(Nb+-7*];KP˹UmS( 2!X&Fb7%Y(,<7J;'lsr<{/19 BC.6]4P`AWB.5>6Q]:!o=p}\ssQgE8z4ƏG1S IDAT [PD,СC>|x{|ؒFQQ;64k bE1=ˬe'wOMG63̡fD7 ׯz]Ѷxݝ צ\a1PP YPf-Cl&$RE8]uu @Vbb Ku*,vXvݡʶu6"\X1z S@a@p}ZTweCm\IIViq7 4gY(,d&Rtz##w|< i$Oa%I_S]O":Uˏ. ̃=V֊n#io"xCШY"mwԻ'̯G^M)wM70Mg q}adHk?{=PT9@enuha"hg(6$$0}ņq1z㹟FHjU5 0j \'dտ\[KVNgp4:mc¿cQZnqu-iC\@E@hH~"4<ӧOF-DQmg҉|L~* ̄)زsu#oHU>Wh4}~~N&  _YLa?}ObZF#'L@0MÀ]>~{݂\dd$" 'h-&OQRDM}H4%"1< a 0}䐗\Ѷ;Ðhe'=dX0E˲X(؁;w߅v86.j[ibw0s(W\͉+ϧa6YuU'-k\/m\/?.ޏvވ6!DкF}7/_ +&(`EFrRV ,vG;wD~~>ZNa6aV8Qw)|QX,eRR|d!5.UUFuQ'A8~.çLiOKrk92*2U^1Xr4 &M5uˠL kcs" ^u´i< b/?8e6>ci$5g\@E姡s7)##0%FyG&  ʥ $!Dmu6',K SBClvQ$el]$Y(ɐ24qiМwV#¨"TѠE[ֽMDQF="zDAҊAq`q۞>#\eIGևX&pלtMwk̄TWv᭧=/ AwZ 8-G\#SSҸ }RR$ $OG GF~r{BX:}| U6jh㡙6 E!~Wojk<4 f̘F>1ц`ӬMHO@툨g HWަ[{9 'S@I<(tE[m5GspIFy?!8SZ<]*vjU[;1Gc1[D un"ҨGdCQp#Bgr-M1h5p՟nqi:Szµ>)Zn u2:HS?E'ltQIjp8r-07-D4yƄ zyRWWmXZ1!"j"2-Fj7̄ivoD014 F!0 T/Z`",R'Qh)F 믿²};vDѣ]~n@oƧ3_z<{.Iv|nTUҩ0<'cgǨ 25:ۜܲRcYQj+V7lUùj+V5# ZFƅ#5.‘gBJ\М&E]K Z^Ե?HH򄣾E]#ɣ4<5% \4;l9Z'a;uQOuFEA`:nUh){GCFE22Qs?`Bر;Xβ2aٶ Ro<}ـQf^#2233Ɖe)08m@)W_;O$~qGII'h?)U 8SY3V]XeEQ5 ٤(-Gny=el O&D`XB%DbhB  s\W:*?R Zu-[vHܨo3<LX&.rtž.j[ Huu{^b.:!ɐ!cNU>-5s&f΄dvZhvAa)[q Qz]?bÏzIyxT?e&dHHHȢ(U*nVmgjܡj (Ȓ$!$7 ,3I&!!<ɹ{fs=WNW!ae]u N'vuP/H~wu:[ om(Q2;tvbHA]m*Έuڸ:pժqvRU+i:j5]4*JEPR(P)APTJT ESlX%j=*I,-f+Fɂd`bh9wkf3C?d% >NLrg| Ą pGj(5vB_ۂaFDac",$I9+LvF&cǐ%q$*QQgqFC% FCKksZD.$I\х4:{r,ffKʔ˕Pw:DG亮u༤쌨]!/Glo[ o'!c >|(5˞;.ac"0.2R !ݹxHBӡ3Q9`gN8ǪQP^hحP(",Ӻj, BB>q}ƭ;h:xCr[.B$Jw\g}%(4BV+;wd޼y(\j?r] 嶷펆0TOJ%Eɞ?=U>KPynyq~Ims-|v-IDY}sED#JɭXk5X aKb5{)Jxjqu 7ڳˋ,hk"yQ*u: gXjlie^K V6l%)2wYNɴ0>s_VE; V 9b#IY~gُ^|bupЈIҩDN ]Dw|'J[EqhǍC&, .  YSHdCq^UQ (JV^g΂nTZJ-~ #_i[0:Dͧt=j??U*l7SHMv-EmknĐu wL5CLۄl'1Iz$a4YȯjTycw;R~P3Q!LHf!@E6do X=7tp_mj$9@  C\X~iŋ@0L8;Oq6ff%v뢣ߙRHt21(T@ p KJY YYdVeRR_ۣo ݮ;Vu.;?EEWqs{nsEu۷w*ZZ0:Ajw;NX PҺT-z.޲UHiE&^}A$9QN5 Ugt)t/{À!΄x:#SG3:.ywTmpK-\k|;G ߱Zfm/k1[9VROja i5֒]Z% kI+Nb8?.`EKP$'G4@ƎeE7wP\;/ĘG0R]O ``H?!-cZ:t,UU336cC9BdܞvE b9ZuL2+3ɪxqLV_]6ۘ3LMhlX1c=((]mB"Wc6mB2s7 jeɒ%<䓨D\e}U.Km$ۑT5 {3OcZcͯ8 U"c%dszr*1;Bqs:5>q!;p;qr : q>v%|\SKd~ Q7pG'I$6ԃP 3uԐZXKR^5E5~﫱–dTp/.e'0ƞ'uZ8J^{!zЈ|=C1$+`ϒ  ,`֭( rh3WTWW ami9+ CZ:4iiٵۼyzbN̻u{`kcG]{/E<~uk!?_}Xjk9UĘ:X$ łJpo]rɰvY)˲ԭL,vPx@pH28I(3K.xYGjwVM+\pW½]t;^}뿼SZᄇc@0V7q09̭DI$ו& 60ϮϷu̍˻S7E0t74A5\B 11M /N<) BCŏ@[$I%7cz:4Y>z[X[kC jOmHbdm8!IO>ܺN*pոhjl/S \ޡl$;VLyy]Z3ޡzZi~N!p՘G 8sd =Ë/\U!5}Zc܏{PKu5*n2ScH+9Rq+V۵St*8]?xǧJV&zOdD&xOU(j殻BjdmjĥaP}?Naa碫{1֞B%냋/KdtʩFNבURGzNQ^cƘ"ü]Ш&b:GOxI0nlaJ( ؞z/₉P ޗ4=jC(]y#"-#ThĘnEbHKTX8 [ 9|?o$%@}Kp0C}ߝݝ(3Tu}>^^1AgZt'I׊ęs v;`M}|ƜWە -6QDY-sgAccޮC'?=s W^ $IV6x9Wd%/B!1>* qlswK5w\k-HV+-NIsq0T`6$8Tn⡓@0Tɯϯr+V3-p6RR}ʝNla3.kV+wfΜ9(J--9Sw/^5JTPz$(? ]D3R}KŨ먜䄑A[E89qSM+9rv: e(Z[pW7ܴ}vTLM|)eG}݈~Pdr(Yl,%m^͍\5Shݽo 3<Pzv o7`$a*+k6aLO8>j??tpyrT@pΐ$|TUa&= NTK=w;c<0g">Lhh|A/0)tX({?\ߟQGa1BvQkvq2f90N$َv@h(V; 7T?&2(u/=7 v!*DF+:]4.628fv ݥMQ7:Q=hTJfaz"'ؑUƎR} 9UT~yxva(B, 33){%mt11?3`SV<. mvItCL];qmqLPYQ(%GX@@wvlA42bVyvZi}f3^O[(N{yaĘMp^PΣel9R,}BӘG J 6l={ʢ& 'O^ ~E`X!Iӧ1ڑ,9vtqAA8ŵ.bbPM@wlX.M%l݆?|'/$!B`ڴi]fu jW_ޤ~vOW?0:{mkڬbDYCa;!zZ`LtgBk5'?n}q×7/pKQa<5fui7*)M%DrKy?H} ?8S=bX_z /G۶Db!piq/4,~|}Gؽ?I8MX4"y@p.m%"TH/O ։h62cNYKvvP!&L"UDX {U頋%gM8"%,< E&d/Xz~$$ 8@ ^:dө<-7lDdm(P0s "poܽ`!Igg^99wU_DSO~%}깥,au1!# ;ѹ\dQMCAD h&1M弞:etpO4kZJ)?be '=O1~5{4'8M[ ^[1@0  ,`֭( ̙Æ @ۗ*88cǎ [0HDKn. I4%'r$~<ܾaϏ}wMp6Q@pN1YMdWgVe.6}wunޅ6nc[6&>>ѸhH@$ Ӎ_Ô,YJsV]/'6X4AIZǨ>ZzXnS`-Gy 1mVa;z-1[B0ɪMRYk!aFUc |r+zgFpxvqoiW㡱:zf<Nb;!+vP^^F!//@GB Geٲeر2{[n}ۗCSj0`p5j`;f {qX?HD~U)VXÑ: 9Q)~&Z;D#qXJ$0h6rǖ;)&w#:#@>kId0;0^ v& W>a`(2dTz{{SVVkonAIOO[oE_2suFG;'ꉙ3gbnyG21=vFNI\|OmYjkiE;:f][amjHNBѧ} g.4ۈ󋣸?g?&M&/~3ё]XVό3P32LBSm;Kb.bYRRȹ<܉b+vk\ (B@Z"vI-%ҋji29öqR+'6DOl1DфdS_̧8/aޓCJ\79>G:Ereϰ|Gy΀Dvo!""S: _ꫯXpai{pB֮]{)8߰`HM)9YNKk -] ;=@004[ɬ$$VXg%𛍶j;n x/d!ԂvSj^~)mA0[ͭdUuIw}󉂪&ݛ' hhmgنF׉<߉6 x۹_cژtMڵ￟]v t$y|@RRNNNL>o'e[j0`HO#1tHa(h'%>yфA;)n,$t%vƕFqK:8jeݺu|GOz +W8\^Nwuu5.<EI`!v.;GCY m{['H)&@$.ˤf}يDG&sMBƝ_ H :yhlkzO-63Y$9X·;uW}sŸ5-"A9=Ae̟?Ç3{l|M.`h$ '))Cq!>̉'h r!""Wlذ'NH`` sfܹId233tsĉuXd [lgSG$%1+ˮD}E?Va96x(&sjkɯ'/f]BAo wuZgJQb#/((4*Mo.BAttyj5>D ~kNB_N+ 5yqsTduGMBC |l 6(3\PCJA )voFh= ¶`Q)T8)hv6o^ C N/Y|t ~8eEUWiMV; &jx31 bc҆hG/$͌3Uw+!!nFNJJ'/|W_}u.*wojz-.b xؼy3 >|fȢoS0["I{qh؎%!1cP'9E$ H.K&,N֞MƏ.UiXSփ݋v@pJ;R+`1sA)[F|]HݎI}'2 GkIo j(q\P(`qćyɄ w'zC^]{%ˮsB >O*OWdvnZWpI(mۄ3 (ϐ1iшRl6-v{xxѣG)))U;,X29aŋYh$''|rN:ʕ+qvvfٲemٍf֬Yaƍ7dmW\aW_X,+ 5ƌL6mvx ]֨D'v~AH)O7өDyElc.kkɫ## ‹/ȟgTGJ%>w-uօ?Ot_٪,Fk"@ 'vRZ%NU4RPCr~5)5-2v$^L$.TcC=p-@`p޾m_ɝ'g<)nj\0ui^89vlhhfw=NJiDe@TF'`G=c\2`{a…׷eW +cԩ;B_} 7aÆ6|뫪1cǏGTL\\\v"""z 9Gy_~@Nw㏳l2x ,YcmOPz=EEEOSIףmmؽ{>8'&sB P'^  >FsOqmdjbG3JV\52o2q~qL e .8IC e5){%_m(zsOa >I^+ۣۖzۑ:0vmdOC  4V$A/0[lH.{53hh'y~wtlY\y0d#srrX`gʹ3ydpq97=P8zh=sNB77+W+jkv7ftg'!_G焇GۃV+n$ ֦& G$$ {u:Oz JB7~|{IxS 8HDN])e)X$ 7EdsZGOtev.<=FJ)"EËf4$IP 'Uto8qfCsGYݳЭrxg;l%d!t)5~T Vͤ=C=& !b|!Ӈ]*YI-O%?a{% m*%7O `,`~<3^G]҅egG݆<g@e˖؈B͍+Vp뭷ќ?ɦ>{o.r㫯`0ܡη~ۯ]ӐnE0t^g~0$'#ID^vXND8N$!BA][ZJJy 55%v$%t+v]W JXV֮]˃>)&#N60z͸]r5;(9I}1|-ZEO{:#jN~%ܒ$IIR~ ŵ,kGV*>#lLJy0 Rۂ#y5UB<ޢU}f7N yM=繐$x=G~j% c2|6$vz>טG f ؽm۶~)_hv IDAT~ڵy󺭧P(7o >|ٳg;/fӓ  Eׄ#^y'sӨQnKM -h##m᜘Av91L"ѣE"I`]ͫIv*/n,m^{M - 9 ;+J}N˂vA8=|K&l:jDȬjjsٯ V.h{}}BzQ,lՐ_mW\ r&aaćyG7L^ R=Okw`➹YtAw?b9 h喤hfЍ~׬q?ۻ1@0BAddy)tddd֭}H333.vk4~ayx>vwy;vqՊNcԩ({񣐑jEP{moZQTJf]I$nvU?mu۶멮#>u[*+1bkm]J%VIBjE")(%d46(%$ãCۦB;s8&8noH@:O.Mm~xx(9x&N&! `\ߋc2\l&55 ř3L,y?,<ŠH(P"aE>m^V( =x7y~0" MIcb6)m&* j<]"!WaEj, $$u%;kUL$~Cć{_04qLT*dmN)OaїX:g)Cgc2|9+xaKSA?O}}=eeek:t/ 6,OW_~T>3+<믿Nii),_"|lٲ{j* hiiaҥ?~;wG:u IXd <~mv9v=b|MϦMXnQ^^ʕ+13r|⋔.[Ɗ+^z 4֯__͡ ƳT{yѬ7$5#~۶mٳ~|L&K,m,꯻ yx8y$K,d2~L>cڵdeeQSSO7|_46ᥗ^JVX@RR7n/ )) +WR^^N]]/"[M6~|M1 ׿Ess3EEE[۷͛75pad鲥axWXRJJJ/`ƍÊ+P4)‚j7455l2Xv-ξ,[C^'94* f}ɓ'y=9[\#5Οk /@AAYiI|`RZx"VmM c/-uY8ύd )F!`XN!dk1ŷl͊i8]jpa648u+?|+o5xrL0/ürY+ ɠw7$D!)X6w F/dc"I2NTAzgGvw;85‡0߽sM(ߺjr{}5+F_2l=)S^jW{MVpvhmyR%c1hgOphu .|NjqFvQ @뮻x)++gW^ݜ3߷{Ds?.D|I/44bHMC1!}nϐlv\F5N"@0h25a6wYn,W3=h6.' a d*8{9I(1p8|9dfqftv%Y `ݯ奔槠 c\IE(/FyJ)Ƃ@2+d~ǾrB('L9@0WMZa]SКnIۡ-j;1܋Q^wQBIw>-s\V>ŊolE|o6'w/nY,VXC=Jp`@Q$_X 9I&sNQn~ 㮻鉧gߧ$沲۟vXLeT\$ } eyjY*ўgnݎdjTU 4B3Qξm J%_<֛aW?Y5fV($ΫpkIfhVk?O1tu:=.)BIE(O¼p@onIl\g8\De7ՄiĴO{n 0֖Gt0MaHJjEMPqSpNH@= #K k~b@b gm5/DzDT`S_"Gl$A?mVSOk^EI?#Cšva;)&SӮ<2ANK Y 3~+_gD-yǧX:{)IL+OD],%d{lܔK~5g{ȫsaekV( &TUB77O? [oխؽm6rssXpaC{w{m1nM&iGѾpq%~r{8{ ԷԓZJRiKs-7 v$4J &kvݣ=F3ct/ {*N@V{|(۬bZYzy>M-5ڑTWMI:v֨ЫiT6gxUQe_mnK_'wx BSBdKT=od]D04Wc_'V+VG N(*_wxTud{ B=PU]]PDeX] ^]+Q,bTIRMT{ a&!y;{vd{9SWciiiDFF|ٳx饗[/**b„ 9rZMrr2cvG]*++̃5Oocғ8<~8G@gخOnFC%wP|='XlhE:k]k\5̷=k,DcGp#}vS1OO&7Tm'gs!k7g`_lF1'j+U۵iiDEk,BP_ɍo;#t(?ks +5U48&BTy^;z(7on-77ׯ_O>{zz2gu{96ỏ'عs'LJ]vj*RSSǮ>ѣ|u}sNm!C=tMӆ[ߖ$('D716pdX)Yq|v۞YieISal -]w}ŋ}|DDDC+t:.R}%Kx嗻/wPΝ˛oiƤ+RFj﷝LUJ2g=F?JTnǡ n}B1 *>DJ^  Ȯ!O?e?}?=l|UaRLxqB(e9HLkÚIg~.< /c2X~=]v٥H/BQ.#~`oW"OnGxմڣGW_B8{^祝/5|x^2C;g|uĕd{)wyC;k9sȐJѥuzegͬY?aD۷5kְa=Jee%L2ns9Y z'o>EZiZmN{; 8$N!=r@ƶY lz_m~QU>C UHvf#bR23Ba6mvujHjF1&h"㚅װ-{ݒ36ۆmAAv=&ذsj"}:3gdƌ]*9*w^Fe}Ŋ\]ϭGqqVU)vKW2pnqq*$Fbc&SRhڲ~A Z~^tSm9 jye5ҋےq z}Gx[ߎ$> ,{m(|-LU=*+Dqf٫ }bH[6pT1.H-j@=U'.R;;!:D*/ٸq#;z}]"ɓ'7T},jS߿ww&]٭( uT''7geأMٷrλo8=BgRL<2ܵ6_ّXuvJ͖y[t򪦪 ոj\QnGcr;g9a>Z`2)-0'ӋeUTnsvR3&̇Ax!')~f̞MB%Of ѭ|xC $!$CG0^/0fn0׷\_ӎK .|#rDeTw߱qF[@@CT'\|1W\OѳDxO昅X˺ܥ}낷^gZ^erWGQ;!}3qQ/lȞc~$g|9*L\'G5i_/!q~٩{]|)9?BK7fLOj;02!ٝU$ܼ!,3tRȚ5k[ҺTT&͛7qF6nÇOxJϏ3f0sLOĪ8s'T!!!>|آg2P{U:uTڅ mX~^0 }f&*gg\G=.Xbxcg}teue]-clSLڙQ}Gq蛘:ѡ1 >w:vM$ۼ\Qeҋؑ^ľeMm^L!@UEP`H~?'?J}sϥ ϣvڕB!D{5|ri1D IDATT9|"n 7GL)BNN!!!=F\]6}#G4$lق`h ɉ>ITTT{%8rww'//ƒRvRbnKR?[Wm5Mhl,4޸)_΄fn66d}B޸ XuՅ8k݈}!{xR!x91E!a"*8^gIEl?b@l>]Qk3I {e[I !EQx{\ywv8BtX>jh)FYt1|> =(BUU]ZIvo7wQZ?p 'c9zYlj{}NU) ۵Gt碋}(±c$'3'Q~<}o|ݜ: Ő2BJ`u_ aūա&gk]̉Vg3q~#>ҟ O-[kؼcފRS1nqqU4m|OuٽWvB[ oN{().^sXA 6nx8LAh4z^u#n>h~k믿;%E]̙36mZ RA>;bd }oB͉<)v鸞ɾ335vo'>#FXQs!cydVG5.鈊|w ͉ 1\''*k ,!)iE*ZA-A|"c@)v 릛[l-:joƫ73]CD=n}yg;DxGtbTBt/ذ[΁h*(E"Q3oH޺}thH|o۶ 1$VX;+*::[UN:9cIIXu0zn;隽fZ&d8d0ozNhtR9ML` W pp-D(P^jgQ;w}!|Rcr;`0axaE-bv.hjKO'|0WmE׫fp{]z2S܄bc  ii"D7z@@ޙ\k qE<::h> ڝ|wvxʨQed>JG^T..mNn3V0)&*- #dgpZyC &(}F㮕L&(8[+s|,(_;{;|";sSc$־\oI95(0lذ^mh"גyuS±[o%l"D7۱xlcVWsş㡕'J M%[|K )(⵫Y WBYL hG>]9zM6qFF_!XAfI@{몽qiv9 +W`7yt֖ş瓟}o[lt  )!l1!gOcv6snGM}cֲdR8_ВdGz9k~nG5Tn B1mUJ=sT^?Tڞ;S?-%%?gAJnIa~npC59ߠAN }tzKh"ƍ%DsMus{j})(AѭgC}?]6o,i}\ **J5S@N 7O;l:}٥ m]F1%UmA`osr;ҟ?B}~?\_eeh1Ǜ=ktߨdJ?-Ek1oؼNJAo4Wv[Fu1øWd6P:8J3E1Yf *Æ cѢE\uUeIEagUv\,hN!8Wcu_r^23f\cL1PB`Cgp#^!>۴$wfSo?ekjoIOL/ޮSE.qߟ* yyV);r\\ y )`q׺-?P|r.~O[h5jx$#3XN*uyY(#V# VFWc,,l+#R D7SdɏKd%<ٝU :k=fz ϹiO6CBt}ӓ*B$|||7o .d=`'T7x#oO +nc{|ncƠnśMxUo;9/W]ήׯܺO|j} v k) dbNr5[De{ߟd*X1 zFB?"Ic`_.,5[\wuh=5qBLVzZ﹧K7Bh2i!xBf9\Vf[./T7G94a5.:=]UUILLdӦMLM8y'OupTR/D-{m~&5* [o{_ypVvoJ+!( j& ʎY?v0u53XnW;AhL}b{2 11;wOnyŋ={9'T~~~[VX+Wv|`B@Ƕ=iZ6ی>wvfەptVBt~paۼ l?_1pʾ &O ==\ȄZʍ?H^Uc%cp˘[:1*!e,z{e[P/pzW4p0jNbk]tdϻ˺u1bW\… ("+-B8NJ^ [huG#lqs 5ێ !-! ѳJ&Ysۻ;z /Eշ%$ۃdbڵ,\Z[R3r>)(ȏ?B܁Q !i͔ԖX{hC6g.f;Iγ"O/s&ETjMy_yDwm'L&~/8FV7?o*!z|j o:cMd6{f560lx;K}ы) d[ e/:s421>UYY| o۷ooRm4;;^?K,EQ8^qdty:*Uvt/CP(< {noc:!b)|c\_|}r{"%g˯iAuY$[d0b2_8sS^ǸO@kr(Bt7[oeK1,B=Byo0w`'D&DQk0rqw*L<괖k"* y F̶r# G$m7 GaϞ==Z!B^ ~b.Wפ-SK&{ !z Olo1230be '4VnƀS爔I(f{}r{ϱF&)JE0P?U 儬zJ>Äf&Sg=}އBԈ|qӉ 38ixkIܖa_Ar"*qQPz#dwvv6>8paR)~g' VU]M?~6׈ ŇXgPIh=팭PcCY[KvO>I4ԭ~.k$VRL] aAVswv݊J!g\]i~~NV#SV[ƿ0;:kZNLCVxjyk*VQw8}f{ړ0qSyD6l@bb"?wScѢE\y/^FBogx;{ef%%ە Y2wj`w[ k;Yc 6$jHJ+b{Z!IiErSI&D{I:jWWּBy32s58wKne.ՆjMn !ST3m(^NI%7Y~= Lt`-ZĈ#:*4a.aǫ1԰ކ{ PmfAO}]}7#G,%%3k,kh\7U 솃ߘvqkBh3Sc-Iª6<&T*gu\󴂓᯿NQAAx}vG'hbnߍBt?ۋD=6E/1M[z-:\ޤ]ݩ$&&HF ngggfΜɢE>}a"=*E'ۓ^#.0j;*M +~o anGbmRWAEC"rJ? x*AuvݖsD_]CE(5V~.Fr8V !ZM q'ĝ`Nӆ+CXM0Ԋy,r#z'OXv-[!>>( ,Z0D\aѮbc& ogok78 >B#bRP!x4DN1>[Ѥp0!VDae]M˸HG3.ʟޭ"Zh4ȍp3~cn${ h$Bf ʼnOpzKYPwe(1g|(<7Q)7nEQYv-_| O a,^hD窬'''vڅGvRtBd ageqgZy/sNslQmX+DR[Ujiۯ3Vk_l0)?\mߘj6K;ҋ(1ztasr;!ʟ!^R9יEAףj>=w gݤިGն T/>9&0-<8KڣM{%11><#ڔ̚5E1m4iSM3rH+V`ʕVT5(3KZ2f ,+@@-%%ەvsrIȋ^9< v>.0)5J a5 a b96[vȮvrFq_&ڢ[Cb{"ECxxxg/Xx6EC߻$.D/Oy{$H$Ƭ !D& XN Qk=}+QM65-ڔ3fLmJƍЦD*ٳgswd]ɓ۟dӱMR olwsr>m RIwIfזA^k{IMΞ)/:d뮓Gz > ѣ;;!DЛ<>a_wv98&͛73eB;egq7pyupTBL;ҋXv-$O`W6=e3l\%&'WB~W?>>>2nd{vty:RR(+@uՆj}yv%5XJ_P[ص3>V\$zҡQ3o}mbpie袪:;!VٛXOvNZMBH]-Ou ,|{և뷿Jr#z6UvGژ)c xve{knMld[W8WF_ɂS볛a]/k;r2зSQROT6In/"H4W(|'6(@WCQ컐dw$#&5 i IP^9S IJ3 IDAT7'OTϰX/WFkmL&֭+Gz;Ṕd-]!;s;;$! s_`2W9ϒ Eq,z'ZC\M,['bD֥[kIehhaK'qِk~?;K~Zbu|aף&ŅjJͭH7ۇDL ¿38 GBsb;|"xmuze $Ҋ(xf[t&vBTCN(8ph, e|CԘ7hD$=&sBʧ?e嶕 vB/=ze*/B6 TUdO0܊*~Q*D+ujey@BBVj2g')) JO?!8 _M;rw#w<{ Pk ;Q3l>&0JQ|K+-S+UHo͐S*<mPk}J1v?|[vȞc -NoWWm'D3T*Ç0zh)|㍦;z}76l@/BqِPLֽ;wX /΋u)NwºYU*`8G+N︠`Nvoڴ J#iݻ+׃>> s<1-ruv%==f_ᾆmNj'F#C{(-?[ ۉiʜ޿w3oK2 OTH,&)iE*>-x4%I'MMFիWl24ޞjó 9d? aG~nf!ѫ\8*wD {x)\TFԬf)˔"Xw`Bt-zx:; YOv^cRI80.xA;7'7F)D7T[ߒ>}.ۚS1z.F{nmobVّ^DR9x)KNdhW}msk@.zZw!+;kt4A>@cA h:82!FuG,١ R^q~5kq5&MԘP ΃]v'naOg :Xy]9;wqz 1>8O|j=4Blq[mWXcK-PWb_{ V((5'+@*ϧr{\?~Ύ?JKKqwG;Gg5yy>1B!#3ۃ3%R i6l+ w,0'\jѳ9ٽw^ZGb׹DǸ0Qs5MF6ۄ.WGr^2a;!dMF|P=%%sAWGQ` J2~V/SZ"=ԂJ@Q1&̷r;p_\r.ѻL&6l-"mL:J"x#K푣D=wp/0)&*yFGTyWbD4U,qj6p!\O~14R +zKVwE(T*'NNz~J'___|GPs>>b}7cokXű{j= W31tGz|8n<mGLamZ.iElO5'3l\j"H4 U+G!zڣG9!:۽<2bb;;!z EQِr^ծ2H.|LhӭVE7Я_?Fa}Ŋ\R -Is%,x7 ZTS0@cG%r%ۓ!r 0lEQH/")z%խ^.NG1~9=2g'd2DBB@.1/QB_~ͣPͲߗ~z|\uRX}h*tܯPU!*+ j u o찘hONvX‘q.fԨQ|w wSN+2]]?~V{OPmנתx1L&(8s;c+ nڈ)EaNjGL6'}#ڔ?Iiնj-[=m'DF-- Dא!Jw3 r+sYu%M}NZ ZW2?}>=N,{\!A-(V6&grcj!t:ty:ʳ}`YCEq}o^&C;,^!z 'EM~ ]k)43#`}?}ZIp~yC"NTԵz{g|?zʗY!6Tsױ[LxCvpTBlyui',gDry9f8{uC\ۘkܹ2ST>v|y;sxdۺ2NJ/Z2(г>mNnyho*C^Vw85=}zg"he ؕJ7h;!*!zx^Z4ɟ u/5\RtoD4!mL:(q0Ȯ/^v/g/~w)= p>7{۟ #gflK}#y𳽨01uՌFAjDrف7u]ήd辣ѪM}x##Y#_h/w\[%6ൺbﹽ3:g)h*Fz3~@Mjn݅;;foP}W'E&h+^AكgK!:ЕI;Q6 jB.ߥ<8=$UNNho~~ ̑#t:.t5ܜܸ0B\\'>(>n}#\!2pr'7|jjy4/qdpn}Z =w+Aot|1F0_GJG"Ee0O:UlHtTxN=JV*ʮBBǻF4'*~0*\yp-ߏ낡%nUW_}5&+{*Iϟ#wyy<4!^o=meds #U@Ɓ9Oay_1d+)ׅŃ֭aѥG}r{R V鵕Fp_&܎ Y5`2xۥIse3bSQȾoQ_|B!ZQxvhV'Uh>|a!\8*"±d@hBTD 6ـ.WǮ]TPycs_ﶺsGGCcG,̭%sa/~Vnxl|c[~Uz-I?vmUs{l_\Bt'Hu1Ƣ"}.'਄B-KRmݴ6,DtGTviYvd]AagNjsjT ovRE~cvVk2طvHpRp бi}ŠZҊ؞V+=~;kcB}a8;I=!( )))ƢRYV9ԧ!zcKot<ϝ !ݓ(dϛ mTY!QǗNڀ2pD$-d a^a_oO+E."#xC++nN~l: uUqj \A5>_ZD|_@ɑ|j$-Dk(BFF111b?9QSs}XȄ`23'uv(B'y.y1ܐhuj~Bu 1v ??~:0r!Μ1M6&U*vDPòevno&#F?>rtBL%MiY/a9Yˊ&r7-"0Q F3VT6{6,=9*7*AJx9Pt/|}FvvHBH/tgw&Erw} ?Cژv3{?2,/ɹ/܏Q1?q宸Ѿ >8j@**t! >J3gc;*b{Zc̢*}*gG `hjIn .L&_|_|1jZ˅} ! WV6&`20T,3G]os EQX2!>(#2= N+8iO)EQ?RۅYs׆(xHr[!ZՑ>o>5Zp#DTR/D}=낷HI=fM09IBdÇIIIRL&˗/ ;|S|,Y//&}}}WX].O.W֍u7fdo>)tz&탌-2AU!ܱ"m{`/>=O6p8vRZ'*Z^KL $"F#/v-=zZB8JsYV -!Zk귒0+WX_; n+l udwEE/k֬FVW]uT*>CBCC3Dqo*www,+WXʕ+;>0+CӑZڰ՟Ms7ٕLzsv7'7߂V-UB4a2B^sb;c dl.~b^ogEؒ$bxhR8Ss{GzED'!*~nr!D)BAA}P@Q{=}jww||o[*-/.%:X=k[Y~#Tlp^NC/yp.?R1o<שR1~x֭[J"11￿=Vh4gJUU|rE5E1g5NO\PqAqLIv a4@S۠2ڗ쎘LVm0؟]B^DydPg$A2DIťCvj?LX3UUr%_{Mn\ oɝKE55#sOS5پ_da<{HzPhv޵kSN!=h FIRR٨T*ݥ뉍eǎzooYuLh2&d 0w\kMz1}cg$z7rv5MnY,/G~8ԫ3{rb*j'=,ث!OOI ]F}YnicMee:sJMOg֬J(+$*VcsS]gd+[ Tx5.wgGؠEeۘFFɡCPTꫯo1c}n.oZMAA~~~SX*E!<]]00]jk5},ψg?PyziNnoPWᘵ|9fʬOnQBI[T0<ĻvB?~?B.V[ݧa7_BSgCJ$D%3_LiCr +xYw|SItҲ@@(RDUTW{{pq!x?+i@ Inr~ - M|Mp> HkڵkiZQFrJTUeϞ=78pMgK>7az4:쎋vo?UU$IsIY ?< U%?rvUؙGbMYTV\Z€֖$qz|핪0p@9ghCFንcTP@άYt= !KABBcy; CU_(;ꏜ]M撰{֯͛_~֯>,aw ߿'XfyZANɧSLj cѾEֿA\xqqU3ZEnI⬂tkumGÇ+f{FTU=ږdxT^.Bъ0`me+]{TNUb%]FInN!h}r3ezyzw/Č!7;l!w @tt4Æ szu^^Sd>>ƙCֵ=g;D_1%."8""YmOU9A:< ^cdp{x6f*Ӎ֞)u&&N. Qi4n&w!ݻ7Sow^wx!4}m#41N OOX~7ԫ9 ,. sssQhќq51"d6gޟ֞C†0cwY|"Qaw./xQu .Um5=7YhmZO#585cplM3Z{n?V m=5 #oO f+V0uz瞢mt=3٬%nL!h]z-CݍUYL V9icU ,Gp^^^TTTPQQg{sQޢe -7\ܝWЮQa7Xzn=l'In|Bt$I$36Y`:g ˤ /jDz5^m(ۉNI:-ãBH={0: g'meLo [/_BBlߙ9IP HM==^ IDAT㦏u[/U=RKx*&O쁵E/4d!⒰;<<<16ol{(K4-[w87,O9BYu> 4 caKw Έ.D{SQ|F̶Imdll\=O?c,wסͺ[TNRsPnq;9 ˃1zF艏3[Z h ]hAOqB?Bfbp{(~όfe,L@RLcK'Og cCFm!ʱcڵƕ$&yWzzxƴhMBvbOoxuFI!Υv4:wL\x\ZG:/L6=q|UU0f 12zXAs!5˟IeFUUNX9ՀzcB'!&zD!/_>mwGĮXֿ !ܯG-}?CWnLd[ؑ_o/{MEw$h]2VchcҰ %%ӧk׮z@3sL47q/}m۶sB%,7B&a}oI߃ ?|Ca7+>rҒ$HbE c:ՌJ`<B8BUU8@>}[;*FYvwA?U !ecF_s?};g9Q>Åh3y2u ˫--<~sCt\gw]dǎ^/ 6Q?QCr%Э[7W%0b\|D8lgl'P|>^e' ;# ʡbRkڒ9UpWgzmI]8B m6z-AI;( ?O׀vg_tx5LE)wj<k o_|z+ļ_C'2 Y#\>۞b %%%ѩS'Z a3ѮnoSCnn kNfE$ZFmoM3b(lxG#ctr!ƛ.gp\2f4.=.ۑmw]'??z!eh6D-/ɓ'tR]-evFKm8qFveyPbО 1:u*չvwy5nEi!p9OQyѼ2/Ƣ;Fexmh]-%N`mLuq365n;˟&0U8^h5HAk]$'Wm!D-##uJyjuN(9<*? JUUL&ZVv\VPw"h!NlդWx%hUZˤ v fMb >Yڙ+1iJN^f:>F'x4cLpp©C26 ݞn!+v]ޖP6p&- )@bygZ!=I %>&aQ$B1̚5_heoA2-D N~.[vh7U ~-qsH~ޗ'-Em(6 璚D?mx1 ^gҤI 0P(**"55[m6hn)S0}tGJ{Ş^x_| uMP۸}"6ݯ/[n [?w*,#,#+_042XK[a!x{JX#SFv !Dۥ*|‚U[OWDWZxA笧~[;y!8euímLɓ9raaazxx}aZZO?4| 剳}QEEEO?ټddp)NinrXS^ޮ8P?̱n'1@RT 0,2X˄CzK-͠*J-mkgujnw;Ox+hsoxj3+`\MS֥ cۘMee%]w&&&Ȇİds=K/D߾}娥M4H6&B8 eF;}cnM>tYy$HL3+3JmoO ãBj& ep <$BgQUu#aBqO=Ɇ(7۬ϯύDQ19uûj ~] TϚTtx | $璑݋/;@Q֬YÄ |dz~zHKKsv,qEFp%v:b;hl#fBG29O-q!5= ΣB!psY kf#),gU[~v%/x~a'=< :@j#޽CA7Xt_L6mѣYh 0?RUz:[@ K1>!䌼 % 9Z@ᶯNK\X=1 Vm!h)fk2~x4 Mj,ڵtrzSA>Q_|!#hCK-(қ'dTQnLjs@o^?~Mpv C5mw*3ªµ>Ѿ$>pгgOQwH\5;hLp|7Ch#c`ﲦ?.ގO8ST^Un[Fnd`rAQonn !TXȩaK>+\ʄa0;y6{i=B@˟Lҕ{5U?3N)T7. O< @aaǨoDYfp 3U]57Bf"TèY 5qhvxt*Ӎ$IJ5XK/F良ݿk n !Dh袋]pl&oNzrz xy:!Ds\{9"')-9sEQy@+=ڃyi<z@'aݝ:u";;F#z߭_:<wqt+NH 3 JlԸu::CIn:&m ,miQIiF+6 %!VOBl(w D۠2,^o].w4BU/=0!DsiB]c߇E6m$ TW@vHde w|76+swPF#G.r.ѹ3a?FЕW/B!ډpγhS/޲JI:+m K T'ZVv:u/ݻw(5tPگEwEy,j_T:`}v ތRSrNUf fbLvB^v!hTUN'᳅|]Bﺋлgun3!5j <&mfGf` fӽo'=<|>hZu PXX?… iajq=z0o }˗/'77Z8OmV͉hy]vf;V!|D4}nPz685Nf rMMBl턒DJ!lfŊs=ƤSt: @d?20lµZ9ymB/9XgwJj۝v,!BdB)6'33ÇGEE3p@[aLPƔBf"dl> T\>jx+75.FAhKepcep4Ryp[!BX1>?1Ȉ|2=ARYm6̽RN}뚕CՏ'22Ȗ~XDcƌݭQY~pnP75.(׼!v :qq4Ԛ % d>ֹt!>&p{ !8+͛ dBѮ=IRN,zb+mftnJњytf]=>Ro+D&vL]P-k[ .AAKNϔ T z}!b gXmk=4ڤ*GؒzzB|ׄۑz_cCB),,tw B!Z_瞳}BȅO~sh=7mYexNн^W%AmLD&mLܬ{uXО oWtšngJkzn[Fo+(wX '>&>.y!B!D*3~_0y ]'-%Ia,=wBH_ &BmhnicJNYFao?,;"}cLdY*!)hPDkN~5IZ /yf3K,ᦛnr-u3b\0!( {[WZoNylcʄpxK=RuYV~-+]HmKjDFRO?ik.uj'#]slNP!rdI۹EN9zմ$ %!FO@ B( N?vŸ~+B!yJ+xzc}횁<2. uI^x>#/+]VRСCv)?2cFo70ᙆwl'|91Bf3˖-kmE_s lt,usCeBg8UvfE TNiee,ڻwcuB4_[;:0X=F?H4]mw(e`ja'3gu[Ǝرc{Yf ӦM6yoȡCPZlf3N`Y;7|э XBpW ˫L')@bv'_h.a5v|L(C#p[!( w^?ntt>N]Uũe;#m7 k-9;Iw*99(xe݀rv#JN a&bGjg{wϒ^xzxӧ䧟~bԩ 9{k %o{0Ɔ8c jLM[ ʫL#f|*]n{{jRnCm!BgQ++92RXUn!ڪ{2{lx ^~/oɨ;| WqF.钑'NlUUUF>Luu5jӬY$nm۶qA˜FO|l(!BX&9scʿпlj_]Y]a|r&pȢ}0mm9>fF qzŽa1J5tWNpp/:,h4#*X3+8Geܹ<{ n_{%$$F=q S5S'K lܶ%lȫ ʧpW%.ZO|Pv B{m !"h2;;v=WD׽ҧ)Wp/tG]VvB!ԖyL[oٕͼ{z [vd7XH/' >>UVTTĎ;HNN&99۷sakiiiDGG7xÔرc ]d-o/iҾ-gەE91 A`׆mb]\QMrT#IiR$i'>&X=ᩕk!™ZQG?(ts+9Gt9 B8M}obᾅt}cbD4&ڇzsӈHLdḄ˼!#;H=K`--XhM\2?o:8pCe׮]g]ߔ{ǎ\s5>xB=sHrJAY,S;V m=YlDŽүk ZP !Bv˖q]t5t5+B!ڷ?Of9}oja³0-Pp& w%,,8zꅢ(?uZ;1zzF# :tFΝ;4hq92L`ޞ2)**СCիQǭ}Q :7gwudo0Fl_ GBuY@nqf\/dk$wEgp[]$B!IUUvСCeh#S/*+v~Ϯh'Bpsd1Y_lݓ:xx`Zun1Ok=j(@{1ef3:_}v={ۻяv7?@QQϬ U吝l鹝nrJAy=tc$;vZ/>lG|ӴoJҌ %rzhbdXiCe1lx.m upI=qDF믿1{96mڄ(,i[{Y޽{i֮]k6GQ&N… )..f3eu VZ7xCǸꪫ0`;c%6W5v{@dʄB9Oǃz? i'Oڬ+BmSB& F2hr3hHh&s**Fv/ -XpVvnabEE99Y` ܦ)Q:-Lm4 M±(((*+xZBlٌVl6[hf3Ab2WkUUUUm,a[FIF∡ PQj`yX6׬9UmݭSӖDOBND}P^=mOEQٞWmYm~s"ω|FϾ}?'2rHTU~9ψ&n||-[QPj~..&E?cFzN I;.faBR ),| ^9h4 >EQ=m99O cJ_sB%Z\ ,1AWZ)9ۙoV{B^^Cn}ܾ6uu 6mڄ?ӦMs8 @>Tb OGEJy Q5{6EEE?w}Ν;;w.F<̙ݻYlxynwf}m*@&Ib Κb<0s僰KtcL=u~QzJRVƍYz5`peee;vȊ+oHIIwޡ'O{c{/_Ύ:}] ̞=={tRuV͛)--7,/P6n~Jff&UUU̜9#GsfΜIUU|lܸ_~?7xR?μyغu+KO={0{l 0 d|ɓ;7|+HLL`;v2^{58`zj6l`}N2220L̜9ULQ۷~ڵo,^C0k,*++bl޼UVdoIII 999|ᇀҏ?eؽ{7s!//ܹsعsuB~d>rss)**⭚__ ʕ+ٲe 1TTTꫯpAf֯_g}FZZf3gb6IKK>`Y?qNNVRR?@Gk+d`J@3sQ(]xx:|(P̶bkf>]}I326 z5ȫ^jZG>g/ω<'!?L& <'y8FvFU ׳o='~礽|FTytݣϪ_Ev9@OYЪǏ(m99[=i~~b;h] ?fSe۲21;4mLCZRVVÇYp!%%%(ˆ#[KXlp ׾.əJKKk+h8}=D!j45M@UVVVku kUU2j fBɺ}j֖5v+*϶mw/ 1dž?~Y{SOgm[RvS9O}sb_[|N|||9ψfq"R;x#h49_GO}zzxG_3Q;Վ;eЬm]sRu\L'.؅)'9*R ѤZ .F3y2M}P|;a㭅ե*۶mc„ :~sJSےݷy >!5Xtu^M*5vRT ʝ[|p[O|l(݂}I!l?䩧w.DSyr kn91 ~૮j„N1c VOed W$DӴs'&}9̧g`{fzsޭos8(Z&TUn(5(<쳌:_^^^tܙ\ܾ^u\8߬p;Pn[Fo(tMɏX= DŽB!Dj?2D;_~ UU6 >!+Q<BW}t6R R)( + 8g?7u[Or[y}x"+[4;쎌ٝ(xyyިh4`ذa| <Ԁ(**"33!vݾo'=l~e~i]LppYSUS%FnUuG|lhM'JtVe6_x^|EUUpn1iFk}5y-v1z:H-BǩJJJ kw {˖^pEZ>a1ff (rh9OD7wfTu|auy?7T&EQk,j)S{[4ϹG͛n?3enF,Y⼢g3f``'+=HJ3j`kS O>$KG!Bg~ ;Pgw-\Y * PoFay:VOyڈdqq1~~~M>zvU;Y׻F~ꪫX|9[lh䡇,JSңG9Sd5ׄ}#H %!VȘPD!.e6Yr%^zih{9kmlBaҗ[U'דɛج4ꃼu}n,%awkTÇqc%N8azҥtw:̞=7r)z!v7LPPv_'5r+c=Ɛ!C\9W~~>w';O_j;Ns) H|LM[h=!n !k.!ݷ/Q\sh]%7R~ ޽{2!Y{?mJ;oܲGX pCeI[h"Foe?9@rr2\s YYYv<v xl)sbk5= +x!Btv2nuA\CWgpEB!DeR^.N/0A^:2ʼnFimL:8˼y8|0%%%DDD0f61ڽ￟p:F݂iK'[m!B&?{VrD;3lރQgOݻ3hBQuszɆ4Nجy_{ W߆]_o'xdxJ?/r?g]\u-\ JQF׸7VԄۖqQ!H-BVLUU֭[N=+W ; "v2!h:9v,ka0dUP3Fv;vk4zotuUµj_ IDATT^^^omD A$ĆF!BRQQWO<$h4| uw9B!:tc6\F+.D RJmw Gv顪p>փ(M,g[V /d6/o< W'B!.ī3<ӮoB2?hQ=.Gvγfw/N9/cmDCv?{E5^ QZ @tP'_wɉ Q @@z'B" B }g~,;vf>;fYr&eѡaԫïKDDDDDDTQqiq!L Tzޚ!k4Ɉ$IAiW 6B <ɿn>*$9vc*P5i'O4}$Ip4i{NX n03fhȒ3} 1#"vɚ*-n8ԕmۖ ǐҰ*:0۷dr%7 nU\\u""""Źj?k׵BD18}u}"rH$t]68c#l]b1B97UHFJdiQܹDO?Ø_DM:URnq.郖Zf!Nls4vud pd.L: -nРAe^AKTYtCզM>}ڢ}ԩ6mLE,Y&Lp9,I;/#mbdm;)u^^h/?#"s.W:,gyN^ILjyM5/xjџYcPA* $IAp9&"""G!zzTw82׮/"s{NTDd &[5OhR.-(g{&X f&䳀æ:#IεkȑkЧ"? v!9aDDgy&G46۾4|7 8|(RDOQݻך9?qUzȹӧ>^:9;GB…mE=tݺjkM*k\ 13>hFh5 9eϸ@%)G!334O$ (B9m70ZOpu+X: ̰ _0r r ɨ5vYB"""rW\:95ӻwz8]4ӦqÚX?5>T ^#lw8MzyӉȡI(|8y͂дپ%Oc=}#8mرcq]O?4vލl5 1/wWFCqqktZ"JsÀkv잳}vɿqTŚG^'oȶXz0I@d\;wn݂#O>{A0g֎I2Π#55t6HB^Ҕ1#w,Dڵj~2CjWrv2DIDoQȉ)_a?ۋ[Ymv3h9ݹ͛7@7kxjxߝ;w@\z@7dZA ">u9M65<7&uwVA ~:zUDUVu?-;gȐ!\(شikҜ ~Ç˶> *'"""Gš _w;p%Ş(2ݮ];HϣR8{y۶m*h޼y\^믿ΚlB1mXJ$DDhX</tmU S(NāRd_ܽ{K.}`:t@fͬK.,$I[o={TEEEx琐,\P^^^r ZG#"""6dK#_A֭*!""Gšyat[ 1)S9@krB(E`ѢE3f rrrп_ퟛ+Ve˖X~=Uu'P*"=]ЪU+ԯ_1k,YNàAk"kzٶ\*5Ożڽ:lk?ibgAG$IA'L`zyfܹsPa B˖-QjU";;8|bQH8hkP"&&򀁲mG?T9)y![.oA}X9h֑A橸R0}k\eg節߃/֥`bs$IxT)ܹs$"""&Zlɚl[ mڼƜ\5!B$ FmUS;O:9(<׼/z4nﻒARѣ0(qЩS*qXRє)Sx<94ш?zqLG-yyڼ UƎ Yí["~UND΀5ϣy{컐j%C-'| H4&dnAJJ 1!"""%I+ȦHEEسiimn͚ٱĭ]5:  R#ch$I,Ӿ;R*MOcBÃs%"""Ǘu" +m+<*'""kdHڡrry*NVl_;2r^%*$`7;v,DQ:bDQĪUXM=ܶ?R1 Y[Dp,@DX={ʶe cVʉZ\.@~!NZ5#ac=-jcӶz- *~s}q'Pt(4 ƍÊ+_|ڵkqu(cJ֬YUzȡt:55r2 uiȚ6Zn˛ULB5uMb](⧣W5HDSS3`ӦMpqq;0zhԫWnnnz %#R9z).\@DDDMElذ5n` mXN4DdMM4Aff4ûŨ&4JE5uE4 BmٶGYK vI&(..]}TJ=H}7o:jԨuG"*gAl, /iH!Q[ڧb|zT:9myǎA*.V9*<InJ ͊pg̀=2)2Iƍqet{IA.g1?FDDDDDɉA+n ~O? йq_"""eFrL>5,Ceg/_0<6;Iǎ!I.^IժUC-P~}ǬYFDDDd$!.. \A Ν= Aᅬoۯ/ kݡپbKŹTH~7n={p"111ydY$I8{,#% p!C@qH%9E9(:AQLcxhذ!<@%~ Y5n """"""")6#z \ނ}/`RIZ"?8~۴aa yv JNcsų>K.m۶Xz5FR?l\(غu+k""Y"|u8ye' ؚWRQޟDI|9/0aUVEJJ y]v k%/jj:|}@ٮ;izuM=ց5HE57HN\GuD?m9n=_AiLt:Eُ4&DDDDDDD! =WDTb6/cA4HEDrE_§7mGN;י~t|Edæ1$Q=HO2C3?>k""YVlΤ(UND5:FWֽbkܔw>T"ӘL:UÒlق?\DDDDt8p t:Ů ""zl Bhh@PdWX󨣪gRF -;ߌRN۪)2 ٯ\]]fuH"Vj="[Wt27nu"| G^I]A CPuz`ͣW1bav6M%`lu Ƅ۔)SJ/94Q駟!bի4n.E0fei*Im'af;z/>:ān0$JJJJG剈DDDDQDTTz7Pd{Ϟ=|#K.ؼy3t:bcc1ekǣ DDD ׯu""G]bXWv$02< ݛX1PH-Fo(cQd;..PF <+;bر$ K,AAA1N[ȡ>5W\d۶'nW9 <c:5MP_< 6"^G9A@Æ - y~~~$IDDDD$ vbCNGGJJBDT׷.WmnO'Z3873cͣ/2pi]]ƍqM$%%Y=veezg`-ɓi""""NW^yEDs lEvT<[^]h*HO;vA??zF5jZ"ĚG{agXNywI*kQvRSSbA(fɒ%HHHx盶۴iDLzzE_c֬YZG#""" Qo>.D֌^Y7Cdn٢q2"zQ}1tSXhO0q)Y-rv E{ezuVu_~$  G}m۶ax<"JĤhذ!bcch&M`۶m^:e˖q[#?>mwƚvj'Peznnx9py" Tرcޭ[7$$$`صk^bԬYxWQF C?~{""""G":t>z!s(EEйjv hUpEF>?)!e4½gVz)2 /NcBDDDDxŵߐm3| DDDYsk{7?d+W1lv|F;)шӧ!յ+tg۶ĚǶjo>:c|ǒ n  I̙3sIȹt:[y)\]ӻl[T&DDXؖ!U\Ӵ}@lR|_WqSNTu""""ݽ{WD_vC2O,Ć g".e\:59%es*""ÚǶ m]l{|ǒ|&7vs"""rh:XS://ٶ;TNCDDJbcBym=A%nK]R*O9rss: eC$r:77x%ۖw/XضaMeb;^d>qd=s\(Xr%krZ7fd IRXؾOԂAwoN_)ꄲS&Yf͂^:bz=&O̚W׮<=pbQR.][F""kؖ .mؿ>%08, X؏!P4c3tAXݷyɄWvSNK h׮krz>{;ͫ?YDYEY8}iH+yN'ֵLiJǮd"9=Ot$7߄+qF|WyUG۶mٻ8MdBk!n k2OSo'v;h <իW 1dDGG?/_΅ ȡt:O<!"""G&IΞ=˚ QDNTajXا%jz~rnдiSԮ]GŶmږ/_x 86m/A"""rh$!>>57kpl[.NeBDdXا-k@u@4 gÜrl:u 'N'pI$$$'&&"$$䑎7o<[ E5޽B%ڵ Æ Cnn.BCCQN\|gϞСCwߡJ*=1!""""r^i-/C)%ǰB}{$.b18!vÀQKhUtʥXw3gXXNqIIIHJJ1qD̞=[ѹtݻwcذa8z(=  Bhh(|}}xC DDDDQ͛1x`t|(1Zik5ZfVU@{_@aƓN bv???F|$ 04=aرGѠA9s0e/0!66Enb̘1tԇw""""sZG )Zǿ ׆ Q"xJ4ρn"";ƚ>kWý}K UJeۜrիWGѨQ#p۷@ŧ11b֭[g:ĉѩS'\x:OOX~(CBB,  ܼyӴ-[u8zY:ш;ԩSرccs"""""s \k׆#LHDDDxmIl+È#nGu!˲c!*.kK:ݓ&M3<ƍWzj4ݹsgn9s2'aÆ_RGƍ^j*`Сz 6 ]0ODDDdoF#|8$""#I37y/q6,\'?u4Rk֫i \-*=YU eٱh9B儶J*^zOS{NNNf^^(**B$ݻ99sZt"?Gvv6n߾op lܸn:>}0{lݻꫯgϞڵk6m2]>w\ܺu D۷oǡC-Brr2pE,[ eJҥ|2$Ia4q,^]Jo1c󑒒 9[V^X̙3T|N† ׯǩS.zL|_͛7ڟ7onܸ<|cʕ;wŋի(...]?ػw/ p%Q\\Wޓ`Ν+WO?yyyq͛͛7"##믿Kdff"-- _=);qa{2g"++ 3gb[ȑ#  %%)y?vڅ{rFL>$Xt);9˖-ŋPTTd,Zp!l^?l:g!77nܹsލi&'Ξ= ꫯp]cӧO ظq#N8oqmdgg?Pz2nժUm۶ (,, pV(]bؿ?`ɒ%HLL(>}:DQDbb",Yؿ?v Xb.\QXXׯc…Çc۶m~G;¶#fΜ{w#u#;K..k!9!  iO}Gz 77vѭQu :ҙ.@\ZXgۍv]GL0Cʆ\xx8HLLDdsW 5}˳m6 X?'Y[dd$,XSN!33h߾=&NAUe6o/DQ FtEEz3/[vƧo[oYg ~Gw\hą L=w|O;~w bM?m{d&"^7thlOD3 F`BWE5oW|ǒ|NRW;ggg?|~-߿""""G$"v܉}?r9x9Q{oS|*|{QϷ?7?X8N@5ѫcbSܑ|QMȲh1L儶JpssC`` )ME)+-:;"~-O'2ׯ7 t@΁ﻃK]Pk0UMs#a N(OTݕԲeKWv_z}V?-Z(Zbbb$GFFшBӡ{‰{w䈺aRX8PLB;9T&WR=Lϣ'I Bvf m۶E-P~}ǬYFDDDdF .h: lz?+?*50uײi iR9S&^Tݕ4rH oΝwe IDATHJJ 8q"/)Sqܺu  1{kjj֬NDNλg/m޽{?'J.qPѩLvv8pl͛7M###QZ5ӶٕeK8pwĉqi<3Ù3g'7|[V}J(1c>z,nRvw:wwcQq,ZOJ<"6G!DzM@UN-A$Ij[t)Ə_Hĉ>|8}oo ժTv [@!,IaArIL/\9L> o}?-*ݵ>JF8_O ~B))jݠQ`!N8jwA4EYCzVkb~v M:Q(ʕV;솭W_}Uq<@5Y.m.3e@Bb-Dy\Ѻ8"W1Vi|dG9šӢEyH9vݻU 5O0T&M}dM(3hvVM&kI CJ\!^T&PP󄿋UfϽn[* M(솭?\.o\.ƌC@DvviG/t 5O81F2XS_}'-B*x֍7[@X|_BPeSJ^;iZQiXs֥s.ո98 5@SdiMca< nZz,:@:ʲ,Ӈ;NTQNNh߯7TS6%IKw-u8j]-Yc?p<䉐d 5ݰ7h*(((uH˲ԵkWj(cEs/^4)5.U'}'+l;%GHAS4OSϖ g?䨴 -ݰ5l0eee)33s=t4z/y^ueYJ6vgbcB@ m>v|_.}]Thn ϩLhvիn:mݺ״iӜ.K?OY 8]tb( 34/wՠጚ~);ow"~Ϥ0<1ͻզMeddJNNv:@=G0xTIijLʲJ>X|0i͞=+:Z ,^4_i{C5zf4'xt<5Ovq>=}ԫ(iahvt өyJf7!N P6loe8 ~kx/ֿ}}UX뛽& ݰէOc4^ġT6 INRn^4.jͲrWwx~)O [@X3h۶m<@En-ly2iҠflܳR'}]Q`TfRn94E̙* \.M0 ˲0d>/iuXehvqT5NV(}l*uWpk>O~!5` Cݥvt۶(=z*6"Vr\>G &.PAdKv{7HvڱcU+8-~@ɲ$_~Їpޢ#M6r_!ڋwMrwV~]gdRWv֪Ux k.K,Q#fe+Z,iRFitA<i|q_rؚ6mZ,׫{JY.s y I 16vMiv?*P:Rwg| [o6g@Xs\y H2vP׭ qߨypbک։JVzwŜݰuqm۶M '''+99<q:+sx}/T\^tat=?D=K#VSbp)޽ur_=|>Q㊎V|~7FE)~EH5NHMP.l]˰}٩)M %Qoy<%&&J֯_r@U7tt% C߯\g}B뗟lKJXY#yCʺ2tT/v+8QLc[ݻwW֭o0pcQ^^w.˲ɷ񭓝5ʺsi&EͬCnWț݁4&%. 6PABC_NNjNǀ j?#E14~Jup1A9oWѪ=.ukUs<ŝW{$IVOѿ8 Eߐ D_+a.c|>>jH>+ =-ر@R$iÙyp ;o/uSdoDC3~ \.G?5+HW$Zv۽4U-Qdqwv:@5j@bщ-[Y.%]pXj >*^YYppvWտiL멸8 <8S IB_eUqw|>, [?X5ϧwzGQ4S8}<+V{@}4aϨq\cG;gA;.ꝒEE6n~iRJe,ê((11Qvp"uݾ_ՠ:.RBӼݺ\IRkmE[6s_ D_n\ܹ3'fƍyHh1M@B̓ 됪H%I*RV:Cv솭sa+WR!׻h}EsBjTAlg/ctXRݰ5{lVar馛nB>}lyr8 /<8 :o/;)m]Dw9l=*@X|;w.5" Le޽;zם΅zg3SFJ{M-BD:ֶmŸJuLllz#=A׷"fyPj V{diKHa&AeW=Oh̙  hkuIeez1z{WIl_v+!'ƙnfi֭徦Mt4|ӟGz==NǨyp.#:0o_7ۮHiO^S Ә֢E?Wyee/U? @]׳W+Ъb tWNGרyp.Cۧ*e3:$}eکE;M [PaRlnڹse˖NGUrdK}+v] PlEwdvXTM:fviv':1{OSp\K \weL<d|\Ttsf7l=rx{r_l{V3oèyPe.קBxVffn֭NG , hj.,-CgtkP) Ѷ~?ijf7l9Rc1F .j 8@ Hh}lӡM!NyP.R2QQbb$v+!!D‘1F'QQryVP/Wӟ?t45t۴rJmVWկI?5kt4U0'w߯l-znddC!<\p,\šӂ 4rHB{^+q(@aLC_ gP󠪲;-I 7Mۄ0M#'gX1ݒTyN>@".ZUn-[nLeB͛>\.FE8 ~BvTre@AuhuЉ>p w!UUakɜa7ޠݲZWrU@xAu^~5ƵB?*={JT%<;ݰtRYt ,KC RE+V8 7jTGJaǗ++p>\솭͛7saͲ,uؑpHeM?̽~eRiqRUnzz4^WO=5+WL PyP]۽~Dھ,Df7l=3,\š?L8$e E5onhT@PFtٽdI%:դI#޽{k۽f7Otz"9NmN5}ri/~`-f7l]z饬 šӧ~J8lv{ qVxPv.W^7~z;D; w8ޡAMd{IeSZQ PQbb$v+!)y:su/RҨQ!N J}7h㡍2*vzjSÕ%PUڰWS:F+kLxR=їn6lg@X|Zd 5ࠨ-ټ>ϊ!N P\Q2LmQ&MQ˒$0M͗n?MeBtǎs:PY"@ַI_{sC5/)6J[%W:IMB>3Variܸq<ØO5wwjC55Cy:C:]rغx k>O5nիC@N]5ք0 yPSe_3!JtnN@zjm߾DJNNQueYٳ,@HDhftr VPE9 JKUF +PZ\6jx 5jgd%D䤎*Q_L+_ |vhv֦Mԭ[ŏ'<9sfeYr:PYu^ay:O)56U-Zhu5j*2¥A_NM=M\6$I)V3Ә_k֭徦Mt4zկ~%tޫtzVht;#ܼݕ,RYrLU;EeqGJLLݻt$0(!!?رC]uoJUb(:Qq?FY0Fypk쿽Ѵ!S[(QhvVJ'{q:PDƶV m3<8cռ$ȥeiv._.K?яyZ²,kh5n)j°2S,e:E*=Dx TpbM@~*_}-_IIZoX~Ou[tG̓@nMxҏI~'E:QwGyfYt ,K:tj~WvR˫v__,|@ ߉r9zp(Y@̓@H1.)4Ē_+N% uoNGĕݨڵk9fYzE"1:ɕhUѪ!N P67薤58~A FEh@fYZaDђe vݰ: h^}Yj""ק>HWz_M;y(Cۧn_UpXKkf7l,\šmF2}*)^F({n_o1!NSP PklO8=G[@}@߾xt|(?q!(45!yC%/1 nؚ qS0 <m0Pz+kjtDRI}.IK>uikFoRmJ=RrkiZ^iL4W\q GQ+!A]+Z"P<!~Xb*#y;_T[l<nt͛7w:J{@@G̓@*^RB<ݰrJ\=@r\0`5PK+\UnI-^x^.Q?hPP ZīEr$鈒~ nw6 ׫^xqre>ƍ@@9<4˲]/~ER [g@Xs\kyZ,R9jÐUhvJ()!n3tqqqNG2h۱mZo_=!c%jڐv+}5", HBS:u=J/k>O/5!7W}qFHhqT'v2/PWJ\Ԩxnv+W 5iht[|FQaL멬,%D%8)Q Xk?-*Լ?g)&5zaHRRR*s\JNN־}W_U]\\́xjVъ箑hvuR&c1 jK,gK.*%!ivwyaa.\4i:v(%˲dY |A)55Uqqq7߬EE&Iھ}{}ڿ$i۶mUzFqu7{ꀸ>s2T5Al7$U6V B3ow{Z60j„ *((ٳ5uT=JV%=Ozw5{lq͞=_*=_aa!g@KJJ}ufء֭C j}TҩL*^mKB޾˞oذFMVy 4vXnܹs|r+j۶$i֬Y1cF`۸ռys-YDSLQ~~>ٳgPdU=qNGPqzI\8T4PP aʜSN~gڷo$^믿ѣGkO~+WCg}V_dddPי$}GJOOkv)%%E7|tJ7n*93gȑ#NG;9pV[s׆\Ne=p5pLpRDRbwUYCɹϧ.ڜ6ds"C'5f _Vc*۰ 9R .$mݺUgqFurl_ڎ;wƌ#I4iy c."}UΚŋW~1;Zv\.kVcǎռyh"eggWGNMyjȨ Y ~'g?jkڐ˩ YYY{R N__)O魸޽ٸ$N.>u̵!B=y Xw$͍~H\;+}?TeׯW׮]d5zhiF۶mbŕ; 4h;Sܶ"(11Q}DGG {'N1&h>tyl677 ?ow$,X}V:β,~ۭիW;Z9nzW1qqq4@+**a603yHv5WvHLLTs] 6hذaϳfѣܢ~y5jHO>9ѣׯ_V]j|>^qSDD~(uαccO?.XcO9=66.Ljx2WXXXkgߜWv ϤH.KGn;hc4h6#%uwx$Fp8>q;vI Z_g]ݗ=Ԗcę5䡢CZpZJ cl(~&_wZ/Xϧ ;IVzLideԩ]:r2{_("IPD%Ίk|roĈF71[n=Ǐv׿?G Pk4ibFeje$ %KT9k$`$ h#ɤ˲LddiԨdLbbd&Mduf$3f$n>#\qFM޽$sӨQ#IW^k1_n `$SMD#_dƎk f$;ӴjDGGH2:t0'O6̨Q\`$nʹmXefΜi"##MFF2ednFm$ntH2=3͛77w}dl.2#\wu{Fy衇L LZZ6mdgJ#L0H2ӧO7&99>4k{F4h?~d&Nhza$|$''T3}t#L0H2W^yׯdMfL C=d$ݻ뮻H2]v|dLb222Ldd9s,˴mvmF ̨Q$3ydӡC#<&::ڴjyF6l;vdzӵkW#<#&114mL:H2 0_~dӫW/#<QF&%%Fݻ꫍$sWI3&))̘1H2ݺu3&M2̸q̐!C$s]w-[X_H2;v47|d.b3rH#~&33Ӹ\.3sLrLffۍ$3rHsIo6;v4/~ kZli.# 2Č7c#j1"!!deeq1c1B1cDx#~aӰaC#1BYre,PYj,PyI>g}qIN^x!0xjӦM*,,T5n8=jѢEv+)))*vء-[VqLcRC}c#v{=HHH Bfw o8qKJJk ˲t >rNqz){4ӄ@`쮡K:5̹l۶uAЭ[7I޾}Ynذ;+++}F_T:K:d߾} ꫯ~W+S.G֋/(˲p@ׯ֭[_~Ysі-[xԴiS 6LSL)% :f7Σٍ[pfΜc*%%EeiȑNǣo[ԭ[7%&&*))I+"tD_JǏWff.]T^z髯*mĈZ`3W^]w%IRNtA䨤D^z>#EF<"##nݺE***Rnn߯VZiҥjժ1?oѣ5qD 8PQQQ1bӑ***Jwu~o޿}5jSyio;~͞=[?[o9(+Tk׮U޽c,˲믧aW˖-ժU+m߾8svTY[z)IڵkWTDD$)::$@y4ϗ$5m$WZZ3gJƎl  UViժUZzl٢3lݺUz_~Ysі-[xԴiSeggoÃJ*WWjYfIƏ_;ӧOuQj׮]6l~_eAÜawZvms Մ m۶JL:U?Y?{sv@5iX[땘Xz'##dggkjӦM4&a jȑ5lAAƎ?xvm;w/_W^yEm۶tj3f&<@'''G{4{ljkSPP c٣9shϞ=޽jg+ /4O۷eY9r.\(g*͙3SN-СC4h6o,˥5k֨Gg}NRkoVC[ooًZmwںuwƍk,TZ+}ݧI&CmY7n\ (I)))9(}>y晚ZڵK\r8g}F7Z)33S ەW@0$߾;*7zh|L P]>|XcƌQAAz! PMK8P@p$b /teYn[Wv4 dS\\+//Or zB(z Y7Nw󕛛C)!!AYYY?~N .<4Qns>}vY3g̙3 PYP(Nǎ_:p`n(..ĉ_+v< QٍsNKr&mXڌ;w4Kvqe,b5w;hvCԭ[7Im߾c7l࿝\D3ݐ$1/t1Fϗ$%$$o߾A(< Q> IW_ꫯV: $I]vYj;jwP$k׮+$I˖-Ӌ/Xa̡C4uTIҌ3B|QpG,8[lђ%Km۳g|TrgN~%K:u֬YI&aÆZvyKO^zTDp~,cq:o[o۴iʙVZ &u޻[/,˪nTz8?\ٍru_֜9sey<5mTÆ Ӕ)S-tPQpG+u T<:f7Σ hv<:f7Σ hv<:f7Σ hv<:f7ɓz5vX5o\,Ke)99xy;~Z`꼵kמ.GIDATg 4pVn[ٺk*))q:P+5n?j=GII5jTy>J7yj>FN@裏*''UVС$INEbኋOII|M7OGk4hK.X-r0G4P)׫7|駟֣>`" |MeddU쿱pնm[}t0GLcJm޼Yǎ$EFFt8P{nkg͝;P34Po7m?u n&^oJn/hvR&j>}[ne˖i|L٦xf9f7Y`,˒eY ۷m^?f3gΔ$c'Sǎ$˲4mڴJ3=zT/.2eff*>>^ 4PǎXͫZ~NN:)!!A7V^c{ FoTgdd`*=&??_/5l0hB111jܸzzH7nؽBаaԬY3ƪe˖0a>*=>s}޽ G[;﨨cnZos=5hr[ouֱk֬Q^^$iСj߾}PUݿ|1 p T hۧo?'qU?TWXX͛7ƌ~[)))|_Wz']^TTC髯s=?O4iRsӉ'#h֬Y2KҡCt!]V5m4׿UXV^'*??^~>CM4Io"#'CnnN\¾cǎ)//Oyyyz뭷԰aC9rĿ'?yI{I&~/^?eʔs>&n͘1C^WgSO=%˲lǖl5C夤K.tz#FTg<%%%Kj*IRzz:t W3fЯrڴi6mjƍy?seggkgmx?OPFF>|toFz7CukS^Yf=z>3m۶M ,( JKKMXM81Qq*VXÇ1 @7$ӦMs[㓒$Ӯ];gwISPPP̵^k6nXn5|IOO0aBy/^l,ҥYti1k$V.֭[mwĈ1?sΟ1ƴiW:n2?9p@1<&22?^9˾ƍ{wTeq#&\\quP#)aHD@+k4'ƭ3r\42wAq 0T\PP\Fǧ{ ~8s}>> ~{LL3gX6c]]]M'N(1nVViOMM'N4=rm̙F&Mxn߾m[1g޼yVXcڼu֙L&iʕk.vކ ,KW笠8k6nhrqq13SNYW{f7@ڷo,J9*((5'O+WiӦ1]\\{SvZŮaĈ2L *99Y?ŘZJ{76lؠe˖IW~ASL8www?^}ĉuutF%KAׂyfK޽[j;QFCy2eJu&~yRÃr'TVJS~~ ))د˿ÇcE@xxMU*p>Hf֬YFҴSN4iR4i>ϙ31PFFUNbUVMgϖյ:y _={,u|tt#I7bgG}TuOOO%}k.sQV|||ꫯ}%1e|QY%),,ڵk-_|Y7o$W^uŋӧO?=5UXX(I ѲeT?-QNEDD4|ȑ#mkm[h+<|hy.//"}qm.9={Vaaa6+**2ڶ~P^ܽ{mZi*y8m2h"o^n24h&N{iҥ7n9biݺuٳ2 .w)iӦY5ܹsZXDak9K.{Y(WZw$?|cIlŋz?ԨQqvOI6BfРA;vCY$wapYfM徎2h M4I&I/ָq֭?j(;qEf7C_n=(m[ ޚ5ke-a`v$g+y{{[~J~k:JPP^xIѣGKJx zUAFFbcc޽{kƌN^?HvL&Sq===vAAMku\yܽ{!::ϡ"x{{[K:L<ˍ2*.]k滷uYIRXXvWs_6>i޼V\Y%^$Tu5Ν[Gy{{kFٚ7o^q2335p@۷o_nw~~FU+W(""8Кǫvڒ׫޽gu^ZZ ݻwƎkW^CJ@ӧO)yR͛FLYե+..ٳfΜU g/pqqիծ];={VoVbb 0@mڴteff*99٨=a„bN:Uׯ7>|֯_)??_۶m… u-EEEiժUV_ء`;vL իW~-X@/^TntQIkŊӧܹ\G W&Mᡂ(==][n5ޟy0~xh޲e;O7nǕ͛7ƍIo^ZRffZ``~7Z|pQPP}4nݺZxP"ի4EDD_~$eeeiҤI۷K.͕$mݺU[n}dl˖-W_ٔ얤iӦ)%%Ũ%gٳq!!!նm[C;wTdd$I;vЎ;l_\\\qF*))I3f%~bbE !CXfsǚ״HJ~JMMՂ ԬYR֬YS=z_1cƔ8QF_-WWG)!!AyJNNVLLUVlaÆ)--M~~~6ǕP=zT&LP:uJhm޼)iZfZjU͛)޲eKbQxX5B>}Ziii:^*wwwծ][M6U˖-O)޹sk.Mڵ1SN)88j\޽[^[nqd2)33SV^^ᡀ5o\>l_i: ᡠ iӦ;~nY Ӗ-[dIհaCK=̐_]vMfa^HvGf7JgܹFAׯ_;..f̘aQRewIEEEN\ " R9x>C{[oQRRR,cǎ{[]v؃ad7pd2Ce-7naÆ9y Hvp7nhÆ ^V--_\nnn_5u 0): # return 1. # else: # return res # else: # res[z > 0] = 1. return res def get_gamma(self, z): return self.medium.delta_n * np.exp(z / self.medium.z_0) def get_turning_point(self, c): """ calculate the turning point, i.e. the maximum of the ray tracing path; parameter is c = self.medium.n_ice ** 2 - C_0 ** -2 """ gamma2 = self.__b * 0.5 - (0.25 * self.__b ** 2 - c) ** 0.5 # first solution discarded z2 = np.log(gamma2 / self.medium.delta_n) * self.medium.z_0 return gamma2, z2 def get_C_1(self, x1, C_0): """ calculates constant C_1 for a given C_0 and start point x1 """ return x1[0] - self.get_y_with_z_mirror(x1[1], C_0) def get_c(self, C_0): return self.medium.n_ice ** 2 - C_0 ** -2 def get_C0_from_log(self, logC0): """ transforms the fit parameter C_0 so that the likelihood looks better """ return np.exp(logC0) + 1. / self.medium.n_ice def get_y(self, gamma, C_0, C_1): """ analytic form of the ray tracing part given an exponential index of refraction profile Parameters ------- gamma: (float or array) gamma is a function of the depth z C_0: (float) first parameter C_1: (float) second parameter """ c = self.medium.n_ice ** 2 - C_0 ** -2 # we take the absolute number here but we only evaluate the equation for # positive outcome. This is to prevent rounding errors making the root # negative root = np.abs(gamma ** 2 - gamma * self.__b + c) logargument = gamma / (2 * c ** 0.5 * (root) ** 0.5 - self.__b * gamma + 2 * c) if(np.sum(logargument <= 0)): self.__logger.debug('log = {}'.format(logargument)) result = self.medium.z_0 * (self.medium.n_ice ** 2 * C_0 ** 2 - 1) ** -0.5 * np.log(logargument) + C_1 return result def get_y_diff(self, z_raw, C_0): """ derivative dy(z)/dz """ z = self.get_z_unmirrored(z_raw, C_0) c = self.medium.n_ice ** 2 - C_0 ** -2 B = (0.2e1 * np.sqrt(c) * np.sqrt(-self.__b * self.medium.delta_n * np.exp(z / self.medium.z_0) + self.medium.delta_n ** 2 * np.exp(0.2e1 * z / self.medium.z_0) + c) - self.__b * self.medium.delta_n * np.exp(z / self.medium.z_0) + 0.2e1 * c) D = self.medium.n_ice ** 2 * C_0 ** 2 - 1 E1 = -self.__b * self.medium.delta_n * np.exp(z / self.medium.z_0) E2 = self.medium.delta_n ** 2 * np.exp(0.2e1 * z / self.medium.z_0) E = (E1 + E2 + c) res = (-np.sqrt(c) * np.exp(z / self.medium.z_0) * self.__b * self.medium.delta_n + 0.2e1 * np.sqrt(-self.__b * self.medium.delta_n * np.exp(z / self.medium.z_0) + self.medium.delta_n ** 2 * np.exp(0.2e1 * z / self.medium.z_0) + c) * c + 0.2e1 * c ** 1.5) / B * E ** -0.5 * (D ** (-0.5)) if(z != z_raw): res *= -1 return res def get_y_with_z_mirror(self, z, C_0, C_1=0): """ analytic form of the ray tracing part given an exponential index of refraction profile this function automatically mirrors z values that are above the turning point, so that this function is defined for all z Parameters ------- z: (float or array) depth z C_0: (float) first parameter C_1: (float) second parameter """ c = self.medium.n_ice ** 2 - C_0 ** -2 gamma_turn, z_turn = self.get_turning_point(c) if(z_turn >= 0): # signal reflected at surface self.__logger.debug('signal reflects off surface') z_turn = 0 gamma_turn = self.get_gamma(0) y_turn = self.get_y(gamma_turn, C_0, C_1) if(not hasattr(z, '__len__')): if(z < z_turn): gamma = self.get_gamma(z) return self.get_y(gamma, C_0, C_1) else: gamma = self.get_gamma(2 * z_turn - z) return 2 * y_turn - self.get_y(gamma, C_0, C_1) else: mask = z < z_turn res = np.zeros_like(z) zs = np.zeros_like(z) gamma = self.get_gamma(z[mask]) zs[mask] = z[mask] res[mask] = self.get_y(gamma, C_0, C_1) gamma = self.get_gamma(2 * z_turn - z[~mask]) res[~mask] = 2 * y_turn - self.get_y(gamma, C_0, C_1) zs[~mask] = 2 * z_turn - z[~mask] self.__logger.debug('turning points for C_0 = {:.2f}, b= {:.2f}, gamma = {:.4f}, z = {:.1f}, y_turn = {:.0f}'.format( C_0, self.__b, gamma_turn, z_turn, y_turn)) return res, zs def get_z_mirrored(self, x1, x2, C_0): """ calculates the mirrored x2 position so that y(z) can be used as a continuous function """ c = self.medium.n_ice ** 2 - C_0 ** -2 C_1 = x1[0] - self.get_y_with_z_mirror(x1[1], C_0) gamma_turn, z_turn = self.get_turning_point(c) if(z_turn >= 0): # signal reflected at surface self.__logger.debug('signal reflects off surface') z_turn = 0 gamma_turn = self.get_gamma(0) y_turn = self.get_y(gamma_turn, C_0, C_1) zstart = x1[1] zstop = x2[1] if(y_turn < x2[0]): zstop = zstart + np.abs(z_turn - x1[1]) + np.abs(z_turn - x2[1]) x2_mirrored = [x2[0], zstop] return x2_mirrored def get_z_unmirrored(self, z, C_0): """ calculates the unmirrored z position """ c = self.medium.n_ice ** 2 - C_0 ** -2 gamma_turn, z_turn = self.get_turning_point(c) if(z_turn >= 0): # signal reflected at surface self.__logger.debug('signal reflects off surface') z_turn = 0 z_unmirrored = z if(z > z_turn): z_unmirrored = 2 * z_turn - z return z_unmirrored def ds(self, t, C_0): """ helper to calculate line integral """ return (self.get_y_diff(t, C_0) ** 2 + 1) ** 0.5 def get_path_length(self, x1, x2, C_0): x2_mirrored = self.get_z_mirrored(x1, x2, C_0) gamma_turn, z_turn = self.get_turning_point(self.medium.n_ice ** 2 - C_0 ** -2) points = None if(x1[1] < z_turn and z_turn < x2_mirrored[1]): points = [z_turn] path_length = integrate.quad(self.ds, x1[1], x2_mirrored[1], args=(C_0), points=points) self.__logger.info("calculating path length from ({:.0f}, {:.0f}) to ({:.0f}, {:.0f}) = ({:.0f}, {:.0f}) = {:.2f} m".format(x1[0], x1[1], x2[0], x2[1], x2_mirrored[0], x2_mirrored[1], path_length[0] / units.m)) # print('numeric {:.2f}'.format(path_length[0])) return path_length[0] def get_path_length_analytic(self, x1, x2, C_0): """ analytic solution to calculate the distance along the path. This code is based on the analytic solution found by Ben Hokanson-Fasing and the pyrex implementation. """ solution_type = self.determine_solution_type(x1, x2, C_0) z_deep = -500 * units.m launch_angle = self.get_launch_angle(x1, C_0) beta = self.n(x1[1]) * np.sin(launch_angle) alpha = self.medium.n_ice ** 2 - beta ** 2 # print("launchangle {:.1f} beta {:.2g} alpha {:.2g}, n(z1) = {:.2g} n(z2) = {:.2g}".format(launch_angle/units.deg, beta, alpha, self.n(x1[1]), self.n(x2[1]))) def l1(z): gamma = self.n(z) ** 2 - beta ** 2 gamma = np.where(gamma < 0, 0, gamma) return self.medium.n_ice * self.n(z) - beta ** 2 - (alpha * gamma) ** 0.5 def l2(z): gamma = self.n(z) ** 2 - beta ** 2 gamma = np.where(gamma < 0, 0, gamma) return self.n(z) + gamma ** 0.5 def get_s(z, deep=False): if(deep): return self.medium.n_ice * z / alpha ** 0.5 else: # print(z, self.n(z), beta) # print(alpha**0.5, l1(z), l2(z)) return self.medium.n_ice / alpha ** 0.5 * (-z + np.log(l1(z)) * self.medium.z_0) + np.log(l2(z)) * self.medium.z_0 def get_path_direct(z1, z2): int1 = get_s(z1, z1 < z_deep) int2 = get_s(z2, z2 < z_deep) # print('analytic {:.4g} ({:.0f} - {:.0f}={:.4g}, {:.4g})'.format( # int2 - int1, get_s(x2[1]), x1[1], x2[1], get_s(x1[1]))) if (z1 < z_deep) == (z2 < z_deep): # z0 and z1 on same side of z_deep return int2 - int1 else: int_diff = get_s(z_deep, deep=True) - get_s(z_deep, deep=False) if z1 < z2: # z0 below z_deep, z1 above z_deep return int2 - int1 + int_diff else: # z0 above z_deep, z1 below z_deep return int2 - int1 - int_diff if(solution_type == 1): return get_path_direct(x1[1], x2[1]) else: if(solution_type == 3): z_turn = 0 else: gamma_turn, z_turn = self.get_turning_point(self.medium.n_ice ** 2 - C_0 ** -2) # print('solution type {:d}, zturn = {:.1f}'.format(solution_type, z_turn)) return get_path_direct(x1[1], z_turn) + get_path_direct(x2[1], z_turn) def get_travel_time(self, x1, x2, C_0): x2_mirrored = self.get_z_mirrored(x1, x2, C_0) def dt(t, C_0): z = self.get_z_unmirrored(t, C_0) return self.ds(t, C_0) / speed_of_light * self.n(z) gamma_turn, z_turn = self.get_turning_point(self.medium.n_ice ** 2 - C_0 ** -2) points = None if(x1[1] < z_turn and z_turn < x2_mirrored[1]): points = [z_turn] travel_time = integrate.quad(dt, x1[1], x2_mirrored[1], args=(C_0), points=points) self.__logger.info("calculating travel time from ({:.0f}, {:.0f}) to ({:.0f}, {:.0f}) = ({:.0f}, {:.0f}) = {:.2f} ns".format( x1[0], x1[1], x2[0], x2[1], x2_mirrored[0], x2_mirrored[1], travel_time[0] / units.ns)) return travel_time[0] def get_travel_time_analytic(self, x1, x2, C_0): """ analytic solution to calculate the time of flight. This code is based on the analytic solution found by Ben Hokanson-Fasing and the pyrex implementation. """ solution_type = self.determine_solution_type(x1, x2, C_0) z_deep = -500 * units.m launch_angle = self.get_launch_angle(x1, C_0) beta = self.n(x1[1]) * np.sin(launch_angle) alpha = self.medium.n_ice ** 2 - beta ** 2 # print("launchangle {:.1f} beta {:.2g} alpha {:.2g}, n(z1) = {:.2g} n(z2) = {:.2g}".format(launch_angle/units.deg, beta, alpha, self.n(x1[1]), self.n(x2[1]))) def l1(z): gamma = self.n(z) ** 2 - beta ** 2 gamma = np.where(gamma < 0, 0, gamma) return self.medium.n_ice * self.n(z) - beta ** 2 - (alpha * gamma) ** 0.5 def l2(z): gamma = self.n(z) ** 2 - beta ** 2 gamma = np.where(gamma < 0, 0, gamma) return self.n(z) + gamma ** 0.5 def get_s(z, deep=False): if(deep): return self.medium.n_ice * (self.n(z) + self.medium.n_ice * (z / self.medium.z_0 - 1)) / (np.sqrt(alpha) / self.medium.z_0 * speed_of_light) else: gamma = self.n(z) ** 2 - beta ** 2 gamma = np.where(gamma < 0, 0, gamma) log_1 = l1(z) log_2 = l2(z) return (((np.sqrt(gamma) + self.medium.n_ice * np.log(log_2) + self.medium.n_ice ** 2 * np.log(log_1) / np.sqrt(alpha)) * self.medium.z_0) - z * self.medium.n_ice ** 2 / np.sqrt(alpha)) / speed_of_light def get_ToF_direct(z1, z2): int1 = get_s(z1, z1 < z_deep) int2 = get_s(z2, z2 < z_deep) # print('analytic {:.4g} ({:.0f} - {:.0f}={:.4g}, {:.4g})'.format( # int2 - int1, get_s(x2[1]), x1[1], x2[1], get_s(x1[1]))) if (z1 < z_deep) == (z2 < z_deep): # z0 and z1 on same side of z_deep return int2 - int1 else: int_diff = get_s(z_deep, deep=True) - get_s(z_deep, deep=False) if z1 < z2: # z0 below z_deep, z1 above z_deep return int2 - int1 + int_diff else: # z0 above z_deep, z1 below z_deep return int2 - int1 - int_diff if(solution_type == 1): return get_ToF_direct(x1[1], x2[1]) else: if(solution_type == 3): z_turn = 0 else: gamma_turn, z_turn = self.get_turning_point(self.medium.n_ice ** 2 - C_0 ** -2) # print('solution type {:d}, zturn = {:.1f}'.format(solution_type, z_turn)) return get_ToF_direct(x1[1], z_turn) + get_ToF_direct(x2[1], z_turn) def __get_frequencies_for_attenuation(self, frequency, max_detector_freq): mask = frequency > 0 nfreqs = min(self.__n_frequencies_integration, np.sum(mask)) freqs = np.linspace(frequency[mask].min(), frequency[mask].max(), nfreqs) if(nfreqs < np.sum(mask) and max_detector_freq is not None): mask2 = frequency <= max_detector_freq nfreqs2 = min(self.__n_frequencies_integration, np.sum(mask2 & mask)) freqs = np.linspace(frequency[mask2 & mask].min(), frequency[mask2 & mask].max(), nfreqs2) if(np.sum(~mask2) > 1): freqs = np.append(freqs, np.linspace(frequency[~mask2].min(), frequency[~mask2].max(), nfreqs // 2)) return freqs def get_attenuation_along_path(self, x1, x2, C_0, frequency, max_detector_freq): if(cpp_available): mask = frequency > 0 freqs = self.__get_frequencies_for_attenuation(frequency, max_detector_freq) tmp = np.zeros_like(freqs) for i, f in enumerate(freqs): tmp[i] = wrapper.get_attenuation_along_path( x1, x2, C_0, f, self.medium.n_ice, self.medium.delta_n, self.medium.z_0, self.attenuation_model_int) attenuation = np.ones_like(frequency) attenuation[mask] = np.interp(frequency[mask], freqs, tmp) return attenuation else: x2_mirrored = self.get_z_mirrored(x1, x2, C_0) def dt(t, C_0, frequency): z = self.get_z_unmirrored(t, C_0) return self.ds(t, C_0) / attenuation_util.get_attenuation_length(z, frequency, self.attenuation_model) # to speed up things we only calculate the attenuation for a few frequencies # and interpolate linearly between them mask = frequency > 0 freqs = self.__get_frequencies_for_attenuation(frequency, max_detector_freq) gamma_turn, z_turn = self.get_turning_point(self.medium.n_ice ** 2 - C_0 ** -2) points = None if(x1[1] < z_turn and z_turn < x2_mirrored[1]): points = [z_turn] tmp = np.array([integrate.quad(dt, x1[1], x2_mirrored[1], args=( C_0, f), epsrel=5e-2, points=points)[0] for f in freqs]) att_func = interpolate.interp1d(freqs, tmp) tmp2 = att_func(frequency[mask]) # tmp = np.array([integrate.quad(dt, x1[1], x2_mirrored[1], args=(C_0, f), epsrel=0.05)[0] for f in frequency[mask]]) attenuation = np.ones_like(frequency) attenuation[mask] = np.exp(-1 * tmp2) self.__logger.info("calculating attenuation from ({:.0f}, {:.0f}) to ({:.0f}, {:.0f}) = ({:.0f}, {:.0f}) = a factor {}".format( x1[0], x1[1], x2[0], x2[1], x2_mirrored[0], x2_mirrored[1], 1 / attenuation)) return attenuation def get_angle(self, x, x_start, C_0): z = self.get_z_mirrored(x_start, x, C_0)[1] dy = self.get_y_diff(z, C_0) angle = np.arctan(dy) if(angle < 0): angle = np.pi + angle return angle def get_launch_angle(self, x1, C_0): return self.get_angle(x1, x1, C_0) def get_receive_angle(self, x1, x2, C_0): return np.pi - self.get_angle(x2, x1, C_0) def get_reflection_angle(self, x1, C_0): c = self.medium.n_ice ** 2 - C_0 ** -2 C_1 = x1[0] - self.get_y_with_z_mirror(x1[1], C_0) gamma_turn, z_turn = self.get_turning_point(c) if(z_turn >= 0): gamma_turn = self.get_gamma(0) y_turn = self.get_y(gamma_turn, C_0, C_1) r = self.get_angle(np.array([y_turn, 0]), x1, C_0) self.__logger.debug( "reflecting off surface at y = {:.1f}m, reflection angle = {:.1f}deg".format(y_turn, r / units.deg)) return r else: return None def get_path(self, x1, x2, C_0, n_points=1000): """ for plotting purposes only, returns the ray tracing path between x1 and x2 the result is only valid if C_0 is a solution to the ray tracing problem Parameters ------- x1: array start position (y, z) x2: array stop position (y, z) C_0: (float) first parameter n_points: integer (optional) the number of coordinates to calculate Returns ------- yy: array the y coordinates of the ray tracing path zz: array the z coordinates of the ray tracing path """ c = self.medium.n_ice ** 2 - C_0 ** -2 C_1 = x1[0] - self.get_y_with_z_mirror(x1[1], C_0) gamma_turn, z_turn = self.get_turning_point(c) if(z_turn >= 0): # signal reflected at surface self.__logger.debug('signal reflects off surface') z_turn = 0 gamma_turn = self.get_gamma(0) y_turn = self.get_y(gamma_turn, C_0, C_1) zstart = x1[1] zstop = self.get_z_mirrored(x1, x2, C_0)[1] z = np.linspace(zstart, zstop, n_points) mask = z < z_turn res = np.zeros_like(z) zs = np.zeros_like(z) gamma = self.get_gamma(z[mask]) zs[mask] = z[mask] res[mask] = self.get_y(gamma, C_0, C_1) gamma = self.get_gamma(2 * z_turn - z[~mask]) res[~mask] = 2 * y_turn - self.get_y(gamma, C_0, C_1) zs[~mask] = 2 * z_turn - z[~mask] self.__logger.debug('turning points for C_0 = {:.2f}, b= {:.2f}, gamma = {:.4f}, z = {:.1f}, y_turn = {:.0f}'.format( C_0, self.__b, gamma_turn, z_turn, y_turn)) return res, zs def obj_delta_y_square(self, logC_0, x1, x2): """ objective function to find solution for C0 """ C_0 = self.get_C0_from_log(logC_0) return self.get_delta_y(C_0, x1, x2) ** 2 def obj_delta_y(self, logC_0, x1, x2): """ function to find solution for C0, returns distance in y between function and x2 position result is signed! (important to use a root finder) """ C_0 = self.get_C0_from_log(logC_0) return self.get_delta_y(C_0, x1, x2) def get_delta_y(self, C_0, x1, x2, C0range=None): """ calculates the difference in the y position between the analytic ray tracing path specified by C_0 at the position x2 """ if(C0range is None): C0range = [1. / self.medium.n_ice, np.inf] if(hasattr(C_0, '__len__')): C_0 = C_0[0] if((C_0 < C0range[0]) or(C_0 > C0range[1])): self.__logger.debug('C0 = {:.4f} out of range {:.0f} - {:.2f}'.format(C_0, C0range[0], C0range[1])) return -np.inf c = self.medium.n_ice ** 2 - C_0 ** -2 # determine y translation first C_1 = x1[0] - self.get_y_with_z_mirror(x1[1], C_0) if(hasattr(C_1, '__len__')): C_1 = C_1[0] self.__logger.debug("C_0 = {:.4f}, C_1 = {:.1f}".format(C_0, C_1)) # for a given c_0, 3 cases are possible to reach the y position of x2 # 1) direct ray, i.e., before the turning point # 2) refracted ray, i.e. after the turning point but not touching the surface # 3) reflected ray, i.e. after the ray reaches the surface gamma_turn, z_turn = self.get_turning_point(c) if(z_turn > 0): z_turn = 0 # a reflection is just a turning point at z = 0, i.e. cases 2) and 3) are the same gamma_turn = self.get_gamma(z_turn) y_turn = self.get_y(gamma_turn, C_0, C_1) if(z_turn < x2[1]): # turning points is deeper that x2 positions, can't reach target # the minimizer has problems finding the minimum if inf is returned here. Therefore, we return the distance # between the turning point and the target point + 10 x the distance between the z position of the turning points # and the target position. This results in a objective function that has the solutions as the only minima and # is smooth in C_0 diff = ((z_turn - x2[1])**2 + (y_turn - x2[0])**2)**0.5 + 10 * np.abs(z_turn - x2[1]) self.__logger.debug( "turning points (zturn = {:.0f} is deeper than x2 positon z2 = {:.0f}, setting distance to target position to {:.1f}".format(z_turn, x2[1], -diff)) return -diff # return -np.inf self.__logger.debug('turning points is z = {:.1f}, y = {:.1f}'.format(z_turn, y_turn)) if(y_turn > x2[0]): # we always propagate from left to right # direct ray y2_fit = self.get_y(self.get_gamma(x2[1]), C_0, C_1) # calculate y position at get_path position diff = (x2[0] - y2_fit) if(hasattr(diff, '__len__')): diff = diff[0] if(hasattr(x2[0], '__len__')): x2[0] = x2[0][0] self.__logger.debug( 'we have a direct ray, y({:.1f}) = {:.1f} -> {:.1f} away from {:.1f}, turning point = y={:.1f}, z={:.2f}, x0 = {:.1f} {:.1f}'.format(x2[1], y2_fit, diff, x2[0], y_turn, z_turn, x1[0], x1[1])) return diff else: # now it's a bit more complicated. we need to transform the coordinates to # be on the mirrored part of the function z_mirrored = x2[1] gamma = self.get_gamma(z_mirrored) self.__logger.debug("get_y( {}, {}, {})".format(gamma, C_0, C_1)) y2_raw = self.get_y(gamma, C_0, C_1) y2_fit = 2 * y_turn - y2_raw diff = (x2[0] - y2_fit) self.__logger.debug('we have a reflected/refracted ray, y({:.1f}) = {:.1f} ({:.1f}) -> {:.1f} away from {:.1f} (gamma = {:.5g})'.format( z_mirrored, y2_fit, y2_raw, diff, x2[0], gamma)) return -1 * diff def determine_solution_type(self, x1, x2, C_0): """ returns the type of the solution Parameters ---------- x1: 2dim np.array start position x2: 2dim np.array stop position C_0: float C_0 value of ray tracing solution Returns ------- solution_type: int * 1: 'direct' * 2: 'refracted' * 3: 'reflected """ c = self.medium.n_ice ** 2 - C_0 ** -2 C_1 = x1[0] - self.get_y_with_z_mirror(x1[1], C_0) gamma_turn, z_turn = self.get_turning_point(c) if(z_turn >= 0): z_turn = 0 gamma_turn = self.get_gamma(0) y_turn = self.get_y(gamma_turn, C_0, C_1) if(x2[0] < y_turn): return 1 else: if(z_turn == 0): return 3 else: return 2 def find_solutions(self, x1, x2, plot=False): """ this function finds all ray tracing solutions prerequesite is that x2 is above and to the right of x1, this is not a violation of universality because this requirement can be achieved with a simple coordinate transformation returns an array of the C_0 paramters of the solutions (the array might be empty) """ if(cpp_available): # t = time.time() solutions = wrapper.find_solutions(x1, x2, self.medium.n_ice, self.medium.delta_n, self.medium.z_0) # print((time.time() -t)*1000.) return solutions else: tol = 1e-6 results = [] C0s = [] # intermediate storage of results # calculate optimal start value. The objective function becomes infinity if the turning point is below the z # position of the observer. We calculate the corresponding value so that the minimization starts at one edge # of the objective function # c = self.__b ** 2 / 4 - (0.5 * self.__b - np.exp(x2[1] / self.medium.z_0) * self.medium.n_ice) ** 2 # C_0_start = (1 / (self.medium.n_ice ** 2 - c)) ** 0.5 # R.L. March 15, 2019: This initial condition does not find a solution for e.g.: # emitter at [-400.0*units.m,-732.0*units.m], receiver at [0., -2.0*units.m] if(self.__use_optimized_start_values): # take surface skimming ray as start value C_0_start, th_start = self.get_surf_skim_angle(x1) logC_0_start = np.log(C_0_start - 1. / self.medium.n_ice) self.__logger.debug( 'starting optimization with x0 = {:.2f} -> C0 = {:.3f}'.format(logC_0_start, C_0_start)) else: logC_0_start = -1 result = optimize.root(self.obj_delta_y_square, x0=logC_0_start, args=(x1, x2), tol=tol) if(plot): fig, ax = plt.subplots(1, 1) if(result.fun < 1e-7): if(plot): self.plot_result(x1, x2, self.get_C0_from_log(result.x[0]), ax) if(np.round(result.x[0], 3) not in np.round(C0s, 3)): C_0 = self.get_C0_from_log(result.x[0]) C0s.append(C_0) solution_type = self.determine_solution_type(x1, x2, C_0) self.__logger.info("found {} solution C0 = {:.2f}".format(solution_types[solution_type], C_0)) results.append({'type': solution_type, 'C0': C_0, 'C1': self.get_C_1(x1, C_0)}) # check if another solution with higher logC0 exists logC0_start = result.x[0] + 0.0001 logC0_stop = 100 delta_start = self.obj_delta_y(logC0_start, x1, x2) delta_stop = self.obj_delta_y(logC0_stop, x1, x2) # print(logC0_start, logC0_stop, delta_start, delta_stop, np.sign(delta_start), np.sign(delta_stop)) if(np.sign(delta_start) != np.sign(delta_stop)): self.__logger.info("solution with logC0 > {:.3f} exists".format(result.x[0])) result2 = optimize.brentq(self.obj_delta_y, logC0_start, logC0_stop, args=(x1, x2)) if(plot): self.plot_result(x1, x2, self.get_C0_from_log(result2), ax) if(np.round(result2, 3) not in np.round(C0s, 3)): C_0 = self.get_C0_from_log(result2) C0s.append(C_0) solution_type = self.determine_solution_type(x1, x2, C_0) self.__logger.info("found {} solution C0 = {:.2f}".format(solution_types[solution_type], C_0)) results.append({'type': solution_type, 'C0': C_0, 'C1': self.get_C_1(x1, C_0)}) else: self.__logger.info("no solution with logC0 > {:.3f} exists".format(result.x[0])) logC0_start = -100 logC0_stop = result.x[0] - 0.0001 delta_start = self.obj_delta_y(logC0_start, x1, x2) delta_stop = self.obj_delta_y(logC0_stop, x1, x2) # print(logC0_start, logC0_stop, delta_start, delta_stop, np.sign(delta_start), np.sign(delta_stop)) if(np.sign(delta_start) != np.sign(delta_stop)): self.__logger.info("solution with logC0 < {:.3f} exists".format(result.x[0])) result3 = optimize.brentq(self.obj_delta_y, logC0_start, logC0_stop, args=(x1, x2)) if(plot): self.plot_result(x1, x2, self.get_C0_from_log(result3), ax) if(np.round(result3, 3) not in np.round(C0s, 3)): C_0 = self.get_C0_from_log(result3) C0s.append(C_0) solution_type = self.determine_solution_type(x1, x2, C_0) self.__logger.info("found {} solution C0 = {:.2f}".format(solution_types[solution_type], C_0)) results.append({'type': solution_type, 'C0': C_0, 'C1': self.get_C_1(x1, C_0)}) else: self.__logger.info("no solution with logC0 < {:.3f} exists".format(result.x[0])) if(plot): plt.show() return sorted(results, key=itemgetter('type')) def plot_result(self, x1, x2, C_0, ax): """ helper function to visualize results """ C_1 = self.get_C_1(x1, C_0) zs = np.linspace(x1[1], x1[1] + np.abs(x1[1]) + np.abs(x2[1]), 1000) yy, zz = self.get_y_with_z_mirror(zs, C_0, C_1) ax.plot(yy, zz, '-', label='C0 = {:.3f}'.format(C_0)) ax.plot(x1[0], x1[1], 'ko') ax.plot(x2[0], x2[1], 'd') # ax.plot(zz, yy, '-', label='C0 = {:.3f}'.format(C_0)) # ax.plot(x1[1], x1[0], 'ko') # ax.plot(x2[1], x2[0], 'd') ax.legend() # def get_angle_from_C_0(self,C_0, z_pos,angoff=0): # # ''' # argument angoff is provided so that the function can be used for minimization in get_C_0_from_angle(), # in which case angoff is the angle for which the C_0 is sought and zero is returned when it is fouund. # # output: # angle corresponding to C_0, minus offset angoff # ''' # # # dydz = self.get_y_diff(z_pos,C_0) # # dydz = self.get_dydz_analytic(C_0, z_pos) # # angle=np.arctan(dydz) # # if(angle < 0): # angle = np.pi + angle # return angle - angoff def get_angle_from_logC_0(self, logC_0, z_pos, angoff=0): ''' argument angoff is provided so that the function can be used for minimization in get_C_0_from_angle(), in which case angoff is the angle for which the C_0 is sought and zero is returned when it is fouund. C_0 has a smallest possible value at 1./self.medium.n_ice . When it approaches this value, very small changes in C_0 correspond to a given change in the angle. In order to prevent the root finding algorithm from crossing into the invalid range of C_0 at values smaller than 1./self.medium.n_ice, the root finding is done with the parameter logC_0 = np.log(C_0 - 1. / self.medium.n_ice), so it is not exactly the log of C_0 as the nome of this method implies. This is the same parameter transformation that is done for find_solutions() input: logC_0 = np.log(C_0 - 1. / self.medium.n_ice) angoff = angular offset z_pos = z-position from where ray is emitted output: angle corresponding to C_0, minus offset angoff ''' C_0 = self.get_C0_from_log(logC_0) dydz = self.get_y_diff(z_pos, C_0) # dydz = self.get_dydz_analytic(C_0, z_pos) angle = np.arctan(dydz) # print(dydz,angoffdydz) return angle - angoff def get_C_0_from_angle(self, anglaunch, z_pos): ''' Find parameter C0 corresponding to a given launch angle and z-position of a ray. The parameter is found by means of a root finding procedure output: Complete output of optimisation procedure (result.x[0] is the C0 value found by optimisation procedure) ''' # C_0 has a smallest possible value at 1./self.medium.n_ice . When it approaches this value, very # small changes in C_0 correspond to given change in the angle. In order to prevent the root finding # algorithm to cross into the invalid range of C_0 at values smaller than 1./self.medium.n_ice, # the root finding is done with the parameter logC_0_start below. This is the same parameter transformation # that is done for find_solutions() C_0_start = 2. logC_0_start = np.log(C_0_start - 1. / self.medium.n_ice) # result = optimize.root(self.get_angle_from_C_0,np.pi/4.,args=(z_pos,anglaunch)) result = optimize.root(self.get_angle_from_logC_0, logC_0_start, args=(z_pos, anglaunch)) # want to return the complete instance of the result class; result value result.x[0] is logC_0, # but we want C_0, so replace it in the result class. This may not be good practice but it seems to be # more user-friendly than to return the value logC_0 result.x[0] = copy.copy(self.get_C0_from_log(result.x[0])) return result # def get_dydz_analytic(self, C_0, z_pos): # ''' # Implementation of derivative dy/dz obtained from the analytic expresion for y(z) # Returns dy/dz for a given z-position and C_0 # ''' # # gamma = self.get_gamma(z_pos) # # b = self.__b # c = self.medium.n_ice ** 2 - C_0 ** -2 # root = np.abs(gamma ** 2 - gamma * b + c) # logargument = gamma / (2 * c ** 0.5 * (root) ** 0.5 - b * gamma + 2 * c) # # dydz = 1/(C_0*np.sqrt(c))*(1 - np.sqrt(c)/np.sqrt(root)*(2*gamma-b)*logargument + b*logargument) # # return dydz def get_z_from_n(self, n): ''' get z from given n - equation from get_n solved for z ''' return np.log((self.medium.n_ice - n) / self.medium.delta_n) * self.medium.z_0 def get_surf_skim_angle(self, x1): ''' For a given position x1 = [x,z] and depth profile self.n(), find the angle at which a beam must be emitted to "skim the surface", i.e. arrive horizontally (angle = 90 deg) at the surface; This is used to find the refraction zone. returns: C0crit: C0 of critical angle thcrit: critical angle ''' nlaunch = self.n(x1[1]) # by definition, z of critical angle is at surface, i.e. z=0 zcrit = 0. nsurf = self.n(zcrit) sinthcrit = nsurf / nlaunch if sinthcrit <= 1: # ray goes from point with high optical thickness to point with lower optical thickness, # i.e. ray bending is towards horizontal thcrit = np.arcsin(sinthcrit) C0result = self.get_C_0_from_angle(thcrit, x1[1]) C0crit = C0result.x[0] else: # ray goes from point with low optical thickness to point with higher optical thickness, # i.e. ray bending is towards vertical, no solution thcrit = None C0crit = None self.__logger.warning(' No solution for critical angle for z = {}!'.format(x1[1])) self.__logger.info(' critical angle for z = {} is {} !'.format(x1[1], thcrit / units.deg)) self.__logger.info(' C0 for critical angle is {}'.format(C0crit)) return C0crit, thcrit def is_in_refraction_zone(self, x1, x2, C0crit=None, plot=False): ''' Find if receiver at x2 is in the refraction zone of emitter at x1. The refraction zone is the oposite of the shadow zone. If the C0 of the critical angle, C0crit, is provided, it will not be calculated. This is useful in case find_solutions() is called and C0crit is calculated in the process of determining the initial value for the minimization procedure. Returns True if x2 is in the refraction zone of x1 - note that the inverse statement is not necessarily true, i.e. when False is returned, it is possible that x2 is in the refraction zone nonetheless TODO: Why does the reference point not seem to lie exactly on the mirrored path? Instead of returning True/False, it might be useful to return ycheck - x2[0] (in case x2[0]>ycrit), which gives some idea of how close the receiver is to the refraction zone. This could be used to define a "gray zone' and a 'far zone', in which the receiver is most definitely in the shadow zone ''' refraction = False if C0crit == None: C0crit, thcrit = self.get_surf_skim_angle(x1) # z_crit = 0 and hence gamma_crit = delta_n by definition gcrit = self.medium.delta_n # the y-value where the ray hits z=0 ycrit = self.get_y(gcrit, C0crit, self.get_C_1(x1, C0crit)) if plot: plt.figure('in_refraction_zone') plt.grid(True) plt.plot(ycrit, 0, 'ro', label='turning point') yarray, zarray = self.get_path(x1, [ycrit, 0], C0crit) plt.plot(yarray, zarray, 'ko-', markersize=4, label='path') plt.plot(x1[0], x1[1], 'C1d', label='emitter') plt.plot(x2[0], x2[1], 'go', label='receiver') if x2[0] <= ycrit: # not in shadow zone refraction = True self.__logger.debug(' is_in_refraction_zone(): y-position of receiver smaller than ycrit!') else: # start horizontal ray at (y,z) = (ycrit,0) # experimentally this was found to give slightly different results than mirroring the array at the critical angle. # theoretically this is not quite unterstood C0check = self.get_C_0_from_angle(np.pi / 2., 0) C0check = C0check.x[0] gcheck = self.get_gamma(x2[1]) # print('C0check, gcheck',C0check,gcheck) ycheck = -self.get_y(gcheck, C0check, self.get_C_1([ycrit, 0], C0check)) + 2 * ycrit # print('ycheck, x2[1]',ycheck,x2[1]) if x2[0] < ycheck: refraction = True if plot: yarraymirr = -yarray + 2 * ycrit plt.plot(yarraymirr, zarray, 'mx-', markersize=4, label='mirrored path') # the reference point does not seem to lie exactly on the mirrored path but instead # ~1cm inside the path (i.e. towards the emmitter) which I do not understand. plt.plot(ycheck, x2[1], 'b+', label='reference point') if plot: plt.legend(fontsize='x-small') return refraction def get_tof_for_straight_line(self, x1, x2): ''' Calculate the time of flight for a hypothatical ray travelling from x1 to x2 in a straight line. Such an array in general is not a solution consistant with Fermat's principle. It is however useful as a reference time or approximation for signals not explicable with geometric optics. output: time of flight for a ray travelling straight from x1 to x2 ''' dx = x2[0] - x1[0] dz = x2[1] - x1[1] n_ice = self.medium.n_ice delta_n = self.medium.delta_n z_0 = self.medium.z_0 if dz > 0: return 1. / speed_of_light * np.sqrt((dx / dz) ** 2 + 1) * ( n_ice * dz - delta_n * z_0 * (np.exp(x2[1] / z_0) - np.exp(x1[1] / z_0)) ) else: return self.n(x2[1]) / speed_of_light * dx def get_surface_pulse(self, x1, x2, infirn=False, angle='critical', chdraw=None, label=None): ''' Calculate the time for a ray to travel from x1 to the surface and arriving at the surface with (a) critical angle or (b) Brewster angle, propagating in a straight line along the surface in air (n=1) in the firn at z=0 (n=self.n(0)) and then reaching the receiver by returning into the firn just at the point to reach the receiver at x2, entering the firn at the surface at the same angle it reached the surface from x1.. Input: x1, x2: Arrays with x and z positions of emitter x1 and receiver x2 infirn: Boolean. Set to True if surface ray travels in the firn, set to False (default) if it travels in air. angle: String specifying angle at which ray reaches/leaves the surface. Can be 'Brewster' or 'critical' If neither of these is chosen, a warning is printed and angle is set to 'critical' chdraw: If None, do not draw the path of the ray. If the ray should be drawn, a string consistent with the matplotlib.pyplot library has to be specified, e.g. 'r:' to draw a dotted red line. It is assumed that an appropriate figure on which to draw the ray has been created and set as current figure by the user before calling this method. label: Label for plot ''' draw = False if chdraw != None: draw = True if infirn == False: nlayer = 1. # index of refraction at surface, default is n=1 for air else: nlayer = self.n(0) if angle == 'critical': # sin(th)=1, nxsin = 1. elif angle == 'Brewster': nxsin = np.sin(np.arctan(1. / self.n(0))) * self.n(0) else: self.__logger.warning(' unknown input angle=={}, using critical angle!!!'.format(angle)) nxsin = 1. zsurf = 0 gamma = self.get_gamma(zsurf) # print('nxsin = ',nxsin) # find emission angle for starting point x1 to hit the surface at the specified angle # look at time and distance it takes for the signal to travel from the emitter to the surface # and from the surface to the receiver tice = 0 sice = 0 for x in [x1, x2]: sinthemit = nxsin / self.n(x[1]) th_emit = np.arcsin(sinthemit) C0result = self.get_C_0_from_angle(th_emit, x[1]) C0_emit = C0result.x[0] # print(C0_emit) self.__logger.info(' emission angle for position {},{} is theta_emit= {}'.format(x[0], x[1], th_emit / units.deg)) # x-coordinate where ray reaches surface; is always bigger than the x-position of the emitter # (i.e. ray travels "to the right") xsurf = self.get_y(gamma, C0_emit, self.get_C_1(x, C0_emit)) sice += xsurf - x[0] self.__logger.info(' air pulse starting at x={}, z={} reaches surface at x={}'.format(x[0], x[1], xsurf)) ttosurf = self.get_travel_time_analytic(x, [xsurf, zsurf], C0_emit) tice += ttosurf self.__logger.info(' travel time is {} ns.'.format(ttosurf / units.ns)) if draw: z = np.linspace(x[1], zsurf, 1000, endpoint=True) y = self.get_y(self.get_gamma(z), C0_emit, C_1=self.get_C_1(x, C0_emit)) if x == x1: ysurf = [y[-1]] else: y = -y + 2 * x2[0] ysurf.append(y[-1]) plt.plot(ysurf, [0, 0], chdraw, label=label) plt.plot(y, z, chdraw) self.__logger.info(' time, distance travelled to and from surface: {}, {} '.format(tice, sice)) sair = abs(x2[0] - x1[0]) - sice tair = sair * nlayer / speed_of_light self.__logger.info(' time, distance travelled at surface: {}, {}'.format(tair, sair)) ttot = tice + tair if sair < 0: ttot = None return ttot def angular_diff(self, x_refl, z_refl, pulser_pos, receiver_pos, ipulssol, irxsol): ''' This is a helper function to find a ray that is subject to specular reflection (no transmission) at the ice-water interface, e.g. for Moore's Bay. For a (virtual) emitter positioned at [x_refl,z_refl], it finds the emission angles such that the rays hit positions pulser_pos and receiver_pos. ipulssol = 0 or 1, respectively means that pulser_pos is hit directly or by means of reflection at the surface, respectively. irxsol is the equivalent parameter for receiver_pos. angular_diff can be used as the function to find a root of in the following fashion: result = optimize.root(raytr.angular_diff, x0=x_refl_start, args=(z_refl,pulser_pos,receiver_pos,ipulssol,irxsol)) Then get the final value by x_refl = result.x[0] (z_refl is fixed) The idea is to treat the reflection point as a virtual emitter and then find the x-position at the predefined depth z_refl, for which the emisssion angles to pulser_pos and receiver_pos are the same (i.e. the output of angular_diff is zero). The x-position would be output "result" ofoptimize.root() above. output: float, is zero if the angles (w.r.t. the vertical) of rays emitted from [x_refl,z_refl] to positions pulser_pos and receiver_pos are the same or greater than zero, if this is not the case. For exact defintion, see "result" in code below ''' # treat position of reflection as emitter and Rx/Tx as receivers pos_rx = [ [receiver_pos[0], receiver_pos[1]], [x_refl - (pulser_pos[0] - x_refl), pulser_pos[1]] ] beta0 = None beta1 = None # solution for receiver solution0 = self.find_solutions([x_refl, z_refl], pos_rx[0], plot=False) if solution0 != []: C0rx = solution0[irxsol]['C0'] beta0 = self.get_launch_angle([x_refl, z_refl], C0rx) # solution for pulser solution1 = self.find_solutions([x_refl, z_refl], pos_rx[1], plot=False) if solution1 != []: C0puls = solution1[ipulssol]['C0'] beta1 = self.get_launch_angle([x_refl, z_refl], C0puls) if beta0 != None and beta1 != None: result = (np.tan(beta0) - np.tan(beta1)) ** 2 else: result = np.inf # set to infinity return result class ray_tracing: """ utility class (wrapper around the 2D analytic ray tracing code) to get ray tracing solutions in 3D for two arbitrary points x1 and x2 """ solution_types = {1: 'direct', 2: 'refracted', 3: 'reflected'} def __init__(self, x1, x2, medium, attenuation_model="SP1", log_level=logging.WARNING, n_frequencies_integration=6): """ class initilization Parameters ---------- x1: 3dim np.array start point of the ray x2: 3dim np.array stop point of the ray medium: medium class class describing the index-of-refraction profile attenuation_model: string signal attenuation model (so far only "SP1" is implemented) log_level: logging object specify the log level of the ray tracing class * logging.ERROR * logging.WARNING * logging.INFO * logging.DEBUG default is WARNING n_frequencies_integration: int the number of frequencies for which the frequency dependent attenuation length is being calculated. The attenuation length for all other frequencies is obtained via linear interpolation. """ self.__logger = logging.getLogger('ray_tracing') self.__logger.setLevel(log_level) self.__medium = medium self.__attenuation_model = attenuation_model self.__n_frequencies_integration = n_frequencies_integration self.__swap = False self.__X1 = x1 self.__X2 = x2 if(x2[2] < x1[2]): self.__swap = True self.__logger.debug('swap = True') self.__X2 = x1 self.__X1 = x2 dX = self.__X2 - self.__X1 self.__dPhi = -np.arctan2(dX[1], dX[0]) c, s = np.cos(self.__dPhi), np.sin(self.__dPhi) self.__R = np.array(((c, -s, 0), (s, c, 0), (0, 0, 1))) X1r = self.__X1 X2r = np.dot(self.__R, self.__X2 - self.__X1) + self.__X1 self.__logger.debug("X1 = {}, X2 = {}".format(self.__X1, self.__X2)) self.__logger.debug('dphi = {:.1f}'.format(self.__dPhi / units.deg)) self.__logger.debug("X2 - X1 = {}, X1r = {}, X2r = {}".format(self.__X2 - self.__X1, X1r, X2r)) self.__x1 = np.array([X1r[0], X1r[2]]) self.__x2 = np.array([X2r[0], X2r[2]]) self.__logger.debug("2D points {} {}".format(self.__x1, self.__x2)) self.__r2d = ray_tracing_2D(self.__medium, self.__attenuation_model, log_level=log_level, n_frequencies_integration=self.__n_frequencies_integration) def set_solution(self, C0s, C1s, solution_types): results = [] for i in range(len(C0s)): if(not np.isnan(C0s[i])): results.append({'type': solution_types[i], 'C0': C0s[i], 'C1': C1s[i]}) self.__results = results def find_solutions(self): """ find all solutions between x1 and x2 """ self.__results = self.__r2d.find_solutions(self.__x1, self.__x2) def has_solution(self): """ checks if ray tracing solution exists """ return len(self.__results) > 0 def get_number_of_solutions(self): """ returns the number of solutions """ return len(self.__results) def get_results(self): """ returns dictionary of results (the parameters of the analytic ray path function) """ return self.__results def get_solution_type(self, iS): """ returns the type of the solution Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- solution_type: int * 1: 'direct' * 2: 'refracted' * 3: 'reflected """ return self.__r2d.determine_solution_type(self.__x1, self.__x2, self.__results[iS]['C0']) def get_path(self, iS, n_points=1000): n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] xx, zz = self.__r2d.get_path(self.__x1, self.__x2, result['C0'], n_points=n_points) path_2d = np.array([xx, np.zeros_like(xx), zz]).T dP = path_2d - np.array([self.__X1[0], 0, self.__X1[2]]) MM = np.matmul(self.__R.T, dP.T) path = MM.T + self.__X1 return path def get_launch_vector(self, iS): """ calculates the launch vector (in 3D) of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- launch_vector: 3dim np.array the launch vector """ n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] alpha = self.__r2d.get_launch_angle(self.__x1, result['C0']) launch_vector_2d = np.array([np.sin(alpha), 0, np.cos(alpha)]) if self.__swap: alpha = self.__r2d.get_receive_angle(self.__x1, self.__x2, result['C0']) launch_vector_2d = np.array([-np.sin(alpha), 0, np.cos(alpha)]) self.__logger.debug(self.__R.T) launch_vector = np.dot(self.__R.T, launch_vector_2d) return launch_vector def get_receive_vector(self, iS): """ calculates the receive vector (in 3D) of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- receive_vector: 3dim np.array the receive vector """ n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] alpha = self.__r2d.get_receive_angle(self.__x1, self.__x2, result['C0']) receive_vector_2d = np.array([-np.sin(alpha), 0, np.cos(alpha)]) if self.__swap: alpha = self.__r2d.get_launch_angle(self.__x1, result['C0']) receive_vector_2d = np.array([np.sin(alpha), 0, np.cos(alpha)]) receive_vector = np.dot(self.__R.T, receive_vector_2d) return receive_vector def get_reflection_angle(self, iS): """ calculates the angle of reflection at the surface (in case of a reflected ray) Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- reflection_angle: float or None the reflection angle (for reflected rays) or None for direct and refracted rays """ n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] return self.__r2d.get_reflection_angle(self.__x1, result['C0']) def get_path_length(self, iS, analytic=True): """ calculates the path length of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero analytic: bool If True the analytic solution is used. If False, a numerical integration is used. (default: True) Returns ------- distance: float distance from x1 to x2 along the ray path """ n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] if analytic: return self.__r2d.get_path_length_analytic(self.__x1, self.__x2, result['C0']) else: return self.__r2d.get_path_length(self.__x1, self.__x2, result['C0']) def get_travel_time(self, iS, analytic=True): """ calculates the travel time of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero analytic: bool If True the analytic solution is used. If False, a numerical integration is used. (default: True) Returns ------- time: float travel time """ n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] if(analytic): return self.__r2d.get_travel_time_analytic(self.__x1, self.__x2, result['C0']) else: return self.__r2d.get_travel_time(self.__x1, self.__x2, result['C0']) def get_attenuation(self, iS, frequency, max_detector_freq=None): """ calculates the signal attenuation due to attenuation in the medium (ice) Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero frequency: array of floats the frequencies for which the attenuation is calculated max_detector_freq: float or None the maximum frequency of the final detector sampling (the simulation is internally run with a higher sampling rate, but the relevant part of the attenuation length calculation is the frequency interval visible by the detector, hence a finer calculation is more important) Returns ------- attenuation: array of floats the fraction of the signal that reaches the observer (only ice attenuation, the 1/R signal falloff not considered here) """ n = self.get_number_of_solutions() if(iS >= n): self.__logger.error("solution number {:d} requested but only {:d} solutions exist".format(iS + 1, n)) raise IndexError result = self.__results[iS] return self.__r2d.get_attenuation_along_path(self.__x1, self.__x2, result['C0'], frequency, max_detector_freq) def get_ray_path(self, iS): return self.__r2d.get_path(self.__x1, self.__x2, self.__results[iS]['C0'], 10000) PKmN9[r;;NuRadioMC/SignalProp/install.sh#!/bin/bash cd "$(dirname "$0")" cd CPPAnalyticRayTracing rm wrapper.so # first delete already existing module if [[ -z "${GSLDIR}" ]]; then echo "GSLDIR environment variable undefined" echo "setting GSLDIR to " $(gsl-config --prefix) export GSLDIR=$(gsl-config --prefix) fi python setup.py build_ext --inplacePKmNv7^22#NuRadioMC/SignalProp/propagation.pyfrom __future__ import absolute_import, division, print_function def get_propagation_module(name='analytic'): """ wrapper around all propagation modules The function returns the python class of the respective propagation module Parameters ---------- name: string * analytic: analytic ray tracer """ if(name=='analytic'): from NuRadioMC.SignalProp.analyticraytracing import ray_tracing return ray_tracing else: raise NotImplementedError("module {} not implemented".format(name)) PKmNp_.NuRadioMC/SignalProp/propagation_base_class.pyfrom __future__ import absolute_import, division, print_function import logging logging.basicConfig() """ Structure of a ray-tracing module. For documentation and development purposes. """ solution_types = {1: 'direct', 2: 'refracted', 3: 'reflected'} class ray_tracing_base: """ base class of ray tracer. All ray tracing modules need to prodide the following functions """ def __init__(self, x1, x2, medium, attenuation_model="SP1", log_level=logging.WARNING, n_frequencies_integration=6): """ class initilization Parameters ---------- x1: 3dim np.array start point of the ray x2: 3dim np.array stop point of the ray medium: medium class class describing the index-of-refraction profile attenuation_model: string signal attenuation model (so far only "SP1" is implemented) log_level: logging object specify the log level of the ray tracing class * logging.ERROR * logging.WARNING * logging.INFO * logging.DEBUG default is WARNING n_frequencies_integration: int the number of frequencies for which the frequency dependent attenuation length is being calculated. The attenuation length for all other frequencies is obtained via linear interpolation. """ pass def find_solutions(self): """ find all solutions between x1 and x2 """ pass def has_solution(self): """ checks if ray tracing solution exists """ return len(self.__results) > 0 def get_number_of_solutions(self): """ returns the number of solutions """ return len(self.__results) def get_results(self): """ """ return self.__results def get_solution_type(self, iS): """ returns the type of the solution Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- solution_type: int * 1: 'direct' * 2: 'refracted' * 3: 'reflected """ pass def get_path(self, iS, n_points=1000): """ helper function that returns the 3D ray tracing path of solution iS Parameters ---------- iS: int ray tracing solution n_points: int number of points of path """ pass def get_launch_vector(self, iS): """ calculates the launch vector (in 3D) of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- launch_vector: 3dim np.array the launch vector """ pass def get_receive_vector(self, iS): """ calculates the receive vector (in 3D) of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- receive_vector: 3dim np.array the receive vector """ pass def get_reflection_angle(self, iS): """ calculates the angle of reflection at the surface (in case of a reflected ray) Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero Returns ------- reflection_angle: float or None the reflection angle (for reflected rays) or None for direct and refracted rays """ pass def get_path_length(self, iS, analytic=True): """ calculates the path length of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero analytic: bool If True the analytic solution is used. If False, a numerical integration is used. (default: True) Returns ------- distance: float distance from x1 to x2 along the ray path """ pass def get_travel_time(self, iS, analytic=True): """ calculates the travel time of solution iS Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero analytic: bool If True the analytic solution is used. If False, a numerical integration is used. (default: True) Returns ------- time: float travel time """ pass def get_attenuation(self, iS, frequency, max_detector_freq=None): """ calculates the signal attenuation due to attenuation in the medium (ice) Parameters ---------- iS: int choose for which solution to compute the launch vector, counting starts at zero frequency: array of floats the frequencies for which the attenuation is calculated max_detector_freq: float or None the maximum frequency of the final detector sampling (the simulation is internally run with a higher sampling rate, but the relevant part of the attenuation length calculation is the frequency interval visible by the detector, hence a finer calculation is more important) Returns ------- attenuation: array of floats the fraction of the signal that reaches the observer (only ice attenuation, the 1/R signal falloff not considered here) """ pass PKmN 5NuRadioMC/SignalProp/CPPAnalyticRayTracing/.gitignorewrapper.cpp PKmN$ yy3NuRadioMC/SignalProp/CPPAnalyticRayTracing/MakefileCC=g++ CFLAGS=-c -g -Wall LDFLAGS=-L${GSLDIR}/lib CXXFLAGS=-I${GSLDIR}/include -I../../utilities LDLIBS=-lgsl -lgslcblas PKmNnׄ4NuRadioMC/SignalProp/CPPAnalyticRayTracing/README.md# AnalyticRayTracing C++ code for analytic ray tracing ## Prerequisites You will need to have a functioning installation of [GSL](https://www.gnu.org/software/gsl/) ([1.16](https://ftp.gnu.org/gnu/gsl/gsl-1.16.tar.gz) is verified to work). - You will need to set the enviromnent variable `GSLDIR` to your local installation of GSL. - You will also need to have `GSLDIR` in your `LD_LIBRARY_PATH`. - For Mac users: you can locate your GSL installation via `gsl-config --prefix`, i.e. `export GSLDIR=$(gsl-config --prefix)` ## Install instructions ### As part of NuRadioMC To create python wrapper around the relevant C function, so that the C code can be used directly from the ray tracer class of NuRadioMC just execute `python setup.py build_ext --inplace` ### As standalone package Getting going is easy. Just: - Make it: `make analytic_raytracing` - Run it: `./analytic_raytracing` - The main is at the bottom of the code, which you can modify to your liking. - You can find if, and how many, solutions exist to the ray tracing problem. - Find the ray tracing path, path length, time of flight, and attenuation factor of the ray. - Find the launch and receive angles for the ray. PKmN6NuRadioMC/SignalProp/CPPAnalyticRayTracing/__init__.pyPKmN~ssBNuRadioMC/SignalProp/CPPAnalyticRayTracing/analytic_raytracing.cpp//basically a c++ recasting of the python code written by c glaser #include #include #include #include #include #include #include #include #include #include //for gsl numerical integration #include //for gsl root finding #include #include #include #include #include using namespace std; //some global constants double speed_of_light = 299792458 * utl::m/utl::s; //meters/second double pi = atan(1.)*4.; //compute and store pi double inf = 1e130; //infinity for all practical purposes... double index_vs_depth(double z, double n_ice, double delta_n, double z_0){ //return the index of refraction at a given depth double index = n_ice - (delta_n*exp(z/z_0)); return index; } double get_gamma(double z, double n_ice, double delta_n, double z_0){ return delta_n * exp(z/z_0); } void get_turning_point(double c, double &gamma2, double &z2, double n_ice, double delta_n, double z_0){ //calculate the turning point (the maximum of the ray tracing path) double b = 2. * n_ice; gamma2 = b*0.5 - sqrt(0.25 * pow(b,2.) - c); z2 = log(gamma2/delta_n) * z_0; } double get_y(double gamma, double C0, double C1, double n_ice, double delta_n, double z_0){ //parameters //gamma: gamma is a function of the depth z //c0: first parameter //c1: second paramter double b = 2. * n_ice; double c = pow(n_ice,2.) - pow(C0,-2.); double root = abs( pow(gamma,2.) - gamma*b + c); double logargument = gamma / ( 2.*sqrt(c) * sqrt(root) - b*gamma + 2.*c); double result = z_0 * 1./sqrt((pow(n_ice,2.) * pow(C0,2.) - 1)) * log(logargument) + C1; return result; } double get_y_with_z_mirror(double n_ice, double delta_n, double z_0, double z, double C0, double C1=0.){ //parameters //z: arrays of depths //c0: first parameter //c1: second parameter double c = pow(n_ice,2.) - pow(C0,-2.); double gamma_turn, z_turn; get_turning_point(c, gamma_turn, z_turn, n_ice, delta_n, z_0); if(z_turn >=0.){ //signal is reflected at surface z_turn=0.; //we've hit the surface gamma_turn=get_gamma(0.,n_ice, delta_n, z_0); //get gamma at the surface } double y_turn = get_y(gamma_turn,C0,C1,n_ice, delta_n, z_0); double result=0.; if(z < z_turn){ double gamma = get_gamma(z,n_ice, delta_n, z_0); result=get_y(gamma,C0,C1,n_ice, delta_n, z_0); } else{ double gamma = get_gamma(2*z_turn - z,n_ice, delta_n, z_0); result = 2*y_turn - get_y(gamma,C0,C1,n_ice, delta_n, z_0); } return result; } double get_C1(double pos[2], double C0, double n_ice, double delta_n, double z_0){ //calculates C1 for a given C0 and starting point X1 return pos[0] - get_y_with_z_mirror(n_ice, delta_n, z_0, pos[1],C0); } double get_c(double C0, double n_ice, double delta_n, double z_0){ return pow(n_ice,2.)-pow(C0,-2.); } double get_C0_from_log(double logC0, double n_ice, double delta_n, double z_0){ //transforms fit parameter C0 so that the likelihood looks better return exp(logC0) + 1./n_ice; } double get_z_unmirrored(double z, double C0, double n_ice, double delta_n, double z_0){ //calculates the unmirrored z position double c = pow(n_ice,2.) - pow(C0,-2.); double gamma_turn, z_turn; get_turning_point(c, gamma_turn, z_turn,n_ice, delta_n, z_0); if(z_turn >=0.){ //signal is reflected at surface z_turn=0.; //we've hit the surface gamma_turn=get_gamma(0.,n_ice, delta_n, z_0); //get gamma at the surface } double z_unmirrored = z; if(z > z_turn) z_unmirrored = 2*z_turn - z; return z_unmirrored; } double get_y_diff(double z_raw, double C0, double n_ice, double delta_n, double z_0){ //derivative dy(z)/dz double b = 2. * n_ice; double z = get_z_unmirrored(z_raw, C0,n_ice, delta_n, z_0); double c = pow(n_ice,2.) - pow(C0,-2.); double term1 = -sqrt(c) * exp(z/z_0) * b * delta_n + 2.*sqrt(-b * delta_n * exp(z/z_0) + pow(delta_n,2.)*exp(2.*z/z_0) + c) * c + 2.*pow(c,3./2.); double term2 = 2. * sqrt(c) * sqrt(-b * delta_n * exp(z/z_0) + pow(delta_n,2.) * exp(2.*z/z_0) + c) -b*delta_n*exp(z/z_0)+ + 2.*c; double term3 = -b * delta_n * exp(z/z_0) + pow(delta_n,2.) * exp(2.*z/z_0) + c; double term4 = pow(n_ice,2.)*pow(C0,2.)-1; double res = term1 / term2 * 1./sqrt(term3) * 1./sqrt(term4); if(z != z_raw) res*=-1.; return res; } void get_z_mirrored(double pos[2], double pos2[2], double C0, double (&x2_mirrored)[2], double n_ice, double delta_n, double z_0){ //calculates the mirrored x2 position so that y(z) can be used as a continuous function double c = pow(n_ice,2.) - pow(C0,-2.); double C1 = pos[0] - get_y_with_z_mirror(n_ice, delta_n, z_0, pos[1],C0); double gamma_turn, z_turn; get_turning_point(c, gamma_turn, z_turn,n_ice, delta_n, z_0); if(z_turn >=0.){ //signal is reflected at surface z_turn=0.; //we've hit the surface gamma_turn=get_gamma(0.,n_ice, delta_n, z_0); //get gamma at the surface } double y_turn = get_y(gamma_turn,C0,C1,n_ice, delta_n, z_0); double z_start = pos[1]; double z_stop = pos2[1]; if(y_turn a); double n_ice = (params->b); double delta_n = (params->a); double z_0 = (params->d); return sqrt((pow(get_y_diff(t,C0, n_ice, delta_n, z_0),2.)+1)); } double get_path_length(double pos[2], double pos2[2], double C0, double n_ice, double delta_n, double z_0){ double x2_mirrored[2]={0.}; get_z_mirrored(pos,pos2,C0,x2_mirrored,n_ice, delta_n, z_0); gsl_integration_workspace *w = gsl_integration_workspace_alloc(1000); gsl_function F; F.function = &ds; struct ds_params params = {C0,n_ice, delta_n, z_0}; F.params=¶ms; double result, error; double epsrel = 1.e-7; //small initial absolute error int max_badfunc_tries=7; int num_badfunc_tries=0; int status; /* This structuring allows for adaptive relative errors in the integral In many cases, the integral can be achieved with relative error between solutions of 1.e-7 But there are several cases were the error bound needs to be as high as 30e-7 So this raises the erorr bound by a factor of two, up to six times This means the largest relative error we're going to tolerate is 6.4e-6 (64e-7) If this relative error cannot be achieved, we will return an path length of zero */ gsl_error_handler_t *myhandler = gsl_set_error_handler_off(); //I want to handle my own errors (dangerous thing to do generally...) do{ status = gsl_integration_qags(&F, pos[1], x2_mirrored[1],0,epsrel,1000,w,&result,&error); if(status!=GSL_SUCCESS){ status=GSL_CONTINUE; num_badfunc_tries++; epsrel*=2.; //double the size of the relative error } }while(status == GSL_CONTINUE && num_badfunc_triesa); double n_ice = (params->b); double delta_n = (params->c); double z_0 = (params->d); double z = get_z_unmirrored(t,C0,n_ice, delta_n, z_0); return sqrt((pow(get_y_diff(t,C0,n_ice, delta_n, z_0),2.)+1)) / speed_of_light * index_vs_depth(z, n_ice, delta_n, z_0); } double get_travel_time(double pos[2], double pos2[2], double C0, double n_ice, double delta_n, double z_0){ double x2_mirrored[2]={0.}; get_z_mirrored(pos,pos2,C0,x2_mirrored, n_ice, delta_n, z_0); gsl_integration_workspace *w = gsl_integration_workspace_alloc(1000); gsl_function F; F.function = &dt; struct dt_params params = {C0, n_ice, delta_n, z_0}; F.params=¶ms; double result, error; gsl_integration_qags(&F, pos[1], x2_mirrored[1],0,10.e-7,1000,w,&result,&error); gsl_integration_workspace_free(w); return result; } //this function is explicitly prepared for gsl integration in get_attenuation_along_path struct dt_freq_params{ double a; double c; double d; double e; double f; int model;}; //a=C0, c=freq, d=n_ice, e=delta_n, f=z_0 double dt_freq (double t, void *p){ struct dt_freq_params *params = (struct dt_freq_params *)p; double C0 = (params->a); double freq = (params->c); double n_ice = (params->d); double delta_n = (params->e); double z_0 = (params->f); double z = get_z_unmirrored(t,C0,n_ice, delta_n, z_0); return sqrt((pow(get_y_diff(t,C0,n_ice, delta_n, z_0),2.)+1)) / get_attenuation_length(z,freq, params->model); } double get_attenuation_along_path(double pos[2], double pos2[2], double C0, double frequency, double n_ice, double delta_n, double z_0, int model){ double x2_mirrored[2]={0.}; get_z_mirrored(pos,pos2,C0,x2_mirrored, n_ice, delta_n, z_0); gsl_integration_workspace *w = gsl_integration_workspace_alloc(2000); gsl_function F; F.function = &dt_freq; struct dt_freq_params params = {C0,frequency, n_ice, delta_n, z_0, model}; F.params=¶ms; double result, error; double epsrel = 1.e-7; //small initial absolute error int max_badfunc_tries=6; int num_badfunc_tries=0; int status; /* This structuring allows for adaptive relative errors in the integral In many cases, the integral can be achieved with relative error between solutions of 1.e-7 But there are several cases were the error bound needs to be as high as 30e-7 So this raises the erorr bound by a factor of two, up to six times This means the largest relative error we're going to tolerate is 6.4e-6 (64e-7) If this relative error cannot be achieved, we will return an attenuation of zero */ gsl_error_handler_t *myhandler = gsl_set_error_handler_off(); //I want to handle my own errors (dangerous thing to do generally...) do{ status = gsl_integration_qags(&F, pos[1], x2_mirrored[1],0,epsrel,2000,w,&result,&error); if(status!=GSL_SUCCESS){ status=GSL_CONTINUE; num_badfunc_tries++; epsrel*=2.; //double the size of the relative error } }while(status == GSL_CONTINUE && num_badfunc_triesupper_bound) {return inf;} double c = pow(n_ice,2.) - pow(C0,-2.); //determine y translation double C1 = x1[0] - get_y_with_z_mirror( n_ice, delta_n, z_0, x1[1],C0); //for a given C0, 3 cases are possible to reach the position of x2 //1: Direct ray--before the turning point //2: Refracted ray--after the turning point but not touching surface //3: Reflected ray--after the ray reaches the surface double gamma_turn, z_turn; get_turning_point(c, gamma_turn, z_turn, n_ice, delta_n, z_0); if(z_turn > 0.){ z_turn = 0.; //a reflection is just a turning point at z=0, ie case 2 and 3 are the same gamma_turn = get_gamma(z_turn, n_ice, delta_n, z_0); } double y_turn = get_y(gamma_turn,C0,C1, n_ice, delta_n, z_0); if(z_turn < x2[1]){ //turning points is deeper than x2 positions, can't reach target // the minimizer has problems finding the minimum if inf is returned here. Therefore, we return the distance // between the turning point and the target point + 10 x the distance between the z position of the turning points // and the target position. This results in a objective function that has the solutions as the only minima and // is smooth in C_0 return -(pow(pow(z_turn - x2[1], 2) + pow(y_turn - x2[0], 2), 0.5) + 10 * fabs(z_turn - x2[1])); } if(y_turn > x2[0]){//always propagate from left to right //direct ray double y2_fit = get_y(get_gamma(x2[1], n_ice, delta_n, z_0),C0,C1, n_ice, delta_n, z_0); //calculate the y position at get_path position double diff = (x2[0] - y2_fit); return diff; } else{ //now it's a bit more complicated; we need to transform the coordinates to be on the mirrored part of the function double z_mirrored = x2[1]; double gamma = get_gamma(z_mirrored, n_ice, delta_n, z_0); double y2_raw = get_y(gamma, C0, C1, n_ice, delta_n, z_0); double y2_fit = 2 * y_turn-y2_raw; double diff = x2[0] - y2_fit; return -1*diff; } } int determine_solution_type(double x1[2], double x2[2], double C0, double n_ice, double delta_n, double z_0){ //return 1 for direct solution //return 2 for refracted //return 3 for reflected double c = pow(n_ice,2.) - pow(C0,-2.); double C1 = x1[0] - get_y_with_z_mirror(n_ice, delta_n, z_0, x1[1],C0); double gamma_turn, z_turn; get_turning_point(c, gamma_turn, z_turn, n_ice, delta_n, z_0); if(z_turn >= 0.){ z_turn=0.; gamma_turn = get_gamma(0, n_ice, delta_n, z_0); } double y_turn = get_y(gamma_turn,C0,C1, n_ice, delta_n, z_0); if(x2[0] < y_turn) return 1; //direct else{ if(abs(z_turn-0.0)<1e-6) return 3; // reflected, trying to do z_turn==0, but == is bad with doubles else return 2; //refracted } } //deprecated, but here for posterity /* double obj_delta_y_square(double logC0, double x1[2], double x2[2]){ //objective function to find solution for C0 double C0 = get_C0_from_log(logC0); return pow(get_delta_y(C0,x1,x2),2.); } */ //this function is explicitly prepared for gsl root finding in find_solutions struct obj_delta_y_square_params{double x1_x; double x1_z; double x2_x; double x2_z; double a; double b; double c;}; //x1_x=x1[0] and so forth, a=n_ice, b=delta_n, c=z_0 double obj_delta_y_square(double logC0, void *p){ struct obj_delta_y_square_params *params = (struct obj_delta_y_square_params *)p; double x1[2], x2[2]; x1[0] = (params->x1_x); x1[1] = (params->x1_z); x2[0] = (params->x2_x); x2[1] = (params->x2_z); double n_ice = (params->a); double delta_n = (params->b); double z_0 = (params->c); double C0 = get_C0_from_log(logC0, n_ice, delta_n, z_0); return pow(get_delta_y(C0,x1,x2, n_ice, delta_n, z_0),2.); } //this function is explicity prepared for gsl root finding in find_solutions //it is the "derivative" //the derivative is f(x+h) - f(x) / h for small h //so let's just hard code that double obj_delta_y_square_df(double logC0, void *p){ struct obj_delta_y_square_params *params = (struct obj_delta_y_square_params *)p; double x1[2], x2[2]; x1[0] = (params->x1_x); x1[1] = (params->x1_z); x2[0] = (params->x2_x); x2[1] = (params->x2_z); double n_ice = (params->a); double delta_n = (params->b); double z_0 = (params->c); double C0 = get_C0_from_log(logC0, n_ice, delta_n, z_0); double increment_size = C0/10000.; //our small h return (pow(get_delta_y(C0+increment_size,x1,x2, n_ice, delta_n, z_0),2.)-pow(get_delta_y(C0,x1,x2, n_ice, delta_n, z_0),2.))/increment_size; //definition of derivative } //this function is explicity prepared for gsl root finding in find_solutions //it is the "f * derivative" void obj_delta_y_square_fdf(double logC0, void *p, double *y, double *dy){ struct obj_delta_y_square_params *params = (struct obj_delta_y_square_params *)p; double x1[2], x2[2]; x1[0] = (params->x1_x); x1[1] = (params->x1_z); x2[0] = (params->x2_x); x2[1] = (params->x2_z); double n_ice = (params->a); double delta_n = (params->b); double z_0 = (params->c); double C0 = get_C0_from_log(logC0, n_ice, delta_n, z_0); double increment_size = C0/10000.; //our small h *y = pow(get_delta_y(C0,x1,x2, n_ice, delta_n, z_0),2.); *dy = (pow(get_delta_y(C0+increment_size,x1,x2, n_ice, delta_n, z_0),2.)-pow(get_delta_y(C0,x1,x2, n_ice, delta_n, z_0),2.))/increment_size; //definition of derivative } /* double obj_delta_y(double logC0, double x1[2], double x2[2]){ //function to find solution for C0, returns distance in y between function and x2 position //result is signed! (important to use root finder) double C0 = get_C0_from_log(logC0); return get_delta_y(C0,x1,x2); } */ //this function is explicitly prepared for gsl root finding in find_solutions double obj_delta_y(double logC0, void *p){ struct obj_delta_y_square_params *params = (struct obj_delta_y_square_params *)p; double x1[2], x2[2]; x1[0] = (params->x1_x); x1[1] = (params->x1_z); x2[0] = (params->x2_x); x2[1] = (params->x2_z); double n_ice = (params->a); double delta_n = (params->b); double z_0 = (params->c); double C0 = get_C0_from_log(logC0, n_ice, delta_n, z_0); return get_delta_y(C0,x1,x2, n_ice, delta_n, z_0); } vector > find_solutions(double x1[2], double x2[2], double n_ice, double delta_n, double z_0){ //function finds all ray tracing solutions //we assume that x2 is above and to the right of x2_mirrored //this is perfectly general, as a coordinate transform can put any system in this configuration // printf("finding solution from %f %f to %f %f with %f %f %f", x1[0], x1[1], x2[0], x2[1], n_ice, delta_n, z_0); //returns a vector of vectors of the C0 solutions //entry 0 will be logC0 //entry 1 will be CO //entry 2 will be C1 //entry 3 will be type vector < vector > results; struct obj_delta_y_square_params params = {x1[0],x1[1],x2[0],x2[1], n_ice, delta_n, z_0}; ///////// ////Find root 1: a first solution; check around logC0=-1 ///////// int status; int iter=0, max_iter=200; double x_guess = -1; bool found_root_1=false; double root_1=-10000000; //some insane value we'd never believe const gsl_root_fdfsolver_type *Tfdf; gsl_root_fdfsolver *sfdf; gsl_function_fdf FDF; FDF.f = &obj_delta_y_square; FDF.df = &obj_delta_y_square_df; FDF.fdf = &obj_delta_y_square_fdf; FDF.params = ¶ms; Tfdf = gsl_root_fdfsolver_secant; sfdf = gsl_root_fdfsolver_alloc(Tfdf); int num_badfunc_tries = 0; int max_badfunc_tries = 100; gsl_root_fdfsolver_set(sfdf,&FDF,x_guess); gsl_error_handler_t *myhandler = gsl_set_error_handler_off(); //I want to handle my own errors (dangerous thing to do generally...) do{ iter++; //cout<<"Got to iter "< sol1; sol1.push_back(root_1); double C0 = get_C0_from_log(root_1, n_ice, delta_n, z_0); sol1.push_back(C0); sol1.push_back(get_C1(x1,C0, n_ice, delta_n, z_0)); sol1.push_back(ceil(double(determine_solution_type(x1,x2,C0, n_ice, delta_n, z_0)))); // printf("Solution 1 [logC0, C0, C1, type]: [%.4f, %.4f, %.4f, %f]]\n",sol1[0],sol1[1],sol1[2],sol1[3]); results.push_back(sol1); //reset this counter num_badfunc_tries = 0; ///////// ////Find root 2: a second solution ///////// //now to check if another solution with higher logC0 exists //if the above algorithm failed, then we have to be more brute-forcy in the next go around double logC0_start; if(!found_root_1) logC0_start=0.; else logC0_start = root_1+0.0001; gsl_function F; F.function = &obj_delta_y; F.params = ¶ms; double logC0_stop = 100.; double delta_start = GSL_FN_EVAL(&F,logC0_start); double delta_stop = GSL_FN_EVAL(&F,logC0_stop); bool found_root_2 = false; double root_2 = -10000000; if(signbit(delta_start)!=signbit(delta_stop)){ //printf("Solutions with logc0 > %.3f exist\n",root_1); //now we must solve again //let's use Brent's method, which should be faster //now that we know there is a y=0 (x-axis) crossing int status2; const gsl_root_fsolver_type *T; gsl_root_fsolver *s; T = gsl_root_fsolver_brent; s = gsl_root_fsolver_alloc(T); gsl_root_fsolver_set(s, &F, logC0_start, logC0_stop); gsl_error_handler_t *myhandler = gsl_set_error_handler_off(); //I want to handle my own errors (dangerous thing to do generally...) iter=0; do{ iter++; status2 = gsl_root_fsolver_iterate(s); logC0_start = gsl_root_fsolver_x_lower(s); logC0_stop = gsl_root_fsolver_x_upper(s); //printf("[Iter, Xlo, Xhi]: [%d, %.8f, %.8f] \n",iter,logC0_start,logC0_stop); status2 = gsl_root_test_interval(logC0_start,logC0_stop,0,0.000001); if(status2==GSL_EBADFUNC) {status2=GSL_CONTINUE; num_badfunc_tries++; continue;} if(status2 == GSL_SUCCESS){ // printf("Converged on root 2! Iteration %d\n",iter); found_root_2=true; root_2 = gsl_root_fsolver_root(s); } } while (status2 == GSL_CONTINUE && iter < max_iter && num_badfunc_tries sol2; sol2.push_back(root_2); double C0 = get_C0_from_log(root_2, n_ice, delta_n, z_0); sol2.push_back(C0); sol2.push_back(get_C1(x1,C0, n_ice, delta_n, z_0)); sol2.push_back(ceil(double(determine_solution_type(x1,x2,C0, n_ice, delta_n, z_0)))); // printf("Solution 2 [logC0, C0, C1, type]: [%.4f, %.4f, %.4f, %f]]\n",sol2[0],sol2[1],sol2[2],sol2[3]); results.push_back(sol2); } } // else printf("No solution with logc0 > %.3f exist\n",logC0_start); //reset this counter num_badfunc_tries = 0; ///////// ////Find root 3: a third solution ///////// //now to check if another solution with lower logC0 exists //if the above algorithm failed, then we have to be more brute-forcy in the next go around if(!found_root_1) logC0_stop=0.0001; else logC0_stop = root_1-0.0001; logC0_start = -100.; delta_start = GSL_FN_EVAL(&F,logC0_start); delta_stop = GSL_FN_EVAL(&F,logC0_stop); bool found_root_3 = false; double root_3 = -10000000; if(signbit(delta_start)!=signbit(delta_stop)){ //printf("Solutions with logc0 > %.3f exist\n",root_1); //now we must solve again //let's use Brent's method, which should be faster //now that we know there is a y=0 (x-axis) crossing int status3; const gsl_root_fsolver_type *T; gsl_root_fsolver *s; gsl_function F; F.function = &obj_delta_y; F.params = ¶ms; T = gsl_root_fsolver_brent; s = gsl_root_fsolver_alloc(T); gsl_root_fsolver_set(s, &F, logC0_start, logC0_stop); gsl_error_handler_t *myhandler = gsl_set_error_handler_off(); //I want to handle my own errors (dangerous thing to do generally...) iter=0; do{ iter++; status3 = gsl_root_fsolver_iterate(s); logC0_start = gsl_root_fsolver_x_lower(s); logC0_stop = gsl_root_fsolver_x_upper(s); // printf("[Iter, Xlo, Xhi]: [%d, %.8f, %.8f] \n",iter,logC0_start,logC0_stop); status3 = gsl_root_test_interval(logC0_start,logC0_stop,0,0.000001); if(status3==GSL_EBADFUNC) {status3=GSL_CONTINUE; num_badfunc_tries++; continue;} if(status3 == GSL_SUCCESS){ // printf("Converged on root 3! Iteration %d\n",iter); found_root_3=true; root_3 = gsl_root_fsolver_root(s); } } while (status3 == GSL_CONTINUE && iter < max_iter && num_badfunc_tries sol3; sol3.push_back(root_3); double C0 = get_C0_from_log(root_3, n_ice, delta_n, z_0); sol3.push_back(C0); sol3.push_back(get_C1(x1,C0, n_ice, delta_n, z_0)); sol3.push_back(ceil(double(determine_solution_type(x1,x2,C0, n_ice, delta_n, z_0)))); // printf("Solution 3 [logC0, C0, C1, type]: [%.4f, %.4f, %.4f, %f]]\n",sol3[0],sol3[1],sol3[2],sol3[3]); results.push_back(sol3); } } // else printf("No solution with logc0 < %.3f exist\n",logC0_stop); } else{ // printf("No solution exist anywhere!\n"); } return results; } void find_solutions2(double*& C0s, double*& C1s, int*& types, int& nSolutions, double y1, double z1, double y2, double z2, double n_ice, double delta_n, double z_0) { // clock_t begin = clock(); double x1[2] = {y1, z1}; double x2[2] = {y2, z2}; vector < vector > solutions2 = find_solutions(x1, x2, n_ice, delta_n, z_0); nSolutions = solutions2.size(); C0s = new double[nSolutions]; C1s = new double[nSolutions]; types = new int[nSolutions]; for (int i = 0; i < nSolutions; ++i) { C0s[i] = solutions2[i][1]; C1s[i] = solutions2[i][2]; types[i] = solutions2[i][3]; } // clock_t end = clock(); // double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC; // printf("%f (%d solutions)\n", 1000* elapsed_secs, nSolutions); } void get_path(double n_ice, double delta_n, double z_0, double x1[2], double x2[2], double C0, vector &res, vector &zs, int n_points=100){ //will return the ray tracing path between x1 and x2 //this is only true if C0 is a solution to the ray tracing problem //parameters //x1: start position (y,z) //x2: stop position (y,z) //C0: first parameter //n_points: number of points to calcuate //returns two vectors by reference //res are y coordinates //zs are z coordinates double c = pow(n_ice,2.) - pow(C0,-.2); double C1 = x1[0] - get_y_with_z_mirror(n_ice, delta_n, z_0, x1[1],C0); double gamma_turn, z_turn; get_turning_point(c, gamma_turn, z_turn, n_ice, delta_n, z_0); if(z_turn >=0.){ //signal reflects at surface z_turn=0.; gamma_turn = get_gamma(0, n_ice, delta_n, z_0); } double y_turn = get_y(gamma_turn, C0, C1, n_ice, delta_n, z_0); double zstart = x1[1]; double result[2]; get_z_mirrored(x1,x2,C0,result, n_ice, delta_n, z_0); double zstop = result[1]; double step_size = (zstop-zstart)/double(n_points-1); //do n-1 so that the bounds are actually the bounds vector z; //vector to hold z's for(int i=0; i > solutions = find_solutions(x1,x2, n_ice, delta_n, z_0); // if(solutions.size()>0){ // printf("C0 %.6f \n ",solutions[0][1]); // double att = get_attenuation_along_path(x1, x2, solutions[0][1], 0.00390625*utl::GHz,n_ice, delta_n, z_0, "SP1"); // printf("Att %.3f \n ", att); // } // // return 0; // //} PKmN ~~3NuRadioMC/SignalProp/CPPAnalyticRayTracing/setup.pyfrom distutils.core import setup from Cython.Build import cythonize from distutils.extension import Extension from Cython.Distutils import build_ext import numpy import os try: print('Your $GSLDIR = ' + str(os.environ['GSLDIR'])) except: print('You have either not installed GSL or have not set the system variable $GSLDIR.\ See NuRadioMC wiki for further GSL details. ') extensions = [ Extension('wrapper', ['wrapper.pyx'], #include_dirs=[numpy.get_include(), '../../utilities/'], include_dirs=[numpy.get_include(), '../../utilities/', str(os.environ['GSLDIR']) + '/include/'], extra_compile_args=['-O3'], libraries=['gsl', 'gslcblas'], language='c++' ), ] setup( ext_modules=cythonize(extensions), cmdclass = {'build_ext': build_ext} # extra_compile_args=["-w", '-g'] ) PKmNEL 6NuRadioMC/SignalProp/CPPAnalyticRayTracing/wrapper.pyximport numpy as np cimport numpy as np from operator import itemgetter import time # Numpy must be initialized. When using numpy from C or Cython you must # _always_ do that, or you will have segfaults np.import_array() cdef extern from "numpy/arrayobject.h": void PyArray_ENABLEFLAGS(np.ndarray arr, int flags) cdef extern from "analytic_raytracing.cpp": void find_solutions2(double * &, double * &, int * &, int & , double, double, double, double, double, double, double) double get_attenuation_along_path2(double, double, double, double, double, double, double, double, double, int) cpdef find_solutions(x1, x2, n_ice, delta_n, z_0): cdef: double * C0s double * C1s int * types int size np.npy_intp shape[1] # t = time.time() find_solutions2(C0s, C1s, types, size, x1[0], x1[1], x2[0], x2[1], n_ice, delta_n, z_0) # print((time.time() - t) * 1000) # 1. Make sure that you have called np.import_array() # http://gael-varoquaux.info/programming/ # cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html # 2. OWNDATA flag is important. It tells the NumPy to free data when the python object is deleted. # https://stackoverflow.com/questions/23872946/force-numpy-ndarray-to-take-ownership-of-its-memory-in-cython/ # You can verify that the memory gets freed when Python object is deleted by using tools such as pmap. shape[0] = < np.npy_intp > size cdef np.ndarray[double, ndim = 1] C0ss = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, C0s) PyArray_ENABLEFLAGS(C0ss, np.NPY_OWNDATA) cdef np.ndarray[double, ndim = 1] C1ss = np.PyArray_SimpleNewFromData(1, shape, np.NPY_DOUBLE, C1s) PyArray_ENABLEFLAGS(C1ss, np.NPY_OWNDATA) cdef np.ndarray[int, ndim = 1] typess = np.PyArray_SimpleNewFromData(1, shape, np.NPY_INT, types) PyArray_ENABLEFLAGS(typess, np.NPY_OWNDATA) solutions = [] for i in range(len(C0ss)): solutions.append({'type': typess[i], 'C0': C0ss[i], 'C1': C1ss[i]}) s = sorted(solutions, key=itemgetter('type')) # print((time.time() - t) * 1000) return s cpdef get_attenuation_along_path(x1, x2, C0, frequency, n_ice, delta_n, z_0, model): # t = time.time() return get_attenuation_along_path2(x1[0], x1[1], x2[0], x2[1], C0, frequency, n_ice, delta_n, z_0, model) # print((time.time() - t) * 1000) PKmN++6NuRadioMC/SignalProp/examples/A01IceCubePulserToARA.pyimport matplotlib.pyplot as plt import numpy as np import time from NuRadioMC.SignalProp import analyticraytraycing as ray from NuRadioMC.utilities import units, medium import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger('raytracing') x1 = [-2 * units.km, -1500. * units.m] # pulser position x2 = [0., -200. * units.m] # ARA antanna r = ray.ray_tracing_2D(medium.southpole_simple()) solution = r.find_solutions(x1, x2) fig, ax = plt.subplots(1, 1) yyy, zzz = r.get_path(x1, x2, solution[0]['C0']) ax.plot(yyy / units.m, zzz / units.m) yyy, zzz = r.get_path(x1, x2, solution[1]['C0']) ax.plot(yyy / units.m, zzz / units.m) ax.set_ylim(-1600, 0) ax.set_xlabel('x [m]') ax.set_ylabel('z [m]') fig.tight_layout() fig.savefig("plots/IceCubePulserToARA1.png") x1 = [-4 * units.km, -1500. * units.m] # pulser position x2 = [0., -200. * units.m] # ARA antanna r = ray.ray_tracing_2D(medium.southpole_simple()) solution = r.find_solutions(x1, x2) fig, ax = plt.subplots(1, 1) yyy, zzz = r.get_path(x1, x2, solution[0]['C0']) ax.plot(yyy / units.m, zzz / units.m) yyy, zzz = r.get_path(x1, x2, solution[1]['C0']) ax.plot(yyy / units.m, zzz / units.m) ax.set_ylim(-1600, 0) ax.set_xlabel('x [m]') ax.set_ylabel('z [m]') fig.tight_layout() fig.savefig("plots/IceCubePulserToARA2.png") plt.show() PKmN89 9 +NuRadioMC/SignalProp/examples/example_3d.pyimport matplotlib.pyplot as plt import numpy as np import time from NuRadioMC.SignalProp import analyticraytraycing as ray from NuRadioMC.utilities import units, medium import logging from radiotools import helper as hp from radiotools import plthelpers as php logging.basicConfig(level=logging.INFO) logger = logging.getLogger('raytracing') # ray.cpp_available=False x1 = np.array([478., 0., -149.])*units.m x2 = np.array([635., 0., -5.])*units.m # direct ray solution x3 = np.array([1000., 0., -90.])*units.m # refracted/reflected ray solution x4 = np.array([700., 0., -149.])*units.m # refracted/reflected ray solution x5 = np.array([1000., 0., -5.])*units.m # no solution receive_vectors = np.zeros((4, 2, 3)) * np.nan ray_tracing_C0 = np.zeros((4, 2)) * np.nan ray_tracing_C1 = np.zeros((4, 2)) * np.nan ray_tracing_solution_type = np.zeros((4, 2), dtype=np.int) * np.nan travel_times = np.zeros((4, 2)) * np.nan travel_distances = np.zeros((4, 2)) * np.nan ice = medium.southpole_simple() lss = ['-', '--', ':'] colors = ['b','g','r'] fig, ax = plt.subplots(1, 1) ax.plot(x1[0], x1[2], 'ko') for i, x in enumerate([x2, x3, x4, x5]): print('finding solutions for ', x) r = ray.ray_tracing(x1,x,ice) r.find_solutions() if(r.has_solution()): for iS in range(r.get_number_of_solutions()): ray_tracing_C0[i, iS] = r.get_results()[iS]['C0'] ray_tracing_solution_type[i, iS] = r.get_solution_type(iS) print " Solution %d, Type %d: "%(iS,ray_tracing_solution_type[i, iS]) R = r.get_path_length(iS) # calculate path length T = r.get_travel_time(iS) # calculate travel time print " Ray Distance %.3f and Travel Time %.3f"%(R/units.m,T/units.ns) receive_vector = r.get_receive_vector(iS) receive_vectors[i, iS] = receive_vector zenith, azimuth = hp.cartesian_to_spherical(*receive_vector) print " Receiving Zenith %.3f and Azimuth %.3f "%(zenith/units.deg, azimuth/units.deg) #to readout the actual trace, we have to flatten to 2D dX = x - x1 dPhi = -np.arctan2(dX[1],dX[0]) c,s = np.cos(dPhi), np.sin(dPhi) R = np.array(((c,-s,0),(s,c,0),(0,0,1))) X1r = x1 X2r = np.dot(R, x-x1) + x1 x1_2d = np.array([X1r[0],X1r[2]]) x2_2d = np.array([X2r[0],X2r[2]]) r_2d = ray.ray_tracing_2D(ice) yy,zz = r_2d.get_path(x1_2d,x2_2d,ray_tracing_C0[i, iS]) ax.plot(yy, zz, '{}'.format(php.get_color_linestyle(i)), label='{} C0 = {:.4f}'.format(ray_tracing_solution_type[i,iS], ray_tracing_C0[i,iS])) ax.plot(x2_2d[0], x2_2d[1], '{}{}-'.format('d',php.get_color(i))) ax.legend() ax.set_xlabel("y [m]") ax.set_ylabel("z [m]") fig.tight_layout() fig.savefig('example.png') PKmNN# 3NuRadioMC/SignalProp/tests/T01test_python_vs_cpp.pyimport matplotlib.pyplot as plt import numpy as np import time from NuRadioMC.SignalProp import analyticraytraycing as ray from NuRadioMC.utilities import units, medium import logging import time from radiotools import helper as hp from radiotools import plthelpers as php logging.basicConfig(level=logging.INFO) logger = logging.getLogger('test_raytracing') ice = medium.southpole_simple() np.random.seed(0) # set seed to have reproducible results n_events = int(1e3) rmin = 50. * units.m rmax = 3. * units.km zmin = 0. * units.m zmax = -3. * units.km rr = np.random.triangular(rmin, rmax, rmax, n_events) phiphi = np.random.uniform(0, 2 * np.pi, n_events) xx = rr * np.cos(phiphi) yy = rr * np.sin(phiphi) zz = np.random.uniform(zmin, zmax, n_events) points = np.array([xx, yy, zz]).T x_receiver = np.array([0., 0., -5.]) results_C0s_cpp = np.zeros((n_events, 2)) n_freqs = 256/2 + 1 # n_freqs = 5 results_A_cpp = np.zeros((n_events, 2, n_freqs)) t_start = time.time() ff = np.linspace(0, 500*units.MHz, n_freqs) # tt = 0 for iX, x in enumerate(points): # t_start2 = time.time() r = ray.ray_tracing(x, x_receiver, ice) # tt += (time.time() - t_start2) r.find_solutions() if(r.has_solution()): for iS in range(r.get_number_of_solutions()): results_C0s_cpp[iX, iS] = r.get_results()[iS]['C0'] results_A_cpp[iX, iS] = r.get_attenuation(iS, ff) t_cpp = time.time() - t_start print("CPP time = {:.1f} seconds = {:.2f}ms/event".format(t_cpp, 1000. * t_cpp / n_events)) # print("CPP time = {:.1f} seconds = {:.2f}ms/event".format(tt, 1000. * tt / n_events)) results_C0s_python = np.zeros((n_events, 2)) results_A_python = np.zeros((n_events, 2, n_freqs)) ray.cpp_available = False t_start = time.time() for iX, x in enumerate(points): r = ray.ray_tracing(x, x_receiver, ice) r.find_solutions() if(r.has_solution()): for iS in range(r.get_number_of_solutions()): results_C0s_python[iX, iS] = r.get_results()[iS]['C0'] results_A_python[iX, iS] = r.get_attenuation(iS, ff) t_python = time.time() - t_start print("Python time = {:.1f} seconds = {:.2f}ms/event".format(t_python, 1000. * t_python / n_events)) print("consistent results for C0: {}".format(np.allclose(results_C0s_cpp, results_C0s_python))) print("consistent results for attenuation length: {}".format(np.allclose(results_A_cpp, results_A_python))) print("consistent results for attenuation length rtol=1e-2, atol=1e-3: {}".format(np.allclose(results_A_cpp, results_A_python, rtol=1e-2, atol=1e-3))) PKmN?C 2NuRadioMC/SignalProp/tests/T02test_analytic_D_T.pyimport matplotlib.pyplot as plt import numpy as np import time from NuRadioMC.SignalProp import analyticraytraycing as ray from NuRadioMC.utilities import units, medium import logging import time from radiotools import helper as hp from radiotools import plthelpers as php logging.basicConfig(level=logging.INFO) logger = logging.getLogger('test_raytracing') ice = medium.southpole_simple() np.random.seed(0) # set seed to have reproducible results n_events = int(1e4) rmin = 50. * units.m rmax = 3. * units.km zmin = 0. * units.m zmax = -3. * units.km rr = np.random.triangular(rmin, rmax, rmax, n_events) phiphi = np.random.uniform(0, 2 * np.pi, n_events) xx = rr * np.cos(phiphi) yy = rr * np.sin(phiphi) zz = np.random.uniform(zmin, zmax, n_events) points = np.array([xx, yy, zz]).T x_receiver = np.array([0., 0., -5.]) results_D = np.zeros((n_events, 2)) results_D_analytic = np.zeros((n_events, 2)) results_T = np.zeros((n_events, 2)) results_T_analytic = np.zeros((n_events, 2)) d_numeric = 0 d_analytic = 0 t_numeric = 0 t_analytic = 0 for iX, x in enumerate(points): r = ray.ray_tracing(x, x_receiver, ice) r.find_solutions() if(r.has_solution()): for iS in range(r.get_number_of_solutions()): t_start = time.time() results_D[iX, iS] = r.get_path_length(iS, analytic=False) d_numeric += time.time() - t_start t_start = time.time() results_D_analytic[iX, iS] = r.get_path_length(iS, analytic=True) d_analytic += time.time() - t_start t_start = time.time() results_T[iX, iS] = r.get_travel_time(iS, analytic=False) t_numeric += time.time() - t_start t_start = time.time() results_T_analytic[iX, iS] = r.get_travel_time(iS, analytic=True) t_analytic += time.time() - t_start # print("analytic {:.2f}".format(results_D_analytic[iX, iS])) # if(np.abs(results_D[iX, iS] - results_D_analytic[iX, iS]) > 0.1): # print(np.abs(results_D[iX, iS] - results_D_analytic[iX, iS])) # a = 1/0 t_cpp = time.time() - t_start print("analytic {:.1f} seconds = {:.2f}ms/event".format(d_analytic, 1000. * d_analytic / n_events)) print("numeric {:.1f} seconds = {:.2f}ms/event".format(d_numeric, 1000. * d_numeric / n_events)) print("analytic {:.1f} seconds = {:.2f}ms/event".format(t_analytic, 1000. * t_analytic / n_events)) print("numeric {:.1f} seconds = {:.2f}ms/event".format(t_numeric, 1000. * t_numeric / n_events)) print("distance ", np.allclose(results_D, results_D_analytic, atol=1e-1, rtol=1e-3)) print("travel time ", np.allclose(results_T, results_T_analytic, atol=1e-1, rtol=1e-3))PKmNQs 0NuRadioMC/SignalProp/tests/T03overall_speedup.pyimport matplotlib.pyplot as plt import numpy as np import time from NuRadioMC.SignalProp import analyticraytraycing as ray from NuRadioMC.utilities import units, medium import logging import time from radiotools import helper as hp from radiotools import plthelpers as php logging.basicConfig(level=logging.INFO) logger = logging.getLogger('test_raytracing') ice = medium.southpole_simple() np.random.seed(0) # set seed to have reproducible results n_events = int(1e3) rmin = 50. * units.m rmax = 3. * units.km zmin = 0. * units.m zmax = -3. * units.km rr = np.random.triangular(rmin, rmax, rmax, n_events) phiphi = np.random.uniform(0, 2 * np.pi, n_events) xx = rr * np.cos(phiphi) yy = rr * np.sin(phiphi) zz = np.random.uniform(zmin, zmax, n_events) points = np.array([xx, yy, zz]).T x_receiver = np.array([0., 0., -5.]) results_C0s_cpp = np.zeros((n_events, 2)) n_freqs = 256/2 + 1 results_A_cpp = np.zeros((n_events, 2, n_freqs)) t_start = time.time() ff = np.linspace(0, 500*units.MHz, n_freqs) # tt = 0 for iX, x in enumerate(points): # t_start2 = time.time() r = ray.ray_tracing(x, x_receiver, ice) # tt += (time.time() - t_start2) r.find_solutions() if(r.has_solution()): for iS in range(r.get_number_of_solutions()): results_C0s_cpp[iX, iS] = r.get_results()[iS]['C0'] results_A_cpp[iX, iS] = r.get_attenuation(iS, ff) r.get_travel_time(iS) r.get_path_length(iS) t_cpp = time.time() - t_start print("CPP time = {:.1f} seconds = {:.2f}ms/event".format(t_cpp, 1000. * t_cpp / n_events)) # print("CPP time = {:.1f} seconds = {:.2f}ms/event".format(tt, 1000. * tt / n_events)) results_C0s_python = np.zeros((n_events, 2)) results_A_python = np.zeros((n_events, 2, n_freqs)) ray.cpp_available = False t_start = time.time() for iX, x in enumerate(points): r = ray.ray_tracing(x, x_receiver, ice) r.find_solutions() if(r.has_solution()): for iS in range(r.get_number_of_solutions()): results_C0s_python[iX, iS] = r.get_results()[iS]['C0'] results_A_python[iX, iS] = r.get_attenuation(iS, ff) r.get_travel_time(iS, analytic=False) r.get_path_length(iS, analytic=False) t_python = time.time() - t_start print("Python time = {:.1f} seconds = {:.2f}ms/event".format(t_python, 1000. * t_python / n_events)) print("overall speedup = {:.2f}".format(t_python/ t_cpp)) print("consistent results for C0: {}".format(np.allclose(results_C0s_cpp, results_C0s_python))) print("consistent results for attenuation length: {}".format(np.allclose(results_A_cpp, results_A_python))) print("consistent results for attenuation length rtol=1e-2, atol=1e-3: {}".format(np.allclose(results_A_cpp, results_A_python, rtol=1e-2, atol=1e-3))) PKmNϟ'NuRadioMC/data/ARASimDummyEventList.txt//version VERSION=0.1 EVENT_NUM=5 //evid nuflavorint nu_nubar pnu currentint posnu_r posnu_theta posnu_phi nnu_theta nnu_phi elast_y //use -999 as a flag of random input // 1 2 0 2.000e+01 1 3666.19334 -0.33859 4.53771 2.13653 1.81084 0.14443 1 -999 -999 2.000e+01 -999 -999 -0.33859 4.53771 2.13653 1.81084 -999 // 2 3 1 2.000e+01 1 3666.19334 -0.33859 4.53771 2.25600 1.52305 0.02829 2 -999 -999 2.000e+01 -999 -999 -0.33859 4.53771 2.25600 1.52305 -999 3 3 0 2.000e+01 1 1000 -0.78 3.14 2.17 0.32969 0.53350 4 1 1 2.000e+01 1 3666.19334 -0.33859 4.53771 1.27277 0.41801 0.33688 5 2 0 2.000e+01 1 3666.19334 -0.33859 4.53771 1.36963 0.40095 0.00098 PKmN *NuRadioMC/data/NuRadioMCDummyEventList.txtVERSION=0.2 # standard event list format of NuRadioMC (adapted from ARASim) # the very first line defines the file version, all other lines represent the events # each row specifies one event # all quantities are in the default NuRadioMC units (i.e., meters, radians and eV) # all geometry quantities are in the NuRadioMC default local coordinate system: # coordinate origin is at the surface # x axis is towards Easting, y axis towards Northing, z axis upwards # zenith/theta angle is defined with respect to z axis, i.e. 0deg = upwards, 90deg = towards horizon, 180deg = downwards # azimuth/phi angle counting northwards from East # # the collumns are defined as follows # 1. event id (integer) # 2. neutrino flavor (integer) encoded as using PDF numbering scheme, particles have positive sign, anti-particles have negative sign, relevant for us are: # 12: electron neutrino # 14: muon neutrino # 16: tau neutrino # 3. energy of neutrino (double) # 4. charge or neutral current interaction (string, one of ['cc', 'nc'] # 5./6./7. position of neutrino interaction vertex in cartesian coordinates (x, y, z) (in default NuRadioMC local coordinate system) # 8. zenith/theta angle of neutrino direction (pointing into direction of propagation) # 9. azimuth/phi angle of neutrino direction (pointing into direction of propagation) # 10. inelasticity (the fraction of neutrino energy that goes into the hadronic part) # 1 12 1e18 nc -200 0 -1000 2.3 0 0.3 2 14 2.5e18 nc -200 0 -1000 2.3 0 0.3 3 -16 2.3e20 cc -200 0 -500 2.3 0 0.3 4 12 1e18 nc -200 0 -1000 2.3 1.4 0.3 PKmN(0;"NuRadioMC/data/dummyEventList.hdf5HDF  `xTREEPHEAPXeventlist@  XeventId@nuflavorint@nu_nubar@pnu ?@4 4currentint  ?@4 4posnu_r( ?@4 4posnu_theta0 ?@4 4posnu_phi8 ?@4 4nnu_theta@ ?@4 4nnu_phiH ?@4 4elast_yP ?@4 4`ZSNOD  8VERSION ?@4 4?4@88A+0duտBs&@bg @E$]3?84@88A+0duտBs&@?5^I @Bi^?84@?ub@A+0duտBs&@eI? ^?On?4@?ub@A+0duտBs&@ZGUD]?T?sK!q?4@?ub@A+0duտBs&@|%?a2U0*?XjP?PKmNPE3(('NuRadioMC/data/dummyStationEfields.hdf5HDF  (`TREEHHEAPXevent_000001event_000002event_000003event_000004event_000005(pTREEHEAPX(test station 1test station 20SNOD Hhȍ(ȏ8hHh !@#Hh 8 event_id@ ( ?@4 4"ZxP?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@SNODh X position@d( ?@4 4"Z X position@d8@pTREEHEAPX(test station 1test station 20ȍ 8 event_id@( ?@4 4"Z X position@d(pHEAPX(test station 1test station 20Xp?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@SNOD( ?@4 4"Z X position@d8TREE 8 event_id@ ( ?@4 4"ZxPSNOD X position@d#p?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@( ?@4 4"Z X position@d8TREE؝HEAPX(test station 1test station 20 8 event_id@ ( ?@4 4 "Z xPSNODȜ X position@d ( ?@4 4"Z xP?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@ X position@d8TREE8%HEAPX(`#test station 1test station 20 !@# 8 event_id@ ( ?@4 4("Z&xPSNOD($& X position@d( ?@4 4"Z X position@d8?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@?@@@@@@ @"@$@&@(@*@,@.@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@@@A@A@B@B@C@C@D@D@E@E@F@F@G@G@H@H@I@I@J@J@K@K@L@L@M@M@N@N@O@O@P@@P@P@P@Q@@Q@Q@Q@R@@R@R@R@S@@S@S@S@T@@T@T@T@U@@U@U@U@V@@V@V@V@W@@W@W@W@X@@X@X@X@Y@@Y@Y@Y@Z@@Z@Z@Z@[@@[@[@[@\@@\@\@\@]@@]@]@]@^@@^@^@^@_@@_@_@_@`@ `@@`@``@`@`@`@`@a@ a@@a@`a@a@a@a@a@b@ b@@b@`b@b@b@b@b@c@ c@@c@`c@c@c@c@c@d@ d@@d@`d@d@d@d@d@e@ e@@e@`e@e@e@e@e@f@ f@@f@`f@f@f@f@f@g@ g@@g@`g@g@g@g@g@h@ h@@h@`h@h@h@h@h@i@ i@@i@`i@i@i@i@i@j@ j@@j@`j@j@j@j@j@k@ k@@k@`k@k@k@k@k@l@ l@@l@`l@l@l@l@l@m@ m@@m@`m@m@m@m@m@n@ n@@n@`n@n@n@n@n@o@ o@@o@`o@o@o@o@o@p@p@ p@0p@@p@Pp@`p@pp@p@p@p@p@p@p@p@p@q@q@ q@0q@@q@Pq@`q@pq@q@q@q@q@q@q@q@q@r@r@ r@0r@@r@Pr@`r@pr@r@r@r@r@r@r@r@r@s@s@ s@0s@@s@Ps@`s@ps@s@s@s@s@s@s@s@s@t@t@ t@0t@@t@Pt@`t@pt@t@t@t@t@t@t@t@t@u@u@ u@0u@@u@Pu@`u@pu@u@u@u@u@u@u@u@u@v@v@ v@0v@@v@Pv@`v@pv@v@v@v@v@v@v@v@v@w@w@ w@0w@@w@Pw@`w@pw@w@w@w@w@w@w@w@w@x@x@ x@0x@@x@Px@`x@px@x@x@x@x@x@x@x@x@y@?y@ y@0y@@y@Py@`y@py@y@y@y@y@y@y@y@y@z@z@ z@0z@@z@Pz@`z@pz@z@z@z@z@z@z@z@z@{@{@ {@0{@@{@P{@`{@p{@{@{@{@{@{@{@{@{@|@|@ |@0|@@|@P|@`|@p|@|@|@|@|@|@|@|@|@}@}@ }@0}@@}@P}@`}@p}@}@}@}@}@}@}@}@}@~@~@ ~@0~@@~@P~@`~@p~@~@~@~@~@~@~@~@~@@@ @0@@@P@`@p@@@@@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȁ@Ѐ@؀@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȁ@Ё@؁@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȃ@Ђ@؂@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȃ@Ѓ@؃@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȅ@Є@؄@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȅ@Ѕ@؅@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȇ@І@؆@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȇ@Ї@؇@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȉ@Ј@؈@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȉ@Љ@؉@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȋ@Њ@؊@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȋ@Ћ@؋@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȍ@Ќ@،@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȍ@Ѝ@؍@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@Ȏ@Ў@؎@@@@@@@@@ @(@0@8@@@H@P@X@`@h@p@x@@@@@@@@@@ȏ@Џ@؏@@@@@PKmN4jrzz$NuRadioMC/data/dummyStationList.json[ {"position": [-500, 0, -200], "name": "test station 2"}, {"position": [-500, 0, -5], "name": "test station 1"} ]PKmNNuRadioMC/examples/__init__.pyPKmNDMM?NuRadioMC/examples/01_Veff_simulation/T01generate_event_list.pyfrom __future__ import absolute_import, division, print_function from NuRadioMC.utilities import units from NuRadioMC.EvtGen.generator import generate_eventlist_cylinder # define simulation volume zmin = -2.7 * units.km # the ice sheet at South Pole is 2.7km deep zmax = 0 * units.km rmin = 0 * units.km rmax = 4 * units.km # generate one event list at 1e19 eV with 1000 neutrinos generate_eventlist_cylinder('1e19_n1e3.hdf5', 1e3, 1e19 * units.eV, 1e19 * units.eV, rmin, rmax, zmin, zmax, full_rmin=rmin, full_rmax=rmax, full_zmin=zmin, full_zmax=zmax) # generate one event list at 1e18 eV with 10000 neutrinos generate_eventlist_cylinder('1e18_n1e4.hdf5', 1e4, 1e18 * units.eV, 1e18 * units.eV, rmin, rmax, zmin, zmax, full_rmin=rmin, full_rmax=rmax, full_zmin=zmin, full_zmax=zmax)PKmN9NuRadioMC/examples/01_Veff_simulation/T02RunSimulation.pyfrom __future__ import absolute_import, division, print_function import argparse # import detector simulation modules import NuRadioReco.modules.efieldToVoltageConverter import NuRadioReco.modules.trigger.highLowThreshold import NuRadioReco.modules.trigger.simpleThreshold import NuRadioReco.modules.channelResampler import NuRadioReco.modules.channelBandPassFilter import NuRadioReco.modules.channelGenericNoiseAdder from NuRadioReco.utilities import units from NuRadioMC.simulation import simulation2 as simulation import logging logging.basicConfig(level=logging.WARNING) logger = logging.getLogger("runstrawman") # initialize detector sim modules efieldToVoltageConverter = NuRadioReco.modules.efieldToVoltageConverter.efieldToVoltageConverter() efieldToVoltageConverter.begin() simpleThreshold = NuRadioReco.modules.trigger.simpleThreshold.triggerSimulator() highLowThreshold = NuRadioReco.modules.trigger.highLowThreshold.triggerSimulator() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() channelBandPassFilter = NuRadioReco.modules.channelBandPassFilter.channelBandPassFilter() channelGenericNoiseAdder = NuRadioReco.modules.channelGenericNoiseAdder.channelGenericNoiseAdder() class mySimulation(simulation.simulation): def _detector_simulation(self): # start detector simulation if(bool(self._cfg['signal']['zerosignal'])): self._increase_signal(None, 0) efieldToVoltageConverter.run(self._evt, self._station, self._det) # convolve efield with antenna pattern # downsample trace to internal simulation sampling rate (the efieldToVoltageConverter upsamples the trace to # 20 GHz by default to achive a good time resolution when the two signals from the two signal paths are added) channelResampler.run(self._evt, self._station, self._det, sampling_rate=1. / self._dt) if bool(self._cfg['noise']): Vrms = self._Vrms / (self._bandwidth /( 2.5 * units.GHz))** 0.5 # normalize noise level to the bandwidth its generated for channelGenericNoiseAdder.run(self._evt, self._station, self._det, amplitude=Vrms, min_freq=0 * units.MHz, max_freq=2.5 * units.GHz, type='rayleigh') # bandpass filter trace, the upper bound is higher then the sampling rate which makes it just a highpass filter channelBandPassFilter.run(self._evt, self._station, self._det, passband=[80 * units.MHz, 1000 * units.GHz], filter_type='butter', order=2) channelBandPassFilter.run(self._evt, self._station, self._det, passband=[0, 500 * units.MHz], filter_type='butter', order=10) # first run a simple threshold trigger simpleThreshold.run(self._evt, self._station, self._det, threshold=3 * self._Vrms, triggered_channels=None, # run trigger on all channels number_concidences=1, trigger_name='simple_threshold') # the name of the trigger # run a high/low trigger on the 4 downward pointing LPDAs highLowThreshold.run(self._evt, self._station, self._det, threshold_high=4 * self._Vrms, threshold_low=-4 * self._Vrms, triggered_channels=[0, 1, 2, 3], # select the LPDA channels number_concidences=2, # 2/4 majority logic trigger_name='LPDA_2of4_4.1sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger # run a high/low trigger on the 4 surface dipoles highLowThreshold.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[4, 5, 6, 7], # select the bicone channels number_concidences=4, # 4/4 majority logic trigger_name='surface_dipoles_4of4_3sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger # downsample trace back to detector sampling rate channelResampler.run(self._evt, self._station, self._det, sampling_rate=self._sampling_rate_detector) parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC input event list') parser.add_argument('detectordescription', type=str, help='path to file containing the detector description') parser.add_argument('config', type=str, help='NuRadioMC yaml config file') parser.add_argument('outputfilename', type=str, help='hdf5 output filename') parser.add_argument('outputfilenameNuRadioReco', type=str, nargs='?', default=None, help='outputfilename of NuRadioReco detector sim file') args = parser.parse_args() sim = mySimulation(eventlist=args.inputfilename, outputfilename=args.outputfilename, detectorfile=args.detectordescription, outputfilenameNuRadioReco=args.outputfilenameNuRadioReco, config_file=args.config) sim.run() PKmNlo KRR9NuRadioMC/examples/01_Veff_simulation/T03visualizeVeff.pyimport numpy as np import matplotlib from matplotlib import pyplot as plt import h5py import glob from scipy import interpolate import json import os import sys from NuRadioReco.utilities import units from NuRadioReco.detector import detector from NuRadioMC.utilities import fluxes from NuRadioMC.utilities.Veff import get_Veff from NuRadioMC.examples.Sensitivities import E2_fluxes3 as limits if __name__ == "__main__": path = 'output' if(len(sys.argv) == 1): print("no path specified, assuming that hdf5 files are in directory 'output'") else: path = sys.argv[1] energies, Veff, Veff_error, SNR, trigger_names, deposited = get_Veff(path) sortmask = np.argsort(energies) # plot effective volume fig, ax = plt.subplots(1, 1, figsize=(6,6)) ax.errorbar(energies[sortmask] / units.eV, Veff['all_triggers'][sortmask]/units.km**3 /units.sr, yerr=Veff_error['all_triggers'][sortmask]/units.km**3/units.sr, fmt='d-') ax.semilogx(True) ax.semilogy(True) ax.set_xlabel("neutrino energy [eV]") ax.set_ylabel("effective volume [km$^3$ sr]") fig.tight_layout() fig.savefig("Veff.pdf") # plot expected limit fig, ax = limits.get_E2_limit_figure(diffuse=True,show_grand_10k=True, show_grand_200k=False) labels = [] labels = limits.add_limit(ax, labels, energies[sortmask], Veff['all_triggers'].T[sortmask], 100, 'NuRadioMC example', livetime=3*units.year, linestyle='-',color='blue',linewidth=3) leg = plt.legend(handles=labels, loc=2) fig.savefig("limits.pdf") plt.show()PKmN{*}}1NuRadioMC/examples/01_Veff_simulation/config.yamlnoise: False # specify if simulation should be run with or without noise sampling_rate: 5. # sampling rate in GHz used internally in the simulation. speedup: minimum_weight_cut: 1.e-5 delta_C_cut: 0.698 # 40 degree propagation: ice_model: southpole_2015 signal: model: Alvarez2009 trigger: noise_temperature: 300 # in Kelvin bandwidth: 0.42 # effective bandwidth in GHz weights: weight_mode: core_mantle_crust # core_mantle_crust: use the three #layer earth model, which considers the different densities of the #core, mantle and crust. simple: use the simple earth model, which #apply a constant earth density PKmNԱI""?NuRadioMC/examples/01_Veff_simulation/surface_station_1GHz.json{ "_default": {}, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "comment": { "1": "a surface station with 4 downward facing LPDAs and 4 dipoles with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "positions": {}, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 0, "pos_easting": 0, "pos_northing": 0, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNW 2NuRadioMC/examples/02_DnR/A01analyse_simulation.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.utilities import units from NuRadioMC.utilities import medium import h5py import argparse import json import time import os from matplotlib.ticker import MultipleLocator, FormatStrFormatter parser = argparse.ArgumentParser(description='Plot NuRadioMC event list output.') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC hdf5 simulation output') args = parser.parse_args() fin = h5py.File(args.inputfilename, 'r') weights = np.array(fin['weights']) n_events = fin.attrs['n_events'] Vrms = fin.attrs['Vrms'] depths = np.array(fin['station_101'].attrs['antenna_positions'])[:, 2] print("simulated depths ", depths) eff1 = np.zeros_like(depths) eff2 = np.zeros_like(depths) eff3 = np.zeros_like(depths) for iD, depth in enumerate(depths): As = np.array(fin['station_101']['max_amp_ray_solution'][:,iD]) As = np.nan_to_num(As) # this sets all cases with empty ray tracing solution to an amplitude of zero mask = np.isnan(As[:, 0]) | np.isnan(As[:, 1]) As = As[~mask] Ts = np.array(fin['station_101']['travel_times'][:, iD])[~mask] Ts = np.nan_to_num(Ts) dTs = np.abs(Ts[:, 1] - Ts[:, 0]) C3 = (As[:, 0] >= 3 * Vrms) | (As[:, 1] >= 3 * Vrms) C1 = ((As[:, 0] >= 3 * Vrms) | (As[:, 1] >= 3 * Vrms)) & ((As[:, 0] >= 2 * Vrms) & (As[:, 1] >= 2 * Vrms)) & (dTs < 430 * units.ns) C2 = ((As[:, 0] >= 3 * Vrms) & (As[:, 1] >= 3 * Vrms)) & (dTs < 430 * units.ns) C4 = ((As[:, 0] >= 4 * Vrms) & (As[:, 1] >= 4 * Vrms)) & (dTs < 430 * units.ns) eff1[iD] = np.sum(weights[~mask][C1])/ np.sum(weights[~mask][C3]) eff2[iD] = np.sum(weights[~mask][C2])/ np.sum(weights[~mask][C3]) eff3[iD] = np.sum(weights[~mask][C4])/ np.sum(weights[~mask][C3]) sort_mask = np.argsort(depths) np.savetxt("DnRefficiency_{:.0g}eV.txt".format(np.array(fin['energies']).mean()), [depths[sort_mask], eff1[sort_mask]]) fig, (ax) = plt.subplots(1, 1, figsize=(6, 5)) ax.plot(depths[sort_mask], eff1[sort_mask], 'o-', label='one pulse > 3 sigma, one pulse > 2 sigma') ax.plot(depths[sort_mask], eff2[sort_mask], "d--", label="both pulses > 3 sigma") ax.plot(depths[sort_mask], eff3[sort_mask], "^:", label="both pulses > 4 sigma") ax.set_xlim(0, -100) ax.set_ylim(0, 1) ax.set_xlabel("depth [m]") ax.set_ylabel("efficiency") ax.set_title("neutrino energy {:.2g}eV".format(np.array(fin['energies']).mean())) ax.legend(fontsize='x-small', numpoints=1) fig.tight_layout() fig.savefig("{}.pdf".format(os.path.basename(args.inputfilename))) plt.show()PKmN;`AA3NuRadioMC/examples/02_DnR/E01detector_simulation.pyfrom __future__ import absolute_import, division, print_function import argparse from six import iteritems # import detector simulation modules import NuRadioReco.modules.efieldToVoltageConverter import NuRadioReco.modules.ARIANNA.triggerSimulator import NuRadioReco.modules.triggerSimulator import NuRadioReco.modules.channelResampler import NuRadioReco.modules.channelBandPassFilter import NuRadioReco.modules.channelGenericNoiseAdder import NuRadioReco.modules.custom.deltaT.calculateAmplitudePerRaySolution from NuRadioReco.utilities import units from NuRadioMC.simulation import simulation2 as simulation from NuRadioReco.framework.parameters import electricFieldParameters as efp import logging import numpy as np logging.basicConfig(level=logging.WARNING) logger = logging.getLogger("runDeltaTStudy") # initialize detector sim modules efieldToVoltageConverter = NuRadioReco.modules.efieldToVoltageConverter.efieldToVoltageConverter() efieldToVoltageConverter.begin(pre_pulse_time=0 * units.ns, post_pulse_time=0 * units.ns) calculateAmplitudePerRaySolution = NuRadioReco.modules.custom.deltaT.calculateAmplitudePerRaySolution.calculateAmplitudePerRaySolution() triggerSimulator = NuRadioReco.modules.triggerSimulator.triggerSimulator() triggerSimulatorARIANNA = NuRadioReco.modules.ARIANNA.triggerSimulator.triggerSimulator() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() channelBandPassFilter = NuRadioReco.modules.channelBandPassFilter.channelBandPassFilter() channelGenericNoiseAdder = NuRadioReco.modules.channelGenericNoiseAdder.channelGenericNoiseAdder() class mySimulation(simulation.simulation): def _detector_simulation(self): if(bool(self._cfg['signal']['zerosignal'])): self._increase_signal(None, 0) calculateAmplitudePerRaySolution.run(self._evt, self._station, self._det) # save the amplitudes to output hdf5 file # save amplitudes per ray tracing solution to hdf5 data output sg = self._mout_groups[self._station_id] n_antennas = self._det.get_number_of_channels(self._station_id) if('max_amp_ray_solution' not in sg): sg['max_amp_ray_solution'] = np.zeros((self._n_events, n_antennas, 2)) * np.nan ch_counter = np.zeros(n_antennas, dtype=np.int) for efield in self._station.get_sim_station().get_electric_fields(): for channel_id, maximum in iteritems(efield[efp.max_amp_antenna]): sg['max_amp_ray_solution'][self._iE, channel_id, ch_counter[channel_id]] = maximum ch_counter[channel_id] += 1 # start detector simulation efieldToVoltageConverter.run(self._evt, self._station, self._det) # convolve efield with antenna pattern # downsample trace to internal simulation sampling rate (the efieldToVoltageConverter upsamples the trace to # 20 GHz by default to achive a good time resolution when the two signals from the two signal paths are added) channelResampler.run(self._evt, self._station, self._det, sampling_rate=1. / self._dt) if bool(self._cfg['noise']): Vrms = self._Vrms / (self._bandwidth /( 2.5 * units.GHz))** 0.5 # normalize noise level to the bandwidth its generated for channelGenericNoiseAdder.run(self._evt, self._station, self._det, amplitude=Vrms, min_freq=0 * units.MHz, max_freq=2.5 * units.GHz, type='rayleigh') # bandpass filter trace, the upper bound is higher then the sampling rate which makes it just a highpass filter channelBandPassFilter.run(self._evt, self._station, self._det, passband=[80 * units.MHz, 1000 * units.GHz], filter_type='butter', order=2) channelBandPassFilter.run(self._evt, self._station, self._det, passband=[0, 500 * units.MHz], filter_type='butter', order=10) triggerSimulator.run(self._evt, self._station, self._det, threshold=2 * self._Vrms, triggered_channels=None, number_concidences=1, trigger_name='pre_trigger_2sigma') # downsample trace back to detector sampling rate channelResampler.run(self._evt, self._station, self._det, sampling_rate=self._sampling_rate_detector) parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC input event list') parser.add_argument('detectordescription', type=str, help='path to file containing the detector description') parser.add_argument('config', type=str, help='NuRadioMC yaml config file') parser.add_argument('outputfilename', type=str, help='hdf5 output filename') parser.add_argument('outputfilenameNuRadioReco', type=str, nargs='?', default=None, help='outputfilename of NuRadioReco detector sim file') args = parser.parse_args() sim = mySimulation(eventlist=args.inputfilename, outputfilename=args.outputfilename, detectorfile=args.detectordescription, outputfilenameNuRadioReco=args.outputfilenameNuRadioReco, config_file=args.config) sim.run() PKmN%NuRadioMC/examples/02_DnR/__init__.pyPKmN{*}}%NuRadioMC/examples/02_DnR/config.yamlnoise: False # specify if simulation should be run with or without noise sampling_rate: 5. # sampling rate in GHz used internally in the simulation. speedup: minimum_weight_cut: 1.e-5 delta_C_cut: 0.698 # 40 degree propagation: ice_model: southpole_2015 signal: model: Alvarez2009 trigger: noise_temperature: 300 # in Kelvin bandwidth: 0.42 # effective bandwidth in GHz weights: weight_mode: core_mantle_crust # core_mantle_crust: use the three #layer earth model, which considers the different densities of the #core, mantle and crust. simple: use the simple earth model, which #apply a constant earth density PKmNq#,#,6NuRadioMC/examples/02_DnR/detector/string_to_100m.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -20.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -30.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -40.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -50.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -60.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -70.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -80.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "9": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -90.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 8, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "10": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -100.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 9, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "11": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 10, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "12": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 11, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "13": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -15.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 12, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 0, "pos_easting": 0, "pos_northing": 0, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } } PKmNm PpPp?NuRadioMC/examples/02_DnR/event_input/1e19_n1e3comparison1.hdf5HDF  Pp` TREEx80HEAPPp 8 VERSION_MAJOR@ 8 VERSION_MINOR@ @header8 h flavors@  @ thetamin ?@4 4 8rmin ?@4 4 8zmax ?@4 4 8phimin ?@4 4 8Emin ?@4 4=`XC 8Emax ?@4 4=`XC 8zmin ?@4 4 8rmax ?@4 4@@ 8 start_event_id@ @ thetamax ?@4 4-DT! @ @fiducial_rmin ?@4 4 P &depositedFALSETRUE @fiducial_zmax ?@4 4hGCOL8 # all quantities are in the default NuRadioMC units (i.e., meters, radians and eV) # all geometry quantities are in the NuRadioMC default local coordinate system: # coordinate origin is at the surface # x axis is towards Easting, y axis towards Northing, z axis upwards # zenith/theta angle is defined with respect to z axis, i.e. 0deg = upwards, 90deg = towards horizon, 180deg = downwards # azimuth/phi angle counting northwards from East # # the collumns are defined as follows # 1. event id (integer) # 2. neutrino flavor (integer) encoded as using PDG numbering scheme, particles have positive sign, anti-particles have negative sign, relevant for us are: # 12: electron neutrino # 14: muon neutrino # 16: tau neutrino # 3. energy of neutrino (double) # 4. charge or neutral current interaction (string, one of ['cc', 'nc'] # 5./6./7. position of neutrino interaction vertex in cartesian coordinates (x, y, z) (in default NuRadioMC local coordinate system) # 8. zenith/theta angle of neutrino direction (pointing to where it came from, i.e. opposite to the direction of propagation) # 9. azimuth/phi angle of neutrino direction (pointing to where it came from, i.e. opposite to the direction of propagation) # 10. inelasticity (the fraction of neutrino energy that goes into the hadronic part) #  @fiducial_zmin ?@4 4 @fiducial_rmax ?@4 4@@ 8phimax ?@4 4-DT!@ @ total_number_of_events@0@ @˓\SNOD Ih8 ?@4 4@?@˓\x ?@4 4^@˓\x ?@4 4}@˓\x ?@4 4@˓\x                                                                                                                   =`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XC=`XCErlܜ@7&C@Q{N@F?]b@"Ĥ6,?n 1I@?@?Lp?وU@|ig@@B@?&?U||z @ʆʷ?tcڄ?u֚@g @U@'* B@{2FV@QӾy@b g@r@wi U @na@: N@Wqp @ :f^@cS0@ҕgTI@8n@h.qT@x?-?Wa:@w W?U Ϊ@g?%S'\@ ؕL@uڍG?=юn @n):?9=5?s@L83k@;3ɚ?_q@BuZ@k@N5K?c @[@ L_@.:s@‰4?NYP @{aJ??yul?㙲}~@e[@FL@О@,TRS@nc5@C`?DܺD? FH @V[' @@'@d}?#.|@@ .@)y@l#?#j`o@ ]k@C.@?%x?T@YCϺ? 9u@+L=G@X"?U@K@0:e@2@C(?ȶdE@&C@8ǜ@ޤT@,2@N  @ @^@dD@vǙ @UկM@垳j=?5@Ր'?oR@dx@ɠDq?2Sw@gD?|Nf@K:.@߫<?9~m?/ݛ@pQ\|@x\@,`DZ@Oij9?.??89?@8= @<@?@I{*?ė O@V2Kv@*jѶ%@E9 ?{iOC@ c? v ?`\#H@6Dq@:[U@ \?2ɽ@7V@d-X @X7Г?D4ʌk@k'?b@@ @k_@~J@H̤@< _@EX( @Q' _ @#;i0@O) @%1@ @^$, @t(t8@h?9t@z6?)@gSz?00}@vX?Na7M?ꩁ@ibW[ @uKj?\(wg@xye*?Dm=9@tK7|@̊cٴ? A;@gM@9Ck\@2?@@.}+V@ȷt?=<-?ͱ@ZR5@'X}ۼ@1D@wn ?w@3],+@ٖJ@TZ)"@@f@^u @a @/X@,My2 @S+@1?yy ?.V?p? ?ǰhQ@Ҩ<@Ve?:Q@¦ð?{A%je?r` @rϾ\ @9 :@MR?:C @_<]p@?zEW@kARB?Up_@ R@ i @y@Did @5@u2hB@I+ @p 2@u@osz?C@p?@c@0@o"~@Ƴ$ң@uk@l`ٚ8@56@ @ShVt?,X@Ǎ @8C@-nk n?-u4Y=@ {V @(6L@OHW@{6t@7 H@]bH0 @ 4Gq?0Qt?#7Q?Z[x@"2 ? c@:@zmQ4@@K&n_?~- >??ʃ@@BsG@#ٹ@L$.?b^@Ў[%@2jsJ?S >-?)6 @U2z"@,e #?'be@^tE@v]J_s?AR@Vy>@y_[@qX9d @4@.q,ߟ"@7W3@Y4]@ ?J@d&u@?@~@@`@V#?P@dap.@P%<)?%q@nј@ܣJfX ?bܜW@ۊ?7FG @$"?&[o?\(@~r|@g;: @[ @lu/q@Q}A @L ?Z@*P@E?@휛Q@NsHp @\NI@_*}@W>Ż@ew @y *@]+}X?|@ >MH @QC`?Թi3?зԛ@lt@,@ 󣲰?˔@Zm7?>A @pi@J @8ѿw@a?{T @ck-!?z+v@Nvh@sz@" 9 @bwݐ@9QE @fyȤ+A @1P@&E@Qr@>E0u2@&׍?U }=@Q~@oR@. @yR<@ Tv@s+?p<@\}2?IRC? ?G c@oo@I@L@0\ @!͔@n @2Td>@0g){)!@!mr?o!h @<(@:=U?(+,9@4b. @U@]s @f? ?6@յ'?k[?E|?EA%?bw3t@K߾@`9??\@雞 @ {b@rZO?u@yW5D?6S @ 3%qr@貱&?9?Bc`֬@a~?jbN@E{[@ćm@5\ΔO@Pw{@'~*?a@N:I[|?Ra@jWs; @|Θ@[%?ق @\@}@X@@yֈ?#?$U @VMw@%_HS@~AG@G%`/@= @ծc?3e@*>}@~qlc@@6qwP@߁M( @-D3 ?M\!6?[?@▷aK?m@C ? @$KĴ?I @Q'?SEJ@<%/@SS@l`z@!]v@W_@˴@l$U??xWE!)F?t_<@LKB@@x3@F}%|@u?Nwq@eB_@c/7@A?!@7uA@?+W@e@wn@UX?J@\O @&Z[? u~N2 @n ;s%@5o@}F?M@!UIHN@ ?ȅkYE?^%%@M9)?e@c?sbϕ0?706%?? vd?J@`ux?قU@]7?Gy+?-2v @7>?SݾG?VO?˴@xJ?$?oU*@æ @@U|?R-S @T?@eNM|@#1 @X@v?Ҵ@ji΋?VH7@! @9 @Ld04@' ?"~@!Ia@(Jj@-uV@{@HL @'}J@@G'?>G?e,@̬?pj@kcT@<8R @ZZM?#  @ @c0@*U@Ui?ys|.@m@IYNj?d_ik@AW@~Mo@s&Ң?ZK;@k!?<qQ@`R0M?N=Ѻ@$͢ @eأ2^@,4?) @> 9p@uԁ?GAB?7!ӾZ?h@7Cw@ѯe@5 @M @D@$@%O?q?F7I@9@oC٦[@"'uV@-9L @=ԏ?@}#?1?HU?8"8E?@s@m"eM @)@)@_=ԣ0@\g(@fn @a@{Ľ$?n @n(A?bP>@ @??Ͷd @ae?$@2j6@N8g@vV;.@Y,%D@6ՀD?;p/ @/w',S@AW@Q@m@SD W<@e5p?SvU@E梓?*@H"?z@JAk?δ@>p7@" { @6>hB?e @Yrh@x ?5@-Ӹ@3b5@$uٛ?Քc @@@mW7s?_f@!`@ذ7?=@G '@M@셓Y?[[, @cMR@Af' @f+@P0?ǟ @)?iw?ŵՉ}@Ya@qbe @?:?F @qh @KR]@Z' @_. @E-'? @d@[ @oE@-@%@_#J?۞U0@(^@xS13@C@3-uq?[Q?Q@*?,$_@N9?"*?lz@ȥ_?Y1@:{@\!@b!?@S;?$p@\.?)@y@>,@:e}b?QKI[Y~a]#J@L,Z'h<"\}q]U4A~eJ,@)\`@B=2H,mգ@WlѸ۽@@iLġ@=?H-@VWMSu=@"@(nlʄ/MDգ)\i|1 F68@BK0eƣdI[@p w|@+5U@*!r!b@2mCq@x\>h< ƛDo@+Y;{@K,t@WDE MI9q@,^ܿ;S@=xOw,mά@=<R7@- s@WK& gu~Kh]J%˃RuUdAJHG`@#M|[;yM=1(6@qk@pŻ.W@i~lxz*g@\{'[9@UCܓ@G2`@i12'$.9@N|BYI@JlXW55J1+z@nɾ@]3J UXzW@ȭ"a@yQwdt w 4p] ;sq@MIab7Ft_@y(vQ@5CZ@`~R@]z y@Mܠ@:(E3z@pך!iWBި;`AwAE}fb@@3sPq1&kZ4˕@ ݝY@e1xq@(0DQ@eP \ Eقod>m@h۹ p@GYj @b@R4bbl@ yо@`>@V[j@ 1,b5Iq񣵊HJ[q@EzcЕ,A6\8ӏ@[ۙ0|@ ӏ_ِ'x˻{sDNr@]B3͠@@@OE@A/$[A-9z@}M8M hUEǗ-,W/$s8A+ O˝@Neor<@%&*,$I\Æ+sriH!-2@rܠLtr[#V@WQ`ڄ|.{@@\d]w@%We@“dI@=4wc‹T>D7nd5,.@յX@\3$Nӫ@GnsuHTVwg3@dH0Лǧq@YYcQtOQm@@ԵŜ@٥άJ@:yBb@,j@_65qW/P@Q&ኜ`5}n@,nݍ噥&|V}PHY@2RYciI:id(›|zU@48?2{ QHt5l܀@Q@:VZq$4+\Ub@|#X@?Y7Y@3P@'^2ɫ@ qϗ@ ρv s@(kznz ۺKVS@~La%O<{%á@4@z3W0>y@O_{@@ ,5qM&|9sm~@J @eDcĈz^j@ƺt@@1+ǖ>Բ]@_~"{RRZ)\@: {@#+{EiG@=j훜@ƒ@(fηRu7@mZG@4ajx(t1e@U@g@ޘJfQ*wVT~sVYs|үjO?@!3^ ۇ@=kS6^L:"-?J@@~{=uکtŒ>@_U!(@\4JmP@ah@ De@ ]aIεq1@0FXޫ@Lux@+]?Scn@ʸ*lS/@Zezjj\GVE(rLJEpѢ@QkdQ@ 9@S USEiQ #y@)dNB ,5yQvaӳ5@ZZo0oX@!KFQFlš@&@ᚩYі@3]*@)\h : r /ܩ.ɬ@張Ck鰑frDK8CҠ0$Kʔ@_&ֱ0{^A@WLs9z@T2ev2`Pѻ,ioS @^,dBQޠ@a0 eؚp@T@;wH~Sݖޠ@ȁ@pשQz ~&[ @`uwxem>6!@ _O;@3XE-@5Fm@輶@E!);('@.{o#~;|@''e/O@K6!~[z+7 @q֐@IԂgsdc_ @uW;@Y0t}Do[@xꉊ@Y@㦾@H̨,&[0@8j~ GNUCh9A@eUN@nWcRH_*_n@ Au@!&dϜp++@/5Ʉ@Ȧ@.1J@JDj@t@@@@Dh 엚&|y@5xkKuL7\쓨96胧5qErxYE<X@ya 7@ 9K^΋uc@Zc#Bep@6ޣ@5Vnnţ@ @p)@ !@tEttbwh@|=Hjl@)@T8􄰜v?v@d+[@,NB3@1Oj,m>@t Cq=zs܋ts{e@za@.f@d}$AL0[@V㛊4p޽?e7_@D7Kjn.3._@)Q>;@{լԎՔgHy4d @LP?FK>̩]7j㌧%@qz=FV=vLs>ġ@[z@2aG1Ǡ},HH(qyenT[1jԘ|><ŕ@4{ar@M(|U.ܪ^CPFQ!1}*B@pXb@*Z?M@ǮJ@+l(?aк?![?qj?U0?!ܰ? I!WC?Ӣz`?)=?k7C@? F%?@V/?5%?9EqQ??|ƪ?ZE$ٕ?F(?13w?CLNj t?Dۓd4?AX?'&W9?&"jj?|p? `?W?Y3;?te2?.,܂??۰p@?_G R?o[S?ԒG:?h5?vx)?{QԄ?S?P?iR+}E?ő5L?nf?WG}?d:d?u~{3?tjސj?y?trg?-  ?~?3?Wڰ??&!? U?>U??SH?:C?:ﴠ? 5ϸ?pTY?!? },S? ?:uY2?blLp"҃?/=h?Ly3 ?k_?#x?&m͑g?]`~{(?]yV?n?ai&?U̙|,?-H>(r?H?pH_B?3aO?]?3I?)@? +T:?kwPE?; ?+ϖ?Q?TnI]??FNp>?JyX?t,d?-/?ѫ? RnT?n?C^?e a?#$?6X?c,vq?5pdkS?8q?˛?RcN'݅>YB_E??#֙ɲ?S?Y~d?͐@?[?%IkG?O_!?R.쇝?4n(W?Ok>51?Uc?fݙ?9?f*6?!y"}?rF?3W?밓mI?¯}?ƃx?Iq?G{?-v??Qk?K?fI}]~R?r)Ca? 0Lj?2k?4B?2 VzQ?};vh3?語?Qz S?GH? vlټ>FR53? o?\pn >A/+?/\jp?L9;?8 L?;?-֑?†;s?fg?:8R?}?N<߼߽?gYء?j;?]a?k8 ? u?H >f?ʱ?Ts?C]?W%?I"i?A5?,\P?w ?>zlXF?[Hl|?09~?ڥ?׽5f"?d e>\a1?QV ?0?j()g?5?!ţ?W՞?\?,m?{$[?>)2?٠dϐ?kbƭH?\3k?} ?P{(p?j?^8}?R?KAԥb?ۋܸ?R ?[p:?|>?jް?]͉3g?MŶ?_%u>UG?rp۝?,9ɏP?XΌ? ?:y?)6 >?M?%~8k?R5Z?qq$%??]V6?m=-@?X ?v`]]?Dr??[I?8ńy?ϵ؀?y >U*?'?+\PA?{3t$?*i?@[ne?[?a??c~E?h?ĕ?Gr?A:Ҥ? I}j ?ڷGE?^gYc>ȓ.P?;GQ[R?qܓ?~Zi"?/ C?u+ߥ? V@?O{et?? ?Â?:f0?<=o?>iދ?D9R?Wu?99?7wǠ? b?P"w? W?P?GF~?mDȥ?ykʶ?>S?Tb!@?(U ?T_?Ь$?hB^$?qa?>d6B?`U?붉?ukw?tz?gR\RZ? װ?)KF??rne7?y @W?5o)?#?<Ѕ`?C-x?XvPT)p?d섂>X$?OVhH?.g9?re ?zP?I"?wbM?s?}$b?sX&?r ?K(Z?4ㇺD?+Z?_(K8y?^T_?6%eθ)S͝?s Z?% Y?;F;*L?t?VjK?"6_ѻ?U?_ ڶ?`3?軪B?))r?[ܩr6?JuI?b?\m?Mx?rvA?.ԑ?)k?3̦.ћ? f?iM5-?@"9??Wq??z-+X?h; ?W+JJ?2h}۳?T+?ߌ=?o\?k>?8,a?X?|N?W ?ܷ(?j^iM? ?_I?#;۝>?k70ň?Wp:?r ?P?Ǐ !x?.'6?TFO?˲?^ԓ.`?6>On?ߥ4cQ?Ol^ğ?)KGF?}`l?X[;!? E͆?pJ?'X?l:H9?Q?!P?Ӵ;C?Uc?6&W?fiY?uG)??}J?P?01?ip ,j?ɯ?+)c?W.b? h?Dw?^a??q&?o?G _?4Q?y$y?N~صvx?]?b:?2|?7(o]K?>Q?>e\H?pkDD?H1?zS߳I?*Ze?4w?P !ʢ?bX~?5e?9kA6 ?$m?ωҊ?:}}?~)*>N^"3?m1x?yM&b?d/ ?Iؠ?j)?8(kp??!2?D$? W T?#}Z?F?GL ?.9?nd?΢Cү?mҫ.0?pT=X?m-\:;n>6ZA?gya?af?[H?Y[=?ӦlEph?-S?`ι ?7"?;Ţ?Xv]x?BZd?y?%ֻ?-ӕ??u?erOz?J=e?{bŷ?/_?47?!"qO?O6ș?zLw??~?$Y ?o.U?Kx?BL?h6͖h???54?7R@? _^m?ְ4?j4?*v"?Q*3?IY?aސ?x$Jf~?X!-8?]?mom{?5T!v?9?# Z?EI%t?Klj&?$:?sTђ?6?IZ?"wb?iGc&?]w s?DeĖ?͍>>(:?o6?2sh#?9q?.;kI?VY8?msF?>?kJ?Dw?xI?7e?zf?/[0[,l?i`?P6?yX%?v F?P?|or?l ?DX?k!m?7Qz?nb?]~P?o/3r6?3gL?!?ut$v҄?S_6? ?\*? ?;^>BaǾw?cλ? R? H?+?)CC?7)?倳?W{?=ϡU??Frc?!RC?9WM?m2S??s,L?'3o?K?s?\Bf?ߛ?y܂u?\24z?e?y?J}9? y?vJ?c:k?@YPȏ?7iֻ?;{?e)!-!?o?$?Hݵ?9nٵ?LkFIã?.a9 >?D?+~Z? vW>cx{?-gX?-n?G\`?e??oq?:?bU?hx?V$⦻?t]i>i[G ?0L#??m]7?x-Ʒ~?ɯ?iBK?;]}͊?@o?Ti̙w?dt;e?q?9),a? P?0R|?a,y?7?ɖxH? '? :$ؾ?pf?+,6v?Y?:ĽBW?~L%=c?Bȉ>h}B }{?(Μ?L/]??\Wdo?RqՋ?sb Ɇ?,ۤxF?w" B?[>hޓ?GjP?\D]?E.?+?!"o?I18?hZg?PE`?==&?9J+E?Cz4?^&o?p1Qx?ɑ=?cr./?vm ?G؛B?,xDž?#E?@-Q?m3>;#J|U?\@?D?6^?Ȥh?y,_?q?lb ?Xݳ}>?z9?FX?Ost:>j?7D?Ã?9)A?^?3` q?jm6?3Na?xcNMk?Lp-sQۏ?JPP?>^*?Wؑ?J5?p?L=h>?j kZ? .?- \?,I!e?n?nw?42?6ѴY?gX?\%a?e>>ِb?]65?8?UW?<7??d+{H?el-8?a?? *>Ƃ?LZ)?C:?.??\Ȫ?+q?dG9?I?/=?<'?h%.?e넲?VC5?{;Ģ? ?=Ü?:?KH$ܘf?˂?Lu?پ}4?3hp?s7K?"na?ǧl??RP^?e~j? ?T<}9gS??Fƿ?(k:>W,?%VJN?oQ? Pf3d?Sldp?zdU?P1?e1o?(BQ?k#>T%?Ih⚵?W;O?{]3?U]G?7т>l?tHò?\] ?x?] ?p?Mn?`\8r@:[SURZ寐ټ1 ,U@wI NU@c\=@J(@E]F@kAaYQP@8J0x_B\@ȴ+@)uM6EN%@|-q@2%J@}R@^م!Ȱ@' @ٳأ@WEǪ@+A-S@_'#'P@=o^ƚU, %J@IĐ@Z7ڞ3x@<羆B,<8`t|҉Kխ=:"9ܘ7Uqj7@iZ@$PU:@⊃!,p ^'}@_u@u"S@g2/Y8W@U "Tu@Ѷaݖ@zٺ+@i& @z=8@)gm"@}n`0r*@-@l)vƦ@3STG-چs/&&@ia*@%?@Dz@p@?HtZ8A@q9@4{=G?-)5@Ptc*2߂@(Ay|Ѥ@ZrۭuƤ'<ݥҧٜ{l|@E05r@Hl8AVґ,1kّP2x wx\|p%`wBJ@: +Q@FN OxaJ.̶ʓPno&&Gyg@e9 ȩ@I/r@frg @p|!G@F(Pmn@[@Tť@xZʔ@h|$ R@% @ŕ@L|9W@iz&9b@F@c\@_I@G֗a2~A1nZ]s@jja痣@0a^W㮪C`@p)@c2ܛ)>@6IZJ@[Xjs:}}:Y@Z&Fz@dzB#@#@tK~@#@[@kGڊɗyg@iHx(S=&@Փ@%Įȫ'3{!~5`Ѩ@4̀@QSo]v)n€R{@Iq㱅 wbR)ȩ"gm@=Cx8z@ö@@Opk㵎2~@H%{?-@Fu@-_T@T΋ш]YKt 0WC@2@ҥo@PK n!Rn@)l@`hᮗ@ ćSn0\~+}ֳe@=6$T y|r@1M@H?#t@7Ϣ@SU5@#u{@ƒw jV5>4r@ל@b@O+ӫߢ5.82f@ևa@"Q*Xo@!R&@.,&Mi@ыȣ@y&?@՝n~-@#i %,J ~hιŘ@ Fj@er@ߝ@#!ɠ@-<@›񮆌xD @A.@"YA@1+$~g@5bTED˧fOv) Ad{"mkl@Ґ 2e,cJlکŃm@KM{@-@Z<:CUG.CSii@%jzo"R@ָ@.xb$`@@ͫII=|f<6YrZqhD@)@7m%:jKx@~O+ ʪ쑙@&("@>նf CQ%@ĉW?@o̚w@n0AvJk|K@\6ȩ{l&[@ F3Z@.e0X%Cn@ӄN@%yg@ %SO@WK,w X7h |5LJxsf3 y[@^QCc_yw8>!@~rŽ@A LÆ1XWfTی XBכN%Yc'nq@Veãs*xuzi?Az@}z@|yp6 )Yo5@0}S3z@^cޜ\7ŨRr`fi!^ pcbTԐ@>@)'TD}daV~IT/M_I@!FGYx@nPmԷ{@-!}E@ @#-@d">ڣԧ@g Tܒ@~4w@ET@}wĠ,.x@ 5@pEs8b@`Mg#^~ qF%pC/ Ʌ{vـ@aگCƖk@QGm@%N>o ]@-yF@Tf!Le1`/sޙ;,@!d8*4|2ތ@7kR@ g@NM@K/@K+S@2èy4j^1@^F1*&@NO240/Bd #DF@[Ig@;9Öe@Zd@^BG@ r@[>?{@ /5y"@+kGr@rꔆ ݏEa/t@Ͳēv@B@,8Ȏ@ CG+@J-,,(Ψ8{@SɑCT@@뮖e@F1uL2 /%S$Zs[ .֒*awm@ci̤@/1O1TMx 9@$c{އi&Q¤FLބ@jO]D$>_Kӂ@IfdR}@HCȌ@>{O,@<ޏ8 9/@$ldޞSeqϜ>Z+uf@Qe3=eu@X2#o=uհs>orÀrWז@ɣY#@kzt@ 8;Óx|@XrB />:Asr@T:2F@[/Q)k/UՈ|e43bW*v]RS/_.ءΨ@U}1@Κ<~w+@K2 ^Ӭ ?Nڒ@C6a^ N@ A6zbjmU{@$n܂F-u¤d@T+RkMV@l>bu@ l䳥@@`lܵ٣@8+H[:aXZHKF7<1@{ܭz{@N.xS NǺΐ@i 7C@w?@@;@,ལOg@|T= zX{"@+xBߔ?0lx"5*F=̚@z';@UTW@:e:@Y4 qM[  ҍ@UIcU &n_@oO@W%C 3@@I~@5XR@]]ͣhxݧ@ְݙ@Bm/[^ELM_cS6 @ O@|Lo@Piomڿf@u-5]/uN@+ u@{mʔj̥@PoOh@HwU =/PË@5ڙ@ez`3n@=9 0Gƕ".@,0WX@5I{@jomȆ@p-N~ޭnl@qޥHXTFs0GFwo?"2@L ZB_@(_@oQYvD@E @Qڨ@aɴ@i;r@~#sfB 槹Gl@/ ڠoQ@ )O}@X- chSxcYO?XBEuj@r$@o3x/cüv@p@D19@LC?=א@ 0v,@!E1И@ Zo_ @m|@o7*z@M@+]vt@1] 6m@"Yۃ yɂ@Z[0@r,%fA @P;gnB ˿@@]v@1{Ne $?2o?LS4@w/hx?.2?d@WG?u@s>L?L ?nc\@?/{@0r@3W@P"?B夸?p@?#ެ?6w~@h4?Oڃ'@Q??ݔK?b L?%2t?m$?sU@G?g2?PA?$C?],9}?]I?(Z?|>??(3??4>u&?l)?P@M?cJHfIH?pS%}@hB5W?@E???Y: .?l)q@+N'?Ef @ @VQ@VQ@W)?}$]@6q?[P?7 EE?@Ɏ?/z?oF&?Kn?#E?'?%{p? p#Z ?a?N K@g5?P3@?`?fCp@qC ?3V?Ν@?{ M3@ٕ @N?~?=vy@QaP?[HW?,DD@j`b@v+|G?ʟE o@em:?D{Z?5?1Y@1\<@5BJf?R?gݏ@@,?F V@"dB?p|N?M @]8?ٴ @~@0SG?B?*GC9V@@?rl@\N4rW@NS@<}>?D?K8er?Ե`"?8kzF?r?oȤ?ظ?2?Q^Z@wu@SR,?y)?U\AI@sW?|bm?jZїw?׭ P?}P? M?(A>@j~3@vħ @h[h?k8?x3y?l?4Hj?d@b$6WJ? }k?|̪?ɟ@z`?@W+F@u1?3]? M?mq ?KLR@U?('? ??Jݿ?GgP ?ʿ3?4h?^,G?KM?y4@;R+*?z@u,V?6v2@V36=?v[?n@@z5%@ g4v@Yp}>%@G@]p?ʱu!?tѡ G?/K9$?!?!@)= _e?Ӎg? 6 ?4ѱ?[ԙ?uFH?/ "t?Գ¹?r?2rrd?Ɯ%3s? ܯw?DM?/B(?g @p1?J?&ḛ?r(s?t t? 9?4(S?M+?|P;$@^.?mq5!?UY%?@_lO@h?Q\?$n6?r m(X?wI7@h~*n?wѹ@Xd??;t?j87??V@[/h??)0.;?,o?,G7?Q@;?&?jiu @L?*Ӳ}@]?X]|?kPՊٽ?2&Y5?eW ?s"w_@L ?@Dp@06n@Lx!u?Aq? e d?\'?%7P@lJ^2?@XnwQ@qGh@?A~\p?p,E{?b @m?$?*ӕ??s?? e?`M.?@١v;?TKJ?Sq8?HJ?iTe@4(n?JzYId?S?%B?M]JUSe?ZJZh@|R@@ش@z#?Q@ /z? E)?N)@UAWx?2Y&@?hY 6?*k?oK D=@[]Xf?@ng`@!?Ŧ.o@7?[{?k?ƬnJ@(1?6@nD`?ndF?je?LEν?ⴃ?(> ?BT @:l?@qy?v#?1cg?(FU?˝C@щee{?j]?׳"Ҿ?h1B??<*tZ?;?y"D?JG?;۱?f__8@?s?ي b@5@q`AG?C-I?sX?eX cX? ϗk ?9?+6em?H? P?r#:???RL?("@&;?f%c @sDŀ?sӜP@&7~&@ذ?z@]h0@eOT@~ƟM?%?{j?! ?kUC?D?LxH@*_bah@`{/?=Uˡ5?e? {?%6\~?~?Z.e/[?O# ?%[?L!? 2Z@TZ}?9&P?8@fj?9oc?Kk?Nfz|?Y? }>J?$j?r@?M# ?kԫ= ?ȁ?nԃ?Jfq?}?zi@?*5!6?4 ?ҦF?up+B?P@jX?5ţ?9]s?G?;?6A?P6;(@Bf^=?w?t(c4@p۪?FJ?wT?0˾dz?Ќ@Bw??`z?p*?|Z&?EPHt?ge?da?"4?h3 @O3JL?hj@>.S?1C#l?OW@y?0)`_!?gT@}W@ci@*@`Mc޺?2W.??Cˆ?"gP?P>[W\@v0?׹r@u?Tc?@J8.?Wz[o@?ʼ@?<5@?EC? ?wG! ?WWJ~t@_߾@XED>@@l?1π? XO?jUc9?v<@ݪ+?sf:@-5N?#)s~?@RV??Z {E?􊱇?>@^_?\֖y?6#(Dkp?T7J%?) ?ۨ@zo@WɀU?%+?]{?m$Q3@e?[POa@a6]g?FČ(K@??k?_v ?+-Z?r7?HP?.)i?L ??O@xu_??]?(hY?Rz=?U?0(@e0?YI?Lq?|6%? 3=?:._w@-? L@OVE?T?o$@!?qs@?rː ?+J(??hK= k2??xD? P &?,W-h?29@GX ?^?^?g8@=@_@`*@P}a??b/d?,V.@Nr;@(<"[@ ֤?.2?W@@ ?{3|@gEJ>@$vH?pc?O(崹?ÇwN?)@Z"K ?kR?Ў}? 1T@҆8?e)G@4v@t*6?hw?@ F,@ G*?Dl?)E?t~.? @K?S g?+nV?tn?K"G?0g„@d" :?ǕXѱ@Vò@}zXC*@:Ҙz?qx?|#?ڻ??}g|F?1S@Zl9?u 0Xx?LsS?!M`@P4h?Ba0?gAC(?̭ @R@>˹?2?(tTN?Mfe ?~[ @Rja\?")5?ST}?YV?g?Հӝ2x@_w2?tl,f@72ܩ@M,/@ ?t}@4;3?*z@#(?ԁzW?D*[?R=?(@?@>?@:@!gm?g?Dbk;@kQ i?:G&Y0?Nr?iK]?fig@?H4?e9w4?:@jњ(@I%?71@jK8@A @a!@/@?ѕtv?|Zj˪?X2VN@>YҔ?t|@Oԟ$@?ܛ8'@@^E[?u^ik?ˋQ?uF@t y%eo?/xM?V@'κ?p2Gh?M)?B?I{@M?aCp?K? OG?Sˆ?$?;!( ?St?|UL?Mm?Âp G?7s-?ս*WB?,,~?}@Xd?dS|(@|Q?_ !cb@M5sS@?Eo@ /?:p@ m?g?Qkv@i?\:?_?5HF?=}Zr?Nԟk2?E@}^@ ?U?Y3E+?8b?upn$= ?}%q]?A? ry@6BК?` E?ؠ@)?pf?daCT?~T?#m^@{@]å˄?MjY?l@:_?gX?T>R HdTjFT p^2 K`)'Ξ>KBWAkv%J."ӦP4qb}\TP(pr!Cl࿶_VCwt)6d~ xO"`yׄUUC4 L|rK 7twi f˷{gڼZKd_ƥǤVvSX},q@X! *Љ߹&˟އAemAAG"xZVnCsS_ z}\Bb& c8T_Z&=pLꔞFR;/>^y9'a >uˠw?[;Xz}sV",0#ZD5jLV[ׇ GՃX`fai\z @ADO5ݟh eڅ ¢{*k7~2 C]3`ܹA̞FzKf_[L-|?i#njڃ>Q{hcExXH0g3͕Bw(IpVdԱf,FAi;a35oXvLݐ5`tAe瞎z4̕7? `Yfo0-@lzl$44Ek9!C\>˄&*H5^dԜ[H ziPĖK@@0XܣyϹ}v XU圠"Ae"at,E3^axgT Ҥ1ZYm` :N褉`yP긇sЇ*X}XcBh&j¨.8.|:UVZҲv]gЛjj*.` %x)T1FС:JQi^>?1`0L_ai9n(I:fПd2@PikB0N#Q_Nn5@+8v6>FP b g@Ԥc7y + Q/q 5`7u^B:7+5'gf'S{aD jX>0E rj7`90^MKʿG' SHX hx"f*{ftS)B߾ `tSYe8첒T2=yUkC3I 2Bˡe}b<+=ᙡ08Ļx4Xm̼3v|.oǠ@' pX]xd XĹ`trhΠS KX6ܪs^<?53}ix|`_A {&U֐H r4}T\4Aq2`+Gx Ҷȹx tЇG*3~[Mgj`H-6Z&Be |Ȭz@צioCzj[Hď ATtynaՒ\:ڠ?hޣ?tI0i(EVOg`e.Y60{=ˋ3^8DYzRIԁ-0th@Lۧ]f#٠0Sq{NCPqAb_Ns5'`x4u`Sds2ΈtH6L>$ ,bэnj%tu"?3{hY-7. B9sJhq4)]fow.' 7.4f!MȈ17)tŒ:ߣy$F-J1נڿs~%~` m#uYsTC 8Z~`ut `EPAL$Rd"y W 6.~ 0'䵮xP"lP@ i˟GxSNÿESr3)yPٺcC}(LfTOUX83Wl) [LpWUjF8xS:RLLӣhRי L=:Jxՠ%Y>8h}, X ~Š\0ַF ;=͓ ̶gz^4{C28Wd`(j~I ~_zjF24!tZf"F,,0zW<$X}Jބ1APU6O>l-`Ԑ)cld[#pߋe$[ZF#\ॡߖw0ݷL,C" hNyPk>R|Ա>YO}/d3zŕ(v<+ev ʍqT8ta8|@P Nl_)2Rڽ%I9zK<>;PHw+|yfwܛ ,-rx9 :ٵy枳a>&_w0 P/?{.U_f_J~ ].4 _F l<r_Ҟ <ёDy™5vk+m:K™bK88u G?:g|ra]IJ|꓅ƣXQ9*lӷ0etJǕlzRD-P p-ҟ;{ៜL?r#a\tN܀ڵ|{J+|QW5p%LCN`A\e1ytV8Ȩ,${KdB4k'Q&oT0>f/!pcvkA˚ulDR6@e1nJi {d3T;6@4Hǿ~Bp+(>{4-@v`B̞$aؓ%/p:Nb^(l3iۖu*dզƐv{rBDv VAǷogqe ,V!/6Dа1oJwc=(Hᣗ҇Jx-B62, #~ߟt^ABRz apZQ3' Yϝ.h=9Yso~Q=PD ~0SY3*+؝@BJӈ1΀/ }$7z$N k57.PJ܄õlhnZO̎) yԷ>t LVjMw_t% $"ShT1t[Dy')c.־mc=V?,זVs6 aTФ OV'pʼ,^>ɶX+ ˡ umRŢ }a+bmЬD]P&j')>*q\őF811 TJE41GRrumpB̈́qF~M^M 2GNT@ (F,湣0PN[h.z=ky oV9u 6RߙYȤ`jtU"¢)N6-*zs9+D >~v'8[~IfcIW WTB~M}/Сwnn='ѧTā_gEړ^ ȸ8PC9ؖ'HzuI.,^=p97RX_(QukUͼ&mp>s$FV8?HЍ8gP(;$}2:MnhtxeHUǑd8;GȲvy]2ʹָlH\~=}cL<&T&_w2/~.18šDSeMR.q26pfKhݟ\CU[ȣ(*"j[wȥbvx?x„D9EJBL2p߹;@wT/Sc}h&a=oaR܏kOD*cAPdj/&+spg>` `tFCᡐ@.pL}@pUj1r-}fʔxOi1wz}dQ{Z1׭!8-pqmԑ`PxeramTD p͜B@עhd8T4|}{E~΅}fUJZ뫑{Vc1p5ӣpω2zU[NhN<[k.Ot٥M։ S?L6bVzkdUyRͳPS)a_ƛHHu(T`ٱCn2W{,7hwV;O lBW'f$Yo z0,e+P4ǿ*p{KcӼZ!-a x:ƒ.:5]cyڹBNQvB(ewpsgrIuHK^)sxDhtOt(gk?$GPj@[atZu,(S>УvK\h8xǡ; vUZP'ɦF@}L(]Fy^1PaMPQ# 28\-wAtk`)Ý Q|o&C^v}HGP~5'l [\W|l.AʌA"N"NJynvCoq=ٸƏL*'l|*Àhmfs*o ^&DH5wjw5PіNL+72gWI+(ƚ5 @_uqL\\hzA)\qOأHhZ]+Ѷ>p|0Yy(Gi֜4v7eEp Jrp|;PY*|%oo[-g`TVjtX`zxpVOkشM +@$/#_ ӡ.>[B ʞw,Ҳ&at.0MTM@.``ԡ4U T/V>phͅbȕDgQX d c/SҒwޒ]ƳԢJf1{ƀ1@Q@˓\  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~PKmN665NuRadioMC/examples/03_station_coincidences/.gitignore*.png *.pdf det.json horizontal_spacing_detector.json PKmNny@NuRadioMC/examples/03_station_coincidences/A01create_detector.pyimport copy import json from matplotlib import pyplot as plt import numpy as np from NuRadioMC.utilities import units from radiotools import plthelpers as php with open("single_position.json") as fin: detector_single = json.load(fin) detector_full ={} detector_full['stations'] = detector_single['stations'] detector_full['channels'] = {} # insert station at center i = -1 for channel in detector_single['channels'].values(): i += 1 channel = copy.copy(channel) channel['channel_id'] = i detector_full['channels'][str(i+1)] = channel distances = [100, 250, 500, 750, 1000, 1250, 1500, 2000, 2500, 3000] xx = [0] yy = [0] for d in distances: for x in [-d, 0, d]: for y in [-d, 0, d]: if(x == 0 and y == 0): continue for channel in detector_single['channels'].values(): i += 1 channel = copy.copy(channel) channel['ant_position_x'] += (x) channel['ant_position_y'] += (y) channel['channel_id'] = i detector_full['channels'][str(i+1)] = channel xx.append(x) yy.append(y) with open('horizontal_spacing_detector.json', 'w') as fout: json.dump(detector_full, fout, indent=4, separators=(',', ': ')) xx = np.array(xx) yy = np.array(yy) fig, ax = plt.subplots(1, 1, figsize=(7,7)) for i, x in enumerate(np.unique(np.abs(xx))): # select all stations corresponding to this distance mask = ((np.abs(xx) == x) & (np.abs(yy) == x)) \ | ((np.abs(xx) == x) & (yy == 0)) \ | ((np.abs(yy) == x) & (xx == 0)) ax.plot(xx[mask], yy[mask], php.get_marker2(i)) ax.set_aspect("equal") ax.set_xlabel("x [m]") ax.set_ylabel("y [m]") fig.savefig("layout.pdf", bbox='tight') plt.show()PKmNb/  JNuRadioMC/examples/03_station_coincidences/A02generate_job_files_presim.pyfrom NuRadioMC.EvtGen import generator from NuRadioMC.utilities import units import numpy as np import glob import os import sys """ This example creates job files for a pre simulation that saves all events that trigger a central station """ n_events_per_file = 300 try: software = sys.argv[0] # specify the path to the software directory (where NuRadioMC, NuRadioReco and radiotools are installed in) working_dir = sys.argv[1] #where you want the simulation to go conf_dir = sys.argv[2] # where are the config files input_dir = sys.argv[3] # Directory with simulations () except: print("Usage python A02generate_job_files_presim.py software working_dir conf_dir input_dir") print("Using default values") conf_dir = "/pub/arianna/NuRadioMC/examples/03_station_coincidences/" working_dir = os.path.join(conf_dir, "presim") software = '/data/users/jcglaser/software' input_dir = '/pub/arianna/NuRadioMC/input_1e4/' config_file = os.path.join(conf_dir, 'config.yaml') if not os.path.exists(os.path.join(working_dir, "output")): os.makedirs(os.path.join(working_dir, "output")) if not os.path.exists(os.path.join(working_dir, "run")): os.makedirs(os.path.join(working_dir, "run")) for iI, filename in enumerate(sorted(glob.glob(os.path.join(input_dir, "*/*.hdf*")))): current_folder = os.path.split(os.path.dirname(filename))[-1] t1 = os.path.join(working_dir, "output", current_folder) if(not os.path.exists(t1)): os.makedirs(t1) t1 = os.path.join(working_dir, 'run', current_folder) if(not os.path.exists(t1)): os.makedirs(t1) # print('generating job submission files for {}'.format(filename)) detector_file = os.path.join(conf_dir, 'single_position.json') output_filename = os.path.join(working_dir, "output", current_folder, os.path.basename(filename)) cmd = "python {} {} {} {} {}\n".format(os.path.join(conf_dir, 'E06RunSimPreprocess.py'), filename, detector_file, config_file, output_filename) header = '#!/bin/bash\n' header += '#$ -N PreSim_{}\n'.format(iI) header += '#$ -j y\n' header += '#$ -V\n' header += '#$ -q grb,grb64\n' # header += '#$ -m \n' header += '#$ -o {}\n'.format(os.path.join(working_dir, 'run')) # add the software to the PYTHONPATH header += 'export PYTHONPATH={}/NuRadioMC:$PYTHONPATH\n'.format(software) header += 'export PYTHONPATH={}/NuRadioReco:$PYTHONPATH \n'.format(software) header += 'export PYTHONPATH={}/radiotools:$PYTHONPATH \n'.format(software) header += 'cd {} \n'.format(working_dir) with open(os.path.join(working_dir, 'run', current_folder, os.path.basename(filename) + ".sh"), 'w') as fout: fout.write(header) fout.write(cmd) PKmNE CNuRadioMC/examples/03_station_coincidences/A03generate_job_files.pyfrom NuRadioMC.EvtGen import generator from NuRadioMC.utilities import units import numpy as np import glob import os import sys """ This example creates job files for simulations to check for coincidences. """ n_events_per_file = 300 try: software = sys.argv[0] # specify the path to the software directory (where NuRadioMC, NuRadioReco and radiotools are installed in) working_dir = sys.argv[1] #where you want the simulation to go conf_dir = sys.argv[2] # where are the config files presim_dir = sys.argv[3] # Directory with simulations () except: print("Usage python A02generate_job_files.py software working_dir presim_dir") print("Using default values") conf_dir = "/pub/arianna/NuRadioMC/examples/03_station_coincidences/" working_dir = conf_dir software = '/data/users/jcglaser/software' presim_dir = os.path.join(working_dir, 'presim/output') config_file = os.path.join(working_dir, 'config.yaml') if not os.path.exists(os.path.join(working_dir, "output")): os.makedirs(os.path.join(working_dir, "output")) if not os.path.exists(os.path.join(working_dir, "run")): os.makedirs(os.path.join(working_dir, "run")) if not os.path.exists(os.path.join(working_dir, "input")): os.makedirs(os.path.join(working_dir, "input")) for iI, filename in enumerate(sorted(glob.glob(os.path.join(presim_dir,"*.hdf5")))): current_folder = os.path.splitext(os.path.basename(filename))[0] t1 = os.path.join(working_dir, "output", current_folder) if(not os.path.exists(t1)): os.makedirs(t1) t1 = os.path.join(working_dir, 'run', current_folder) if(not os.path.exists(t1)): os.makedirs(t1) t1 = os.path.join(working_dir, 'input', current_folder) if(not os.path.exists(t1)): os.makedirs(t1) output_filename = os.path.join(working_dir, 'input', current_folder, os.path.basename(filename)) print('saving files to {}'.format(output_filename)) generator.split_hdf5_input_file(filename, output_filename, n_events_per_file) for iF, filename2 in enumerate(sorted(glob.glob(os.path.join(working_dir, 'input', current_folder, "{}*".format(os.path.basename(output_filename[:-1])))))): print('generating job submission files for {}'.format(filename2)) detector_file = os.path.join(working_dir, 'horizontal_spacing_detector.json') output_filename = os.path.join("output", current_folder, os.path.basename(filename2)) cmd = "python {} {} {} {} {}\n".format(os.path.join(working_dir, 'E06RunSimPreprocess.py'), filename2, detector_file, config_file, output_filename) header = '#!/bin/bash\n' header += '#$ -N HS_{}_{}\n'.format(iI, iF) header += '#$ -j y\n' header += '#$ -V\n' header += '#$ -q grb,grb64\n' # header += '#$ -m \n' header += '#$ -o {}\n'.format(os.path.join(working_dir, 'run')) # add the software to the PYTHONPATH header += 'export PYTHONPATH={}/NuRadioMC:$PYTHONPATH\n'.format(software) header += 'export PYTHONPATH={}/NuRadioReco:$PYTHONPATH \n'.format(software) header += 'export PYTHONPATH={}/radiotools:$PYTHONPATH \n'.format(software) header += 'cd {} \n'.format(working_dir) with open(os.path.join('run', current_folder, os.path.basename(filename2) + ".sh"), 'w') as fout: fout.write(header) fout.write(cmd) PKmN9K K ?NuRadioMC/examples/03_station_coincidences/A04analyze_output.pyimport numpy as np import h5py from NuRadioReco.detector import detector from NuRadioMC.utilities import units from scipy import constants from matplotlib import pyplot as plt import glob from radiotools import plthelpers as php import sys import os Tnoise = 300 Vrms = (Tnoise * 50 * constants.k * 500 * units.MHz / units.Hz) ** 0.5 counter = -1 fig, ax = plt.subplots(1, 1, figsize=(7,7)) for iF, filename in enumerate(sorted(glob.glob(os.path.join(sys.argv[1], "*.hdf5")))): fin = h5py.File(filename) print(np.log10(fin.attrs['Emin'])) if(np.log10(fin.attrs['Emin']) not in [17.0, 18.0, 19.0, 20.0]): continue counter += 1 with open('det.json', 'w') as fout: fout.write(fin.attrs['detector']) fout.close() det = detector.Detector(json_filename="det.json") max_amps_env = np.array(fin['station_101']['maximum_amplitudes_envelope']) weights = fin['weights'] n_stations = det.get_number_of_channels(101) / 4 # (we had 4 antennas per station) xs = np.zeros(n_stations) ys = np.zeros(n_stations) triggered_near_surface = np.any(max_amps_env[:, 0:3] > (3 * Vrms), axis=1) # triggered any LPDA or dipole of the center station triggered_near_deep = max_amps_env[:, 3] > (3 * Vrms) # triggered deep dipole triggered_surface = np.zeros((max_amps_env.shape[0], n_stations)) # create empy array of shape (n events, n stations) triggered_deep = np.zeros((max_amps_env.shape[0], n_stations)) # create empy array of shape (n events, n stations) # loop through all stations with different distances for i in range(n_stations): # select the 2 LPDA + 1 dipole channel and check if they fulfill the trigger condition triggered_surface[:, i] = np.any(max_amps_env[:, i * 4:(i * 4 + 3)] > (3 * Vrms), axis=1) triggered_deep[:, i] = max_amps_env[:, i * 4 + 3] > (3 * Vrms) # get their position xs[i] = np.abs(det.get_relative_position(101, i * 4)[0]) ys[i] = np.abs(det.get_relative_position(101, i * 4)[1]) # loop through all simulated distances coincidence_fractions_surface = np.zeros(len(np.unique(xs))) coincidence_fractions_deep = np.zeros(len(np.unique(xs))) for i, x in enumerate(np.unique(xs)): mask = ((np.abs(xs) == x) & (np.abs(ys) == x)) \ | ((np.abs(xs) == x) & (ys == 0)) \ | ((np.abs(ys) == x) & (xs == 0)) # calculate coincidence fraction coincidence_fractions_surface[i] = 1. * np.sum(weights[np.any(triggered_surface[:, mask], axis=1) & triggered_near_surface]) / np.sum(weights[triggered_near_surface]) coincidence_fractions_deep[i] = 1. * np.sum(weights[np.any(triggered_deep[:, mask], axis=1) & triggered_near_deep]) / np.sum(weights[triggered_near_deep]) ax.plot(np.unique(xs), coincidence_fractions_surface, php.get_marker2(counter)+'-', label="E = {:.2g}eV".format(fin.attrs['Emin'])) ax.plot(np.unique(xs), coincidence_fractions_deep, php.get_marker2(counter)+'--') #, label="E = {:.2g}, 50m deep".format(fin.attrs['Emin'])) ax.set_xlabel("distance [m]") ax.set_ylabel("coincidence fraction") ax.semilogy(True) ax.set_aspect('equal', 'box') ax.set_xlim(0, 3000) ax.set_ylim(0.5e-2, 1.1) ax.legend(loc='lower left', fontsize='medium', numpoints=1) fig.tight_layout() fig.savefig("coincidences.png") fig.savefig("coincidences.pdf", bbox='tight') plt.show() PKmN,Bڄww>NuRadioMC/examples/03_station_coincidences/A05visualization.pyimport numpy as np import h5py from NuRadioReco.detector import detector from NuRadioMC.utilities import units from scipy import constants from matplotlib import pyplot as plt import glob from radiotools import plthelpers as php import sys from radiotools import helper as hp import os from NuRadioMC.SignalProp import analyticraytracing as ray from NuRadioMC.utilities import medium from mpl_toolkits import mplot3d import matplotlib import logging Tnoise = 300 Vrms = (Tnoise * 50 * constants.k * 500 * units.MHz / units.Hz) ** 0.5 plot=False counter = -1 filename = sys.argv[1] x = float(sys.argv[2]) * units.m print("using file {} and distance {:.0f}m".format(filename, x/units.m)) fin = h5py.File(filename) print(np.log10(fin.attrs['Emin'])) with open('det.json', 'w') as fout: fout.write(fin.attrs['detector']) fout.close() det = detector.Detector(json_filename="det.json") max_amps_env = np.array(fin['station_101']['maximum_amplitudes_envelope']) weights = fin['weights'] n_channels = det.get_number_of_channels(101) n_stations = det.get_number_of_channels(101) / 4 # (we had 4 antennas per station) xs = np.zeros(n_stations) ys = np.zeros(n_stations) triggered_near_surface = np.any(max_amps_env[:, 0:3] > (3 * Vrms), axis=1) # triggered any LPDA or dipole of the center station triggered_near_deep = max_amps_env[:, 3] > (3 * Vrms) # triggered deep dipole triggered_surface = np.zeros((max_amps_env.shape[0], n_stations)) # create empy array of shape (n events, n stations) triggered_deep = np.zeros((max_amps_env.shape[0], n_stations)) # create empy array of shape (n events, n stations) # loop through all stations with different distances for i in range(n_stations): # select the 2 LPDA + 1 dipole channel and check if they fulfill the trigger condition triggered_surface[:, i] = np.any(max_amps_env[:, i * 4:(i * 4 + 3)] > (3 * Vrms), axis=1) triggered_deep[:, i] = max_amps_env[:, i * 4 + 3] > (3 * Vrms) # get their position xs[i] = np.abs(det.get_relative_position(101, i * 4)[0]) ys[i] = np.abs(det.get_relative_position(101, i * 4)[1]) # loop through all simulated distances coincidence_fractions_surface = np.zeros(len(np.unique(xs))) coincidence_fractions_deep = np.zeros(len(np.unique(xs))) med = medium.ARAsim_southpole() mask = ((np.abs(xs) == x) & (np.abs(ys) == x)) \ | ((np.abs(xs) == x) & (ys == 0)) \ | ((np.abs(ys) == x) & (xs == 0)) theta = np.arccos(1. / 1.78) n_events = len(triggered_near_surface) dTs = [] for iE in np.arange(n_events, dtype=np.int)[np.any(triggered_deep[:, mask], axis=1) & triggered_near_deep]: if(iE % 100 == 0): print(iE) if(plot): ax = plt.axes(projection='3d') # x1 = det.get_relative_position(101, 3) # ax.plot([x1[0]], [x1[1]], [x1[2]], 'ko') for j in np.append([0], np.arange(n_stations)[mask]): iC = j * 4 + 3 x2 = det.get_relative_position(101, iC) if(plot): ax.plot([x2[0]], [x2[1]], [x2[2]], 'ko') if(j != 0 and (~(np.array(triggered_deep[iE], dtype=np.bool) & mask))[j]): continue vertex = np.array([fin['xx'][iE], fin['yy'][iE], fin['zz'][iE]]) # print(fin.keys()) # l1 = fin['launch_vectors'][iE][3] / units.deg l2 = fin['station_101']['launch_vectors'][iE][j*4 + 3] # r1 = ray.ray_tracing(vertex, x1, med, log_level=logging.DEBUG) # # r1.find_solutions() # r1.set_solution(fin['ray_tracing_C0'][iE][3], fin['ray_tracing_C1'][iE][3], fin['ray_tracing_solution_type'][iE][3]) # path1 = r1.get_path(0) zen, az = fin['zeniths'][iE], fin['azimuths'][iE] v = hp.spherical_to_cartesian(zen, az) if(plot): r2 = ray.ray_tracing(vertex, x2, med, log_level=logging.INFO) r2.set_solution(fin['station_101']['ray_tracing_C0'][iE][iC], fin['station_101']['ray_tracing_C1'][iE][iC], fin['station_101']['ray_tracing_solution_type'][iE][iC]) path2 = r2.get_path(0) # ax.plot3D(path1.T[0], path1.T[1], path1.T[2], label='path 1') ax.plot3D(path2.T[0], path2.T[1], path2.T[2], label='path {}'.format(j)) ax.plot3D([vertex[0], vertex[0] + 500*v[0]], [vertex[1], vertex[1] + 500*v[1]], [vertex[2], vertex[2] + 500*v[2]], '--', label='shower direction') dT = [] for l in l2: # print("{:.1f}".format((theta - hp.get_angle(-v, l))/units.deg)) dT.append((theta - hp.get_angle(-v, l))/units.deg) dTs.append(np.min(np.abs(np.array(dT)))) if(plot): R3 = hp.get_rotation(np.array([0, 0, 1]), -v) for phi in np.linspace(0, 2 * np.pi, 200): l = hp.spherical_to_cartesian(theta, phi) # zen, az = hp.cartesian_to_spherical(v[0], v[1], v[2]) R1 = np.array([[np.cos(az), -np.sin(az), 0], [np.sin(az), np.cos(az), 0], [0, 0, 1]]) R2 = np.array([[np.cos(zen), 0, -np.sin(zen)], [0, 1, 0], [np.sin(zen), 0, np.cos(zen)]]) # l2 = np.matmul(R1, np.matmul(R2,l)) l2 = np.matmul(R3, l) # l2 = np.matmul(R2, np.matmul(R1, l)) l2 *= 400 # print(hp.get_angle(v, l2)/units.deg) l2 += vertex ax.plot3D([vertex[0], l2[0]], [vertex[1], l2[1]], [vertex[2], l2[2]], 'C3-', alpha=0.2) if(plot): ax.legend() # ax.set_aspect('equal') ax.set_xlabel("x [m]") ax.set_ylabel("y [m]") ax.set_zlabel("z [m]") # plt.ion() plt.show() # a = 1/0 php.get_histogram(np.array(dTs)) plt.show() PKmNK?ANuRadioMC/examples/03_station_coincidences/E06RunSimPreprocess.pyfrom __future__ import absolute_import, division, print_function import argparse # import detector simulation modules import NuRadioReco.modules.efieldToVoltageConverter import NuRadioReco.modules.ARIANNA.triggerSimulator import NuRadioReco.modules.triggerSimulator import NuRadioReco.modules.channelResampler import NuRadioReco.modules.channelBandPassFilter import NuRadioReco.modules.channelGenericNoiseAdder from NuRadioReco.utilities import units from NuRadioMC.simulation import simulation2 as simulation import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger("runstrawman") # initialize detector sim modules efieldToVoltageConverter = NuRadioReco.modules.efieldToVoltageConverter.efieldToVoltageConverter() efieldToVoltageConverter.begin(debug=False, time_resolution=1 * units.ns, pre_pulse_time=0 * units.ns, post_pulse_time=0 * units.ns) triggerSimulator = NuRadioReco.modules.triggerSimulator.triggerSimulator() triggerSimulatorARIANNA = NuRadioReco.modules.ARIANNA.triggerSimulator.triggerSimulator() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() channelBandPassFilter = NuRadioReco.modules.channelBandPassFilter.channelBandPassFilter() channelGenericNoiseAdder = NuRadioReco.modules.channelGenericNoiseAdder.channelGenericNoiseAdder() class mySimulation(simulation.simulation): def _detector_simulation(self): # start detector simulation efieldToVoltageConverter.run(self._evt, self._station, self._det) # convolve efield with antenna pattern # downsample trace to internal simulation sampling rate (the efieldToVoltageConverter upsamples the trace to # 20 GHz by default to achive a good time resolution when the two signals from the two signal paths are added) channelResampler.run(self._evt, self._station, self._det, sampling_rate=1. / self._dt) if bool(self._cfg['noise']): Vrms = self._Vrms / (self._bandwidth /( 2.5 * units.GHz))** 0.5 # normalize noise level to the bandwidth its generated for channelGenericNoiseAdder.run(self._evt, self._station, self._det, amplitude=Vrms, min_freq=0 * units.MHz, max_freq=2.5 * units.GHz, type='rayleigh') # bandpass filter trace, the upper bound is higher then the sampling rate which makes it just a highpass filter channelBandPassFilter.run(self._evt, self._station, self._det, passband=[80 * units.MHz, 500 * units.MHz], filter_type='butter', order=10) triggerSimulator.run(self._evt, self._station, self._det, threshold=1 * self._Vrms, triggered_channels=[0, 1, 2, 3], number_concidences=1, trigger_name='pre_trigger_1sigma') # downsample trace back to detector sampling rate channelResampler.run(self._evt, self._station, self._det, sampling_rate=self._sampling_rate_detector) parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC input event list') parser.add_argument('detectordescription', type=str, help='path to file containing the detector description') parser.add_argument('config', type=str, help='NuRadioMC yaml config file') parser.add_argument('outputfilename', type=str, help='hdf5 output filename') parser.add_argument('outputfilenameNuRadioReco', type=str, nargs='?', default=None, help='outputfilename of NuRadioReco detector sim file') args = parser.parse_args() sim = mySimulation(eventlist=args.inputfilename, outputfilename=args.outputfilename, detectorfile=args.detectordescription, config_file=args.config, outputfilenameNuRadioReco=args.outputfilenameNuRadioReco) sim.run() PKmN]6NuRadioMC/examples/03_station_coincidences/config.yamltrigger: bandwidth: 0.42 # null or float in GHz (the effective bandwidth. It is used to calculate the Vrms from the noise temperature. If None, the bandwidth is calculated from the sampling rate assuming that the bandwidth is 0Hz to the Nyquist frequency PKmNu% ww?NuRadioMC/examples/03_station_coincidences/single_position.json{ "_default": {}, "comment": { "1": "" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -0.0, "ant_position_y": -0.0, "ant_position_z": -2.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -2.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0, "ant_position_y": 0, "ant_position_z": -50.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 45.0, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 0, "pos_easting": 0, "pos_northing": 0, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmN@7>hh3NuRadioMC/examples/04_read_ari_files/A01read_ari.pyimport logging import numpy as np import argparse import matplotlib.pyplot as plt from NuRadioReco.utilities import units import NuRadioReco.detector.detector as detector import NuRadioReco.modules.io.eventReader from NuRadioReco.framework.parameters import stationParameters as stnp logging.basicConfig(level=logging.INFO) # Parse eventfile as argument parser = argparse.ArgumentParser(description='NuRadioSim file') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC simulation result') parser.add_argument('detectordescription', type=str, help='path to detectordescription') args = parser.parse_args() # read in detector positions (this is a dummy detector) det = detector.Detector(json_filename=args.detectordescription) # initialize modules eventReader = NuRadioReco.modules.io.eventReader.eventReader() eventReader.begin(args.inputfilename) for event in eventReader.run(): for station in event.get_stations(): station_id = station.get_id() for channel in station.iter_channels(): channel_id = channel.get_id() # get time trace and times of bins trace = channel.get_trace() times = channel.get_times() # or get the frequency spetrum instead spectrum = channel.get_frequency_spectrum() frequencies = channel.get_frequencies() # obtain the position of the channel/antenna from the detector description position = det.get_relative_position(station_id, channel_id) PKmNaA A QNuRadioMC/examples/05_pulser_calibration_measurement/A01generate_pulser_events.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units from six import iterkeys, iteritems from scipy import constants from scipy.integrate import quad from scipy.interpolate import interp1d from scipy.optimize import fsolve import h5py from NuRadioMC.EvtGen.generator import write_events_to_hdf5, split_hdf5_input_file import logging logger = logging.getLogger("EventGen") logging.basicConfig() VERSION_MAJOR = 1 VERSION_MINOR = 1 def generate_my_events(filename, n_events): """ Event generator skeleton Parameters ---------- filename: string the output filename of the hdf5 file n_events: int number of events to generate """ # first set the meta attributes attributes = {} n_events = int(n_events) attributes['n_events'] = n_events attributes['start_event_id'] = 0 # attributes['fiducial_rmin'] = 0 # attributes['fiducial_rmax'] = 1 * units.km # attributes['fiducial_zmin'] = 0 * units.m # attributes['fiducial_zmax'] = -2 * units.km # attributes['rmin'] = 0 # attributes['rmax'] = 1 * units.km # attributes['zmin'] = 0 * units.m # attributes['zmax'] = -2 * units.km # attributes['Emin'] = 1 * units.EeV # attributes['Emax'] = 1 * units.EeV # now generate the events and fill all required data sets # here we fill all data sets with dummy values data_sets = {} # the 'neutrino direction' needs to be set but are irrelevant for the simulation, because we simulate a # uniform emitter data_sets["azimuths"] = np.ones(n_events) data_sets["zeniths"] = np.ones(n_events) # define the emitter positions. X/Y are the easting/northing coordinates of the SPICE core data_sets["xx"] = np.ones(n_events) * 42600 * units.feet data_sets["yy"] = np.ones(n_events) * 48800 * units.feet # simualte different depth data_sets["zz"] = -np.linspace(0, 1800, n_events) * units.m data_sets["event_ids"] = np.arange(n_events) data_sets["n_interaction"] = np.ones(n_events, dtype=np.int) data_sets["interaction_type"] = np.array(['had'] * n_events) # again these parameters are irrelevant for our simulation but still need to be set data_sets["flavors"] = np.array([12 for i in range(n_events)]) data_sets["energies"] = np.ones(n_events) * 1 * units.eV data_sets["inelasticity"] = np.ones(n_events) * 0.5 # write events to file write_events_to_hdf5(filename, data_sets, attributes) if __name__ == "__main__": generate_my_events("input_spice.hdf5", 1000)PKmNg'HNuRadioMC/examples/05_pulser_calibration_measurement/A02RunSimulation.pyfrom __future__ import absolute_import, division, print_function import argparse import datetime # import detector simulation modules import NuRadioReco.modules.efieldToVoltageConverter import NuRadioReco.modules.channelResampler import NuRadioReco.modules.channelGenericNoiseAdder import NuRadioReco.modules.triggerTimeAdjuster import NuRadioReco.modules.ARIANNA.hardwareResponseIncorporator import NuRadioReco.modules.trigger.highLowThreshold from NuRadioReco.utilities import units from NuRadioMC.simulation import simulation2 as simulation import logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger("runstrawman") # initialize detector sim modules efieldToVoltageConverter = NuRadioReco.modules.efieldToVoltageConverter.efieldToVoltageConverter() efieldToVoltageConverter.begin() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() channelGenericNoiseAdder = NuRadioReco.modules.channelGenericNoiseAdder.channelGenericNoiseAdder() hardwareResponseIncorporator = NuRadioReco.modules.ARIANNA.hardwareResponseIncorporator.hardwareResponseIncorporator() triggerSimulator = NuRadioReco.modules.trigger.highLowThreshold.triggerSimulator() triggerTimeAdjuster = NuRadioReco.modules.triggerTimeAdjuster.triggerTimeAdjuster() triggerSimulator.begin(log_level=logging.WARNING) class mySimulation(simulation.simulation): def _detector_simulation(self): if(bool(self._cfg['signal']['zerosignal'])): self._increase_signal(None, 0) efieldToVoltageConverter.run(self._evt, self._station, self._det) # convolve efield with antenna pattern # downsample trace to internal simulation sampling rate (the efieldToVoltageConverter upsamples the trace to # 20 GHz by default to achive a good time resolution when the two signals from the two signal paths are added) channelResampler.run(self._evt, self._station, self._det, sampling_rate=1. / self._dt) if bool(self._cfg['noise']): Vrms = self._Vrms / (self._bandwidth /( 2.5 * units.GHz))** 0.5 # normalize noise level to the bandwidth its generated for channelGenericNoiseAdder.run(self._evt, self._station, self._det, amplitude=Vrms, min_freq=0 * units.MHz, max_freq=2.5 * units.GHz, type='rayleigh') hardwareResponseIncorporator.run(self._evt, self._station, self._det, sim_to_data=True) triggerSimulator.run(self._evt, self._station, self._det, threshold_high=0.5 * units.mV, threshold_low=-0.5 * units.mV, high_low_window=5 * units.ns, coinc_window=30 * units.ns, number_concidences=2, triggered_channels=range(8)) triggerTimeAdjuster.run(self._evt, self._station, self._det) # self._station.set_triggered(True) # downsample trace back to detector sampling rate channelResampler.run(self._evt, self._station, self._det, sampling_rate=self._sampling_rate_detector) parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC input event list') parser.add_argument('detectordescription', type=str, help='path to file containing the detector description') parser.add_argument('config', type=str, help='NuRadioMC yaml config file') parser.add_argument('outputfilename', type=str, help='hdf5 output filename') parser.add_argument('outputfilenameNuRadioReco', type=str, nargs='?', default=None, help='outputfilename of NuRadioReco detector sim file') args = parser.parse_args() sim = mySimulation(eventlist=args.inputfilename, outputfilename=args.outputfilename, detectorfile=args.detectordescription, outputfilenameNuRadioReco=args.outputfilenameNuRadioReco, config_file=args.config, log_level=logging.DEBUG, evt_time=datetime.datetime(2018, 12, 30)) sim.run() PKmN,,JNuRadioMC/examples/05_pulser_calibration_measurement/A03reconstruct_sim.pyfrom __future__ import absolute_import, division, print_function, unicode_literals import matplotlib.pyplot as plt import logging logging.basicConfig(level=logging.WARNING) import numpy as np from scipy import signal import argparse from datetime import datetime import pickle import os from NuRadioReco.utilities import units import NuRadioReco.detector.detector as detector import NuRadioReco.modules.io.eventReader from NuRadioReco.framework.parameters import stationParameters as stnp from NuRadioReco.framework.parameters import electricFieldParameters as efp import NuRadioReco.modules.channelBandPassFilter import NuRadioReco.modules.correlationDirectionFitter import NuRadioReco.modules.channelResampler import NuRadioReco.modules.ARIANNA.hardwareResponseIncorporator import NuRadioReco.modules.voltageToEfieldConverterPerChannel import NuRadioReco.modules.electricFieldSignalReconstructor import NuRadioReco.modules.efieldTimeDirectionFitter import NuRadioReco.modules.channelTimeWindow import NuRadioReco.modules.channelSignalReconstructor from NuRadioMC.SignalProp import analyticraytracing as ray from NuRadioMC.utilities import medium from radiotools import helper as hp plot = 1 channelBandPassFilter = NuRadioReco.modules.channelBandPassFilter.channelBandPassFilter() correlationDirectionFitter = NuRadioReco.modules.correlationDirectionFitter.correlationDirectionFitter() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() hardwareResponseIncorporator = NuRadioReco.modules.ARIANNA.hardwareResponseIncorporator.hardwareResponseIncorporator() voltageToEfieldConverterPerChannel = NuRadioReco.modules.voltageToEfieldConverterPerChannel.voltageToEfieldConverterPerChannel() electricFieldSignalReconstructor = NuRadioReco.modules.electricFieldSignalReconstructor.electricFieldSignalReconstructor() efieldTimeDirectionFitter = NuRadioReco.modules.efieldTimeDirectionFitter.efieldTimeDirectionFitter() channelTimeWindow = NuRadioReco.modules.channelTimeWindow.channelTimeWindow() channelSignalReconstructor = NuRadioReco.modules.channelSignalReconstructor.channelSignalReconstructor() efieldTimeDirectionFitter.begin(debug=plot) channelTimeWindow.begin(debug=False) correlationDirectionFitter.begin(debug=False, log_level=logging.DEBUG) electricFieldSignalReconstructor.begin(log_level=logging.WARNING) # Parse eventfile as argument parser = argparse.ArgumentParser(description='NuRadioSim file') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC simulation result') # parser.add_argument('detectordescription', type=str, # help='path to detectordescription') args = parser.parse_args() pos_SP1 = np.array([41153.2175* units.feet, 50381.75* units.feet, -1.5* units.m]) pos_spice = np.array([42600, 48800, 0]) * units.feet print('distance = {:.2f}'.format(np.linalg.norm(pos_SP1 - pos_spice))) # read in detector positions (this is a dummy detector) det = detector.Detector() t1 = datetime(2018, 12, 30, 22, 30, 22) t2 = datetime(2018, 12, 31, 2, 3, 11) # initialize modules eventReader = NuRadioReco.modules.io.eventReader.eventReader() eventReader.begin(args.inputfilename) results = {'corr_LPDA': [], 'corr_dipole': [], 'depth': [], 'exp': [], 'time_LPDA': [], 'time_dipole': [], 'chi2_time_dipole': [], 'chi2_time_LPDA': []} dds = -1 * np.arange(500, 1800, 100) for evt in eventReader.run(): for station in evt.get_stations(): station_id = station.get_id() t = station.get_station_time() det.update(t) d = station.get_sim_station().get_parameter(stnp.nu_vertex)[2] if(np.any(np.isclose(d, dds, atol=5))): dds = np.delete(dds, np.argwhere(np.isclose(d, dds, atol=5))) else: continue # if(d > -800): # continue # calcualte expected angles r = ray.ray_tracing(pos_spice + np.array([0, 0, d]), pos_SP1, medium.southpole_simple(), log_level=logging.WARNING) r.find_solutions() if(not r.has_solution()): continue results['depth'].append(d) rvec = r.get_receive_vector(0) zen, az = hp.cartesian_to_spherical(*rvec) az = hp.get_normalized_angle(az) results['exp'].append((zen, az)) print("{} depth = {:.1f}m -> {:.2f} {:.2f} (solution type {})".format(t, d, zen / units.deg, az / units.deg, r.get_solution_type(0))) channelResampler.run(evt, station, det, 50 * units.GHz) channelBandPassFilter.run(evt, station, det, passband=[120 * units.MHz, 300 * units.MHz], filter_type='butterabs', order=10) channelBandPassFilter.run(evt, station, det, passband=[10 * units.MHz, 1000 * units.MHz], filter_type='rectangular') hardwareResponseIncorporator.run(evt, station, det) channelSignalReconstructor.run(evt, station, det) # channelTimeWindow.run(evt, station, det, window_function='hanning', around_pulse=True, window_width=20*units.ns, # window_rise_time=20*units.ns) correlationDirectionFitter.run(evt, station, det, n_index=1.353, ZenLim=[90 * units.deg, 180 * units.deg], AziLim=[300 * units.deg, 330*units.deg], channel_pairs=((0, 2), (1, 3))) print("reco correlation LPDAs = {:.1f} ({:.1f}) {:.1f} ({:.1f})".format(station[stnp.zenith] / units.deg, (station[stnp.zenith] - zen)/ units.deg, station[stnp.azimuth] / units.deg, (station[stnp.azimuth] - az)/ units.deg)) results['corr_LPDA'].append((station[stnp.zenith], station[stnp.azimuth])) # correlationDirectionFitter.run(evt, station, det, n_index=1.353, ZenLim=[90 * units.deg, 180 * units.deg], AziLim=[300 * units.deg, 330*units.deg], channel_pairs=((6, 4), (5, 7))) print("reco correlation dipoles = {:.1f} ({:.1f}) {:.1f} ({:.1f})".format(station[stnp.zenith] / units.deg, (station[stnp.zenith] - zen)/ units.deg, station[stnp.azimuth] / units.deg, (station[stnp.azimuth] - az)/ units.deg)) results['corr_dipole'].append((station[stnp.zenith], station[stnp.azimuth])) voltageToEfieldConverterPerChannel.run(evt, station, det, pol=0) electricFieldSignalReconstructor.run(evt, station, det) efieldTimeDirectionFitter.run(evt, station, det, channels_to_use=[0,1,2,3]) print("reco time LPDAs = {:.1f} ({:.1f}) {:.1f} ({:.1f})".format(station[stnp.zenith] / units.deg, (station[stnp.zenith] - zen)/ units.deg, station[stnp.azimuth] / units.deg, (station[stnp.azimuth] - az)/ units.deg)) results['time_LPDA'].append((station[stnp.zenith], station[stnp.azimuth])) results['chi2_time_LPDA'].append(station[stnp.chi2_efield_time_direction_fit]) efieldTimeDirectionFitter.run(evt, station, det, channels_to_use=range(4, 8)) print("reco time 4 dipoles = {:.1f} ({:.1f}) {:.1f} ({:.1f})".format(station[stnp.zenith] / units.deg, (station[stnp.zenith] - zen)/ units.deg, station[stnp.azimuth] / units.deg, (station[stnp.azimuth] - az)/ units.deg)) results['time_dipole'].append((station[stnp.zenith], station[stnp.azimuth])) results['chi2_time_dipole'].append(station[stnp.chi2_efield_time_direction_fit]) if plot: fig, ax = plt.subplots(4, 2, sharex=True, sharey=True) ax = ax.flatten(order='F') for channel in station.iter_channels(): cid = channel.get_id() if not cid in range(8): continue tt = channel.get_times() #+ channel.get_trace_start_time() tt -= tt[0] ax[cid].plot(tt/units.ns, channel.get_trace()/units.mV, lw=1) # ax[cid].plot(tt/units.ns, channel.get_trace()[2]/units.mV) # ax[cid].axvline(channel[efp.signal_time] + channel.get_trace_start_time()) ax[cid].set_xlim(10, 150) ax[cid].set_title("channel {}".format(cid), fontsize='xx-small') ax[3].set_xlabel("time [ns]") ax[7].set_xlabel("time [ns]") fig.suptitle("voltage trace (signal chain deconvolved) d = {:.0f}m".format(d)) fig.tight_layout() fig.subplots_adjust(top=0.9) fig, ax = plt.subplots(4, 2, sharex=True, sharey=True) ax = ax.flatten(order='F') for efield in station.get_electric_fields(): eid = efield.get_channel_ids()[0] if not eid in range(8): continue tt = efield.get_times() #+ efield.get_trace_start_time() t0 = tt[0] tt -= t0 ax[eid].plot(tt/units.ns, efield.get_trace()[1]/units.mV, lw=1, label='rec') ax[eid].plot(tt/units.ns, np.abs(signal.hilbert(efield.get_trace()[1]))/units.mV, '--', lw=1) # ax[eid].plot(tt/units.ns, efield.get_trace()[2]/units.mV) ax[eid].axvline(efield[efp.signal_time] - t0, linestyle='--', lw=1) ax[eid].set_xlim(10, 150) # add simulated efields for efield in station.get_sim_station().get_electric_fields(): eid = efield.get_channel_ids()[0] if not eid in range(8): continue if(efield[efp.ray_path_type] == 'reflected'): # print("{} {}".format(efield[efp.reflection_coefficient_theta], efield[efp.reflection_coefficient_phi])) ax[eid].set_title("channel {}, r = {:.2f} {:.2f}".format(eid, np.abs(efield[efp.reflection_coefficient_theta]), np.abs(efield[efp.reflection_coefficient_phi])), fontsize='xx-small') for i in range(8): ax[i].legend(fontsize='xx-small') ax[3].set_xlabel("time [ns]") ax[7].set_xlabel("time [ns]") fig.suptitle("reconstructed electric field d = {:.0f}m".format(d)) fig.tight_layout() fig.subplots_adjust(top=0.9) if(not os.path.exists("plots/efields")): os.makedirs("plots/efields") fig.savefig("plots/efields/d_{:04.0f}m.png".format(d)) plt.close("all") # a = 1/0 with open("sim_results_02.pkl", 'wb') as fout: pickle.dump(results, fout, protocol=2) PKmNe9k  GNuRadioMC/examples/05_pulser_calibration_measurement/A04plot_results.pyfrom __future__ import absolute_import, division, print_function, unicode_literals import matplotlib.pyplot as plt import logging logging.basicConfig(level=logging.WARNING) import numpy as np from scipy import signal import argparse from datetime import datetime import pickle from NuRadioReco.utilities import units from radiotools import plthelpers as php i = 2 with open("sim_results_{:02d}.pkl".format(i), 'r') as fin: results = pickle.load(fin) d = results['depth'] zen = np.array(results['exp'])[:, 0] az = np.array(results['exp'])[:, 1] fig, (ax, ax2) = plt.subplots(2, 1, sharex=True) ax.scatter(d, (np.array(results['corr_LPDA'])[:, 0] - zen) / units.deg, label='corr LPDA', s=10, marker='o', alpha=0.5) ax.scatter(d, (np.array(results['corr_dipole'])[:, 0] - zen) / units.deg, label='corr dipole', s=10, marker='d', alpha=0.5) # ax.scatter(d, (np.array(results['time_LPDA'])[:, 0] - zen) / units.deg, label='times LPDA', # s=10, marker='^', alpha=0.5) # ax.scatter(d, (np.array(results['time_dipole'])[:, 0] - zen) / units.deg, label='times dipole', # s=10, marker='x', alpha=0.5) ax.set_ylabel("zenith (reco - exp) [deg]") ax.legend() ax2.scatter(d, (np.array(results['corr_LPDA'])[:, 1] - az) / units.deg, label='corr LPDA', s=10, marker='o', alpha=0.5) ax2.scatter(d, (np.array(results['corr_dipole'])[:, 1] - az) / units.deg, label='corr dipole', s=10, marker='d', alpha=0.5) # ax2.scatter(d, (np.array(results['time_LPDA'])[:, 1] - az) / units.deg, label='times LPDA', # s=10, marker='^', alpha=0.5) # ax2.scatter(d, (np.array(results['time_dipole'])[:, 1] - az) / units.deg, label='times dipole', # s=10, marker='x', alpha=0.5) ax2.set_ylabel("azimuth (reco - exp) [deg]") ax2.set_xlabel("depth [m]") fig.tight_layout() fig, ax = php.get_histograms([(np.array(results['corr_LPDA'])[:, 0] - zen) / units.deg, (np.array(results['corr_dipole'])[:, 0] - zen) / units.deg, (np.array(results['time_LPDA'])[:, 0] - zen) / units.deg, (np.array(results['time_dipole'])[:, 0] - zen) / units.deg, (np.array(results['corr_LPDA'])[:, 1] - az) / units.deg, (np.array(results['corr_dipole'])[:, 1] - az) / units.deg, (np.array(results['time_LPDA'])[:, 1] - az) / units.deg, (np.array(results['time_dipole'])[:, 1] - az) / units.deg], bins=np.linspace(-15, 15, 30), titles=['corr LPDA', 'corr_dipole', 'time_LPDA', 'time_dipole', '','','',''], xlabels=[r'$\Delta$zen [deg]', r'$\Delta$zen [deg]', r'$\Delta$zen [deg]', r'$\Delta$zen [deg]', r'$\Delta$az [deg]', r'$\Delta$az [deg]', r'$\Delta$az [deg]', r'$\Delta$az [deg]']) fig.savefig("plots/results_{:02d}_hist.png".format(i)) plt.show() PKmN  FNuRadioMC/examples/05_pulser_calibration_measurement/config_spice.yamlnoise: False # specify if simulation should be run with or without noise sampling_rate: 5. # sampling rate in GHz used internally in the simulation. At the end the waveforms will be downsampled to the sampling rate specified in the detector description speedup: minimum_weight_cut: 0 # disable neutrino weight cut -> we're not simulating neutrinos here delta_C_cut: 10 # more than 360deg, disable cone angle cut min_efield_amplitude: 0 propagation: module: analytic ice_model: southpole_2015 attenuation_model: SP1 attenuate_ice: True # if True apply the frequency dependent attenuation due to propagating through ice. (Note: The 1/R amplitude scaling will be applied in either case.) n_freq: 25 # the number of frequencies where the attenuation length is calculated for. The remaining frequencies will be determined from a linear interpolation between the reference frequencies. The reference frequencies are equally spaced over the complet frequency range. signal: model: spherical zerosignal: False # if True, the signal is set to zero. This is useful to study 'noise' only simulations polarization: custom # can be either 'auto' or 'custom' ePhi: 0. # only used if 'polarization = custom', fraction of ePhi component, the eTheta component is eTheta = (1 - ePhi**2)**0.5 PKmNVENuRadioMC/examples/05_pulser_calibration_measurement/detector_db.json{ "_default": {}, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -2.92, "ant_position_y": -0.15, "ant_position_z": -1.462, "ant_rotation_phi": 8.21, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "10": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan1 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -0.17, "ant_position_y": 2.94, "ant_position_z": -1.519, "ant_rotation_phi": 276.9, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-11", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "11": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan2 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.17, "ant_position_y": -0.0900000000001, "ant_position_z": -1.647, "ant_rotation_phi": 188.21, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-10", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "12": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan3 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.5, "ant_position_y": -2.96, "ant_position_z": -1.45, "ant_rotation_phi": 96.9, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-14", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.7, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "13": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan4 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.25, "ant_position_y": -3.87, "ant_position_z": -0.928, "ant_rotation_phi": 51.35, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-01", "cab_length": 7.0, "cab_reference_measurement": null, "cab_time_delay": 28.6, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "14": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan5 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -4.45, "ant_position_y": 2.63, "ant_position_z": -0.932, "ant_rotation_phi": 321.35, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-02", "cab_length": 7.0, "cab_reference_measurement": null, "cab_time_delay": 28.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "15": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan6 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.2, "ant_position_y": 3.83, "ant_position_z": -0.995, "ant_rotation_phi": 231.4, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-03", "cab_length": 7.0, "cab_reference_measurement": null, "cab_time_delay": 28.6, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "16": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn51 Chan7 2019", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 4.48, "ant_position_y": -2.45, "ant_position_z": -0.998, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "10", "cab_length": 10.0, "cab_reference_measurement": null, "cab_time_delay": 42.3, "cab_type": "LMR_240", "channel_id": 7, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 }, "17": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 52 layout upward facing channel 5", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.46, "ant_position_y": 3.57, "ant_position_z": -1.0, "ant_rotation_phi": 225.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2016-10-01T00:00:00", "decommission_time": "{TinyDate}:2017-11-01T00:00:00", "station_id": 41 }, "18": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 52 layout upward facing channel 6", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.69, "ant_position_y": -3.27, "ant_position_z": -1.0, "ant_rotation_phi": 135.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2016-10-01T00:00:00", "decommission_time": "{TinyDate}:2017-11-01T00:00:00", "station_id": 41 }, "19": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 52 layout upward facing channel 7", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.61, "ant_position_y": -3.48, "ant_position_z": -1.0, "ant_rotation_phi": 45.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2016-10-01T00:00:00", "decommission_time": "{TinyDate}:2017-11-01T00:00:00", "station_id": 41 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel 1", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -0.17, "ant_position_y": 2.94, "ant_position_z": -1.519, "ant_rotation_phi": 276.9, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-11", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "20": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 52 layout upward facing channel 4", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.8, "ant_position_y": 3.25, "ant_position_z": -1.0, "ant_rotation_phi": 315.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2016-10-01T00:00:00", "decommission_time": "{TinyDate}:2017-11-01T00:00:00", "station_id": 41 }, "21": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "Station 32 channel 0", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 4.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-06T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 32 }, "22": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "Station 32 channel 1", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 4.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.86, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-06T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 32 }, "23": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "Station 32 channel 2", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": -4.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 18.82, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-06T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 32 }, "24": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "Station 32 channel 3", "ant_deployment_time": "{TinyDate}:2017-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -4.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.86, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-06T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 32 }, "25": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 13 layout channel0", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 13 }, "26": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 13 layout channel 1", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 13 }, "27": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 13 layout channel 2", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 13 }, "28": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 13 layout channel 3", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 13 }, "29": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 14 layout channel0", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 14 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel 2", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.17, "ant_position_y": -0.0900000000001, "ant_position_z": -1.647, "ant_rotation_phi": 188.21, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-10", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "30": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 14 layout channel 1", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 14 }, "31": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 14 layout channel 2", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 14 }, "32": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 14 layout channel 3", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 14 }, "33": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 15 layout channel0", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 15 }, "34": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 15 layout channel 1", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 15 }, "35": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 15 layout channel 2", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 15 }, "36": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "100", "ant_comment": "station 15 layout channel 3", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 15 }, "37": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 17 layout channel0", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 17 }, "38": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 17 layout channel 1", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 17 }, "39": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 17 layout channel 2", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 17 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel 3", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.5, "ant_position_y": -2.96, "ant_position_z": -1.45, "ant_rotation_phi": 96.9, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-14", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.7, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "40": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 17 layout channel 3", "ant_deployment_time": "{TinyDate}:2014-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2014-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 17 }, "41": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 19 layout channel0", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 19 }, "42": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 19 layout channel 1", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 19 }, "43": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 19 layout channel 2", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 19 }, "44": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 19 layout channel 3", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 19 }, "45": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 30 layout channel0", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": 0.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 30 }, "46": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 30 layout channel 1", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 30 }, "47": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 30 layout channel 2", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": 0.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 30 }, "48": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "200", "ant_comment": "station 30 layout channel 3", "ant_deployment_time": "{TinyDate}:2015-11-15T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": 0.0, "ant_position_z": 0.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2015-11-15T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 30 }, "49": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch0", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 2.97, "ant_position_z": -1.4, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "18-15", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 20.7, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station upward facing channel 4", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.468, "ant_position_y": -3.911, "ant_position_z": 1.0, "ant_rotation_phi": 51.35, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-01", "cab_length": 7.0, "cab_reference_measurement": null, "cab_time_delay": 28.6, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "50": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch1", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 2.94, "ant_position_y": -0.0176, "ant_position_z": -1.4, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "18-19", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 20.6, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "51": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch2", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -0.0582, "ant_position_y": -3.06, "ant_position_z": -1.4, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "18-17", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 20.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "52": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch3", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -2.91, "ant_position_y": -0.00687, "ant_position_z": -1.4, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "18-18", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 20.7, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "53": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch4", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.54, "ant_position_y": 3.76, "ant_position_z": -2.695, "ant_rotation_phi": 0.0, "ant_rotation_theta": 0.0, "ant_type": "KU_dipole", "cab_id": "18-14", "cab_length": 10.0, "cab_reference_measurement": null, "cab_time_delay": 41.5, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "54": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch5", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.13, "ant_position_y": 3.8, "ant_position_z": 1.422, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "18-12", "cab_length": 10.0, "cab_reference_measurement": null, "cab_time_delay": 41.0, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "55": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch6", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.56, "ant_position_y": -3.77, "ant_position_z": -2.766, "ant_rotation_phi": 0.0, "ant_rotation_theta": 0.0, "ant_type": "KU_dipole", "cab_id": "18-13", "cab_length": 10.0, "cab_reference_measurement": null, "cab_time_delay": 41.5, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "56": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Stn61 Ch7", "ant_deployment_time": "{TinyDate}:2018-12-08T12:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.09, "ant_position_y": -3.88, "ant_position_z": 1.4, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "18-00", "cab_length": 10.0, "cab_reference_measurement": null, "cab_time_delay": 41.5, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2018-12-08T12:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 61 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station upward facing channel 5", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -4.632, "ant_position_y": 2.283, "ant_position_z": 1.0, "ant_rotation_phi": 321.35, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-02", "cab_length": 7.0, "cab_reference_measurement": null, "cab_time_delay": 28.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station upward facing channel 6", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 2.653, "ant_position_y": 3.743, "ant_position_z": 1.0, "ant_rotation_phi": 231.4, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-03", "cab_length": 7.0, "cab_reference_measurement": null, "cab_time_delay": 28.6, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "bicone antenna installed at first southpole station Ch7", "ant_deployment_time": "{TinyDate}:2017-12-01T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -1.057, "ant_position_y": 5.06, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "ARA_bicone", "cab_id": "", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.95, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2018-12-05T00:00:00", "station_id": 51 }, "9": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "Station 51 Channel 0 (2019)", "ant_deployment_time": "{TinyDate}:2018-12-05T00:00:00", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -2.92, "ant_position_y": -0.15, "ant_position_z": -1.462, "ant_rotation_phi": 8.21, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2018-12-05T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 51 } }, "positions": {}, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 0.0, "pos_easting": 41153.2175, "pos_measurement_time": "{TinyDate}:2018-01-25T00:00:00", "pos_northing": 50381.75, "pos_zone": "SP-grid", "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 51, "station_type": null } } }PKmNq["LL-NuRadioMC/examples/Sensitivities/E1_fluxes.pyimport matplotlib.pyplot as plt import numpy as np from NuRadioReco.utilities import units from NuRadioMC.utilities import fluxes # What to plot save_figure_as = "E1_figure.pdf" # ---------------------------------------- # Our simulations show_strawman = False N_strawman = [300] show_strawman_pa = True N_strawman_pa = [200] show_punch = False N_punch = [1000] show_50_punch = True N_50_punch = [50] livetime = 5 * units.year # ----------------------------------------- # Existing experimental limits show_ice_cube_EHE_limit = True show_ice_cube_HESE = True show_ice_cube_mu = True show_anita_I_III_limit = True show_auger_limit = True # Neutrino parameter space show_neutrino_best_fit = True show_neutrino_best_case = True show_neutrino_worst_case = True # ------------------------------------------ # Other planned experiments show_grand_10k = True show_grand_200k = True show_radar = False #-------------------------------------- show_veff = False energyBinsPerDecade = 2. plotUnitsEnergy = units.GeV plotUnitsFlux = units.cm**-2 * units.second**-1 * units.sr**-1 # Input # -------------------------------------------------------- # -------------------------------------------------------- # Add here your simulations: # Form: [Energy, Veff] # Multiply by appropriate units (see NuRadioRec utilities) # -------------------------------------------------------- # NuRadioMC Simulations 2018-10-30 # shallow (+ PA@15m) strawman_veff_pa = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19], [0.004262962502392621, 0.03822262685532028, 0.23820656099350665, 0.9868013403282071, 2.6962266043091505, 4.804439044664905, 7.952404234726831, 12.134531004961424])).T strawman_veff_pa[:,0] *= units.eV strawman_veff_pa[:,1] *= units.km**3 * units.sr strawman_pa_label = 'Strawman + PA (15m)' # NuRadioMC Simulations 2018-10-30 # shallow (no PA) strawman_veff = np.array(([ (1e+16, 0.00187395737505), (3.16227766017e+16, 0.0139137654267), (1e+17, 0.111686556083), (3.16227766017e+17, 0.606554605342), (1e+18, 2.14600116741), (3.16227766017e+18, 4.38389098037), (1e+19, 7.53391749902), (3.16227766017e+19, 11.7036694609) ])) strawman_veff[:,0] *= units.eV strawman_veff[:,1] *= units.km**3 * units.sr strawman_label = "shallow (no PA)" # NuRadioMC Simulations 2018-10-30 # punch deep 90m PA (+ 3x > 3$\\sigma$) punch_veff = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19],[0.006668021292200337, 0.0743147844483842, 0.6506745450040999, 3.0390454429054534, 8.950078934762834, 19.113997931757307, 30.98552028868807, 51.21180969326324] )).T punch_veff[:,0] *= units.eV punch_veff[:,1] *= units.km**3 * units.sr punch_label = 'Punch 90m PA' # NuRadioMC Simulations 2018-10-30 # deep 50m PA (+ 3x > 3$\\sigma$) punch_50_veff = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19], [0.007467602898257461, 0.06986834193426224, 0.5333379226865426, 2.1410489793474383, 5.896654567671568, 11.343574036186226, 18.415350759353128, 27.81614390854279] )).T punch_50_veff[:,0] *= units.eV punch_50_veff[:,1] *= units.km**3 * units.sr punch_50_label = 'Punch 50m PA' # Unless you would like to work with the layout or the models/data from other experiments, # you don't need to change anything below here # -------------------------------------------------------------------- # Other planned experiments # GRAND white paper, # numerical values, Bustamante GRAND_energy = np.array(([48192296.5, 67644231.1, 94947581.6, 133271428.0, 187063990.0, 262568931.0, 368550053.0, 517308507.0, 726110577.0, 1019191760.0, 1430569790.0, 2007992980.0, 2818482440.0, 3956111070.0, 5552922590.0, 7794257720.0, 10940266600.0, 15356104100.0, 21554313200.0, 30254315500.0, 42465913900.0, 59606499400.0, 83665567300.0, 117435636000.0, 164836371000.0, 231369543000.0, 324757606000.0, 455840043000.0, 639831498000.0, 898087721000.0, 1260584320000.0, 1769396010000.0, 2483580190000.0, 3486031680000.0, 4893104280000.0, 6868115880000.0, 9640304610000.0, 13531436400000.0, 18993151900000.0, 26659388600000.0])) GRAND_energy *= units.GeV GRAND_10k = np.array(([8.41513361e-08, 7.38147706e-08, 5.69225180e-08, 3.46647934e-08, 1.95651137e-08, 1.40651565e-08, 1.25782087e-08, 1.24621707e-08, 1.31123151e-08, 1.45812119e-08, 1.65528260e-08, 1.91930521e-08, 2.31554429e-08, 2.87477813e-08, 3.55164030e-08, 4.42563884e-08, 5.63965197e-08, 7.45183330e-08, 1.01159657e-07, 1.39040439e-07, 1.98526677e-07, 2.61742251e-07, 3.40870828e-07, 4.82745531e-07, 6.55876763e-07, 9.07706655e-07, 1.67125879e-06, 1.76142511e-05, 2.55022320e-04, 1.88371074e-03, 6.71431813e-03, 1.14286198e-02, 1.14294614e-02, 1.72447830e-02, 7.48579143e-02, 3.31883351e-01, 8.57786094e-01, 1.24824516e+00, 1.42294586e+00, 1.80135089e+00])) GRAND_10k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) GRAND_10k /= GRAND_energy GRAND_200k = np.array(([4.26219753e-09, 3.58147708e-09, 2.75670137e-09, 1.85254042e-09, 1.13825106e-09, 7.70141315e-10, 6.51758930e-10, 6.35878242e-10, 6.69261628e-10, 7.37439217e-10, 8.38784832e-10, 9.81688683e-10, 1.18493794e-09, 1.45699379e-09, 1.80867621e-09, 2.26948852e-09, 2.91952068e-09, 3.86790849e-09, 5.24530715e-09, 7.31211288e-09, 9.98848945e-09, 1.33523293e-08, 1.80893102e-08, 2.46582187e-08, 3.41054825e-08, 5.39140368e-08, 3.36553610e-07, 4.57179717e-06, 3.59391218e-05, 1.47550853e-04, 3.33777479e-04, 4.92873322e-04, 6.68381070e-04, 1.72553598e-03, 7.06643413e-03, 2.10754560e-02, 4.06319101e-02, 5.88162853e-02, 7.45423652e-02, 8.83700084e-02])) GRAND_200k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) GRAND_200k /= GRAND_energy # RADAR proposed from https://arxiv.org/pdf/1710.02883.pdf Radar = np.array(([ (1.525e+01, 6.870e-09, 3.430e-07), (1.575e+01, 9.797e-10, 3.113e-08), (1.625e+01, 4.728e-09, 1.928e-07), (1.675e+01, 6.359e-09, 3.706e-07), (1.725e+01, 9.128e-09, 8.517e-07), (1.775e+01, 1.619e-08, 1.835e-06), (1.825e+01, 2.995e-08, 2.766e-06), (1.875e+01, 5.562e-08, 8.253e-06), (1.925e+01, 1.072e-07, 1.849e-05)])) Radar[:,0] = 10**Radar[:,0]*units.eV Radar[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) Radar[:,1] /= Radar[:,0] Radar[:,2] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) Radar[:,2] /= Radar[:,0] # -------------------------------------------------------------------- # Published data and limits # IceCube # log (E^2 * Phi [GeV cm^02 s^-1 sr^-1]) : log (E [Gev]) # Phys Rev D 98 062003 (2018) # Numbers private correspondence Shigeru Yoshida ice_cube_limit = np.array(([ (6.199999125,-7.698484687), (6.299999496,-8.162876678), (6.400000617,-8.11395291), (6.500000321,-8.063634144), (6.599999814,-8.004841781), (6.699999798,-7.944960162), (6.799999763,-7.924197388), (6.899999872,-7.899315263), (7.299999496,-7.730561153), (7.699999798,-7.670680637), (8.100001583,-7.683379711), (8.500000321,-7.748746801), (8.899999872,-7.703060304), (9.299999496,-7.512907553), (9.699999798,-7.370926525), (10.10000158,-7.134626026), (10.50000032,-6.926516638), (10.89999987,-6.576523031) ])) ice_cube_limit[:,0] = 10**ice_cube_limit[:,0] * units.GeV ice_cube_limit[:,1] = 10**ice_cube_limit[:,1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_limit[:,1] *= energyBinsPerDecade ice_cube_limit[:,1] /= ice_cube_limit[:,0] # Fig. 2 from PoS ICRC2017 (2018) 981 # IceCube preliminary # E (GeV); E^2 dN/dE (GeV cm^-2 s-1 sr-1); yerror down; yerror up ice_cube_hese = np.array(([ (6.526e+04, 2.248e-08, 9.96e-9, 1.123e-8), (1.409e+05, 2.692e-08, 5.91e-9, 7.56e-9), (3.041e+05, 7.631e-09, 3.746e-9, 4.61e-9), (6.644e+05, 2.022e-09, 7.03e-10, 0.), (1.434e+06, 5.205e-09, 3.183e-9, 4.57e-9), (3.096e+06, 4.347e-09, 3.142e-9, 5.428e-9), (6.684e+06, 1.544e-09, 5.37e-10, 0.), (1.46e+07, 4.063e-09, 1.353e-9, 0.), (3.153e+07, 6.093e-09, 2.03e-9, 0.), (6.806e+07, 1.046e-08, 3.641e-9, 0.) ])) ice_cube_hese[:,0] = ice_cube_hese[:,0]* units.GeV ice_cube_hese[:,1] = ice_cube_hese[:,1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:,1] *= energyBinsPerDecade * 3 # single flavor ice_cube_hese[:,1] /= ice_cube_hese[:,0] ice_cube_hese[:,2] = ice_cube_hese[:,2] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:,2] *= energyBinsPerDecade * 3 ice_cube_hese[:,2] /= ice_cube_hese[:,0] ice_cube_hese[:,3] = ice_cube_hese[:,3] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:,3] *= energyBinsPerDecade * 3 ice_cube_hese[:,3] /= ice_cube_hese[:,0] # Ice cube def ice_cube_nu_fit(energy,slope=-2.13,offset=0.9): flux = 3 * offset * (energy/(100*units.TeV))**slope *1e-18 * (units.GeV**-1 * units.cm**-2 * units.second**-1 * units.sr**-1) return flux def ice_cube_mu_range(): energy = np.arange(1e5,5e6,1e5)*units.GeV upper = np.maximum(ice_cube_nu_fit(energy,offset=0.9,slope=-2.),ice_cube_nu_fit(energy,offset=1.2,slope=-2.13)) upper *= energy lower = np.minimum(ice_cube_nu_fit(energy,offset=0.9,slope=-2.26),ice_cube_nu_fit(energy,offset=0.63,slope=-2.13)) lower *= energy return energy, upper, lower def ice_cube_hese_range(): energy = np.arange(1e5,5e6,1e5)*units.GeV upper = np.maximum(ice_cube_nu_fit(energy,offset=2.46,slope=-2.63),ice_cube_nu_fit(energy,offset=2.76,slope=-2.92)) upper *= energy lower = np.minimum(ice_cube_nu_fit(energy,offset=2.46,slope=-3.25),ice_cube_nu_fit(energy,offset=2.16,slope=-2.92)) lower *= energy return energy, upper, lower #ANITA I - III #Phys. Rev. D 98, 022001 (2018) anita_limit =np.array(([ (9.94e17, 3.79e-14 * 9.94e17/1e9), (2.37e18, 2.15e-15 * 2.37e18/1e9), (5.19e18, 2.33e-16 * 5.19e18/1e9), (1.10e19, 3.64e-17 * 1.10e19/1e9), (3.55e19, 4.45e-18 * 3.55e19/1e9), (1.11e20, 9.22e-19 * 1.11e20/1e9), (4.18e20, 2.97e-19 * 4.18e20/1e9), (9.70e20, 1.62e-19 * 9.70e20/1e9) ])) anita_limit[:,0] *= units.eV anita_limit[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) anita_limit[:,1] /= 2 anita_limit[:,1] *= energyBinsPerDecade anita_limit[:,1] /= anita_limit[:,0] # Auger neutrino limit # Auger 9 years, all flavour (x3) auger_limit = np.array(( [ (16.7523809524, 4.462265901e-07), (17.2523809524, 1.103901153e-07), (17.7523809524, 6.487559078e-08), (18.2380952381, 7.739545498e-08), (18.7523809524, 1.387743075e-07), (19.2571428571, 3.083827665e-07), (19.7523809524, 7.467202523e-07), (20.2476190476, 1.998499395e-06) ])) auger_limit[:,0] = 10** auger_limit[:,0] * units.eV auger_limit[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) auger_limit[:,1] /= 2 #half-decade binning auger_limit[:,1] *= energyBinsPerDecade auger_limit[:,1] /= auger_limit[:,0] # =========================================================================== # Plotting # Veff # --------------------------------------------------------------------------- if show_veff: plt.figure() plt.plot(strawman_veff_pa[:,0],strawman_veff_pa[:,1]/(units.km**3 * units.sr),label=strawman_pa_label) plt.plot(strawman_veff[:,0],strawman_veff[:,1]/(units.km**3 * units.sr),label=strawman_label) plt.plot(punch_veff[:,0],punch_veff[:,1]/(units.km**3 * units.sr),label=punch_label) plt.plot(punch_50_veff[:,0],punch_50_veff[:,1]/(units.km**3 * units.sr),label=punch_50_label) plt.yscale('log') plt.xscale('log') plt.xlabel("Energy [eV]") plt.ylabel(r'Effective Volume [km$^3$ sr]') plt.legend() plt.tight_layout() # Limit E2 Plot # --------------------------------------------------------------------------- fig, ax = plt.subplots(1,1,figsize=(7,8)) # fig, ax = plt.subplots(1,1,figsize=(7,4)) # Neutrino Models Heinze_band = np.loadtxt("talys_neu_bands.out") best_fit, = ax.plot(Heinze_band[:,0], Heinze_band[:,1]*Heinze_band[:,0],c='k',label=r'Best fit UHECR ($\pm$ 3$\sigma$), Heinze et al.',linestyle='-.') Heinze_evo = np.loadtxt("talys_neu_evolutions.out") ax.fill_between(Heinze_evo[:,0],Heinze_evo[:,5]*Heinze_evo[:,0],Heinze_evo[:,6]*Heinze_evo[:,0],color='0.8') vanVliet_max_1 = np.loadtxt("MaxNeutrinos1.txt") vanVliet_max_2 = np.loadtxt("MaxNeutrinos2.txt") vanVliet_reas = np.loadtxt("ReasonableNeutrinos1.txt") vanVliet_max = np.maximum(vanVliet_max_1[1,:]/vanVliet_max_1[0,:],vanVliet_max_2[1,:]/vanVliet_max_2[0,:]) prot10, = ax.plot(vanVliet_reas[0,:],vanVliet_reas[1,:]/vanVliet_reas[0,:],label=r'10% protons in UHECRs, van Vliet et al.',linestyle=':',color='darkmagenta') prot = ax.fill_between(vanVliet_max_1[0,:],vanVliet_max,vanVliet_reas[1,:]/vanVliet_reas[0,:], color='thistle',alpha=0.5,label=r'not excluded from UHECRs') first_legend = plt.legend(handles=[best_fit,prot,prot10], loc=4) plt.gca().add_artist(first_legend) #----------------------------------------------------------------------- if show_grand_10k: ax.plot(GRAND_energy/plotUnitsEnergy,GRAND_10k/plotUnitsFlux,linestyle="--",color='saddlebrown') ax.annotate('GRAND 10k', xy=(1e10, 3.5e-18), xycoords='data', horizontalalignment='left',color='saddlebrown',rotation=-5 ) if show_grand_200k: ax.plot(GRAND_energy/plotUnitsEnergy,GRAND_200k/plotUnitsFlux,linestyle="--",color='saddlebrown') ax.annotate('GRAND 200k', xy=(1e10, 1.8e-19), xycoords='data', horizontalalignment='left',color='saddlebrown' ,rotation=-5) if show_radar: ax.fill_between(Radar[:,0]/plotUnitsEnergy,Radar[:,1]/plotUnitsFlux,Radar[:,2]/plotUnitsFlux, facecolor='None',hatch='x',edgecolor='0.8') ax.annotate('Radar', xy=(3e10, 8e-8), xycoords='data', horizontalalignment='left',color='0.7' ,rotation=45) if show_ice_cube_EHE_limit: ax.plot(ice_cube_limit[:,0]/plotUnitsEnergy,ice_cube_limit[:,1]/plotUnitsFlux,color='dodgerblue') ax.annotate('IceCube', xy=(2e6, 4e-14), xycoords='data', horizontalalignment='center',color='dodgerblue',rotation=0 ) if show_ice_cube_HESE: # data points uplimit = np.copy(ice_cube_hese[:,3]) uplimit[np.where(ice_cube_hese[:,3]==0)] = 1 uplimit[np.where(ice_cube_hese[:,3]!=0.)] = 0 ax.errorbar(ice_cube_hese[:,0]/plotUnitsEnergy,ice_cube_hese[:,1]/plotUnitsFlux, yerr=ice_cube_hese[:,2:].T/plotUnitsFlux,uplims=uplimit,color='dodgerblue',marker='o',ecolor='dodgerblue',linestyle='None') # hese fit ice_cube_hese_range = ice_cube_hese_range() ax.fill_between(ice_cube_hese_range[0]/plotUnitsEnergy, ice_cube_hese_range[1]/plotUnitsFlux,ice_cube_hese_range[2]/plotUnitsFlux,hatch='//',edgecolor='dodgerblue',facecolor='azure') plt.plot(ice_cube_hese_range[0]/plotUnitsEnergy, ice_cube_nu_fit(ice_cube_hese_range[0],offset=2.46,slope=-2.92)*ice_cube_hese_range[0]/plotUnitsFlux, color='dodgerblue') if show_ice_cube_mu: # mu fit ice_cube_mu_range = ice_cube_mu_range() ax.fill_between(ice_cube_mu_range[0]/plotUnitsEnergy, ice_cube_mu_range[1]/plotUnitsFlux,ice_cube_mu_range[2]/plotUnitsFlux,hatch='\\',edgecolor='dodgerblue',facecolor='azure') plt.plot(ice_cube_mu_range[0]/plotUnitsEnergy, ice_cube_nu_fit(ice_cube_mu_range[0],offset=0.9,slope=-2.13)*ice_cube_mu_range[0]/plotUnitsFlux,color='dodgerblue') if show_anita_I_III_limit: ax.plot(anita_limit[:,0]/plotUnitsEnergy,anita_limit[:,1]/plotUnitsFlux,color='darkorange') ax.annotate('ANITA I - III', xy=(3e9, 1e-14), xycoords='data', horizontalalignment='left',color='darkorange' ) if show_auger_limit: ax.plot(auger_limit[:,0]/plotUnitsEnergy,auger_limit[:,1]/plotUnitsFlux,color='forestgreen') ax.annotate('Auger', xy=(1.1e8, 2.1e-15), xycoords='data', horizontalalignment='left',color='forestgreen',rotation=0 ) # Own limits limit_labels = [] if show_strawman_pa: for N in N_strawman_pa: strawman_limit_pa = fluxes.get_limit_e1_flux(energy = strawman_veff_pa[:,0], veff = strawman_veff_pa[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') str_plt_pa, = ax.plot(strawman_veff_pa[:,0]/plotUnitsEnergy,strawman_limit_pa/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),strawman_pa_label),color='red',linewidth=3) limit_labels.append(str_plt_pa) if show_strawman: for N in N_strawman: strawman_limit = fluxes.get_limit_e1_flux(energy = strawman_veff[:,0], veff = strawman_veff[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') str_plt, = ax.plot(strawman_veff[:,0]/plotUnitsEnergy,strawman_limit/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),strawman_label),color='darkmagenta',linewidth=3) limit_labels.append(str_plt) if show_punch: for N in N_punch: punch_limit = fluxes.get_limit_e1_flux(energy = punch_veff[:,0], veff = punch_veff[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') punch_plt, = ax.plot(punch_veff[:,0]/plotUnitsEnergy,punch_limit/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),punch_label),color='firebrick',linewidth=3) limit_labels.append(punch_plt) if show_50_punch: for N in N_50_punch: punch_50_limit = fluxes.get_limit_e1_flux(energy = punch_50_veff[:,0], veff = punch_50_veff[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') punch_50_plt, = ax.plot(punch_50_veff[:,0]/plotUnitsEnergy,punch_50_limit/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),punch_50_label),color='deeppink',linewidth=3) limit_labels.append(punch_50_plt) plt.legend(handles=limit_labels, loc=2) ax.set_yscale('log') ax.set_xscale('log') ax.set_xlabel(r'Neutrino Energy [GeV]') ax.set_ylabel(r'$E\Phi$ [cm$^{-2}$ s$^{-1}$ sr$^{-1}$]') ax.set_ylim(1e-20,2e-12) ax.set_xlim(1e5,1e11) plt.tight_layout() plt.savefig(save_figure_as) plt.show() PKmN1JJ-NuRadioMC/examples/Sensitivities/E2_fluxes.pyimport matplotlib.pyplot as plt import numpy as np from NuRadioReco.utilities import units from NuRadioMC.utilities import fluxes # What to plot save_figure_as = "Work_in_progress.pdf" # ---------------------------------------- # Our simulations show_strawman = True N_strawman = [270] show_strawman_pa = True N_strawman_pa = [270] show_punch = True N_punch = [50] show_50_punch = True N_50_punch = [80] livetime = 3 * units.year # ----------------------------------------- # Existing experimental limits show_ice_cube_EHE_limit = True show_ice_cube_HESE = True show_ice_cube_mu = True show_anita_I_III_limit = True show_auger_limit = True # Neutrino parameter space show_neutrino_best_fit = True show_neutrino_best_case = True show_neutrino_worst_case = True # ------------------------------------------ # Other planned experiments show_grand_10k = True show_grand_200k = True show_radar = True #-------------------------------------- show_veff = False energyBinsPerDecade = 2. plotUnitsEnergy = units.GeV plotUnitsFlux = units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1 # Input # -------------------------------------------------------- # -------------------------------------------------------- # Add here your simulations: # Form: [Energy, Veff] # Multiply by appropriate units (see NuRadioRec utilities) # -------------------------------------------------------- # NuRadioMC Simulations 2018-10-30 # shallow (+ PA@15m) strawman_veff_pa = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19], [0.004262962502392621, 0.03822262685532028, 0.23820656099350665, 0.9868013403282071, 2.6962266043091505, 4.804439044664905, 7.952404234726831, 12.134531004961424])).T strawman_veff_pa[:,0] *= units.eV strawman_veff_pa[:,1] *= units.km**3 * units.sr strawman_pa_label = 'Strawman + PA (15m)' # NuRadioMC Simulations 2018-10-30 # shallow (no PA) strawman_veff = np.array(([ (1e+16, 0.00187395737505), (3.16227766017e+16, 0.0139137654267), (1e+17, 0.111686556083), (3.16227766017e+17, 0.606554605342), (1e+18, 2.14600116741), (3.16227766017e+18, 4.38389098037), (1e+19, 7.53391749902), (3.16227766017e+19, 11.7036694609) ])) strawman_veff[:,0] *= units.eV strawman_veff[:,1] *= units.km**3 * units.sr strawman_label = "shallow (no PA)" # NuRadioMC Simulations 2018-10-30 # punch deep 90m PA (+ 3x > 3$\\sigma$) punch_veff = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19],[0.006668021292200337, 0.0743147844483842, 0.6506745450040999, 3.0390454429054534, 8.950078934762834, 19.113997931757307, 30.98552028868807, 51.21180969326324] )).T punch_veff[:,0] *= units.eV punch_veff[:,1] *= units.km**3 * units.sr punch_label = 'Punch 90m PA' # NuRadioMC Simulations 2018-10-30 # deep 50m PA (+ 3x > 3$\\sigma$) punch_50_veff = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19], [0.007467602898257461, 0.06986834193426224, 0.5333379226865426, 2.1410489793474383, 5.896654567671568, 11.343574036186226, 18.415350759353128, 27.81614390854279] )).T punch_50_veff[:,0] *= units.eV punch_50_veff[:,1] *= units.km**3 * units.sr punch_50_label = 'Punch 50m PA' # Unless you would like to work with the layout or the models/data from other experiments, # you don't need to change anything below here # -------------------------------------------------------------------- # Other planned experiments # GRAND white paper, # numerical values, Bustamante GRAND_energy = np.array(([48192296.5, 67644231.1, 94947581.6, 133271428.0, 187063990.0, 262568931.0, 368550053.0, 517308507.0, 726110577.0, 1019191760.0, 1430569790.0, 2007992980.0, 2818482440.0, 3956111070.0, 5552922590.0, 7794257720.0, 10940266600.0, 15356104100.0, 21554313200.0, 30254315500.0, 42465913900.0, 59606499400.0, 83665567300.0, 117435636000.0, 164836371000.0, 231369543000.0, 324757606000.0, 455840043000.0, 639831498000.0, 898087721000.0, 1260584320000.0, 1769396010000.0, 2483580190000.0, 3486031680000.0, 4893104280000.0, 6868115880000.0, 9640304610000.0, 13531436400000.0, 18993151900000.0, 26659388600000.0])) GRAND_energy *= units.GeV GRAND_10k = np.array(([8.41513361e-08, 7.38147706e-08, 5.69225180e-08, 3.46647934e-08, 1.95651137e-08, 1.40651565e-08, 1.25782087e-08, 1.24621707e-08, 1.31123151e-08, 1.45812119e-08, 1.65528260e-08, 1.91930521e-08, 2.31554429e-08, 2.87477813e-08, 3.55164030e-08, 4.42563884e-08, 5.63965197e-08, 7.45183330e-08, 1.01159657e-07, 1.39040439e-07, 1.98526677e-07, 2.61742251e-07, 3.40870828e-07, 4.82745531e-07, 6.55876763e-07, 9.07706655e-07, 1.67125879e-06, 1.76142511e-05, 2.55022320e-04, 1.88371074e-03, 6.71431813e-03, 1.14286198e-02, 1.14294614e-02, 1.72447830e-02, 7.48579143e-02, 3.31883351e-01, 8.57786094e-01, 1.24824516e+00, 1.42294586e+00, 1.80135089e+00])) GRAND_10k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) GRAND_200k = np.array(([4.26219753e-09, 3.58147708e-09, 2.75670137e-09, 1.85254042e-09, 1.13825106e-09, 7.70141315e-10, 6.51758930e-10, 6.35878242e-10, 6.69261628e-10, 7.37439217e-10, 8.38784832e-10, 9.81688683e-10, 1.18493794e-09, 1.45699379e-09, 1.80867621e-09, 2.26948852e-09, 2.91952068e-09, 3.86790849e-09, 5.24530715e-09, 7.31211288e-09, 9.98848945e-09, 1.33523293e-08, 1.80893102e-08, 2.46582187e-08, 3.41054825e-08, 5.39140368e-08, 3.36553610e-07, 4.57179717e-06, 3.59391218e-05, 1.47550853e-04, 3.33777479e-04, 4.92873322e-04, 6.68381070e-04, 1.72553598e-03, 7.06643413e-03, 2.10754560e-02, 4.06319101e-02, 5.88162853e-02, 7.45423652e-02, 8.83700084e-02])) GRAND_200k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # RADAR proposed from https://arxiv.org/pdf/1710.02883.pdf Radar = np.array(([ (1.525e+01, 6.870e-09, 3.430e-07), (1.575e+01, 9.797e-10, 3.113e-08), (1.625e+01, 4.728e-09, 1.928e-07), (1.675e+01, 6.359e-09, 3.706e-07), (1.725e+01, 9.128e-09, 8.517e-07), (1.775e+01, 1.619e-08, 1.835e-06), (1.825e+01, 2.995e-08, 2.766e-06), (1.875e+01, 5.562e-08, 8.253e-06), (1.925e+01, 1.072e-07, 1.849e-05)])) Radar[:,0] = 10**Radar[:,0]*units.eV Radar[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) Radar[:,2] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # -------------------------------------------------------------------- # Published data and limits # IceCube # log (E^2 * Phi [GeV cm^02 s^-1 sr^-1]) : log (E [Gev]) # Phys Rev D 98 062003 (2018) # Numbers private correspondence Shigeru Yoshida ice_cube_limit = np.array(([ (6.199999125,-7.698484687), (6.299999496,-8.162876678), (6.400000617,-8.11395291), (6.500000321,-8.063634144), (6.599999814,-8.004841781), (6.699999798,-7.944960162), (6.799999763,-7.924197388), (6.899999872,-7.899315263), (7.299999496,-7.730561153), (7.699999798,-7.670680637), (8.100001583,-7.683379711), (8.500000321,-7.748746801), (8.899999872,-7.703060304), (9.299999496,-7.512907553), (9.699999798,-7.370926525), (10.10000158,-7.134626026), (10.50000032,-6.926516638), (10.89999987,-6.576523031) ])) ice_cube_limit[:,0] = 10**ice_cube_limit[:,0] * units.GeV ice_cube_limit[:,1] = 10**ice_cube_limit[:,1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_limit[:,1] *= energyBinsPerDecade # Fig. 2 from PoS ICRC2017 (2018) 981 # IceCube preliminary # E (GeV); E^2 dN/dE (GeV cm^-2 s-1 sr-1); yerror down; yerror up ice_cube_hese = np.array(([ (6.526e+04, 2.248e-08, 9.96e-9, 1.123e-8), (1.409e+05, 2.692e-08, 5.91e-9, 7.56e-9), (3.041e+05, 7.631e-09, 3.746e-9, 4.61e-9), (6.644e+05, 2.022e-09, 7.03e-10, 0.), (1.434e+06, 5.205e-09, 3.183e-9, 4.57e-9), (3.096e+06, 4.347e-09, 3.142e-9, 5.428e-9), (6.684e+06, 1.544e-09, 5.37e-10, 0.), (1.46e+07, 4.063e-09, 1.353e-9, 0.), (3.153e+07, 6.093e-09, 2.03e-9, 0.), (6.806e+07, 1.046e-08, 3.641e-9, 0.) ])) ice_cube_hese[:,0] = ice_cube_hese[:,0]* units.GeV ice_cube_hese[:,1] = ice_cube_hese[:,1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:,1] *= energyBinsPerDecade * 3 ice_cube_hese[:,2] = ice_cube_hese[:,2] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:,2] *= energyBinsPerDecade * 3 ice_cube_hese[:,3] = ice_cube_hese[:,3] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:,3] *= energyBinsPerDecade * 3 # Ice cube def ice_cube_nu_fit(energy,slope=-2.13,offset=0.9): flux = 3 * offset * (energy/(100*units.TeV))**slope *1e-18 * (units.GeV**-1 * units.cm**-2 * units.second**-1 * units.sr**-1) return flux def ice_cube_mu_range(): energy = np.arange(1e5,5e6,1e5)*units.GeV upper = np.maximum(ice_cube_nu_fit(energy,offset=0.9,slope=-2.),ice_cube_nu_fit(energy,offset=1.2,slope=-2.13)) upper *= energy**2 lower = np.minimum(ice_cube_nu_fit(energy,offset=0.9,slope=-2.26),ice_cube_nu_fit(energy,offset=0.63,slope=-2.13)) lower *= energy**2 return energy, upper, lower def ice_cube_hese_range(): energy = np.arange(1e5,5e6,1e5)*units.GeV upper = np.maximum(ice_cube_nu_fit(energy,offset=2.46,slope=-2.63),ice_cube_nu_fit(energy,offset=2.76,slope=-2.92)) upper *= energy**2 lower = np.minimum(ice_cube_nu_fit(energy,offset=2.46,slope=-3.25),ice_cube_nu_fit(energy,offset=2.16,slope=-2.92)) lower *= energy**2 return energy, upper, lower #ANITA I - III #Phys. Rev. D 98, 022001 (2018) anita_limit =np.array(([ (9.94e17, 3.79e-14 * 9.94e17/1e9), (2.37e18, 2.15e-15 * 2.37e18/1e9), (5.19e18, 2.33e-16 * 5.19e18/1e9), (1.10e19, 3.64e-17 * 1.10e19/1e9), (3.55e19, 4.45e-18 * 3.55e19/1e9), (1.11e20, 9.22e-19 * 1.11e20/1e9), (4.18e20, 2.97e-19 * 4.18e20/1e9), (9.70e20, 1.62e-19 * 9.70e20/1e9) ])) anita_limit[:,0] *= units.eV anita_limit[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) anita_limit[:,1] /= 2 anita_limit[:,1] *= energyBinsPerDecade # Auger neutrino limit # Auger 9 years, all flavour (x3) auger_limit = np.array(( [ (16.7523809524, 4.462265901e-07), (17.2523809524, 1.103901153e-07), (17.7523809524, 6.487559078e-08), (18.2380952381, 7.739545498e-08), (18.7523809524, 1.387743075e-07), (19.2571428571, 3.083827665e-07), (19.7523809524, 7.467202523e-07), (20.2476190476, 1.998499395e-06) ])) auger_limit[:,0] = 10** auger_limit[:,0] * units.eV auger_limit[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) auger_limit[:,1] /= 2 #half-decade binning auger_limit[:,1] *= energyBinsPerDecade # =========================================================================== # Plotting # Veff # --------------------------------------------------------------------------- if show_veff: plt.figure() plt.plot(strawman_veff_pa[:,0],strawman_veff_pa[:,1]/(units.km**3 * units.sr),label=strawman_pa_label) plt.plot(strawman_veff[:,0],strawman_veff[:,1]/(units.km**3 * units.sr),label=strawman_label) plt.plot(punch_veff[:,0],punch_veff[:,1]/(units.km**3 * units.sr),label=punch_label) plt.plot(punch_50_veff[:,0],punch_50_veff[:,1]/(units.km**3 * units.sr),label=punch_50_label) plt.yscale('log') plt.xscale('log') plt.xlabel("Energy [eV]") plt.ylabel(r'Effective Volume [km$^3$ sr]') plt.legend() plt.tight_layout() # Limit E2 Plot # --------------------------------------------------------------------------- fig, ax = plt.subplots(1,1,figsize=(7,8)) # Neutrino Models Heinze_band = np.loadtxt("talys_neu_bands.out") best_fit, = ax.plot(Heinze_band[:,0], Heinze_band[:,1]*Heinze_band[:,0]**2,c='k',label=r'Best fit UHECR ($\pm$ 3$\sigma$), Heinze et al.',linestyle='-.') Heinze_evo = np.loadtxt("talys_neu_evolutions.out") ax.fill_between(Heinze_evo[:,0],Heinze_evo[:,5]*Heinze_evo[:,0]**2,Heinze_evo[:,6]*Heinze_evo[:,0]**2,color='0.8') vanVliet_max_1 = np.loadtxt("MaxNeutrinos1.txt") vanVliet_max_2 = np.loadtxt("MaxNeutrinos2.txt") vanVliet_reas = np.loadtxt("ReasonableNeutrinos1.txt") vanVliet_max = np.maximum(vanVliet_max_1[1,:],vanVliet_max_2[1,:]) prot10, = ax.plot(vanVliet_reas[0,:],vanVliet_reas[1,:],label=r'10% protons in UHECRs, van Vliet et al.',linestyle=':',color='darkmagenta') prot = ax.fill_between(vanVliet_max_1[0,:],vanVliet_max,vanVliet_reas[1,:]/10,color='thistle',alpha=0.5,label=r'not excluded from UHECRs') first_legend = plt.legend(handles=[best_fit,prot,prot10], loc=4) plt.gca().add_artist(first_legend) #----------------------------------------------------------------------- if show_grand_10k: ax.plot(GRAND_energy/plotUnitsEnergy,GRAND_10k/ plotUnitsFlux,linestyle="--",color='saddlebrown') ax.annotate('GRAND 10k', xy=(1e10, 1.1e-7), xycoords='data', horizontalalignment='left',color='saddlebrown',rotation=50 ) if show_grand_200k: ax.plot(GRAND_energy/plotUnitsEnergy,GRAND_200k/ plotUnitsFlux,linestyle="--",color='saddlebrown') ax.annotate('GRAND 200k', xy=(1e10, 6e-9), xycoords='data', horizontalalignment='left',color='saddlebrown' ,rotation=50) if show_radar: ax.fill_between(Radar[:,0]/plotUnitsEnergy,Radar[:,1]/plotUnitsFlux,Radar[:,2]/plotUnitsFlux, facecolor='None',hatch='x',edgecolor='0.8') ax.annotate('Radar', xy=(1e9, 4.5e-8), xycoords='data', horizontalalignment='left',color='0.7' ,rotation=45) if show_ice_cube_EHE_limit: ax.plot(ice_cube_limit[:,0]/plotUnitsEnergy,ice_cube_limit[:,1]/plotUnitsFlux,color='dodgerblue') ax.annotate('IceCube', xy=(0.7e7, 4e-8), xycoords='data', horizontalalignment='center',color='dodgerblue',rotation=0 ) if show_ice_cube_HESE: # data points uplimit = np.copy(ice_cube_hese[:,3]) uplimit[np.where(ice_cube_hese[:,3]==0)] = 1 uplimit[np.where(ice_cube_hese[:,3]!=0.)] = 0 ax.errorbar(ice_cube_hese[:,0]/plotUnitsEnergy,ice_cube_hese[:,1]/plotUnitsFlux, yerr=ice_cube_hese[:,2:].T/plotUnitsFlux,uplims=uplimit,color='dodgerblue',marker='o',ecolor='dodgerblue',linestyle='None') # hese fit ice_cube_hese_range = ice_cube_hese_range() ax.fill_between(ice_cube_hese_range[0]/plotUnitsEnergy, ice_cube_hese_range[1]/plotUnitsFlux,ice_cube_hese_range[2]/plotUnitsFlux,hatch='//',edgecolor='dodgerblue',facecolor='azure') plt.plot(ice_cube_hese_range[0]/plotUnitsEnergy, ice_cube_nu_fit(ice_cube_hese_range[0],offset=2.46,slope=-2.92)*ice_cube_hese_range[0]**2/plotUnitsFlux, color='dodgerblue') if show_ice_cube_mu: # mu fit ice_cube_mu_range = ice_cube_mu_range() ax.fill_between(ice_cube_mu_range[0]/plotUnitsEnergy, ice_cube_mu_range[1]/plotUnitsFlux,ice_cube_mu_range[2]/plotUnitsFlux,hatch='\\',edgecolor='dodgerblue',facecolor='azure') plt.plot(ice_cube_mu_range[0]/plotUnitsEnergy, ice_cube_nu_fit(ice_cube_mu_range[0],offset=0.9,slope=-2.13)*ice_cube_mu_range[0]**2/plotUnitsFlux,color='dodgerblue') if show_anita_I_III_limit: ax.plot(anita_limit[:,0]/plotUnitsEnergy,anita_limit[:,1]/plotUnitsFlux,color='darkorange') ax.annotate('ANITA I - III', xy=(7e9, 1e-6), xycoords='data', horizontalalignment='left',color='darkorange' ) if show_auger_limit: ax.plot(auger_limit[:,0]/plotUnitsEnergy,auger_limit[:,1]/plotUnitsFlux,color='forestgreen') ax.annotate('Auger', xy=(1.1e8, 2.1e-7), xycoords='data', horizontalalignment='left',color='forestgreen',rotation=0 ) # Own limits limit_labels = [] if show_strawman_pa: for N in N_strawman_pa: strawman_limit_pa = fluxes.get_limit_e2_flux(energy = strawman_veff_pa[:,0], veff = strawman_veff_pa[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') str_plt_pa, = ax.plot(strawman_veff_pa[:,0]/plotUnitsEnergy,strawman_limit_pa/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),strawman_pa_label),color='red',linewidth=3) limit_labels.append(str_plt_pa) if show_strawman: for N in N_strawman: strawman_limit = fluxes.get_limit_e2_flux(energy = strawman_veff[:,0], veff = strawman_veff[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') str_plt, = ax.plot(strawman_veff[:,0]/plotUnitsEnergy,strawman_limit/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),strawman_label),color='darkmagenta',linewidth=3) limit_labels.append(str_plt) if show_punch: for N in N_punch: punch_limit = fluxes.get_limit_e2_flux(energy = punch_veff[:,0], veff = punch_veff[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') punch_plt, = ax.plot(punch_veff[:,0]/plotUnitsEnergy,punch_limit/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),punch_label),color='firebrick',linewidth=3) limit_labels.append(punch_plt) if show_50_punch: for N in N_50_punch: punch_50_limit = fluxes.get_limit_e2_flux(energy = punch_50_veff[:,0], veff = punch_50_veff[:,1], livetime = livetime, signalEff = N, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.300, nuCrsScn='ctw') punch_50_plt, = ax.plot(punch_50_veff[:,0]/plotUnitsEnergy,punch_50_limit/ plotUnitsFlux,label="{2}: {0} stations, {1} years".format(N,int(livetime/units.year),punch_50_label),color='deeppink',linewidth=3) limit_labels.append(punch_50_plt) plt.legend(handles=limit_labels, loc=2) ax.set_yscale('log') ax.set_xscale('log') ax.set_xlabel(r'Neutrino Energy [GeV]') ax.set_ylabel(r'$E^2\Phi$ [GeV cm$^{-2}$ s$^{-1}$ sr$^{-1}$]') ax.set_ylim(1e-11,2e-6) ax.set_xlim(1e5,1e11) plt.tight_layout() plt.savefig(save_figure_as) plt.show() PKmNPDPD.NuRadioMC/examples/Sensitivities/E2_fluxes2.pyimport matplotlib.pyplot as plt import numpy as np from NuRadioReco.utilities import units from NuRadioMC.utilities import fluxes import os energyBinsPerDecade = 2. plotUnitsEnergy = units.GeV plotUnitsFlux = units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1 # Unless you would like to work with the layout or the models/data from other experiments, # you don't need to change anything below here # -------------------------------------------------------------------- # Other planned experiments # GRAND white paper, # numerical values, Bustamante GRAND_energy = np.array(([48192296.5, 67644231.1, 94947581.6, 133271428.0, 187063990.0, 262568931.0, 368550053.0, 517308507.0, 726110577.0, 1019191760.0, 1430569790.0, 2007992980.0, 2818482440.0, 3956111070.0, 5552922590.0, 7794257720.0, 10940266600.0, 15356104100.0, 21554313200.0, 30254315500.0, 42465913900.0, 59606499400.0, 83665567300.0, 117435636000.0, 164836371000.0, 231369543000.0, 324757606000.0, 455840043000.0, 639831498000.0, 898087721000.0, 1260584320000.0, 1769396010000.0, 2483580190000.0, 3486031680000.0, 4893104280000.0, 6868115880000.0, 9640304610000.0, 13531436400000.0, 18993151900000.0, 26659388600000.0])) GRAND_energy *= units.GeV GRAND_10k = np.array(([8.41513361e-08, 7.38147706e-08, 5.69225180e-08, 3.46647934e-08, 1.95651137e-08, 1.40651565e-08, 1.25782087e-08, 1.24621707e-08, 1.31123151e-08, 1.45812119e-08, 1.65528260e-08, 1.91930521e-08, 2.31554429e-08, 2.87477813e-08, 3.55164030e-08, 4.42563884e-08, 5.63965197e-08, 7.45183330e-08, 1.01159657e-07, 1.39040439e-07, 1.98526677e-07, 2.61742251e-07, 3.40870828e-07, 4.82745531e-07, 6.55876763e-07, 9.07706655e-07, 1.67125879e-06, 1.76142511e-05, 2.55022320e-04, 1.88371074e-03, 6.71431813e-03, 1.14286198e-02, 1.14294614e-02, 1.72447830e-02, 7.48579143e-02, 3.31883351e-01, 8.57786094e-01, 1.24824516e+00, 1.42294586e+00, 1.80135089e+00])) GRAND_10k *= (units.GeV* units.cm**-2 * units.second**-1 * units.sr**-1) #GRAND_10k /= 2 #halfdecade bins GRAND_10k *= energyBinsPerDecade GRAND_200k = np.array(([4.26219753e-09, 3.58147708e-09, 2.75670137e-09, 1.85254042e-09, 1.13825106e-09, 7.70141315e-10, 6.51758930e-10, 6.35878242e-10, 6.69261628e-10, 7.37439217e-10, 8.38784832e-10, 9.81688683e-10, 1.18493794e-09, 1.45699379e-09, 1.80867621e-09, 2.26948852e-09, 2.91952068e-09, 3.86790849e-09, 5.24530715e-09, 7.31211288e-09, 9.98848945e-09, 1.33523293e-08, 1.80893102e-08, 2.46582187e-08, 3.41054825e-08, 5.39140368e-08, 3.36553610e-07, 4.57179717e-06, 3.59391218e-05, 1.47550853e-04, 3.33777479e-04, 4.92873322e-04, 6.68381070e-04, 1.72553598e-03, 7.06643413e-03, 2.10754560e-02, 4.06319101e-02, 5.88162853e-02, 7.45423652e-02, 8.83700084e-02])) GRAND_200k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # RADAR proposed from https://arxiv.org/pdf/1710.02883.pdf Radar = np.array(([ (1.525e+01, 6.870e-09, 3.430e-07), (1.575e+01, 9.797e-10, 3.113e-08), (1.625e+01, 4.728e-09, 1.928e-07), (1.675e+01, 6.359e-09, 3.706e-07), (1.725e+01, 9.128e-09, 8.517e-07), (1.775e+01, 1.619e-08, 1.835e-06), (1.825e+01, 2.995e-08, 2.766e-06), (1.875e+01, 5.562e-08, 8.253e-06), (1.925e+01, 1.072e-07, 1.849e-05)])) Radar[:, 0] = 10**Radar[:, 0] * units.eV Radar[:, 1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) Radar[:, 2] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # -------------------------------------------------------------------- # Published data and limits # IceCube # log (E^2 * Phi [GeV cm^02 s^-1 sr^-1]) : log (E [Gev]) # Phys Rev D 98 062003 (2018) # Numbers private correspondence Shigeru Yoshida ice_cube_limit = np.array(([ (6.199999125, -7.698484687), (6.299999496, -8.162876678), (6.400000617, -8.11395291), (6.500000321, -8.063634144), (6.599999814, -8.004841781), (6.699999798, -7.944960162), (6.799999763, -7.924197388), (6.899999872, -7.899315263), (7.299999496, -7.730561153), (7.699999798, -7.670680637), (8.100001583, -7.683379711), (8.500000321, -7.748746801), (8.899999872, -7.703060304), (9.299999496, -7.512907553), (9.699999798, -7.370926525), (10.10000158, -7.134626026), (10.50000032, -6.926516638), (10.89999987, -6.576523031) ])) ice_cube_limit[:, 0] = 10**ice_cube_limit[:, 0] * units.GeV ice_cube_limit[:, 1] = 10**ice_cube_limit[:, 1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_limit[:, 1] *= energyBinsPerDecade # Fig. 2 from PoS ICRC2017 (2018) 981 # IceCube preliminary # E (GeV); E^2 dN/dE (GeV cm^-2 s-1 sr-1); yerror down; yerror up ice_cube_hese = np.array(([ (6.526e+04, 2.248e-08, 9.96e-9, 1.123e-8), (1.409e+05, 2.692e-08, 5.91e-9, 7.56e-9), (3.041e+05, 7.631e-09, 3.746e-9, 4.61e-9), (6.644e+05, 2.022e-09, 7.03e-10, 0.), (1.434e+06, 5.205e-09, 3.183e-9, 4.57e-9), (3.096e+06, 4.347e-09, 3.142e-9, 5.428e-9), (6.684e+06, 1.544e-09, 5.37e-10, 0.), (1.46e+07, 4.063e-09, 1.353e-9, 0.), (3.153e+07, 6.093e-09, 2.03e-9, 0.), (6.806e+07, 1.046e-08, 3.641e-9, 0.) ])) ice_cube_hese[:, 0] = ice_cube_hese[:, 0] * units.GeV ice_cube_hese[:, 1] = ice_cube_hese[:, 1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:, 1] *= 3 ice_cube_hese[:, 2] = ice_cube_hese[:, 2] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:, 2] *= 3 ice_cube_hese[:, 3] = ice_cube_hese[:, 3] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:, 3] *= 3 # Ice cube def ice_cube_nu_fit(energy, slope=-2.13, offset=0.9): flux = 3 * offset * (energy / (100 * units.TeV))**slope * 1e-18 * \ (units.GeV**-1 * units.cm**-2 * units.second**-1 * units.sr**-1) return flux def get_ice_cube_mu_range(): energy = np.arange(1e5, 5e6, 1e5) * units.GeV upper = np.maximum(ice_cube_nu_fit(energy, offset=0.9, slope=-2.), ice_cube_nu_fit(energy, offset=1.2, slope=-2.13)) upper *= energy**2 lower = np.minimum(ice_cube_nu_fit(energy, offset=0.9, slope=-2.26), ice_cube_nu_fit(energy, offset=0.63, slope=-2.13)) lower *= energy**2 return energy, upper, lower def get_ice_cube_hese_range(): energy = np.arange(1e5, 5e6, 1e5) * units.GeV upper = np.maximum(ice_cube_nu_fit(energy, offset=2.46, slope=-2.63), ice_cube_nu_fit(energy, offset=2.76, slope=-2.92)) upper *= energy**2 lower = np.minimum(ice_cube_nu_fit(energy, offset=2.46, slope=-3.25), ice_cube_nu_fit(energy, offset=2.16, slope=-2.92)) lower *= energy**2 return energy, upper, lower # ANITA I - III # Phys. Rev. D 98, 022001 (2018) anita_limit = np.array(([ (9.94e17, 3.79e-14 * 9.94e17 / 1e9), (2.37e18, 2.15e-15 * 2.37e18 / 1e9), (5.19e18, 2.33e-16 * 5.19e18 / 1e9), (1.10e19, 3.64e-17 * 1.10e19 / 1e9), (3.55e19, 4.45e-18 * 3.55e19 / 1e9), (1.11e20, 9.22e-19 * 1.11e20 / 1e9), (4.18e20, 2.97e-19 * 4.18e20 / 1e9), (9.70e20, 1.62e-19 * 9.70e20 / 1e9) ])) anita_limit[:, 0] *= units.eV anita_limit[:, 1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) anita_limit[:, 1] /= 2 anita_limit[:, 1] *= energyBinsPerDecade # Auger neutrino limit # Auger 9 years, all flavour (x3) auger_limit = np.array(([ (16.7523809524, 4.462265901e-07), (17.2523809524, 1.103901153e-07), (17.7523809524, 6.487559078e-08), (18.2380952381, 7.739545498e-08), (18.7523809524, 1.387743075e-07), (19.2571428571, 3.083827665e-07), (19.7523809524, 7.467202523e-07), (20.2476190476, 1.998499395e-06) ])) auger_limit[:, 0] = 10 ** auger_limit[:, 0] * units.eV auger_limit[:, 1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) auger_limit[:, 1] /= 2 # half-decade binning auger_limit[:, 1] *= energyBinsPerDecade # get 10% proton flux def get_proton_10(energy): vanVliet_reas = np.loadtxt(os.path.join(os.path.dirname(__file__), "ReasonableNeutrinos1.txt")) E = vanVliet_reas[0, :] * plotUnitsEnergy f = vanVliet_reas[1, :] * plotUnitsFlux / E**2 from scipy.interpolate import interp1d getE = interp1d(E, f) return getE(energy) def get_E2_limit_figure(show_ice_cube_EHE_limit=True, show_ice_cube_HESE=True, show_ice_cube_mu=True, show_anita_I_III_limit=True, show_auger_limit=True, show_neutrino_best_fit=True, show_neutrino_best_case=True, show_neutrino_worst_case=True, show_grand_10k=True, show_grand_200k=True, show_radar=False): # Limit E2 Plot # --------------------------------------------------------------------------- fig, ax = plt.subplots(1, 1, figsize=(7, 8)) # Neutrino Models Heinze_band = np.loadtxt(os.path.join(os.path.dirname(__file__), "talys_neu_bands.out")) best_fit, = ax.plot(Heinze_band[:, 0], Heinze_band[:, 1] * Heinze_band[:, 0]**2, c='k', label=r'Best fit UHECR ($\pm$ 3$\sigma$), Heinze et al.', linestyle='-.') Heinze_evo = np.loadtxt(os.path.join(os.path.dirname(__file__), "talys_neu_evolutions.out")) ax.fill_between(Heinze_evo[:, 0], Heinze_evo[:, 5] * Heinze_evo[:, 0] ** 2, Heinze_evo[:, 6] * Heinze_evo[:, 0]**2, color='0.8') vanVliet_max_1 = np.loadtxt(os.path.join(os.path.dirname(__file__), "MaxNeutrinos1.txt")) vanVliet_max_2 = np.loadtxt(os.path.join(os.path.dirname(__file__), "MaxNeutrinos2.txt")) vanVliet_reas = np.loadtxt(os.path.join(os.path.dirname(__file__), "ReasonableNeutrinos1.txt")) vanVliet_max = np.maximum(vanVliet_max_1[1, :], vanVliet_max_2[1, :]) prot10, = ax.plot(vanVliet_reas[0, :], vanVliet_reas[1, :], label=r'10% protons in UHECRs, van Vliet et al.', linestyle=':', color='darkmagenta') prot = ax.fill_between(vanVliet_max_1[0,:],vanVliet_max,vanVliet_reas[1,:]/10,color='thistle',alpha=0.5,label=r'not excluded from UHECRs') first_legend = plt.legend(handles=[best_fit, prot, prot10], loc=4) plt.gca().add_artist(first_legend) #----------------------------------------------------------------------- if show_grand_10k: ax.plot(GRAND_energy / plotUnitsEnergy, GRAND_10k / plotUnitsFlux, linestyle="--", color='saddlebrown') ax.annotate('GRAND 10k', xy=(0.3e10, 1.1e-7 /2 * energyBinsPerDecade), xycoords='data', horizontalalignment='left', color='saddlebrown', rotation=50) if show_grand_200k: ax.plot(GRAND_energy / plotUnitsEnergy, GRAND_200k / plotUnitsFlux, linestyle="--", color='saddlebrown') ax.annotate('GRAND 200k', xy=(1e10, 6e-9 /2 * energyBinsPerDecade), xycoords='data', horizontalalignment='left', color='saddlebrown', rotation=50) if show_radar: ax.fill_between(Radar[:, 0] / plotUnitsEnergy, Radar[:, 1] / plotUnitsFlux, Radar[:, 2] / plotUnitsFlux, facecolor='None', hatch='x', edgecolor='0.8') ax.annotate('Radar', xy=(1e9, 4.5e-8), xycoords='data', horizontalalignment='left', color='0.7', rotation=45) if show_ice_cube_EHE_limit: ax.plot(ice_cube_limit[:, 0] / plotUnitsEnergy, ice_cube_limit[:, 1] / plotUnitsFlux, color='dodgerblue') ax.annotate('IceCube', xy=(3e5, 1e-7), xycoords='data', horizontalalignment='left', verticalalignment='center', color='dodgerblue', rotation=0) if show_ice_cube_HESE: # data points uplimit = np.copy(ice_cube_hese[:, 3]) uplimit[np.where(ice_cube_hese[:, 3] == 0)] = 1 uplimit[np.where(ice_cube_hese[:, 3] != 0.)] = 0 ax.errorbar(ice_cube_hese[:, 0] / plotUnitsEnergy, ice_cube_hese[:, 1] / plotUnitsFlux, yerr=ice_cube_hese[:,2:].T / plotUnitsFlux, uplims=uplimit, color='dodgerblue', marker='o', ecolor='dodgerblue', linestyle='None') # hese fit ice_cube_hese_range = get_ice_cube_hese_range() ax.fill_between(ice_cube_hese_range[0] / plotUnitsEnergy, ice_cube_hese_range[1] / plotUnitsFlux, ice_cube_hese_range[2] / plotUnitsFlux, hatch='//', edgecolor='dodgerblue', facecolor='azure') plt.plot(ice_cube_hese_range[0] / plotUnitsEnergy, ice_cube_nu_fit(ice_cube_hese_range[0], offset=2.46, slope=-2.92) * ice_cube_hese_range[0]**2 / plotUnitsFlux, color='dodgerblue') if show_ice_cube_mu: # mu fit ice_cube_mu_range = get_ice_cube_mu_range() ax.fill_between(ice_cube_mu_range[0] / plotUnitsEnergy, ice_cube_mu_range[1] / plotUnitsFlux, ice_cube_mu_range[2] / plotUnitsFlux, hatch='\\', edgecolor='dodgerblue', facecolor='azure') plt.plot(ice_cube_mu_range[0] / plotUnitsEnergy, ice_cube_nu_fit(ice_cube_mu_range[0], offset=0.9, slope=-2.13) * ice_cube_mu_range[0]**2 / plotUnitsFlux, color='dodgerblue') if show_anita_I_III_limit: ax.plot(anita_limit[:, 0] / plotUnitsEnergy, anita_limit[:, 1] / plotUnitsFlux, color='darkorange') ax.annotate('ANITA I - III', xy=(5e9, 0.5e-6 /2 * energyBinsPerDecade), xycoords='data', horizontalalignment='right', color='darkorange') if show_auger_limit: ax.plot(auger_limit[:, 0] / plotUnitsEnergy, auger_limit[:, 1] / plotUnitsFlux, color='forestgreen') ax.annotate('Auger', xy=(1.2e8, 2.1e-7 /2 * energyBinsPerDecade), xycoords='data', horizontalalignment='left', color='forestgreen', rotation=0) ax.set_yscale('log') ax.set_xscale('log') ax.set_xlabel(r'Neutrino Energy [GeV]') ax.set_ylabel(r'$E^2\Phi$ [GeV cm$^{-2}$ s$^{-1}$ sr$^{-1}$]') ax.set_ylim(1e-11, 2e-6) ax.set_xlim(1e5, 1e11) plt.tight_layout() return fig, ax def add_limit(ax, limit_labels, E, Veff, n_stations, label, livetime=3*units.year, fmt='-', color='C0'): E = np.array(E) Veff = np.array(Veff) limit = fluxes.get_limit_e2_flux(energy = E, veff = Veff, livetime = livetime, signalEff = n_stations, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.44, nuCrsScn='ctw') _plt, = ax.plot(E/plotUnitsEnergy,limit/ plotUnitsFlux, fmt, color=color, label="{2}: {0} stations, {1} years".format(n_stations,int(livetime/units.year),label), linewidth=3) limit_labels.append(_plt) return limit_labels def add_limit_band(ax, limit_labels, E, Veff1, Veff2, n_stations, label, livetime=3*units.year, color='C0'): E = np.array(E) Veff1 = np.array(Veff1) Veff2 = np.array(Veff2) limit1 = fluxes.get_limit_e2_flux(energy = E, veff = Veff1, livetime = livetime, signalEff = n_stations, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.44, nuCrsScn='ctw') limit2 = fluxes.get_limit_e2_flux(energy = E, veff = Veff2, livetime = livetime, signalEff = n_stations, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.44, nuCrsScn='ctw') ax.fill_between(E/plotUnitsEnergy,limit1/ plotUnitsFlux,limit2/ plotUnitsFlux, color=color, alpha=0.5, label="{2}: {0} stations, {1} years".format(n_stations,int(livetime/units.year),label)) # limit_labels.append(_plt) return limit_labels if __name__=="__main__": strawman_veff_pa = np.array(( [1.00000000e+16, 3.16227766e+16, 1.00000000e+17, 3.16227766e+17, 1.00000000e+18, 3.16227766e+18, 1.00000000e+19, 3.16227766e+19], [1.82805666e+07, 1.34497197e+08, 6.32044851e+08, 2.20387046e+09, 4.86050340e+09, 8.18585201e+09, 1.25636305e+10, 1.83360237e+10])).T strawman_veff_pa[:,0] *= units.eV strawman_veff_pa[:,1] *= units.m**3 * units.sr strawman_pa_label = 'Strawman + PA@15m@2s' fig, ax = get_E2_limit_figure() labels =[] labels = add_limit(ax, labels, strawman_veff_pa[:,0],strawman_veff_pa[:,1], 270, strawman_pa_label) plt.legend(handles=labels, loc=2) plt.show() PKmNe6-MhMh.NuRadioMC/examples/Sensitivities/E2_fluxes3.pyimport matplotlib matplotlib.rc('xtick', labelsize=14) matplotlib.rc('ytick', labelsize=14) matplotlib.rc('axes', labelsize=18) legendfontsize = 11 import matplotlib.pyplot as plt import numpy as np from NuRadioReco.utilities import units from NuRadioMC.utilities import fluxes import os energyBinsPerDecade = 1. plotUnitsEnergy = units.GeV plotUnitsFlux = units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1 DIFFUSE = True # Unless you would like to work with the layout or the models/data from other experiments, # you don't need to change anything below here # -------------------------------------------------------------------- # Other planned experiments # GRAND white paper, # numerical values, Bustamante GRAND_energy = np.array(([48192296.5, 67644231.1, 94947581.6, 133271428.0, 187063990.0, 262568931.0, 368550053.0, 517308507.0, 726110577.0, 1019191760.0, 1430569790.0, 2007992980.0, 2818482440.0, 3956111070.0, 5552922590.0, 7794257720.0, 10940266600.0, 15356104100.0, 21554313200.0, 30254315500.0, 42465913900.0, 59606499400.0, 83665567300.0, 117435636000.0, 164836371000.0, 231369543000.0, 324757606000.0, 455840043000.0, 639831498000.0, 898087721000.0, 1260584320000.0, 1769396010000.0, 2483580190000.0, 3486031680000.0, 4893104280000.0, 6868115880000.0, 9640304610000.0, 13531436400000.0, 18993151900000.0, 26659388600000.0])) GRAND_energy *= units.GeV GRAND_10k = np.array(([8.41513361e-08, 7.38147706e-08, 5.69225180e-08, 3.46647934e-08, 1.95651137e-08, 1.40651565e-08, 1.25782087e-08, 1.24621707e-08, 1.31123151e-08, 1.45812119e-08, 1.65528260e-08, 1.91930521e-08, 2.31554429e-08, 2.87477813e-08, 3.55164030e-08, 4.42563884e-08, 5.63965197e-08, 7.45183330e-08, 1.01159657e-07, 1.39040439e-07, 1.98526677e-07, 2.61742251e-07, 3.40870828e-07, 4.82745531e-07, 6.55876763e-07, 9.07706655e-07, 1.67125879e-06, 1.76142511e-05, 2.55022320e-04, 1.88371074e-03, 6.71431813e-03, 1.14286198e-02, 1.14294614e-02, 1.72447830e-02, 7.48579143e-02, 3.31883351e-01, 8.57786094e-01, 1.24824516e+00, 1.42294586e+00, 1.80135089e+00])) GRAND_10k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) #GRAND_10k /= 2 #halfdecade bins GRAND_10k *= energyBinsPerDecade GRAND_200k = np.array(([4.26219753e-09, 3.58147708e-09, 2.75670137e-09, 1.85254042e-09, 1.13825106e-09, 7.70141315e-10, 6.51758930e-10, 6.35878242e-10, 6.69261628e-10, 7.37439217e-10, 8.38784832e-10, 9.81688683e-10, 1.18493794e-09, 1.45699379e-09, 1.80867621e-09, 2.26948852e-09, 2.91952068e-09, 3.86790849e-09, 5.24530715e-09, 7.31211288e-09, 9.98848945e-09, 1.33523293e-08, 1.80893102e-08, 2.46582187e-08, 3.41054825e-08, 5.39140368e-08, 3.36553610e-07, 4.57179717e-06, 3.59391218e-05, 1.47550853e-04, 3.33777479e-04, 4.92873322e-04, 6.68381070e-04, 1.72553598e-03, 7.06643413e-03, 2.10754560e-02, 4.06319101e-02, 5.88162853e-02, 7.45423652e-02, 8.83700084e-02])) GRAND_200k *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) #GRAND_200k /= 2 #halfdecade bins GRAND_200k *= energyBinsPerDecade # RADAR proposed from https://arxiv.org/pdf/1710.02883.pdf Radar = np.array(([ (1.525e+01, 6.870e-09, 3.430e-07), (1.575e+01, 9.797e-10, 3.113e-08), (1.625e+01, 4.728e-09, 1.928e-07), (1.675e+01, 6.359e-09, 3.706e-07), (1.725e+01, 9.128e-09, 8.517e-07), (1.775e+01, 1.619e-08, 1.835e-06), (1.825e+01, 2.995e-08, 2.766e-06), (1.875e+01, 5.562e-08, 8.253e-06), (1.925e+01, 1.072e-07, 1.849e-05)])) Radar[:, 0] = 10**Radar[:, 0] * units.eV Radar[:, 1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) Radar[:, 1] /= 2 #halfdecade bins Radar[:, 1] *= energyBinsPerDecade Radar[:, 2] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) Radar[:, 2] /= 2 #halfdecade bins Radar[:, 2] *= energyBinsPerDecade # -------------------------------------------------------------------- # Published data and limits # IceCube # log (E^2 * Phi [GeV cm^02 s^-1 sr^-1]) : log (E [Gev]) # Phys Rev D 98 062003 (2018) # Numbers private correspondence Shigeru Yoshida ice_cube_limit = np.array(([ (6.199999125, -7.698484687), (6.299999496, -8.162876678), (6.400000617, -8.11395291), (6.500000321, -8.063634144), (6.599999814, -8.004841781), (6.699999798, -7.944960162), (6.799999763, -7.924197388), (6.899999872, -7.899315263), (7.299999496, -7.730561153), (7.699999798, -7.670680637), (8.100001583, -7.683379711), (8.500000321, -7.748746801), (8.899999872, -7.703060304), (9.299999496, -7.512907553), (9.699999798, -7.370926525), (10.10000158, -7.134626026), (10.50000032, -6.926516638), (10.89999987, -6.576523031) ])) ice_cube_limit[:, 0] = 10**ice_cube_limit[:, 0] * units.GeV ice_cube_limit[:, 1] = 10**ice_cube_limit[:, 1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_limit[:, 1] *= energyBinsPerDecade # Fig. 2 from PoS ICRC2017 (2018) 981 # IceCube preliminary # E (GeV); E^2 dN/dE (GeV cm^-2 s-1 sr-1); yerror down; yerror up # HESE 6 years # ice_cube_hese = np.array(([ # # (6.526e+04, 2.248e-08, 9.96e-9, 1.123e-8), # (1.409e+05, 2.692e-08, 5.91e-9, 7.56e-9), # (3.041e+05, 7.631e-09, 3.746e-9, 4.61e-9), # (6.644e+05, 2.022e-09, 7.03e-10, 0.), # (1.434e+06, 5.205e-09, 3.183e-9, 4.57e-9), # (3.096e+06, 4.347e-09, 3.142e-9, 5.428e-9), # (6.684e+06, 1.544e-09, 5.37e-10, 0.), # (1.46e+07, 4.063e-09, 1.353e-9, 0.), # (3.153e+07, 6.093e-09, 2.03e-9, 0.), # (6.806e+07, 1.046e-08, 3.641e-9, 0.) # ])) # ice_cube_hese[:, 0] = ice_cube_hese[:, 0] * units.GeV # ice_cube_hese[:, 1] = ice_cube_hese[:, 1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # ice_cube_hese[:, 1] *= 3 # ice_cube_hese[:, 2] = ice_cube_hese[:, 2] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # ice_cube_hese[:, 2] *= 3 # ice_cube_hese[:, 3] = ice_cube_hese[:, 3] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) # ice_cube_hese[:, 3] *= 3 # HESE 8 years #log(E (GeV)); log(E^2 dN/dE (GeV cm^-2 s-1 sr-1)); format x y -dy +dy ice_cube_hese = np.array(([ (4.78516, -7.63256, 0.223256, 0.167442), (5.10938, -7.66977, 0.139535, 0.102326), (5.42969, -8.36744, 0.930233, 0.297674), (5.75391, -8.51628, 0.2, 0. ), (6.07813, -8.38605, 0.604651, 0.288372), (6.39844, -8.35814, 0.455814, 0.334884), (6.72266, -9.0, 0.2 , 0) ])) # get uncertainties in right order ice_cube_hese[:, 2] = 10**ice_cube_hese[:, 1] - 10**(ice_cube_hese[:, 1]-ice_cube_hese[:, 2]) ice_cube_hese[:, 3] = 10**(ice_cube_hese[:, 1]+ice_cube_hese[:, 3]) - 10**ice_cube_hese[:, 1] ice_cube_hese[:, 0] = 10**ice_cube_hese[:, 0] * units.GeV ice_cube_hese[:, 1] = 10**ice_cube_hese[:, 1] * (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:, 1] *= 3 ice_cube_hese[:, 2] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:, 2] *= 3 ice_cube_hese[:, 3] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ice_cube_hese[:, 3] *= 3 # Ice cube def ice_cube_nu_fit(energy, slope=-2.19, offset=1.01): # ApJ slope=-2.13, offset=0.9 flux = 3 * offset * (energy / (100 * units.TeV))**slope * 1e-18 * \ (units.GeV**-1 * units.cm**-2 * units.second**-1 * units.sr**-1) return flux def get_ice_cube_mu_range(): energy = np.arange(1e5, 5e6, 1e5) * units.GeV # upper = np.maximum(ice_cube_nu_fit(energy, offset=0.9, slope=-2.), ice_cube_nu_fit(energy, offset=1.2, slope=-2.13)) # APJ upper = np.maximum(ice_cube_nu_fit(energy, offset=1.01, slope=-2.09), ice_cube_nu_fit(energy, offset=1.27, slope=-2.19),ice_cube_nu_fit(energy, offset=1.27, slope=-2.09)) # ICRC upper *= energy**2 # lower = np.minimum(ice_cube_nu_fit(energy, offset=0.9, slope=-2.26), # ice_cube_nu_fit(energy, offset=0.63, slope=-2.13)) #ApJ lower = np.minimum(ice_cube_nu_fit(energy, offset=1.01, slope=-2.29), ice_cube_nu_fit(energy, offset=0.78, slope=-2.19)) #ICRC lower *= energy**2 return energy, upper, lower def get_ice_cube_hese_range(): energy = np.arange(1e5, 5e6, 1e5) * units.GeV upper = np.maximum(ice_cube_nu_fit(energy, offset=2.46, slope=-2.63), ice_cube_nu_fit(energy, offset=2.76, slope=-2.92)) upper *= energy**2 lower = np.minimum(ice_cube_nu_fit(energy, offset=2.46, slope=-3.25), ice_cube_nu_fit(energy, offset=2.16, slope=-2.92)) lower *= energy**2 return energy, upper, lower # ANITA I - III # Phys. Rev. D 98, 022001 (2018) anita_limit = np.array(([ (9.94e17, 3.79e-14 * 9.94e17 / 1e9), (2.37e18, 2.15e-15 * 2.37e18 / 1e9), (5.19e18, 2.33e-16 * 5.19e18 / 1e9), (1.10e19, 3.64e-17 * 1.10e19 / 1e9), (3.55e19, 4.45e-18 * 3.55e19 / 1e9), (1.11e20, 9.22e-19 * 1.11e20 / 1e9), (4.18e20, 2.97e-19 * 4.18e20 / 1e9), (9.70e20, 1.62e-19 * 9.70e20 / 1e9) ])) anita_limit[:, 0] *= units.eV anita_limit[:, 1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) anita_limit[:, 1] /= 2 anita_limit[:, 1] *= energyBinsPerDecade # Auger neutrino limit # Auger 9 years, all flavour (x3) auger_limit = np.array(([ (16.7523809524, 4.462265901e-07), (17.2523809524, 1.103901153e-07), (17.7523809524, 6.487559078e-08), (18.2380952381, 7.739545498e-08), (18.7523809524, 1.387743075e-07), (19.2571428571, 3.083827665e-07), (19.7523809524, 7.467202523e-07), (20.2476190476, 1.998499395e-06) ])) auger_limit[:, 0] = 10 ** auger_limit[:, 0] * units.eV auger_limit[:, 1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) auger_limit[:, 1] /= 2 # half-decade binning auger_limit[:, 1] *= energyBinsPerDecade # ARA Published 2sta x 1yr analysis level limit: ara_1year = np.array(( [9.80923e+15, 3.11547e+16, 9.79329e+16, 3.1057e+17, 9.75635e+17, 3.0924e+18, 9.80103e+18, 3.07732e+19, 9.75028e+19], [0.000166106, 1.24595e-05, 4.06271e-06, 2.04351e-06, 1.48811e-06, 1.42649e-06, 1.50393e-06, 2.10936e-06, 3.25384e-06] )) ara_1year = ara_1year.T ara_1year[:,0] *= units.eV ara_1year[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ara_1year[:,1] /= 2 #half-decade binning ara_1year[:,1] *= energyBinsPerDecade # Ongoing analysis 2sta x 4yr *trigger* level projected limit (analysis # level not fully defined yet) ara_4year = np.array(( [9.91245E+15,3.11814E+16,9.80021E+16,3.10745E+17,9.94099E+17,3.0936E+18,9.71449E+18,3.07805E+19,9.75192E+19], # [1.01518E+16,1.01357E+17,1.01748E+18,1.0234E+19,1.03113E+20], # [7.27626e-06,5.06909e-07,2.13658e-07,2.02468e-07,4.46012e-07] [5.35394e-06,1.24309e-06,4.20315e-07,2.24199e-07,1.61582e-07,1.50329e-07,1.63715e-07,2.24543e-07,3.36398e-07] )) ara_4year = ara_4year.T ara_4year[:,0] *= units.eV ara_4year[:,1] *= (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1) ara_4year[:,1] /= 2 #half-decade binning ara_4year[:,1] *= energyBinsPerDecade # get 10% proton flux def get_proton_10(energy): vanVliet_reas = np.loadtxt(os.path.join(os.path.dirname(__file__), "ReasonableNeutrinos1.txt")) E = vanVliet_reas[0, :] * plotUnitsEnergy f = vanVliet_reas[1, :] * plotUnitsFlux / E**2 from scipy.interpolate import interp1d getE = interp1d(E, f) return getE(energy) def get_E2_limit_figure(diffuse = True, show_ice_cube_EHE_limit=True, show_ice_cube_HESE_data=True, show_ice_cube_HESE_fit=True, show_ice_cube_mu=True, show_anita_I_III_limit=True, show_auger_limit=True, show_ara=True, show_neutrino_best_fit=True, show_neutrino_best_case=True, show_neutrino_worst_case=True, show_grand_10k=True, show_grand_200k=False, show_radar=False): # Limit E2 Plot # --------------------------------------------------------------------------- fig, ax = plt.subplots(1, 1, figsize=(7, 6)) # Neutrino Models # Version for a diffuse flux and for a source dominated flux if diffuse: Heinze_band = np.loadtxt(os.path.join(os.path.dirname(__file__), "talys_neu_bands.out")) best_fit, = ax.plot(Heinze_band[:, 0], Heinze_band[:, 1] * Heinze_band[:, 0]**2, c='k', label=r'Best fit UHECR, Heinze et al.', linestyle='-.') Heinze_evo = np.loadtxt(os.path.join(os.path.dirname(__file__), "talys_neu_evolutions.out")) best_fit_3s, = ax.plot(Heinze_evo[:, 0]*units.GeV/plotUnitsEnergy, Heinze_evo[:, 6] * Heinze_evo[:, 0] ** 2, color='0.5',label=r'Best fit UHECR + 3$\sigma$, Heinze et al.', linestyle='-.') vanVliet_max_1 = np.loadtxt(os.path.join(os.path.dirname(__file__), "MaxNeutrinos1.txt")) vanVliet_max_2 = np.loadtxt(os.path.join(os.path.dirname(__file__), "MaxNeutrinos2.txt")) vanVliet_reas = np.loadtxt(os.path.join(os.path.dirname(__file__), "ReasonableNeutrinos1.txt")) vanVliet_max = np.maximum(vanVliet_max_1[1, :], vanVliet_max_2[1, :]) prot10, = ax.plot(vanVliet_reas[0, :]*units.GeV/plotUnitsEnergy, vanVliet_reas[1, :], label=r'10% protons in UHECRs, van Vliet et al.', linestyle='--', color='k') prot = ax.fill_between(vanVliet_max_1[0,:]*units.GeV/plotUnitsEnergy,vanVliet_max,vanVliet_reas[1,:]/50,color='0.9',label=r'allowed from UHECRs, van Vliet et al.') first_legend = plt.legend(handles=[best_fit, best_fit_3s, prot10, prot], loc=4,fontsize=legendfontsize, handlelength=4) plt.gca().add_artist(first_legend) else: tde = np.loadtxt(os.path.join(os.path.dirname(__file__),"TDEneutrinos.txt")) ll_grb = np.loadtxt(os.path.join(os.path.dirname(__file__),"LLGRBneutrinos.txt")) pulsars = np.loadtxt(os.path.join(os.path.dirname(__file__),"Pulsar_Fang+_2014.txt")) clusters = np.loadtxt(os.path.join(os.path.dirname(__file__),"cluster_Fang_Murase_2018.txt")) # Fang & Metzger data_ns_merger = np.array(( [164178.9149064658, 6.801708660714134e-11], [336720.74740929523, 1.4132356758632395e-10], [835305.4165187279, 3.649486484772094e-10], [2160958.1870687287, 9.239856704429993e-10], [8002898.345863899, 3.085108101843864e-9], [20681309.183352273, 6.161686112812425e-9], [61887155.98482043, 1.0930162266889215e-8], [132044526.30261868, 1.3058095134564553e-8], [253159530.43095005, 1.0506528126116853e-8], [436411840.74101496, 6.5380862245683814e-9], [635712891.7663972, 3.910881690144994e-9], [944515747.1734984, 1.773891442500038e-9], [1211896737.260516, 9.059026812485584e-10], [1586152410.074502, 3.578063705414756e-10], [1948716060.6917415, 1.358461111073226e-10], [2344547243.608689, 5.26053655617631e-11])) data_ns_merger[:,0] *= units.GeV data_ns_merger[:,1] *= units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1 ns_merger, = ax.plot(data_ns_merger[:,0]/plotUnitsEnergy,data_ns_merger[:,1]/plotUnitsFlux,color='palevioletred',label='NS-NS merger, Fang & Metzger 1707.04263',linestyle=(0, (3, 5, 1, 5))) ax.fill_between(tde[:,0]*units.GeV/plotUnitsEnergy,tde[:,2]*3,tde[:,3]*3,color='thistle',alpha=0.5) p_tde, = ax.plot(tde[:,0]*units.GeV/plotUnitsEnergy,tde[:,1]*3,label="TDE, Biehl et al. (1711.03555)", color='darkmagenta', linestyle=':',zorder=1) ax.fill_between(ll_grb[:,0]*units.GeV/plotUnitsEnergy,ll_grb[:,2]*3,ll_grb[:,3]*3, color='0.8') p_ll_grb, = ax.plot(ll_grb[:,0]*units.GeV/plotUnitsEnergy,ll_grb[:,1]*3,label="LLGRB, Boncioli et al. (1808.07481)",linestyle='-.',c='k',zorder=1) p_pulsar = ax.fill_between(pulsars[:,0]*units.GeV/plotUnitsEnergy,pulsars[:,1],pulsars[:,2],label="Pulsar, Fang et al. (1311.2044)",color='wheat',alpha=0.5) p_cluster, = ax.plot(clusters[:,0]*units.GeV/plotUnitsEnergy,clusters[:,1],label="Clusters, Fang & Murase, (1704.00015)",color="olive",zorder=1,linestyle=(0, (5, 10))) first_legend = plt.legend(handles=[p_tde, p_ll_grb, p_pulsar,p_cluster,ns_merger], loc=3,fontsize=legendfontsize, handlelength=4) plt.gca().add_artist(first_legend) #----------------------------------------------------------------------- if show_grand_10k: ax.plot(GRAND_energy / plotUnitsEnergy, GRAND_10k / plotUnitsFlux, linestyle=":", color='saddlebrown') if energyBinsPerDecade == 2: ax.annotate('GRAND 10k', xy=(1e10, 1.1e-7), xycoords='data', horizontalalignment='left', color='saddlebrown', rotation=40,fontsize=legendfontsize) else: ax.annotate('GRAND 10k', xy=(5e9, 7e-8), xycoords='data', horizontalalignment='left', color='saddlebrown', rotation=40,fontsize=legendfontsize) if show_grand_200k: ax.plot(GRAND_energy / plotUnitsEnergy, GRAND_200k / plotUnitsFlux, linestyle=":", color='saddlebrown') ax.annotate('GRAND 200k', xy=(1e10, 6e-9), xycoords='data', horizontalalignment='left', color='saddlebrown', rotation=40,fontsize=legendfontsize) if show_radar: ax.fill_between(Radar[:, 0] / plotUnitsEnergy, Radar[:, 1] / plotUnitsFlux, Radar[:, 2] / plotUnitsFlux, facecolor='None', hatch='x', edgecolor='0.8') ax.annotate('Radar', xy=(1e9, 4.5e-8), xycoords='data', horizontalalignment='left', color='0.7', rotation=45,fontsize=legendfontsize) if show_ice_cube_EHE_limit: ax.plot(ice_cube_limit[:, 0] / plotUnitsEnergy, ice_cube_limit[:, 1] / plotUnitsFlux, color='dodgerblue') if energyBinsPerDecade == 2: ax.annotate('IceCube', xy=(0.7e7, 4e-8), xycoords='data', horizontalalignment='center', color='dodgerblue', rotation=0,fontsize=legendfontsize) else: ax.annotate('IceCube', xy=(4e6, 4e-8), xycoords='data', horizontalalignment='center', color='dodgerblue', rotation=0,fontsize=legendfontsize) if show_ice_cube_HESE_data: # data points uplimit = np.copy(ice_cube_hese[:, 3]) uplimit[np.where(ice_cube_hese[:, 3] == 0)] = 1 uplimit[np.where(ice_cube_hese[:, 3] != 0.)] = 0 ax.errorbar(ice_cube_hese[:, 0] / plotUnitsEnergy, ice_cube_hese[:, 1] / plotUnitsFlux, yerr=ice_cube_hese[:,2:].T / plotUnitsFlux, uplims=uplimit, color='dodgerblue', marker='o', ecolor='dodgerblue', linestyle='None',zorder=3) if show_ice_cube_HESE_fit: ice_cube_hese_range = get_ice_cube_hese_range() ax.fill_between(ice_cube_hese_range[0] / plotUnitsEnergy, ice_cube_hese_range[1] / plotUnitsFlux, ice_cube_hese_range[2] / plotUnitsFlux, hatch='//', edgecolor='dodgerblue', facecolor='azure',zorder=2) plt.plot(ice_cube_hese_range[0] / plotUnitsEnergy, ice_cube_nu_fit(ice_cube_hese_range[0], offset=2.46, slope=-2.92) * ice_cube_hese_range[0]**2 / plotUnitsFlux, color='dodgerblue') if show_ice_cube_mu: # mu fit ice_cube_mu_range = get_ice_cube_mu_range() ax.fill_between(ice_cube_mu_range[0] / plotUnitsEnergy, ice_cube_mu_range[1] / plotUnitsFlux, ice_cube_mu_range[2] / plotUnitsFlux, hatch='\\', edgecolor='dodgerblue', facecolor='azure',zorder=2) plt.plot(ice_cube_mu_range[0] / plotUnitsEnergy, ice_cube_nu_fit(ice_cube_mu_range[0], offset=1.01, slope=-2.19) * ice_cube_mu_range[0]**2 / plotUnitsFlux, color='dodgerblue') # Extrapolation energy_placeholder = np.array(([1e14,1e17]))*units.eV plt.plot(energy_placeholder / plotUnitsEnergy, ice_cube_nu_fit(energy_placeholder, offset=1.01, slope=-2.19) * energy_placeholder**2 / plotUnitsFlux, color='dodgerblue',linestyle=':') if show_anita_I_III_limit: ax.plot(anita_limit[:, 0] / plotUnitsEnergy, anita_limit[:, 1] / plotUnitsFlux, color='darkorange') if energyBinsPerDecade == 2: ax.annotate('ANITA I - III', xy=(7e9, 1e-6), xycoords='data', horizontalalignment='left', color='darkorange',fontsize=legendfontsize) else: ax.annotate('ANITA I - III', xy=(7e9, 5e-7), xycoords='data', horizontalalignment='left', color='darkorange',fontsize=legendfontsize) if show_auger_limit: ax.plot(auger_limit[:, 0] / plotUnitsEnergy, auger_limit[:, 1] / plotUnitsFlux, color='forestgreen') if energyBinsPerDecade == 2: ax.annotate('Auger', xy=(1.1e8, 2.1e-7), xycoords='data', horizontalalignment='left', color='forestgreen', rotation=0,fontsize=legendfontsize) else: ax.annotate('Auger', xy=(2e8, 6e-8), xycoords='data', horizontalalignment='left', color='forestgreen', rotation=0,fontsize=legendfontsize) if show_ara: ax.plot(ara_1year[:,0]/plotUnitsEnergy,ara_1year[:,1]/ plotUnitsFlux,color='indigo') # ax.plot(ara_4year[:,0]/plotUnitsEnergy,ara_4year[:,1]/ plotUnitsFlux,color='indigo',linestyle='--') if energyBinsPerDecade == 2: ax.annotate('ARA', xy=(5e8, 6e-7), xycoords='data', horizontalalignment='left', color='indigo', rotation=0,fontsize=legendfontsize) else: ax.annotate('ARA', xy=(1e10, 1.05e-6), xycoords='data', horizontalalignment='left', color='indigo', rotation=0,fontsize=legendfontsize) ax.set_yscale('log') ax.set_xscale('log') ax.set_xlabel(r'neutrino energy [GeV]') ax.set_ylabel(r'$E^2\Phi$ [GeV cm$^{-2}$ s$^{-1}$ sr$^{-1}$]') if diffuse: ax.set_ylim(1e-11, 2e-6) ax.set_xlim(1e5, 1e11) else: ax.set_ylim(1e-11, 2e-6) ax.set_xlim(1e5, 1e11) plt.tight_layout() return fig, ax def add_limit(ax, limit_labels, E, Veff, n_stations, label, livetime=3*units.year, linestyle='-',color='r',linewidth=3,band=False): E = np.array(E) Veff = np.array(Veff) if band: limit_lower = fluxes.get_limit_e2_flux(energy = E, veff = Veff[0], livetime = livetime, signalEff = n_stations, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.44, nuCrsScn='ctw') limit_upper = fluxes.get_limit_e2_flux(energy = E, veff = Veff[1], livetime = livetime, signalEff = n_stations, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.44, nuCrsScn='ctw') plt1 = ax.fill_between(E/plotUnitsEnergy,limit_upper/ plotUnitsFlux, limit_lower/plotUnitsFlux,color=color,alpha=0.2) else: limit = fluxes.get_limit_e2_flux(energy = E, veff = Veff, livetime = livetime, signalEff = n_stations, energyBinsPerDecade=energyBinsPerDecade, upperLimOnEvents=2.44, nuCrsScn='ctw') print(E/plotUnitsEnergy,limit/ plotUnitsFlux) # _plt, = ax.plot(E/plotUnitsEnergy,limit/ plotUnitsFlux, linestyle=linestyle, color=color, # label="{2}: {0} stations, {1} years".format(n_stations,int(livetime/units.year),label), # linewidth=linewidth) _plt, = ax.plot(E/plotUnitsEnergy,limit/ plotUnitsFlux, linestyle=linestyle, color=color, label="{1}: {0} years".format(int(livetime/units.year),label), linewidth=linewidth) limit_labels.append(_plt) return limit_labels if __name__=="__main__": # 50 meter veff = np.array(( [1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19], [0.007467602898257461, 0.06986834193426224, 0.5333379226865426, 2.1410489793474383, 5.896654567671568, 11.343574036186226, 18.415350759353128, 27.81614390854279] )).T veff[:,0] *= units.eV veff[:,1] *= units.km**3 * units.sr veff_label = 'One current design' # strawman_veff_pa = np.array(( [1.00000000e+16, 3.16227766e+16, 1.00000000e+17, 3.16227766e+17, 1.00000000e+18, 3.16227766e+18, 1.00000000e+19, 3.16227766e+19], # [1.82805666e+07, 1.34497197e+08, 6.32044851e+08, 2.20387046e+09, 4.86050340e+09, 8.18585201e+09, 1.25636305e+10, 1.83360237e+10])).T # # strawman_veff_pa[:,0] *= units.eV # strawman_veff_pa[:,1] *= units.m**3 * units.sr # strawman_pa_label = 'Strawman + PA@15m@2s' # strawman_pa_label = 'One current design' fig, ax = get_E2_limit_figure(diffuse=DIFFUSE) labels =[] labels = add_limit(ax, labels, veff[:,0],veff[:,1], n_stations = 100, livetime=5*units.year, label= veff_label) labels = add_limit(ax, labels, veff[:,0],veff[:,1], n_stations = 1000, livetime=5*units.year, label= veff_label) plt.legend(handles=labels, loc=2) if DIFFUSE: name_plot = "Limit_diffuse.pdf" else: name_plot = "Limit_sources.pdf" plt.savefig(name_plot) plt.show() PKmND""2NuRadioMC/examples/Sensitivities/MaxNeutrinos1.txt# All-flavour neutrino flux for gamma = 1.0, Emax = 10^21 eV, m = 5.0 and 20% protons at Ecr = 10^19.6 eV # First line: E [GeV] # Second line: E^2 dN/dE [GeV cm-2 s-1 sr-1] # Read in and plot: # E,J = numpy.loadtxt('MaxNeutrinos1.txt') # plot(E, J) 1.122018454301963036e-02 1.412537544622752793e-02 1.778279410038919109e-02 2.238721138568333310e-02 2.818382931264443517e-02 3.548133892335739170e-02 4.466835921509607760e-02 5.623413251903457144e-02 7.079457843841330256e-02 8.912509381337387071e-02 1.122018454301956236e-01 1.412537544622738117e-01 1.778279410038908215e-01 2.238721138568310620e-01 2.818382931264426516e-01 3.548133892335702533e-01 4.466835921509580420e-01 5.623413251903399690e-01 7.079457843841286957e-01 8.912509381337294645e-01 1.122018454301946910e+00 1.412537544622726848e+00 1.778279410038893893e+00 2.238721138568292357e+00 2.818382931264403091e+00 3.548133892335673334e+00 4.466835921509543894e+00 5.623413251903353505e+00 7.079457843841228559e+00 8.912509381337221370e+00 1.122018454301937673e+01 1.412537544622715124e+01 1.778279410038879149e+01 2.238721138568273616e+01 2.818382931264380176e+01 3.548133892335644646e+01 4.466835921509507301e+01 5.623413251903306787e+01 7.079457843841171893e+01 8.912509381337149250e+01 1.122018454301928614e+02 1.412537544622703649e+02 1.778279410038864796e+02 2.238721138568255355e+02 2.818382931264357012e+02 3.548133892335615656e+02 4.466835921509470495e+02 5.623413251903260743e+02 7.079457843841113345e+02 8.912509381337076775e+02 1.122018454301919519e+03 1.412537544622691939e+03 1.778279410038850301e+03 2.238721138568237166e+03 2.818382931264334275e+03 3.548133892335586552e+03 4.466835921509434229e+03 5.623413251903215496e+03 7.079457843841055364e+03 8.912509381337004015e+03 1.122018454301910242e+04 1.412537544622680434e+04 1.778279410038835704e+04 2.238721138568218885e+04 2.818382931264311264e+04 3.548133892335557175e+04 4.466835921509398031e+04 5.623413251903169294e+04 7.079457843840996793e+04 8.912509381336929800e+04 1.122018454301901220e+05 1.412537544622668938e+05 1.778279410038820934e+05 2.238721138568200404e+05 2.818382931264288491e+05 3.548133892335528508e+05 4.466835921509360778e+05 5.623413251903122291e+05 7.079457843840939458e+05 8.912509381336858496e+05 1.122018454301891848e+06 1.412537544622657355e+06 1.778279410038806498e+06 2.238721138568182010e+06 2.818382931264264975e+06 3.548133892335499171e+06 4.466835921509324573e+06 5.623413251903077587e+06 7.079457843840881251e+06 8.912509381336785853e+06 1.122018454301882721e+07 1.412537544622645713e+07 1.778279410038791969e+07 2.238721138568164036e+07 2.818382931264241785e+07 3.548133892335470021e+07 4.466835921509288251e+07 5.623413251903031021e+07 7.079457843840824068e+07 8.912509381336712837e+07 1.122018454301873446e+08 1.412537544622634053e+08 1.778279410038777292e+08 2.238721138568145633e+08 2.818382931264218688e+08 3.548133892335441709e+08 4.466835921509251595e+08 5.623413251902985573e+08 7.079457843840765953e+08 8.912509381336638927e+08 1.122018454301864386e+09 1.412537544622622490e+09 1.778279410038762808e+09 2.238721138568127155e+09 2.818382931264195919e+09 3.548133892335412502e+09 4.466835921509215355e+09 5.623413251902939796e+09 7.079457843840707779e+09 8.912509381336566925e+09 1.122018454301855278e+10 1.412537544622611046e+10 1.778279410038748169e+10 2.238721138568109131e+10 2.818382931264172745e+10 3.548133892335382843e+10 4.466835921509178162e+10 5.623413251902893066e+10 7.079457843840649414e+10 8.912509381336494446e+10 1.122018454301846008e+11 1.412537544622599487e+11 1.778279410038733521e+11 2.238721138568090515e+11 2.818382931264149780e+11 3.548133892335354004e+11 4.466835921509141846e+11 5.623413251902847900e+11 7.079457843840592041e+11 8.912509381336419678e+11 1.122018454301836670e+12 1.412537544622588135e+12 1.778279410038719238e+12 2.238721138568072266e+12 2.818382931264126953e+12 3.548133892335325195e+12 4.466835921509105469e+12 5.623413251902801758e+12 7.079457843840533203e+12 8.912509381336347656e+12 1.122018454301827539e+13 1.412537544622576562e+13 1.778279410038704688e+13 2.238721138568053906e+13 2.818382931264103516e+13 3.548133892335296094e+13 4.466835921509068750e+13 5.623413251902755469e+13 7.079457843840476562e+13 8.912509381336275000e+13 1.122018454301818594e+14 1.412537544622565000e+14 1.778279410038690000e+14 2.238721138568035938e+14 2.818382931264080625e+14 3.548133892335267500e+14 4.466835921509031875e+14 5.623413251902709375e+14 7.079457843840418750e+14 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.042713281400716380e-15 1.387195969585465186e-14 2.055016600721074712e-14 2.955934080454035626e-14 4.392169712897399437e-14 6.589864593527518031e-14 9.722168685763071985e-14 1.453446465363717718e-13 2.211066356662709716e-13 3.332222033039227686e-13 5.173779487218962863e-13 7.970746614195424000e-13 1.230585523293215751e-12 1.910911653350903538e-12 2.912948607963771843e-12 4.428721593637144015e-12 6.610933951503952326e-12 9.560670784718445594e-12 1.354147142022220122e-11 1.862582275637238807e-11 2.463578839312194178e-11 3.166099690110797038e-11 3.975756168535712425e-11 4.846944082872565822e-11 5.864979000866385808e-11 7.059151513390747515e-11 8.635051923698780138e-11 1.093672064340608896e-10 1.444179574963975550e-10 2.001642633541182906e-10 2.876557296186935406e-10 4.251344618639473623e-10 6.351629576034224938e-10 9.514311568500448275e-10 1.409639229871893491e-09 2.076794157377591520e-09 2.981359140822316404e-09 4.183795807154305665e-09 5.728711532860355560e-09 7.642992229677893904e-09 9.955837561750994232e-09 1.263557813244296757e-08 1.566906899860893537e-08 1.900984731532957460e-08 2.261767766121226951e-08 2.640438972106258551e-08 3.038906610789239946e-08 3.457207065935179001e-08 3.869808263210152633e-08 4.282142465357403630e-08 4.673155637555514072e-08 5.041329999602029430e-08 5.370998400130605603e-08 5.612559713713268502e-08 5.753814143822899659e-08 5.799009423966559873e-08 5.715123923130174871e-08 5.510025509112454789e-08 5.179909101363595862e-08 4.675386928626115471e-08 4.151941772874073967e-08 3.565541376781356215e-08 2.929885588043766016e-08 2.320716104133283116e-08 1.761708878914394602e-08 1.278221203301194080e-08 8.755563500334158412e-09 5.728062200793559904e-09 3.604392742784496741e-09 2.076735045489078146e-09 1.131280157953165082e-09 5.903138589063678977e-10 2.680267519628703340e-10 1.115580997394684823e-10 4.217049059496935926e-11 1.546724962434289279e-11 4.658817696895335110e-12 1.367564248571592278e-12 2.761061523776165405e-13 3.649441781713528701e-14 6.066835417390372224e-15 8.362572178054654932e-16 8.370976486275824582e-17 1.090186064437636045e-17 6.215319762646485085e-20 7.736107023594167041e-24 7.773170241798256793e-25 2.054092604653348796e-30 1.108974818631751885e-35 8.193282587571543858e-40 1.387509182731223313e-50 2.086284389134695460e-58 3.549603066553636413e-72 6.275853401813206252e-79 1.057171252083467268e-111 3.764401957719576687e-123 4.495085184631217267e-125 2.925083118630152726e-164 1.157840014734542556e-254 3.241472581571739417e-247 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 PKmN0|""2NuRadioMC/examples/Sensitivities/MaxNeutrinos2.txt# All-flavour neutrino flux for gamma = 2.5, Emax = 10^19.6 eV, m = 5.0 and 20% protons at Ecr = 10^19.6 eV # First line: E [GeV] # Second line: E^2 dN/dE [GeV cm-2 s-1 sr-1] # Read in and plot: # E,J = numpy.loadtxt('MaxNeutrinos2.txt') # plot(E, J) 1.122018454301963036e-02 1.412537544622752793e-02 1.778279410038919109e-02 2.238721138568333310e-02 2.818382931264443517e-02 3.548133892335739170e-02 4.466835921509607760e-02 5.623413251903457144e-02 7.079457843841330256e-02 8.912509381337387071e-02 1.122018454301956236e-01 1.412537544622738117e-01 1.778279410038908215e-01 2.238721138568310620e-01 2.818382931264426516e-01 3.548133892335702533e-01 4.466835921509580420e-01 5.623413251903399690e-01 7.079457843841286957e-01 8.912509381337294645e-01 1.122018454301946910e+00 1.412537544622726848e+00 1.778279410038893893e+00 2.238721138568292357e+00 2.818382931264403091e+00 3.548133892335673334e+00 4.466835921509543894e+00 5.623413251903353505e+00 7.079457843841228559e+00 8.912509381337221370e+00 1.122018454301937673e+01 1.412537544622715124e+01 1.778279410038879149e+01 2.238721138568273616e+01 2.818382931264380176e+01 3.548133892335644646e+01 4.466835921509507301e+01 5.623413251903306787e+01 7.079457843841171893e+01 8.912509381337149250e+01 1.122018454301928614e+02 1.412537544622703649e+02 1.778279410038864796e+02 2.238721138568255355e+02 2.818382931264357012e+02 3.548133892335615656e+02 4.466835921509470495e+02 5.623413251903260743e+02 7.079457843841113345e+02 8.912509381337076775e+02 1.122018454301919519e+03 1.412537544622691939e+03 1.778279410038850301e+03 2.238721138568237166e+03 2.818382931264334275e+03 3.548133892335586552e+03 4.466835921509434229e+03 5.623413251903215496e+03 7.079457843841055364e+03 8.912509381337004015e+03 1.122018454301910242e+04 1.412537544622680434e+04 1.778279410038835704e+04 2.238721138568218885e+04 2.818382931264311264e+04 3.548133892335557175e+04 4.466835921509398031e+04 5.623413251903169294e+04 7.079457843840996793e+04 8.912509381336929800e+04 1.122018454301901220e+05 1.412537544622668938e+05 1.778279410038820934e+05 2.238721138568200404e+05 2.818382931264288491e+05 3.548133892335528508e+05 4.466835921509360778e+05 5.623413251903122291e+05 7.079457843840939458e+05 8.912509381336858496e+05 1.122018454301891848e+06 1.412537544622657355e+06 1.778279410038806498e+06 2.238721138568182010e+06 2.818382931264264975e+06 3.548133892335499171e+06 4.466835921509324573e+06 5.623413251903077587e+06 7.079457843840881251e+06 8.912509381336785853e+06 1.122018454301882721e+07 1.412537544622645713e+07 1.778279410038791969e+07 2.238721138568164036e+07 2.818382931264241785e+07 3.548133892335470021e+07 4.466835921509288251e+07 5.623413251903031021e+07 7.079457843840824068e+07 8.912509381336712837e+07 1.122018454301873446e+08 1.412537544622634053e+08 1.778279410038777292e+08 2.238721138568145633e+08 2.818382931264218688e+08 3.548133892335441709e+08 4.466835921509251595e+08 5.623413251902985573e+08 7.079457843840765953e+08 8.912509381336638927e+08 1.122018454301864386e+09 1.412537544622622490e+09 1.778279410038762808e+09 2.238721138568127155e+09 2.818382931264195919e+09 3.548133892335412502e+09 4.466835921509215355e+09 5.623413251902939796e+09 7.079457843840707779e+09 8.912509381336566925e+09 1.122018454301855278e+10 1.412537544622611046e+10 1.778279410038748169e+10 2.238721138568109131e+10 2.818382931264172745e+10 3.548133892335382843e+10 4.466835921509178162e+10 5.623413251902893066e+10 7.079457843840649414e+10 8.912509381336494446e+10 1.122018454301846008e+11 1.412537544622599487e+11 1.778279410038733521e+11 2.238721138568090515e+11 2.818382931264149780e+11 3.548133892335354004e+11 4.466835921509141846e+11 5.623413251902847900e+11 7.079457843840592041e+11 8.912509381336419678e+11 1.122018454301836670e+12 1.412537544622588135e+12 1.778279410038719238e+12 2.238721138568072266e+12 2.818382931264126953e+12 3.548133892335325195e+12 4.466835921509105469e+12 5.623413251902801758e+12 7.079457843840533203e+12 8.912509381336347656e+12 1.122018454301827539e+13 1.412537544622576562e+13 1.778279410038704688e+13 2.238721138568053906e+13 2.818382931264103516e+13 3.548133892335296094e+13 4.466835921509068750e+13 5.623413251902755469e+13 7.079457843840476562e+13 8.912509381336275000e+13 1.122018454301818594e+14 1.412537544622565000e+14 1.778279410038690000e+14 2.238721138568035938e+14 2.818382931264080625e+14 3.548133892335267500e+14 4.466835921509031875e+14 5.623413251902709375e+14 7.079457843840418750e+14 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.789600507777953727e-11 3.425074677687048174e-11 3.856470290832725096e-11 4.034437060051335849e-11 4.438159611509317690e-11 5.230901466992912329e-11 6.622677397819860727e-11 9.609910594408384163e-11 1.247214610837502729e-10 1.690352232961966339e-10 3.017446741415838849e-10 4.278267037128287097e-10 7.442173090852739530e-10 1.102450923063887346e-09 1.609164239849360403e-09 2.315546345770476228e-09 3.319450998412610271e-09 4.366161794014032535e-09 5.293271739110868274e-09 6.065733451586584284e-09 6.454433705589188627e-09 6.324474168755409517e-09 6.349236608530585071e-09 6.206740597290641659e-09 5.578093756785447427e-09 4.631307490890327572e-09 4.133868647123316774e-09 3.556527449540112741e-09 2.971312606612189151e-09 2.834703147552731475e-09 2.722115928680980659e-09 2.992091640847409748e-09 3.579459957184781973e-09 4.457032942861875068e-09 5.558867507891880710e-09 6.876945758337060137e-09 8.398442277368486208e-09 9.964624240754099757e-09 1.133160165634977726e-08 1.227118959236649976e-08 1.289495751503514121e-08 1.282861518058582455e-08 1.222967336623313523e-08 1.113840585295099137e-08 9.617545259088873918e-09 7.927632835333647195e-09 6.313257347939302177e-09 4.765680324072305081e-09 3.388553660312201968e-09 2.300521606892880665e-09 1.488300318029174670e-09 9.023861064246288110e-10 5.282311752083542925e-10 2.861594788172370158e-10 1.470942286997576694e-10 6.918682580052507102e-11 3.173825487533701146e-11 1.264758546654479166e-11 4.963389039207519058e-12 1.584933003359912034e-12 4.885334565864800645e-13 1.434887050396057168e-13 3.249806356809790521e-14 7.893727855213071501e-15 1.640499543071679626e-15 1.959408355668127640e-16 1.779458064877696071e-17 2.601669858758770352e-18 9.576482677999587226e-20 9.006342166629801215e-22 6.280377127787483228e-23 1.088757685842163251e-25 3.059175254340111528e-28 1.609263123247923106e-30 2.043623505995828355e-35 3.844876290274494671e-38 8.100712140440925631e-47 3.689244516289132380e-55 1.874382245702075069e-69 3.418702489230632887e-83 2.156927871733531545e-103 7.740548822990614682e-117 6.240671776873415316e-134 1.706700773100883660e-155 1.052449361559898509e-213 1.324580589490485168e-315 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 PKmN2=NuRadioMC/examples/Sensitivities/NuRadioMC_20181113_Veff.json{ "shallow (no PA)": { "Veff": [ 3365929.558336489, 32863897.14398139, 231654149.47658473, 1091997135.7084377, 2941393200.699282, 5422616594.99084, 8678088138.812132, 12679590121.008402 ], "Veff_error": [ 375289.3583950204, 1466573.7345174046, 3896971.526084225, 12680792.032543559, 27749228.247950997, 47096521.2539835, 59579438.84576943, 86493018.30875146 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@15m@2s": { "Veff": [ 14425473.2442393, 110373571.29482897, 557065032.2532321, 1920988302.1002226, 4341721469.625079, 7474681798.979147, 11630660188.542105, 16987506159.805302 ], "Veff_error": [ 895135.595550965, 3293092.1394644766, 7407457.963857708, 20607483.17544803, 41307823.243624106, 67749750.1707743, 84511055.7310658, 122870774.99994528 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@15m@2s + 3x3s": { "Veff": [ 10605774.474215189, 85782099.34096052, 448396210.11210865, 1511771796.7910733, 3360032104.980638, 5770650330.055196, 9056512867.37562, 13277920433.266376 ], "Veff_error": [ 767529.3409035549, 2903151.3000628655, 6645799.170713985, 18281242.657551102, 36339006.02774212, 59528333.28715079, 74574757.13715726, 108629758.7116487 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@40m@2s": { "Veff": [ 19776608.56362181, 167377456.77065432, 848479740.7118105, 3001040065.3133693, 7137872819.538307, 12696521285.82679, 19633503594.43491, 28640751031.376877 ], "Veff_error": [ 1048092.7129112782, 4055270.394551736, 9141910.919206923, 25757190.533461954, 52964604.44838949, 88298579.30958374, 109801998.9625947, 159542350.0843558 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@40m@2s + 3x3s": { "Veff": [ 5839833.015649029, 82249691.17973404, 466100952.9030891, 1558807393.4167802, 3447435810.551306, 5871442961.556419, 9144002727.422457, 13400775185.821493 ], "Veff_error": [ 569539.7065768386, 2842748.720777285, 6775732.342346873, 18563455.544435907, 36808610.61019943, 60045956.401171215, 74934103.68438542, 109131153.25448495 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@50m@2s": { "Veff": [ 21976495.750112876, 182164239.91919523, 956588138.8130912, 3415967475.1438956, 8301605599.294565, 15147565238.352411, 23427201766.83896, 34352461776.98144 ], "Veff_error": [ 1104849.2223604787, 4230609.086092018, 9706859.47310892, 27480172.672690388, 57119234.53723021, 96445675.51034047, 119942073.49320795, 174728084.7462612 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@50m@2s + 3x3s": { "Veff": [ 13248878.496610384, 133710653.46492183, 807930197.4226847, 2951280406.3027625, 7262708466.302125, 13580326076.772707, 21436065865.02578, 31952754918.655807 ], "Veff_error": [ 857853.9419842301, 3624552.0470130374, 8920786.939062733, 25542760.49041752, 53425751.05421594, 91320113.45899563, 114731820.51813695, 168514756.8693087 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@90m@2s": { "Veff": [ 24880278.126693618, 236139775.93004233, 1338735557.47049, 4950196406.622714, 12711823836.118498, 25184520916.653793, 38857264832.27936, 62612424814.106186 ], "Veff_error": [ 1175577.8864541831, 4816769.987400451, 11483218.958331596, 33080632.840634212, 70681419.56306398, 124359277.5245963, 154471177.5023232, 235892452.45716712 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] }, "shallow + PA@90m@2s + 3x3s": { "Veff": [ 11009650.816962983, 143072229.7028657, 1053152478.6580735, 4124454305.017271, 10832664258.72787, 21935771812.39804, 34713229634.49739, 56531187795.90429 ], "Veff_error": [ 782006.8641894537, 3749289.7753803656, 10185019.708062159, 30195751.458612956, 65248265.60610542, 116061399.55374695, 146002016.50428295, 224144372.29570162 ], "energies": [ 1e+16, 3.162277660168379e+16, 1e+17, 3.1622776601683795e+17, 1e+18, 3.1622776601683794e+18, 1e+19, 3.162277660168379e+19 ] } }PKmNS""9NuRadioMC/examples/Sensitivities/ReasonableNeutrinos1.txt# All-flavour neutrino flux for gamma = 2.5, Emax = 10^20 eV, m = 3.4 and 10% protons at Ecr = 10^19.6 eV # First line: E [GeV] # Second line: E^2 dN/dE [GeV cm-2 s-1 sr-1] # Read in and plot: # E,J = numpy.loadtxt('ReasonableNeutrinos1.txt') # plot(E, J) 1.122018454301963036e-02 1.412537544622752793e-02 1.778279410038919109e-02 2.238721138568333310e-02 2.818382931264443517e-02 3.548133892335739170e-02 4.466835921509607760e-02 5.623413251903457144e-02 7.079457843841330256e-02 8.912509381337387071e-02 1.122018454301956236e-01 1.412537544622738117e-01 1.778279410038908215e-01 2.238721138568310620e-01 2.818382931264426516e-01 3.548133892335702533e-01 4.466835921509580420e-01 5.623413251903399690e-01 7.079457843841286957e-01 8.912509381337294645e-01 1.122018454301946910e+00 1.412537544622726848e+00 1.778279410038893893e+00 2.238721138568292357e+00 2.818382931264403091e+00 3.548133892335673334e+00 4.466835921509543894e+00 5.623413251903353505e+00 7.079457843841228559e+00 8.912509381337221370e+00 1.122018454301937673e+01 1.412537544622715124e+01 1.778279410038879149e+01 2.238721138568273616e+01 2.818382931264380176e+01 3.548133892335644646e+01 4.466835921509507301e+01 5.623413251903306787e+01 7.079457843841171893e+01 8.912509381337149250e+01 1.122018454301928614e+02 1.412537544622703649e+02 1.778279410038864796e+02 2.238721138568255355e+02 2.818382931264357012e+02 3.548133892335615656e+02 4.466835921509470495e+02 5.623413251903260743e+02 7.079457843841113345e+02 8.912509381337076775e+02 1.122018454301919519e+03 1.412537544622691939e+03 1.778279410038850301e+03 2.238721138568237166e+03 2.818382931264334275e+03 3.548133892335586552e+03 4.466835921509434229e+03 5.623413251903215496e+03 7.079457843841055364e+03 8.912509381337004015e+03 1.122018454301910242e+04 1.412537544622680434e+04 1.778279410038835704e+04 2.238721138568218885e+04 2.818382931264311264e+04 3.548133892335557175e+04 4.466835921509398031e+04 5.623413251903169294e+04 7.079457843840996793e+04 8.912509381336929800e+04 1.122018454301901220e+05 1.412537544622668938e+05 1.778279410038820934e+05 2.238721138568200404e+05 2.818382931264288491e+05 3.548133892335528508e+05 4.466835921509360778e+05 5.623413251903122291e+05 7.079457843840939458e+05 8.912509381336858496e+05 1.122018454301891848e+06 1.412537544622657355e+06 1.778279410038806498e+06 2.238721138568182010e+06 2.818382931264264975e+06 3.548133892335499171e+06 4.466835921509324573e+06 5.623413251903077587e+06 7.079457843840881251e+06 8.912509381336785853e+06 1.122018454301882721e+07 1.412537544622645713e+07 1.778279410038791969e+07 2.238721138568164036e+07 2.818382931264241785e+07 3.548133892335470021e+07 4.466835921509288251e+07 5.623413251903031021e+07 7.079457843840824068e+07 8.912509381336712837e+07 1.122018454301873446e+08 1.412537544622634053e+08 1.778279410038777292e+08 2.238721138568145633e+08 2.818382931264218688e+08 3.548133892335441709e+08 4.466835921509251595e+08 5.623413251902985573e+08 7.079457843840765953e+08 8.912509381336638927e+08 1.122018454301864386e+09 1.412537544622622490e+09 1.778279410038762808e+09 2.238721138568127155e+09 2.818382931264195919e+09 3.548133892335412502e+09 4.466835921509215355e+09 5.623413251902939796e+09 7.079457843840707779e+09 8.912509381336566925e+09 1.122018454301855278e+10 1.412537544622611046e+10 1.778279410038748169e+10 2.238721138568109131e+10 2.818382931264172745e+10 3.548133892335382843e+10 4.466835921509178162e+10 5.623413251902893066e+10 7.079457843840649414e+10 8.912509381336494446e+10 1.122018454301846008e+11 1.412537544622599487e+11 1.778279410038733521e+11 2.238721138568090515e+11 2.818382931264149780e+11 3.548133892335354004e+11 4.466835921509141846e+11 5.623413251902847900e+11 7.079457843840592041e+11 8.912509381336419678e+11 1.122018454301836670e+12 1.412537544622588135e+12 1.778279410038719238e+12 2.238721138568072266e+12 2.818382931264126953e+12 3.548133892335325195e+12 4.466835921509105469e+12 5.623413251902801758e+12 7.079457843840533203e+12 8.912509381336347656e+12 1.122018454301827539e+13 1.412537544622576562e+13 1.778279410038704688e+13 2.238721138568053906e+13 2.818382931264103516e+13 3.548133892335296094e+13 4.466835921509068750e+13 5.623413251902755469e+13 7.079457843840476562e+13 8.912509381336275000e+13 1.122018454301818594e+14 1.412537544622565000e+14 1.778279410038690000e+14 2.238721138568035938e+14 2.818382931264080625e+14 3.548133892335267500e+14 4.466835921509031875e+14 5.623413251902709375e+14 7.079457843840418750e+14 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.741653194556044069e-12 2.158702068621600670e-12 2.447268994728904799e-12 2.584272458552283012e-12 2.853902056450069830e-12 3.327168435990729158e-12 4.172712603503881120e-12 5.938481652703657704e-12 7.762773368485301575e-12 1.041355886496133090e-11 1.828923827517445710e-11 2.582897495341690296e-11 4.471295946504938866e-11 6.611517999536620833e-11 9.727058594099343890e-11 1.405046163650436788e-10 2.014880976877018575e-10 2.672504317867431431e-10 3.286682977374635241e-10 3.814006504211717233e-10 4.139453520741057747e-10 4.138547606821842577e-10 4.232163656819923224e-10 4.231494798333531347e-10 3.870123835712287286e-10 3.390184752317760217e-10 3.109943365662647888e-10 2.776664700822567275e-10 2.448185469272280188e-10 2.419738411437960241e-10 2.394887824588709481e-10 2.677105935978830694e-10 3.249759138210736008e-10 4.106536948722148567e-10 5.230454365765723339e-10 6.623599803431255710e-10 8.307759385257467113e-10 1.017035728643683570e-09 1.204896307450004157e-09 1.367818679549549751e-09 1.513248358901216138e-09 1.603535784859713443e-09 1.646005819303414846e-09 1.628051807247976074e-09 1.551264082147519746e-09 1.428449909174768614e-09 1.282827451462876584e-09 1.111897073289777567e-09 9.269140113768132130e-10 7.468648939266765272e-10 5.803832200763698516e-10 4.329875276194628392e-10 3.147213469378862925e-10 2.179712184934935655e-10 1.454275489234573421e-10 9.253223495220467084e-11 5.662859985748022696e-11 3.273458024557679929e-11 1.804397344294491302e-11 9.063845530471715578e-12 4.477012690553499326e-12 2.079927213614225624e-12 8.711200053721534960e-13 3.357850771448404133e-13 1.263991845520676232e-13 3.780415586569203543e-14 1.042912273096391984e-14 2.462494022137368896e-15 5.323542841223054486e-16 6.966895548091299940e-17 1.129466165720364652e-17 7.170117130147022742e-19 4.418430587098184385e-20 3.302899144290462401e-21 2.528970162908517875e-23 2.332369256147077104e-24 5.584746512769211734e-28 2.396056999631039610e-31 4.433228382940093735e-37 1.520470506029526906e-42 6.805050061579286605e-51 4.561466664947315116e-56 4.687509629132631084e-63 9.841208518124890522e-72 4.347180070929435989e-95 6.514845572893557248e-136 1.136195090411420748e-146 4.646941473417237801e-209 2.442702527249242792e-256 2.039826147412975109e-298 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 PKmN,NuRadioMC/examples/Sensitivities/__init__.pyPKmNŧ3NuRadioMC/examples/Sensitivities/makeMyLimitPlot.pyimport numpy as np from matplotlib import pyplot as plt from NuRadioMC.utilities import fluxes from NuRadioMC.examples.Sensitivities import E2_fluxes2 as limit from NuRadioMC.utilities import units import json # import latest Veff from NuRadioMC with open("NuRadioMC_20181113_Veff.json", 'r') as fin: data = json.load(fin) # producen nice outreach plot fig, ax = limit.get_E2_limit_figure() labels = [] labels = limit.add_limit(ax, labels, data['shallow + PA@15m@2s']['energies'], data['shallow + PA@15m@2s']['Veff'], 200, 'GIANT', fmt='-C1') labels = limit.add_limit(ax, labels, data['shallow + PA@15m@2s']['energies'], data['shallow + PA@15m@2s']['Veff'], 2000, 'GIANT', fmt='-C3') plt.legend(handles=labels, loc=2) ax.set_title("raw triggered volumes") fig.tight_layout() fig.savefig("limits_outreach.pdf") fig, ax = limit.get_E2_limit_figure() labels = [] labels = limit.add_limit(ax, labels, data['shallow + PA@15m@2s']['energies'], data['shallow + PA@15m@2s']['Veff'], 270, 'shallow + PA@15m', fmt='-C0') labels = limit.add_limit(ax, labels, data['shallow + PA@50m@2s']['energies'], data['shallow + PA@50m@2s']['Veff'], 130, 'shallow + deep 60m', fmt='--C0') labels = limit.add_limit(ax, labels, data['shallow + PA@15m@2s']['energies'], data['shallow + PA@15m@2s']['Veff'], 110, 'shallow + PA@15m', fmt='-C1') labels = limit.add_limit(ax, labels, data['shallow + PA@50m@2s']['energies'], data['shallow + PA@50m@2s']['Veff'], 55, 'shallow + deep 60m', fmt='--C1') plt.legend(handles=labels, loc=2) ax.set_title("raw triggered volumes") fig.tight_layout() fig.savefig("limits_shallow_deep60m_raw.pdf") fig, ax = limit.get_E2_limit_figure() labels = [] labels = limit.add_limit(ax, labels, data['shallow + PA@15m@2s + 3x3s']['energies'], data['shallow + PA@15m@2s + 3x3s']['Veff'], 270, 'shallow + PA@15m', fmt='-C0') labels = limit.add_limit(ax, labels, data['shallow + PA@50m@2s + 3x3s']['energies'], data['shallow + PA@50m@2s + 3x3s']['Veff'], 130, 'shallow + deep 60m', fmt='--C0') labels = limit.add_limit(ax, labels, data['shallow + PA@15m@2s + 3x3s']['energies'], data['shallow + PA@15m@2s + 3x3s']['Veff'], 110, 'shallow + PA@15m', fmt='-C1') labels = limit.add_limit(ax, labels, data['shallow + PA@50m@2s + 3x3s']['energies'], data['shallow + PA@50m@2s + 3x3s']['Veff'], 55, 'shallow + deep 60m', fmt='--C1') plt.legend(handles=labels, loc=2) ax.set_title("with 3x 3sigma cut") fig.tight_layout() fig.savefig("limits_shallow_deep60m_reco.pdf") ## calculate number of neutrinos from icecube (nu mu) flux def print_N_neutrinos(trigger_name, n_stations): print("{} for 3 years and {} stations with 100% uptime".format(trigger_name, n_stations)) E = np.array(data[trigger_name]['energies']) Nnu = fluxes.get_number_of_events_for_flux(E, limit.ice_cube_nu_fit(E), data[trigger_name]['Veff'], 3 * units.year * n_stations) print("{:>10}: {}".format("energy [eV]", "N_nu")) for iE in range(len(E)): print("{:>10.1g}: {:.1f}".format(E[iE], Nnu[iE])) print("--------------------") print("{:>10}: {:.1f}".format("total", np.sum(Nnu))) print("number of neutrinos for icecube (numu) flux") print_N_neutrinos('shallow + PA@15m@2s', 270) print_N_neutrinos('shallow + PA@15m@2s', 110) print_N_neutrinos('shallow + PA@50m@2s', 130) print_N_neutrinos('shallow + PA@50m@2s', 55) plt.show() PKmN4NuRadioMC/examples/Sensitivities/talys_neu_bands.out# # by column: # energy [GeV], # best fit flux, # 1 sigma lower/upper limit, # 2 sigma lower/upper limit, # 3 sigma lower/upper limit # all fluxes in [GeV^-1 cm^-1 s^-1 sr^-1] # 1.037393e+03 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.114977e+03 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.198362e+03 5.884864e-25 5.862617e-26 2.928146e-24 3.218425e-27 1.422211e-23 2.127381e-27 1.055485e-21 1.287984e+03 6.169444e-25 7.518014e-26 2.956074e-24 3.811356e-27 1.417767e-23 2.518046e-27 1.046919e-21 1.384308e+03 6.468323e-25 9.700650e-26 2.984288e-24 4.513524e-27 1.413340e-23 2.980452e-27 1.038422e-21 1.487836e+03 6.782232e-25 1.258398e-25 3.012791e-24 5.345051e-27 1.408928e-23 3.527773e-27 1.029995e-21 1.599107e+03 7.386791e-25 1.613674e-25 3.158482e-24 5.955084e-26 1.447266e-23 4.195402e-26 1.020363e-21 1.718699e+03 8.558454e-25 2.018144e-25 3.521148e-24 8.134696e-26 1.561233e-23 5.661100e-26 1.008763e-21 1.847235e+03 9.916350e-25 2.524495e-25 3.925530e-24 1.111955e-25 1.684193e-23 7.642633e-26 9.972959e-22 1.985384e+03 1.149015e-24 3.158513e-25 4.376435e-24 1.511129e-25 1.816857e-23 1.032305e-25 9.859593e-22 2.133864e+03 1.320946e-24 3.912079e-25 4.836320e-24 1.971148e-25 1.943508e-23 1.366495e-25 9.706008e-22 2.293449e+03 1.499975e-24 4.723862e-25 5.271016e-24 2.491109e-25 2.051615e-23 1.751994e-25 9.490986e-22 2.464969e+03 1.703402e-24 5.699357e-25 5.744916e-24 3.150109e-25 2.165756e-23 2.247818e-25 9.280731e-22 2.649316e+03 1.934567e-24 6.878289e-25 6.261567e-24 3.985634e-25 2.286268e-23 2.885812e-25 9.075138e-22 2.847450e+03 2.154428e-24 7.904489e-25 6.769258e-24 4.650491e-25 2.401158e-23 3.409311e-25 8.839228e-22 3.060402e+03 2.329021e-24 8.433487e-25 7.228355e-24 4.798797e-25 2.502366e-23 3.550284e-25 8.558384e-22 3.289279e+03 2.517796e-24 8.998183e-25 7.718673e-24 4.952497e-25 2.607856e-23 3.647607e-25 8.286467e-22 3.535274e+03 2.721907e-24 9.600998e-25 8.242340e-24 5.111773e-25 2.717812e-23 3.690900e-25 8.023195e-22 3.799666e+03 2.903882e-24 9.674709e-25 8.753766e-24 2.680929e-26 2.821124e-23 2.151763e-26 7.736615e-22 4.083831e+03 3.039112e-24 8.830244e-25 9.223551e-24 2.868043e-26 2.911407e-23 2.241298e-26 7.416090e-22 4.389247e+03 3.180910e-24 8.081338e-25 9.718576e-24 3.072993e-26 3.004592e-23 2.334925e-26 7.108852e-22 4.717505e+03 3.329618e-24 7.419482e-25 1.024020e-23 3.295309e-26 3.100773e-23 2.432799e-26 6.814352e-22 5.070313e+03 3.592663e-24 7.870299e-25 1.085502e-23 3.972157e-26 3.196709e-23 2.876438e-26 6.504144e-22 5.449505e+03 4.044301e-24 1.017958e-24 1.160418e-23 5.638011e-26 3.290817e-23 4.058987e-26 6.170966e-22 5.857056e+03 4.552751e-24 1.316937e-24 1.240514e-23 8.006725e-26 3.387714e-23 5.727896e-26 5.854872e-22 6.295087e+03 5.125167e-24 1.704094e-24 1.326147e-23 1.138120e-25 3.487483e-23 8.083257e-26 5.554985e-22 6.765876e+03 5.897022e-24 2.246863e-24 1.434521e-23 1.179530e-24 3.592415e-23 7.165018e-25 5.247168e-22 7.271874e+03 6.989617e-24 3.015214e-24 1.576174e-23 1.759761e-24 3.703599e-23 1.179192e-24 4.926915e-22 7.815715e+03 8.287465e-24 4.052782e-24 1.731946e-23 2.611153e-24 3.818263e-23 1.839955e-24 4.626230e-22 8.400227e+03 9.829450e-24 5.455063e-24 1.903253e-23 3.886186e-24 3.938018e-23 2.792513e-24 4.343917e-22 9.028453e+03 1.133090e-23 6.843563e-24 2.071239e-23 5.011466e-24 4.070936e-23 3.425799e-24 4.060876e-22 9.703663e+03 1.258459e-23 7.793520e-24 2.225647e-23 5.664815e-24 4.197436e-23 3.902993e-24 3.774603e-22 1.042937e+04 1.397836e-23 8.823202e-24 2.391660e-23 6.402797e-24 4.327921e-23 4.444134e-24 3.508533e-22 1.120935e+04 1.552793e-23 9.936395e-24 2.570156e-23 7.238048e-24 4.462518e-23 5.035326e-24 3.261240e-22 1.204766e+04 1.662760e-23 1.065753e-23 2.717449e-23 7.734886e-24 4.588279e-23 5.440677e-24 3.019077e-22 1.294867e+04 1.700678e-23 1.073931e-23 2.815365e-23 7.704840e-24 4.700861e-23 5.530563e-24 2.780722e-22 1.391705e+04 1.739706e-23 1.067378e-23 2.916912e-23 7.617271e-24 4.816237e-23 5.587610e-24 2.561206e-22 1.495787e+04 1.779894e-23 1.053230e-23 3.022231e-23 7.346946e-24 4.934478e-23 5.646186e-24 2.359038e-22 1.607652e+04 1.874495e-23 1.083989e-23 3.187827e-23 7.428292e-24 5.102779e-23 5.936116e-24 2.166011e-22 1.727883e+04 2.044105e-23 1.173845e-23 3.435614e-23 8.037050e-24 5.341587e-23 6.351506e-24 1.981264e-22 1.857106e+04 2.229439e-23 1.272018e-23 3.702773e-23 8.706337e-24 5.628227e-23 6.755902e-24 1.812291e-22 1.995993e+04 2.432008e-23 1.379433e-23 3.990831e-23 9.444402e-24 5.930275e-23 7.197853e-24 1.657744e-22 2.145267e+04 2.850334e-23 1.675852e-23 4.497795e-23 1.176853e-23 6.411663e-23 8.893269e-24 1.519697e-22 2.305704e+04 3.631218e-23 2.322898e-23 5.339415e-23 1.721973e-23 7.142950e-23 1.292559e-23 1.392417e-22 2.478141e+04 4.628002e-23 3.190400e-23 6.341542e-23 2.499733e-23 7.958298e-23 1.425247e-23 1.284138e-22 2.663473e+04 5.900743e-23 4.204526e-23 7.738422e-23 3.311929e-23 9.125868e-23 1.406591e-23 1.186560e-22 2.862666e+04 7.444313e-23 5.434888e-23 9.431514e-23 4.088360e-23 1.116533e-22 1.399632e-23 1.305916e-22 3.076755e+04 9.280647e-23 6.874250e-23 1.147958e-22 5.017939e-23 1.360288e-22 1.405565e-23 1.513601e-22 3.306856e+04 1.157376e-22 8.690978e-23 1.433223e-22 6.160110e-23 1.657820e-22 1.411545e-23 1.797244e-22 3.554165e+04 1.443786e-22 1.072085e-22 1.798559e-22 7.434059e-23 2.021066e-22 1.417573e-23 2.194389e-22 3.819970e+04 1.739230e-22 1.275428e-22 2.181572e-22 8.598323e-23 2.391568e-22 1.438087e-23 2.598067e-22 4.105653e+04 2.017394e-22 1.470832e-22 2.545818e-22 9.612538e-23 2.778669e-22 1.474885e-23 2.989450e-22 4.412702e+04 2.340243e-22 1.695572e-22 2.971140e-22 1.065918e-22 3.240576e-22 1.512674e-23 3.485260e-22 4.742714e+04 2.714978e-22 1.942852e-22 3.467807e-22 1.182071e-22 3.779574e-22 1.551481e-23 4.082502e-22 5.097406e+04 3.061102e-22 2.171637e-22 3.925624e-22 1.291720e-22 4.274641e-22 1.602791e-23 4.629530e-22 5.478625e+04 3.350432e-22 2.365536e-22 4.304818e-22 1.390078e-22 4.682315e-22 1.668245e-23 5.075862e-22 5.888354e+04 3.667177e-22 2.576801e-22 4.720718e-22 1.495973e-22 5.128951e-22 1.736448e-23 5.565299e-22 6.328725e+04 4.013939e-22 2.806990e-22 5.176881e-22 1.609986e-22 5.626087e-22 1.798767e-23 6.102009e-22 6.802031e+04 4.307791e-22 3.001733e-22 5.563391e-22 1.707571e-22 6.050106e-22 1.857548e-23 6.554834e-22 7.310733e+04 4.532880e-22 3.151122e-22 5.858861e-22 1.779741e-22 6.373613e-22 1.922933e-23 6.898373e-22 7.857479e+04 4.769748e-22 3.307963e-22 6.170040e-22 1.854982e-22 6.714432e-22 1.990707e-23 7.259932e-22 8.445115e+04 5.019012e-22 3.472628e-22 6.497763e-22 1.933427e-22 7.073490e-22 2.060959e-23 7.640457e-22 9.076698e+04 5.212758e-22 3.598464e-22 6.754813e-22 1.992343e-22 7.355396e-22 2.127586e-23 7.938108e-22 9.755516e+04 5.346202e-22 3.682457e-22 6.934846e-22 2.030597e-22 7.553139e-22 2.190291e-23 8.145633e-22 1.048510e+05 5.483065e-22 3.768415e-22 7.119680e-22 2.069593e-22 7.756201e-22 2.254912e-23 8.358585e-22 1.126925e+05 5.623437e-22 3.856385e-22 7.309443e-22 2.109346e-22 7.964724e-22 2.321508e-23 8.577106e-22 1.211204e+05 5.711806e-22 3.907626e-22 7.433535e-22 2.129441e-22 8.100505e-22 2.374234e-23 8.718051e-22 1.301786e+05 5.749577e-22 3.923374e-22 7.493499e-22 2.130742e-22 8.165238e-22 2.413186e-23 8.783358e-22 1.399142e+05 5.787597e-22 3.939187e-22 7.553947e-22 2.132047e-22 8.230488e-22 2.390125e-23 8.849156e-22 1.503780e+05 5.825870e-22 3.955065e-22 7.614883e-22 2.133355e-22 8.296260e-22 2.340986e-23 8.915446e-22 1.616243e+05 5.810522e-22 3.934492e-22 7.606082e-22 2.115901e-22 8.283997e-22 2.288211e-23 8.898149e-22 1.737116e+05 5.747520e-22 3.881783e-22 7.535024e-22 2.082064e-22 8.202138e-22 2.232549e-23 8.809328e-22 1.867030e+05 5.685206e-22 3.829782e-22 7.464637e-22 2.048770e-22 8.123221e-22 2.178326e-23 8.730420e-22 2.006659e+05 5.623571e-22 3.778480e-22 7.394913e-22 2.016010e-22 8.054320e-22 2.125503e-23 8.661975e-22 2.156730e+05 5.504951e-22 3.689911e-22 7.249022e-22 1.965221e-22 7.910161e-22 2.065386e-23 8.512473e-22 2.318025e+05 5.340620e-22 3.571748e-22 7.041687e-22 1.900245e-22 7.706289e-22 1.999794e-23 8.295462e-22 2.491383e+05 5.181216e-22 3.457382e-22 6.840314e-22 1.837422e-22 7.513596e-22 1.936332e-23 8.088931e-22 2.677706e+05 5.026590e-22 3.346690e-22 6.650143e-22 1.776682e-22 7.325754e-22 1.874927e-23 7.891898e-22 2.877963e+05 4.819373e-22 3.202110e-22 6.391458e-22 1.699826e-22 7.058520e-22 1.805330e-23 7.608878e-22 3.093196e+05 4.575628e-22 3.034339e-22 6.082647e-22 1.612027e-22 6.734456e-22 1.730237e-23 7.264080e-22 3.324527e+05 4.344268e-22 2.875393e-22 5.788838e-22 1.528779e-22 6.425357e-22 1.658294e-23 6.934998e-22 3.573157e+05 4.124664e-22 2.724810e-22 5.509300e-22 1.449844e-22 6.130530e-22 1.589368e-23 6.620914e-22 3.840383e+05 3.867459e-22 2.549770e-22 5.179011e-22 1.358921e-22 5.778374e-22 1.513300e-23 6.244795e-22 4.127593e+05 3.590188e-22 2.362049e-22 4.820765e-22 1.261786e-22 5.393626e-22 1.433291e-23 5.833152e-22 4.436282e+05 3.332907e-22 2.188219e-22 4.487449e-22 1.171625e-22 5.034654e-22 1.351796e-23 5.448811e-22 4.768057e+05 3.094170e-22 2.027250e-22 4.177324e-22 1.087938e-22 4.699727e-22 1.269512e-23 5.089958e-22 5.124645e+05 2.837347e-22 1.854175e-22 3.842812e-22 9.976765e-23 4.335516e-22 1.183137e-23 4.699948e-22 5.507901e+05 2.577299e-22 1.679224e-22 3.503012e-22 9.061487e-23 3.963323e-22 1.096160e-23 4.306666e-22 5.919819e+05 2.341244e-22 1.520887e-22 3.193467e-22 8.230685e-23 3.623304e-22 1.015622e-23 3.946521e-22 6.362544e+05 2.126963e-22 1.377582e-22 2.911477e-22 7.476548e-23 3.312671e-22 9.410483e-24 3.616714e-22 6.838378e+05 1.909622e-22 1.232142e-22 2.624837e-22 6.705246e-23 2.993899e-22 8.643662e-24 3.280405e-22 7.349799e+05 1.699618e-22 1.091846e-22 2.346934e-22 5.957028e-23 2.682820e-22 7.888234e-24 2.969287e-22 7.899467e+05 1.512905e-22 9.676615e-23 2.098706e-22 5.292993e-23 2.404337e-22 7.199419e-24 2.687914e-22 8.490243e+05 1.346894e-22 8.577324e-23 1.876976e-22 4.703647e-23 2.155026e-22 6.571332e-24 2.433436e-22 9.125201e+05 1.184523e-22 7.505317e-23 1.658950e-22 4.125990e-23 1.907227e-22 5.942958e-24 2.177851e-22 9.807646e+05 1.032770e-22 6.507723e-23 1.454055e-22 3.586252e-23 1.672850e-22 5.339670e-24 1.933282e-22 1.054113e+06 9.006947e-23 5.644381e-23 1.274765e-22 3.117981e-23 1.472273e-22 4.798356e-24 1.716472e-22 1.132947e+06 7.857371e-23 4.897167e-23 1.117871e-22 2.711684e-23 1.299401e-22 4.312631e-24 1.524259e-22 1.217676e+06 6.755587e-23 4.187369e-23 9.660392e-23 2.326652e-23 1.130046e-22 3.838899e-24 1.333671e-22 1.308742e+06 5.752031e-23 3.545785e-23 8.266599e-23 1.978337e-23 9.730448e-23 3.395039e-24 1.160964e-22 1.406619e+06 4.900466e-23 3.004522e-23 7.077633e-23 1.683195e-23 8.382306e-23 3.003367e-24 1.010969e-22 1.511815e+06 4.177763e-23 2.547818e-23 6.063253e-23 1.433072e-23 7.254894e-23 2.657717e-24 8.806865e-23 1.624879e+06 3.497413e-23 2.123553e-23 5.096626e-23 1.202623e-23 6.188844e-23 2.328445e-24 7.531242e-23 1.746399e+06 2.894935e-23 1.751254e-23 4.233440e-23 1.000297e-23 5.218403e-23 2.027007e-24 6.364635e-23 1.877006e+06 2.399918e-23 1.446707e-23 3.521265e-23 8.332098e-24 4.404117e-23 1.765569e-24 5.383382e-23 2.017382e+06 1.993045e-23 1.197480e-23 2.933482e-23 6.951775e-24 3.720699e-23 1.472525e-24 4.557848e-23 2.168255e+06 1.621384e-23 9.730146e-24 2.390054e-23 5.715574e-24 3.074049e-23 1.202712e-24 3.771882e-23 2.330412e+06 1.304645e-23 7.831666e-24 1.923736e-23 4.663409e-24 2.507225e-23 9.748162e-25 3.080263e-23 2.504696e+06 1.054304e-23 6.332979e-24 1.554490e-23 3.798917e-24 2.050113e-23 7.924692e-25 2.521595e-23 2.692014e+06 8.562332e-24 5.148569e-24 1.261825e-23 3.089470e-24 1.681244e-23 6.464493e-25 2.070041e-23 2.893342e+06 6.845700e-24 4.134219e-24 1.005488e-23 2.487995e-24 1.348718e-23 5.229115e-25 1.660901e-23 3.109725e+06 5.452447e-24 3.313663e-24 7.966729e-24 2.002680e-24 1.071554e-23 4.220894e-25 1.318984e-23 3.342292e+06 4.391500e-24 2.686118e-24 6.380478e-24 1.629973e-24 8.575791e-24 3.429046e-25 1.054905e-23 3.592251e+06 3.581034e-24 2.204618e-24 5.171848e-24 1.342814e-24 6.920670e-24 2.805921e-25 8.505612e-24 3.860904e+06 2.936728e-24 1.823793e-24 4.203703e-24 1.116093e-24 5.535262e-24 2.297060e-25 6.788611e-24 4.149649e+06 2.437845e-24 1.527816e-24 3.455364e-24 9.392324e-25 4.442746e-24 1.890669e-25 5.433309e-24 4.459988e+06 2.059690e-24 1.300963e-24 2.893531e-24 8.025738e-25 3.624735e-24 1.573083e-25 4.420110e-24 4.793536e+06 1.770650e-24 1.125690e-24 2.468163e-24 6.923925e-25 3.008640e-24 1.323778e-25 3.658277e-24 5.152030e+06 1.566472e-24 1.000415e-24 2.169087e-24 6.027717e-25 2.549333e-24 1.128495e-25 3.089342e-24 5.537333e+06 1.410251e-24 9.034983e-25 1.942227e-24 5.320634e-25 2.199995e-24 9.732344e-26 2.657136e-24 5.951453e+06 1.280712e-24 8.224105e-25 1.756313e-24 4.745033e-25 1.952805e-24 8.338573e-26 2.322132e-24 6.396543e+06 1.172282e-24 7.539795e-25 1.602375e-24 4.272236e-25 1.766506e-24 7.204736e-26 2.059435e-24 6.874920e+06 1.093795e-24 7.033371e-25 1.493532e-24 3.921452e-25 1.638166e-24 6.377836e-26 1.880425e-24 7.389074e+06 1.029486e-24 6.613283e-25 1.405599e-24 3.633663e-25 1.536367e-24 5.724100e-26 1.741105e-24 7.941679e+06 9.700172e-25 6.225033e-25 1.324397e-24 3.375580e-25 1.444042e-24 5.168370e-26 1.617781e-24 8.535612e+06 9.149331e-25 5.865625e-25 1.249276e-24 3.143265e-25 1.367012e-24 4.573209e-26 1.508058e-24 9.173963e+06 8.647985e-25 5.537113e-25 1.181665e-24 2.944940e-25 1.296121e-24 4.114907e-26 1.419456e-24 9.860054e+06 8.181198e-25 5.230831e-25 1.119026e-24 2.766533e-25 1.229688e-24 3.747955e-26 1.342546e-24 1.059746e+07 7.740667e-25 4.942210e-25 1.059848e-24 2.599732e-25 1.166779e-24 3.403094e-26 1.273903e-24 1.139001e+07 7.324842e-25 4.670181e-25 1.003931e-24 2.443716e-25 1.107200e-24 3.089719e-26 1.208897e-24 1.224183e+07 6.897897e-25 4.391980e-25 9.464574e-25 2.290060e-25 1.045368e-24 2.844493e-26 1.141486e-24 1.315736e+07 6.480163e-25 4.120442e-25 8.901623e-25 2.142706e-25 9.845095e-25 2.634685e-26 1.075154e-24 1.414135e+07 6.088113e-25 3.865930e-25 8.372689e-25 2.004977e-25 9.272486e-25 2.441863e-26 1.012739e-24 1.519894e+07 5.720139e-25 3.627361e-25 7.875678e-25 1.876234e-25 8.733686e-25 2.204263e-26 9.540066e-25 1.633562e+07 5.336339e-25 3.379384e-25 7.356237e-25 1.744439e-25 8.168257e-25 2.001107e-26 8.924792e-25 1.755731e+07 4.961417e-25 3.137667e-25 6.848022e-25 1.616890e-25 7.613698e-25 1.822094e-26 8.324015e-25 1.887036e+07 4.613058e-25 2.913368e-25 6.375240e-25 1.498731e-25 7.097130e-25 1.659735e-26 7.767915e-25 2.028162e+07 4.289361e-25 2.705220e-25 5.935394e-25 1.389266e-25 6.615923e-25 1.512409e-26 7.255871e-25 2.179842e+07 3.953491e-25 2.489956e-25 5.477968e-25 1.277319e-25 6.113588e-25 1.377065e-26 6.722866e-25 2.342865e+07 3.629274e-25 2.282597e-25 5.035658e-25 1.170001e-25 5.626777e-25 1.253323e-26 6.205961e-25 2.518080e+07 3.331778e-25 2.092581e-25 4.629262e-25 1.071736e-25 5.178947e-25 1.140795e-26 5.729105e-25 2.706400e+07 3.058789e-25 1.918449e-25 4.255845e-25 9.817569e-26 4.766954e-25 1.038455e-26 5.289164e-25 2.908803e+07 2.778626e-25 1.740360e-25 3.871625e-25 8.906295e-26 4.341519e-25 9.413909e-27 4.834766e-25 3.126343e+07 2.512423e-25 1.571502e-25 3.505868e-25 8.045145e-26 3.935708e-25 8.518605e-27 4.400195e-25 3.360152e+07 2.271808e-25 1.419074e-25 3.174793e-25 7.267485e-26 3.567969e-25 7.708852e-27 4.004871e-25 3.611447e+07 2.054312e-25 1.281472e-25 2.875099e-25 6.565196e-26 3.234717e-25 6.952103e-27 3.645230e-25 3.881535e+07 1.834527e-25 1.142927e-25 2.571374e-25 5.863798e-26 2.895767e-25 6.204345e-27 3.280525e-25 4.171823e+07 1.629658e-25 1.014049e-25 2.287697e-25 5.212374e-26 2.578605e-25 5.524368e-27 2.939239e-25 4.483821e+07 1.447728e-25 8.997371e-26 2.035407e-25 4.633470e-26 2.298085e-25 4.919151e-27 2.633586e-25 4.819151e+07 1.286162e-25 7.983405e-26 1.811021e-25 4.118993e-26 2.050875e-25 4.380449e-27 2.359832e-25 5.179560e+07 1.126329e-25 6.983850e-26 1.588361e-25 3.614668e-26 1.804611e-25 3.876946e-27 2.086367e-25 5.566923e+07 9.806872e-26 6.074703e-26 1.385060e-25 3.155672e-26 1.578950e-25 3.422967e-27 1.834695e-25 5.983255e+07 8.539238e-26 5.284159e-26 1.207849e-25 2.755067e-26 1.381585e-25 3.022309e-27 1.613471e-25 6.430724e+07 7.435855e-26 4.596713e-26 1.053371e-25 2.405412e-26 1.208959e-25 2.668690e-27 1.419001e-25 6.911657e+07 6.373897e-26 3.936982e-26 9.042629e-26 2.070640e-26 1.041590e-25 2.340364e-27 1.229728e-25 7.428558e+07 5.430756e-26 3.351894e-26 7.715846e-26 1.772814e-26 8.920685e-26 2.047094e-27 1.059711e-25 7.984116e+07 4.627488e-26 2.853933e-26 6.584213e-26 1.517898e-26 7.640654e-26 1.790679e-27 9.132610e-26 8.581223e+07 3.943301e-26 2.430097e-26 5.618953e-26 1.299699e-26 6.544757e-26 1.566473e-27 7.871032e-26 9.222985e+07 3.304990e-26 2.035446e-26 4.716212e-26 1.096312e-26 5.514954e-26 1.359791e-27 6.679898e-26 9.912743e+07 2.753279e-26 1.694671e-26 3.934585e-26 9.196965e-27 4.634712e-26 1.177077e-27 5.637198e-26 1.065409e+08 2.293854e-26 1.411053e-26 3.282781e-26 7.715784e-27 3.907883e-26 1.018981e-27 4.757635e-26 1.145087e+08 1.911247e-26 1.174987e-26 2.739189e-26 6.473523e-27 3.295293e-26 8.821765e-28 4.015625e-26 1.230724e+08 1.565247e-26 9.617475e-27 2.246598e-26 5.346930e-27 2.734744e-26 7.570706e-28 3.335866e-26 1.322766e+08 1.274234e-26 7.825184e-27 1.831609e-26 4.392401e-27 2.257006e-26 6.477424e-28 2.755917e-26 1.421692e+08 1.037428e-26 6.367470e-27 1.493430e-26 3.608533e-27 1.862898e-26 5.542448e-28 2.277008e-26 1.528016e+08 8.447121e-27 5.181767e-27 1.217815e-26 2.964765e-27 1.537749e-26 4.742790e-28 1.881499e-26 1.642291e+08 6.754173e-27 4.140936e-27 9.752237e-27 2.396061e-27 1.248193e-26 4.018049e-28 1.528849e-26 1.765113e+08 5.368277e-27 3.289381e-27 7.763061e-27 1.925933e-27 1.007564e-26 3.358510e-28 1.235457e-26 1.897120e+08 4.267286e-27 2.613241e-27 6.180431e-27 1.548194e-27 8.134217e-27 2.799965e-28 9.984904e-27 2.039000e+08 3.392519e-27 2.076319e-27 4.921088e-27 1.244658e-27 6.567663e-27 2.281895e-28 8.070738e-27 2.191490e+08 2.644265e-27 1.617437e-27 3.841557e-27 9.815605e-28 5.205675e-27 1.814022e-28 6.404076e-27 2.355384e+08 2.048359e-27 1.252208e-27 2.980388e-27 7.604555e-28 4.102425e-27 1.433461e-28 5.052420e-27 2.531536e+08 1.587007e-27 9.695977e-28 2.312675e-27 5.892380e-28 3.233528e-27 1.132869e-28 3.986726e-27 2.720862e+08 1.229767e-27 7.508819e-28 1.794864e-27 4.566330e-28 2.549084e-27 8.954152e-29 3.146348e-27 2.924346e+08 9.317987e-28 5.686920e-28 1.361867e-27 3.460878e-28 1.967085e-27 6.930239e-29 2.430489e-27 3.143049e+08 7.013698e-28 4.278807e-28 1.026474e-27 2.605824e-28 1.508474e-27 5.330514e-29 1.865726e-27 3.378107e+08 5.280429e-28 3.220008e-28 7.767368e-28 1.962391e-28 1.157060e-27 4.100759e-29 1.432548e-27 3.630745e+08 3.976373e-28 2.423698e-28 5.920385e-28 1.478109e-28 8.877210e-28 3.155245e-29 1.100211e-27 3.902277e+08 2.916856e-28 1.777858e-28 4.400584e-28 1.085261e-28 6.639905e-28 2.371510e-29 8.236020e-28 4.194116e+08 2.124091e-28 1.294763e-28 3.248214e-28 7.911538e-29 4.931679e-28 1.770836e-29 6.121887e-28 4.507780e+08 1.547249e-28 9.431916e-29 2.398371e-28 5.768938e-29 3.664162e-28 1.322630e-29 4.560138e-28 4.844903e+08 1.127388e-28 6.872654e-29 1.771424e-28 4.207628e-29 2.723318e-28 9.881075e-30 3.399482e-28 5.207238e+08 7.962611e-29 4.858073e-29 1.269500e-28 2.978778e-29 1.963048e-28 7.187611e-30 2.480352e-28 5.596671e+08 5.577961e-29 3.366716e-29 9.026449e-29 2.092285e-29 1.403775e-28 5.191953e-30 1.800196e-28 6.015228e+08 3.908827e-29 2.333703e-29 6.420559e-29 1.470055e-29 1.004271e-28 3.751669e-30 1.308075e-28 6.465087e+08 2.740088e-29 1.618126e-29 4.568735e-29 1.030406e-29 7.187643e-29 2.711837e-30 9.508981e-29 6.948591e+08 1.850243e-29 1.079864e-29 3.134866e-29 6.891441e-30 4.959723e-29 1.900669e-30 6.672885e-29 7.468254e+08 1.237714e-29 7.137411e-30 2.131640e-29 4.565967e-30 3.436790e-29 1.322051e-30 4.642225e-29 8.026781e+08 8.282338e-30 4.718770e-30 1.450049e-29 3.026009e-30 2.382613e-29 9.199652e-31 3.231143e-29 8.627078e+08 5.543994e-30 3.120547e-30 9.867800e-30 2.005950e-30 1.652541e-29 6.404316e-31 2.258550e-29 9.272270e+08 3.546156e-30 1.970050e-30 6.425642e-30 1.271308e-30 1.098837e-29 4.299607e-31 1.530379e-29 9.965713e+08 2.243713e-30 1.229939e-30 4.140529e-30 7.970805e-31 7.234240e-30 2.862260e-31 1.027299e-29 1.071102e+09 1.419934e-30 7.680064e-31 2.668810e-30 4.998444e-31 4.764495e-30 1.906232e-31 6.899163e-30 1.151206e+09 8.987923e-31 4.796452e-31 1.720676e-30 3.135073e-31 3.139061e-30 1.270060e-31 4.635429e-30 1.237301e+09 5.376346e-31 2.826309e-31 1.050683e-30 1.859278e-31 1.964598e-30 8.102824e-32 2.967521e-30 1.329835e+09 3.174846e-31 1.643487e-31 6.336923e-31 1.066520e-31 1.215338e-30 5.119803e-32 1.879221e-30 1.429289e+09 1.874983e-31 9.557572e-32 3.822406e-31 6.036488e-32 7.519661e-31 3.236060e-32 1.190350e-30 1.536181e+09 1.107417e-31 5.545646e-32 2.305933e-31 3.415263e-32 4.653457e-31 1.899522e-32 7.541912e-31 1.651067e+09 6.083007e-32 2.977526e-32 1.298599e-31 1.772126e-32 2.701195e-31 1.003625e-32 4.503739e-31 1.774545e+09 3.290000e-32 1.572651e-32 7.206249e-32 9.028825e-33 1.546626e-31 5.211925e-33 2.655614e-31 1.907258e+09 1.779599e-32 8.307791e-33 3.999251e-32 4.601773e-33 8.935572e-32 2.577295e-33 1.566026e-31 2.049895e+09 9.627124e-33 4.389500e-33 2.225780e-32 2.346270e-33 5.268796e-32 1.260542e-33 9.235802e-32 2.203200e+09 4.731733e-33 2.081227e-33 1.137745e-32 1.052929e-33 2.895945e-32 5.322293e-34 5.957747e-32 2.367971e+09 2.282381e-33 9.660485e-34 5.717394e-33 4.607484e-34 1.569464e-32 2.182142e-34 3.927712e-32 2.545064e+09 1.101597e-33 4.487078e-34 2.874143e-33 2.017349e-34 8.543003e-33 8.950002e-35 2.590486e-32 2.735401e+09 5.320260e-34 2.085560e-34 1.445369e-33 8.838073e-35 4.679397e-33 3.672210e-35 1.709227e-32 2.939973e+09 2.290605e-34 8.900661e-35 6.450133e-34 4.061776e-35 2.352500e-33 1.854935e-35 1.076229e-32 3.159844e+09 9.670201e-35 3.777622e-35 2.816813e-34 1.890801e-35 1.164132e-33 9.797553e-36 6.718764e-33 3.396159e+09 4.090767e-35 1.618209e-35 1.231339e-34 8.650509e-36 5.762816e-34 4.115715e-36 4.195666e-33 3.650147e+09 1.733714e-35 6.982204e-36 5.388228e-35 3.899249e-36 2.853847e-34 1.674777e-36 2.620806e-33 3.923129e+09 8.484255e-36 3.093720e-36 2.494641e-35 1.141694e-36 1.248515e-34 0.000000e+00 1.550741e-33 4.216528e+09 4.266562e-36 1.404556e-36 1.169642e-35 4.431221e-37 5.345853e-35 0.000000e+00 9.090690e-34 4.531868e+09 2.150279e-36 6.495013e-37 5.572996e-36 1.707751e-37 2.289630e-35 0.000000e+00 5.330261e-34 4.870792e+09 1.085890e-36 3.049214e-37 2.688260e-36 6.480903e-38 9.809400e-36 0.000000e+00 3.126018e-34 5.235064e+09 8.415290e-38 2.706269e-38 1.264030e-36 0.000000e+00 4.595665e-36 0.000000e+00 1.717225e-34 5.626577e+09 5.232166e-38 2.089889e-38 6.865290e-37 0.000000e+00 2.310941e-36 0.000000e+00 9.334324e-35 6.047371e+09 3.452895e-38 1.613896e-38 3.753752e-37 0.000000e+00 1.601596e-36 0.000000e+00 5.074468e-35 6.499635e+09 2.321155e-38 1.156925e-38 2.063740e-37 0.000000e+00 1.115499e-36 0.000000e+00 2.769437e-35 6.985722e+09 1.694434e-38 0.000000e+00 3.089236e-38 0.000000e+00 2.443808e-37 0.000000e+00 1.381689e-35 7.508161e+09 1.252981e-38 0.000000e+00 2.380446e-38 0.000000e+00 7.164911e-38 0.000000e+00 6.800621e-36 8.069673e+09 9.283644e-39 0.000000e+00 1.834280e-38 0.000000e+00 2.765350e-38 0.000000e+00 3.347623e-36 8.673178e+09 6.901165e-39 0.000000e+00 1.413425e-38 0.000000e+00 2.125260e-38 0.000000e+00 1.648063e-36 9.321817e+09 3.262262e-39 0.000000e+00 5.884536e-39 0.000000e+00 8.466871e-39 0.000000e+00 7.039735e-37 1.001897e+10 3.050118e-39 0.000000e+00 5.602479e-39 0.000000e+00 8.182801e-39 0.000000e+00 2.949435e-37 1.076825e+10 2.851770e-39 0.000000e+00 5.333941e-39 0.000000e+00 7.908261e-39 0.000000e+00 1.236106e-37 1.157358e+10 2.666321e-39 0.000000e+00 5.078275e-39 0.000000e+00 7.642933e-39 0.000000e+00 5.182120e-38 1.243913e+10 4.452083e-39 0.000000e+00 8.519867e-39 0.000000e+00 1.281881e-38 0.000000e+00 1.804544e-38 1.336941e+10 2.448855e-39 0.000000e+00 4.822945e-39 0.000000e+00 7.236574e-39 0.000000e+00 9.211948e-39 1.436927e+10 1.371377e-39 0.000000e+00 2.779265e-39 0.000000e+00 4.160373e-39 0.000000e+00 5.290916e-39 1.544390e+10 7.794069e-40 0.000000e+00 1.625418e-39 0.000000e+00 2.428118e-39 0.000000e+00 3.084842e-39 1.659890e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.289148e-42 0.000000e+00 5.989303e-41 1.784028e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.209106e-43 0.000000e+00 3.505485e-41 1.917449e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.227439e-43 0.000000e+00 2.951278e-41 2.060849e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.328756e-43 0.000000e+00 3.180152e-41 2.214974e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.063707e-44 0.000000e+00 1.286540e-41 2.380624e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.006988e-44 0.000000e+00 6.544361e-42 2.558664e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.785643e-44 0.000000e+00 3.944440e-42 2.750018e+10 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.060371e-44 0.000000e+00 3.134670e-42 2.955683e+10 0.000000e+00 0.000000e+00 8.620130e-42 0.000000e+00 1.139542e-41 0.000000e+00 1.667920e-41 3.176729e+10 0.000000e+00 0.000000e+00 3.189545e-42 0.000000e+00 4.592372e-42 0.000000e+00 6.332851e-42 3.414307e+10 0.000000e+00 0.000000e+00 1.180168e-42 0.000000e+00 1.850733e-42 0.000000e+00 2.839474e-42 3.669652e+10 0.000000e+00 0.000000e+00 4.366754e-43 0.000000e+00 7.458486e-43 0.000000e+00 2.342977e-42 3.944093e+10 0.000000e+00 0.000000e+00 2.983225e-43 0.000000e+00 6.398264e-43 0.000000e+00 2.087318e-42 4.239059e+10 0.000000e+00 0.000000e+00 2.258849e-43 0.000000e+00 3.628603e-43 0.000000e+00 1.856002e-42 4.556085e+10 0.000000e+00 0.000000e+00 1.759969e-43 0.000000e+00 2.241261e-43 0.000000e+00 1.650893e-42 4.896820e+10 0.000000e+00 0.000000e+00 1.398374e-43 0.000000e+00 1.529410e-43 0.000000e+00 1.468958e-42 5.263038e+10 0.000000e+00 0.000000e+00 1.320199e-44 0.000000e+00 2.832632e-43 0.000000e+00 1.319087e-42 5.656644e+10 0.000000e+00 0.000000e+00 1.043742e-44 0.000000e+00 1.761635e-43 0.000000e+00 1.185270e-42 6.079686e+10 0.000000e+00 0.000000e+00 8.251758e-45 0.000000e+00 1.209456e-43 0.000000e+00 1.065040e-42 6.534366e+10 0.000000e+00 0.000000e+00 6.523790e-45 0.000000e+00 8.999315e-44 0.000000e+00 9.570171e-43 7.023051e+10 0.000000e+00 0.000000e+00 4.948979e-45 0.000000e+00 8.194423e-44 0.000000e+00 8.487897e-43 7.548282e+10 0.000000e+00 0.000000e+00 3.744997e-45 0.000000e+00 7.640785e-44 0.000000e+00 7.522138e-43 8.112794e+10 0.000000e+00 0.000000e+00 2.833919e-45 0.000000e+00 7.242031e-44 0.000000e+00 6.666303e-43 8.719524e+10 0.000000e+00 0.000000e+00 2.144487e-45 0.000000e+00 6.992804e-44 0.000000e+00 5.907876e-43 9.371630e+10 0.000000e+00 0.000000e+00 1.419494e-45 0.000000e+00 5.933133e-44 0.000000e+00 5.168153e-43 1.007250e+11 0.000000e+00 0.000000e+00 9.333455e-46 0.000000e+00 5.000206e-44 0.000000e+00 4.518143e-43 1.082579e+11 0.000000e+00 0.000000e+00 6.136934e-46 0.000000e+00 4.214963e-44 0.000000e+00 3.949906e-43 1.163542e+11 0.000000e+00 0.000000e+00 4.035157e-46 0.000000e+00 3.553871e-44 0.000000e+00 3.453154e-43 1.250560e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.006211e-44 0.000000e+00 2.971538e-43 1.344085e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.543270e-44 0.000000e+00 2.555499e-43 1.444605e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.151626e-44 0.000000e+00 2.197721e-43 1.552642e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.820297e-44 0.000000e+00 1.890043e-43 1.668760e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.521886e-44 0.000000e+00 1.594156e-43 1.793561e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.271958e-44 0.000000e+00 1.343817e-43 1.927695e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.063084e-44 0.000000e+00 1.132799e-43 2.071862e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.885202e-45 0.000000e+00 9.549232e-44 2.226810e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 7.303252e-45 0.000000e+00 7.848799e-44 2.393346e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.001002e-45 0.000000e+00 6.447937e-44 2.572336e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.931017e-45 0.000000e+00 5.297164e-44 2.764713e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.051860e-45 0.000000e+00 4.351822e-44 2.971477e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.235202e-45 0.000000e+00 3.458397e-44 3.193704e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.582437e-45 0.000000e+00 2.747483e-44 3.432551e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.061452e-45 0.000000e+00 2.182760e-44 3.689261e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.645629e-45 0.000000e+00 1.734156e-44 3.965169e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.248343e-45 0.000000e+00 1.318921e-44 4.261711e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 9.470074e-46 0.000000e+00 1.003103e-44 4.580431e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 7.184898e-46 0.000000e+00 7.629474e-45 4.922987e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.449016e-46 0.000000e+00 5.800726e-45 5.291162e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.879605e-46 0.000000e+00 4.182629e-45 5.686871e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.762809e-46 0.000000e+00 3.016134e-45 6.112174e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.967926e-46 0.000000e+00 2.175135e-45 6.569284e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.398836e-46 0.000000e+00 1.566745e-45 7.060579e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.728921e-47 0.000000e+00 1.048494e-45 7.588618e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.459545e-47 0.000000e+00 7.017665e-46 8.156146e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.422513e-47 0.000000e+00 4.697614e-46 8.766118e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.942015e-47 0.000000e+00 3.136835e-46 9.421709e+11 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.304807e-47 0.000000e+00 1.903243e-46 1.012633e+12 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.901507e-48 0.000000e+00 1.154935e-46 1.088364e+12 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.136513e-48 0.000000e+00 7.009402e-47 1.169760e+12 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.283309e-48 0.000000e+00 4.210018e-47 1.257242e+12 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.468918e-48 0.000000e+00 1.903699e-47 1.351267e+12 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.811097e-48 0.000000e+00 8.643643e-48 1.452324e+12 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.279453e-48 0.000000e+00 4.044277e-48 1.560939e+12 0.000000e+00 0.000000e+00 6.715493e-48 0.000000e+00 8.430991e-48 0.000000e+00 1.234184e-47 1.677677e+12 0.000000e+00 0.000000e+00 5.960662e-48 0.000000e+00 7.635932e-48 0.000000e+00 1.060976e-47 1.803145e+12 0.000000e+00 0.000000e+00 5.304983e-48 0.000000e+00 6.938629e-48 0.000000e+00 9.136210e-48 1.937996e+12 0.000000e+00 0.000000e+00 4.830861e-48 0.000000e+00 6.325331e-48 0.000000e+00 8.109941e-48 2.082933e+12 1.424656e-48 2.736277e-49 4.407890e-48 5.845684e-50 5.741714e-48 0.000000e+00 7.224995e-48 2.238709e+12 1.327594e-48 2.807335e-49 3.524053e-48 6.222345e-50 4.585964e-48 0.000000e+00 6.176423e-48 2.406135e+12 1.237541e-48 2.887702e-49 2.817569e-48 6.763878e-50 3.663117e-48 0.000000e+00 5.378783e-48 2.586082e+12 1.153968e-48 2.978265e-49 2.252824e-48 7.561436e-50 2.926189e-48 0.000000e+00 4.684468e-48 2.779487e+12 1.070547e-48 3.303815e-49 1.803049e-48 9.141942e-50 2.341423e-48 0.000000e+00 4.069238e-48 2.987356e+12 9.165793e-49 2.917463e-49 1.463289e-48 8.171906e-50 1.918496e-48 0.000000e+00 3.398877e-48 3.210770e+12 7.848827e-49 2.577777e-49 1.187627e-48 7.319929e-50 1.572081e-48 0.000000e+00 2.839105e-48 3.450894e+12 6.722172e-49 2.279026e-49 9.639559e-49 6.572041e-50 1.288316e-48 0.000000e+00 2.371651e-48 3.708975e+12 5.727097e-49 2.005361e-49 7.810827e-49 5.876744e-50 1.054034e-48 0.000000e+00 1.974051e-48 3.986358e+12 4.553969e-49 1.647747e-49 6.188542e-49 4.833397e-50 8.436224e-49 0.000000e+00 1.568267e-48 4.284485e+12 3.621696e-49 1.354052e-49 4.903422e-49 3.976293e-50 6.752455e-49 0.000000e+00 1.245964e-48 4.604907e+12 2.880713e-49 1.112828e-49 3.885346e-49 3.272038e-50 5.404994e-49 0.000000e+00 9.899537e-49 4.949294e+12 2.280433e-49 9.069933e-50 3.070704e-49 2.680208e-50 4.315887e-49 0.000000e+00 7.839088e-49 5.319436e+12 1.708430e-49 7.004106e-50 2.356395e-49 2.079321e-50 3.351616e-49 0.000000e+00 5.974306e-49 5.717259e+12 1.279984e-49 5.409327e-50 1.808342e-49 1.613271e-50 2.602914e-49 0.000000e+00 4.553222e-49 6.144835e+12 9.590444e-50 4.178069e-50 1.387829e-49 1.207575e-50 2.021560e-49 0.000000e+00 3.470242e-49 6.604388e+12 7.145603e-50 3.212532e-50 1.060277e-49 8.961958e-51 1.563550e-49 0.000000e+00 2.635485e-49 7.098309e+12 5.031399e-50 2.328633e-50 7.737814e-50 6.019776e-51 1.159733e-49 0.000000e+00 1.931520e-49 7.629169e+12 3.543007e-50 1.503962e-50 5.647540e-50 3.654747e-51 8.602712e-50 0.000000e+00 1.415657e-49 8.199730e+12 2.495104e-50 9.718435e-51 4.122328e-50 2.037548e-51 6.381809e-50 0.000000e+00 1.037618e-49 8.812962e+12 1.748246e-50 6.158152e-51 2.986775e-50 0.000000e+00 4.705123e-50 0.000000e+00 7.584240e-50 9.472055e+12 1.170025e-50 3.281770e-51 2.145479e-50 0.000000e+00 3.280218e-50 0.000000e+00 5.405500e-50 1.018044e+13 7.834939e-51 1.768920e-51 1.558573e-50 0.000000e+00 2.287124e-50 0.000000e+00 3.853210e-50 1.094180e+13 5.249550e-51 9.626762e-52 1.132255e-50 0.000000e+00 1.598497e-50 0.000000e+00 2.747086e-50 1.176010e+13 3.505416e-51 2.574460e-52 8.195665e-51 0.000000e+00 1.175146e-50 0.000000e+00 1.953679e-50 1.263961e+13 2.270274e-51 1.686068e-52 5.775267e-51 0.000000e+00 8.437733e-51 0.000000e+00 1.360498e-50 1.358488e+13 1.473676e-51 1.104822e-52 4.141552e-51 0.000000e+00 6.058798e-51 0.000000e+00 9.475734e-51 1.460085e+13 9.587490e-52 6.032224e-53 2.970405e-51 0.000000e+00 4.350846e-51 0.000000e+00 6.600829e-51 1.569280e+13 6.254105e-52 0.000000e+00 2.121335e-51 0.000000e+00 3.110428e-51 0.000000e+00 4.585841e-51 1.686642e+13 4.098561e-52 0.000000e+00 1.466168e-51 0.000000e+00 2.150204e-51 0.000000e+00 3.119641e-51 1.812780e+13 2.687944e-52 0.000000e+00 1.013383e-51 0.000000e+00 1.486441e-51 0.000000e+00 2.122273e-51 1.948352e+13 1.764108e-52 0.000000e+00 7.004528e-52 0.000000e+00 1.027601e-51 0.000000e+00 1.443806e-51 2.094063e+13 1.160014e-52 0.000000e+00 4.791793e-52 0.000000e+00 7.039400e-52 0.000000e+00 9.792070e-52 2.250672e+13 7.693803e-53 0.000000e+00 3.054586e-52 0.000000e+00 4.530794e-52 0.000000e+00 6.501813e-52 2.418992e+13 5.103720e-53 0.000000e+00 1.947239e-52 0.000000e+00 2.916290e-52 0.000000e+00 4.317270e-52 2.599901e+13 3.386108e-53 0.000000e+00 1.241362e-52 0.000000e+00 1.877175e-52 0.000000e+00 2.866808e-52 2.794339e+13 2.228035e-53 0.000000e+00 7.638385e-53 0.000000e+00 1.184993e-52 0.000000e+00 1.906522e-52 3.003319e+13 1.390731e-53 0.000000e+00 4.650561e-53 0.000000e+00 6.943464e-53 0.000000e+00 1.279707e-52 3.227928e+13 8.684216e-54 0.000000e+00 3.142630e-53 0.000000e+00 4.643535e-53 0.000000e+00 8.589771e-53 3.469334e+13 5.424787e-54 0.000000e+00 2.123684e-53 0.000000e+00 3.581199e-53 0.000000e+00 5.765735e-53 3.728795e+13 0.000000e+00 0.000000e+00 1.094797e-53 0.000000e+00 1.659101e-53 0.000000e+00 2.988333e-53 4.007659e+13 0.000000e+00 0.000000e+00 6.704833e-54 0.000000e+00 1.007500e-53 0.000000e+00 2.017053e-53 4.307379e+13 0.000000e+00 0.000000e+00 5.070430e-54 0.000000e+00 6.538319e-54 0.000000e+00 1.361858e-53 4.629514e+13 0.000000e+00 0.000000e+00 3.843253e-54 0.000000e+00 5.332167e-54 0.000000e+00 9.197565e-54 4.975741e+13 0.000000e+00 0.000000e+00 3.774462e-54 0.000000e+00 7.041856e-54 0.000000e+00 7.479482e-54 5.347861e+13 0.000000e+00 0.000000e+00 5.938035e-54 0.000000e+00 1.017762e-53 0.000000e+00 1.102366e-53 5.747810e+13 0.000000e+00 0.000000e+00 9.397572e-54 0.000000e+00 1.516255e-53 0.000000e+00 1.642960e-53 6.177671e+13 0.000000e+00 0.000000e+00 1.496924e-53 0.000000e+00 2.267046e-53 0.000000e+00 2.477612e-53 6.639679e+13 0.000000e+00 0.000000e+00 2.229836e-53 0.000000e+00 3.195547e-53 0.000000e+00 3.820784e-53 7.136240e+13 0.000000e+00 0.000000e+00 2.290479e-53 0.000000e+00 3.283988e-53 0.000000e+00 3.920910e-53 7.669936e+13 0.000000e+00 0.000000e+00 2.352773e-53 0.000000e+00 3.374877e-53 0.000000e+00 4.023668e-53 8.243546e+13 0.000000e+00 0.000000e+00 2.416763e-53 0.000000e+00 3.468283e-53 0.000000e+00 4.129127e-53 8.860055e+13 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 9.522670e+13 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.023484e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.100027e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.182295e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.270715e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.365747e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.467887e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.577666e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.695655e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.822467e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.958764e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.105253e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.262699e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.431919e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.613794e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.809271e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.019368e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.245177e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.487873e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.748720e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.029075e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.330396e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.654253e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.002330e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.376438e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.778525e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.210682e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.675159e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 7.174373e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 7.710922e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.287597e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.907400e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 9.573556e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.028953e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.105905e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.188612e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.277505e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.373045e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.475731e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.586096e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.704716e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.832206e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.969231e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.116503e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.274790e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.444914e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.627761e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.824283e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.035502e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.262518e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.506511e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.768752e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.050605e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.353537e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.679124e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.029060e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.405168e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 PKmN ϐ]9NuRadioMC/examples/Sensitivities/talys_neu_evolutions.out# # by column: # energy [GeV], # 3 sigma lower/upper limit for cutoff at z=1 # 3 sigma lower/upper limit for flat evo above z=1 # 3 sigma lower/upper limit for citoff at z=3 # all fluxes in [GeV^-1 cm^-1 s^-1 sr^-1] # 1.037393e+03 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.114977e+03 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.198362e+03 2.127381e-27 1.055485e-21 5.159375e-24 1.608639e-21 9.468964e-24 1.170266e-21 1.287984e+03 2.518046e-27 1.046919e-21 4.630819e-24 1.581709e-21 8.859337e-24 1.158756e-21 1.384308e+03 2.980452e-27 1.038422e-21 4.147349e-24 1.560626e-21 8.135995e-24 1.147360e-21 1.487836e+03 3.527773e-27 1.029995e-21 3.704238e-24 1.540176e-21 7.272824e-24 1.136077e-21 1.599107e+03 4.195402e-26 1.020363e-21 3.588258e-24 1.513609e-21 7.008871e-24 1.123081e-21 1.718699e+03 5.661100e-26 1.008763e-21 3.974842e-24 1.477310e-21 7.638180e-24 1.107295e-21 1.847235e+03 7.642633e-26 9.972959e-22 4.405984e-24 1.441883e-21 8.327293e-24 1.091732e-21 1.985384e+03 1.032305e-25 9.859593e-22 4.886915e-24 1.407307e-21 9.082001e-24 1.076388e-21 2.133864e+03 1.366495e-25 9.706008e-22 5.138406e-24 1.369828e-21 2.658478e-25 1.056998e-21 2.293449e+03 1.751994e-25 9.490986e-22 4.854815e-24 1.327957e-21 2.691094e-25 1.031420e-21 2.464969e+03 2.247818e-25 9.280731e-22 4.525488e-24 1.288738e-21 2.724113e-25 1.006461e-21 2.649316e+03 2.885812e-25 9.075138e-22 3.955646e-24 1.250678e-21 2.757540e-25 9.821067e-22 2.847450e+03 3.409311e-25 8.839228e-22 0.000000e+00 1.209948e-21 0.000000e+00 9.546893e-22 3.060402e+03 3.550284e-25 8.558384e-22 0.000000e+00 1.165019e-21 0.000000e+00 9.226986e-22 3.289279e+03 3.647607e-25 8.286467e-22 0.000000e+00 1.121760e-21 0.000000e+00 1.010719e-21 3.535274e+03 3.690900e-25 8.023195e-22 0.000000e+00 1.080108e-21 0.000000e+00 1.117098e-21 3.799666e+03 2.151763e-26 7.736615e-22 2.884041e-25 1.036726e-21 7.923392e-25 1.275495e-21 4.083831e+03 2.241298e-26 7.416090e-22 5.657349e-25 9.905300e-22 1.358073e-24 1.526929e-21 4.389247e+03 2.334925e-26 7.108852e-22 1.109748e-24 9.463938e-22 2.266946e-24 1.828194e-21 4.717505e+03 2.432799e-26 6.814352e-22 2.176887e-24 9.042257e-22 3.784071e-24 2.397201e-21 5.070313e+03 2.876438e-26 6.504144e-22 2.082558e-23 8.611309e-22 2.088683e-23 3.233920e-21 5.449505e+03 4.058987e-26 6.170966e-22 2.609954e-23 8.163644e-22 2.090237e-23 3.990510e-21 5.857056e+03 5.727896e-26 5.854872e-22 2.789455e-23 7.739269e-22 2.091797e-23 4.925376e-21 6.295087e+03 8.083257e-26 5.554985e-22 2.805849e-23 7.336973e-22 2.093365e-23 6.286885e-21 6.765876e+03 7.165018e-25 5.247168e-22 2.819179e-23 6.933133e-22 2.089584e-23 7.863590e-21 7.271874e+03 1.179192e-24 4.926915e-22 2.828294e-23 6.523032e-22 2.078634e-23 9.126145e-21 7.815715e+03 1.839955e-24 4.626230e-22 2.837465e-23 6.137208e-22 2.065787e-23 1.059365e-20 8.400227e+03 2.792513e-24 4.343917e-22 2.846696e-23 6.280531e-22 2.048628e-23 1.229984e-20 9.028453e+03 3.425799e-24 4.060876e-22 2.840123e-23 7.051011e-22 2.027989e-23 1.388000e-20 9.703663e+03 3.902993e-24 3.774603e-22 2.806005e-23 7.793947e-22 2.002910e-23 1.511342e-20 1.042937e+04 4.444134e-24 3.508533e-22 2.772321e-23 8.615672e-22 1.978150e-23 1.646237e-20 1.120935e+04 5.035326e-24 3.261240e-22 2.739066e-23 9.524589e-22 1.953706e-23 1.793271e-20 1.204766e+04 5.440677e-24 3.019077e-22 2.704191e-23 1.042847e-21 1.918218e-23 1.921657e-20 1.294867e+04 5.530563e-24 2.780722e-22 2.667264e-23 1.128107e-21 1.879512e-23 2.017353e-20 1.391705e+04 5.587610e-24 2.561206e-22 2.630867e-23 1.220372e-21 1.841598e-23 2.117840e-20 1.495787e+04 5.646186e-24 2.359038e-22 2.594995e-23 1.322962e-21 1.804460e-23 2.223359e-20 1.607652e+04 5.936116e-24 2.166011e-22 2.560500e-23 1.428513e-21 1.770186e-23 2.317166e-20 1.727883e+04 6.351506e-24 1.981264e-22 2.527516e-23 1.539515e-21 1.739061e-23 2.393784e-20 1.857106e+04 6.755902e-24 1.812291e-22 2.494986e-23 1.661791e-21 1.708497e-23 2.472939e-20 1.995993e+04 7.197853e-24 1.657744e-22 2.462902e-23 1.793799e-21 1.678484e-23 2.554717e-20 2.145267e+04 8.893269e-24 1.519697e-22 2.435704e-23 1.926866e-21 1.655417e-23 2.633569e-20 2.305704e+04 1.292559e-23 1.392417e-22 2.413945e-23 2.058107e-21 1.640040e-23 2.708137e-20 2.478141e+04 1.425247e-23 1.284138e-22 2.392409e-23 2.198304e-21 1.624825e-23 2.784818e-20 2.663473e+04 1.406591e-23 1.186560e-22 2.371095e-23 2.348068e-21 1.609770e-23 2.863675e-20 2.862666e+04 1.399632e-23 1.305916e-22 2.358356e-23 2.492751e-21 1.605726e-23 2.939176e-20 3.076755e+04 1.405565e-23 1.513601e-22 2.355042e-23 2.628318e-21 1.613907e-23 3.010270e-20 3.306856e+04 1.411545e-23 1.797244e-22 2.351762e-23 2.771269e-21 1.622159e-23 3.083088e-20 3.554165e+04 1.417573e-23 2.194389e-22 2.348516e-23 2.922008e-21 1.630482e-23 3.157671e-20 3.819970e+04 1.438087e-23 2.598067e-22 2.356539e-23 3.057609e-21 1.652157e-23 3.219689e-20 4.105653e+04 1.474885e-23 2.989450e-22 2.376829e-23 3.173395e-21 1.688784e-23 3.267213e-20 4.412702e+04 1.512674e-23 3.485260e-22 2.397324e-23 3.293572e-21 1.726270e-23 3.315440e-20 4.742714e+04 1.551481e-23 4.082502e-22 2.418029e-23 3.418305e-21 1.764635e-23 3.364380e-20 5.097406e+04 1.602791e-23 4.629530e-22 2.449531e-23 3.519222e-21 1.814713e-23 3.391628e-20 5.478625e+04 1.668245e-23 5.075862e-22 2.479703e-23 3.593818e-21 1.877886e-23 3.395792e-20 5.888354e+04 1.736448e-23 5.565299e-22 2.505152e-23 3.674473e-21 1.943323e-23 3.399962e-20 6.328725e+04 1.798767e-23 6.102009e-22 2.530908e-23 3.756939e-21 1.992795e-23 3.404137e-20 6.802031e+04 1.857548e-23 6.554834e-22 2.563023e-23 3.814159e-21 2.047536e-23 3.384629e-20 7.310733e+04 1.922933e-23 6.898373e-22 2.601734e-23 3.853787e-21 2.108490e-23 3.341833e-20 7.857479e+04 1.990707e-23 7.259932e-22 2.641077e-23 3.893827e-21 2.171335e-23 3.299581e-20 8.445115e+04 2.060959e-23 7.640457e-22 2.681063e-23 3.934283e-21 2.236129e-23 3.259330e-20 9.076698e+04 2.127586e-23 7.938108e-22 2.718636e-23 3.945269e-21 2.297112e-23 3.204538e-20 9.755516e+04 2.190291e-23 8.145633e-22 2.753785e-23 3.927599e-21 2.354068e-23 3.135893e-20 1.048510e+05 2.254912e-23 8.358585e-22 2.789426e-23 3.910010e-21 2.412494e-23 3.073288e-20 1.126925e+05 2.321508e-23 8.577106e-22 2.825568e-23 3.892503e-21 2.472430e-23 3.014293e-20 1.211204e+05 2.374234e-23 8.718051e-22 2.849377e-23 3.845687e-21 2.518331e-23 2.941881e-20 1.301786e+05 2.413186e-23 8.783358e-22 2.807445e-23 3.772660e-21 2.550463e-23 2.856056e-20 1.399142e+05 2.390125e-23 8.849156e-22 2.727489e-23 3.701030e-21 2.502224e-23 2.772752e-20 1.503780e+05 2.340986e-23 8.915446e-22 2.649930e-23 3.630770e-21 2.444552e-23 2.691895e-20 1.616243e+05 2.288211e-23 8.898149e-22 2.571334e-23 3.533523e-21 2.383627e-23 2.597025e-20 1.737116e+05 2.232549e-23 8.809328e-22 2.492245e-23 3.414399e-21 2.320213e-23 2.491455e-20 1.867030e+05 2.178326e-23 8.730420e-22 2.415665e-23 3.299317e-21 2.258567e-23 2.390211e-20 2.006659e+05 2.125503e-23 8.661975e-22 2.341512e-23 3.188142e-21 2.198637e-23 2.293115e-20 2.156730e+05 2.065386e-23 8.512473e-22 2.262195e-23 3.054780e-21 2.131957e-23 2.182513e-20 2.318025e+05 1.999794e-23 8.295462e-22 2.179375e-23 2.908906e-21 2.060335e-23 2.063051e-20 2.491383e+05 1.936332e-23 8.088931e-22 2.099630e-23 2.786430e-21 1.991163e-23 1.950192e-20 2.677706e+05 1.874927e-23 7.891898e-22 2.022845e-23 2.669582e-21 1.924356e-23 1.843987e-20 2.877963e+05 1.805330e-23 7.608878e-22 1.939487e-23 2.534636e-21 1.849944e-23 1.726760e-20 3.093196e+05 1.730237e-23 7.264080e-22 1.852118e-23 2.388544e-21 1.770575e-23 1.602866e-20 3.324527e+05 1.658294e-23 6.934998e-22 1.768713e-23 2.250945e-21 1.694638e-23 1.487969e-20 3.573157e+05 1.589368e-23 6.620914e-22 1.689091e-23 2.121344e-21 1.621984e-23 1.381414e-20 3.840383e+05 1.513300e-23 6.244795e-22 1.603397e-23 1.979686e-21 1.542663e-23 1.267323e-20 4.127593e+05 1.433291e-23 5.833152e-22 1.514754e-23 1.833079e-21 1.459818e-23 1.155544e-20 4.436282e+05 1.351796e-23 5.448811e-22 1.421809e-23 1.697439e-21 1.374884e-23 1.053774e-20 4.768057e+05 1.269512e-23 5.089958e-22 1.332290e-23 1.571943e-21 1.290135e-23 9.611135e-21 5.124645e+05 1.183137e-23 4.699948e-22 1.239387e-23 1.439705e-21 1.201634e-23 8.631349e-21 5.507901e+05 1.096160e-23 4.306666e-22 1.146553e-23 1.307457e-21 1.112816e-23 7.660608e-21 5.919819e+05 1.015622e-23 3.946521e-22 1.060730e-23 1.187512e-21 1.030613e-23 6.801313e-21 6.362544e+05 9.410483e-24 3.616714e-22 9.813877e-24 1.078721e-21 9.545316e-24 6.040599e-21 6.838378e+05 8.643662e-24 3.280405e-22 9.003309e-24 9.673721e-22 8.765011e-24 5.270496e-21 7.349799e+05 7.888234e-24 2.969287e-22 8.208277e-24 8.593716e-22 7.997555e-24 4.557006e-21 7.899467e+05 7.199419e-24 2.687914e-22 7.484181e-24 7.636385e-22 7.297927e-24 3.945621e-21 8.490243e+05 6.571332e-24 2.433436e-22 6.824673e-24 6.787729e-22 6.660120e-24 3.419096e-21 9.125201e+05 5.942958e-24 2.177851e-22 6.167444e-24 5.942907e-22 6.022709e-24 2.909175e-21 9.807646e+05 5.339670e-24 1.933282e-22 5.538127e-24 5.170266e-22 5.411156e-24 2.445275e-21 1.054113e+06 4.798356e-24 1.716472e-22 4.973923e-24 4.500800e-22 4.862480e-24 2.059161e-21 1.132947e+06 4.312631e-24 1.524259e-22 4.468065e-24 3.920483e-22 4.370195e-24 1.737629e-21 1.217676e+06 3.838899e-24 1.333671e-22 3.976123e-24 3.359219e-22 3.890282e-24 1.440348e-21 1.308742e+06 3.395039e-24 1.160964e-22 3.516060e-24 2.847679e-22 3.440752e-24 1.181910e-21 1.406619e+06 3.003367e-24 1.010969e-22 3.110273e-24 2.417283e-22 3.044087e-24 9.742987e-22 1.511815e+06 2.657717e-24 8.806865e-23 2.752316e-24 2.055028e-22 2.694036e-24 8.072880e-22 1.624879e+06 2.328445e-24 7.531242e-23 2.412096e-24 1.716539e-22 2.360620e-24 6.603895e-22 1.746399e+06 2.027007e-24 6.364635e-23 2.101022e-24 1.419451e-22 2.055410e-24 5.382488e-22 1.877006e+06 1.765569e-24 5.383382e-23 1.831212e-24 1.177667e-22 1.790692e-24 4.430982e-22 2.017382e+06 1.472525e-24 4.557848e-23 1.521479e-24 9.807054e-23 1.490933e-24 3.686880e-22 2.168255e+06 1.202712e-24 3.771882e-23 1.246889e-24 8.044007e-23 1.218875e-24 3.067179e-22 2.330412e+06 9.748162e-25 3.080263e-23 1.014875e-24 6.559847e-23 9.890245e-25 2.568599e-22 2.504696e+06 7.924692e-25 2.521595e-23 8.289115e-25 5.390960e-23 8.050335e-25 2.182275e-22 2.692014e+06 6.464493e-25 2.070041e-23 6.797018e-25 4.467963e-23 6.576248e-25 1.880107e-22 2.893342e+06 5.229115e-25 1.660901e-23 5.534007e-25 3.685402e-23 5.328503e-25 1.639667e-22 3.109725e+06 4.220894e-25 1.318984e-23 4.500932e-25 3.051869e-23 4.309553e-25 1.444430e-22 3.342292e+06 3.429046e-25 1.054905e-23 3.686298e-25 2.561657e-23 3.508646e-25 1.284320e-22 3.592251e+06 2.805921e-25 8.505612e-24 3.042315e-25 2.179734e-23 2.877813e-25 1.151428e-22 3.860904e+06 2.297060e-25 6.788611e-24 2.515100e-25 1.876010e-23 2.362452e-25 1.041898e-22 4.149649e+06 1.890669e-25 5.433309e-24 2.091667e-25 1.633421e-23 1.950392e-25 9.468802e-23 4.459988e+06 1.573083e-25 4.420110e-24 1.757924e-25 1.439192e-23 1.627766e-25 8.623574e-23 4.793536e+06 1.323778e-25 3.658277e-24 1.493462e-25 1.281829e-23 1.373962e-25 7.868979e-23 5.152030e+06 1.128495e-25 3.089342e-24 1.284500e-25 1.159387e-23 1.174944e-25 7.170748e-23 5.537333e+06 9.732344e-26 2.657136e-24 1.108238e-25 1.057195e-23 1.014279e-25 6.533696e-23 5.951453e+06 8.338573e-26 2.322132e-24 9.535188e-26 9.674845e-24 8.699466e-26 5.960944e-23 6.396543e+06 7.204736e-26 2.059435e-24 8.298537e-26 8.882606e-24 7.538292e-26 5.438864e-23 6.874920e+06 6.377836e-26 1.880425e-24 7.375828e-26 8.198500e-24 6.686929e-26 4.916391e-23 7.389074e+06 5.724100e-26 1.741105e-24 6.632534e-26 7.583317e-24 6.010355e-26 4.421846e-23 7.941679e+06 5.168370e-26 1.617781e-24 5.940023e-26 7.017237e-24 5.432868e-26 3.977258e-23 8.535612e+06 4.573209e-26 1.508058e-24 5.232099e-26 6.504215e-24 4.786122e-26 3.577558e-23 9.173963e+06 4.114907e-26 1.419456e-24 4.708993e-26 6.007516e-24 4.310351e-26 3.187369e-23 9.860054e+06 3.747955e-26 1.342546e-24 4.277631e-26 5.536399e-24 3.926986e-26 2.826248e-23 1.059746e+07 3.403094e-26 1.273903e-24 3.862567e-26 5.102493e-24 3.560259e-26 2.506175e-23 1.139001e+07 3.089719e-26 1.208897e-24 3.500807e-26 4.702836e-24 3.233136e-26 2.222468e-23 1.224183e+07 2.844493e-26 1.141486e-24 3.210290e-26 4.305827e-24 2.974448e-26 1.952876e-23 1.315736e+07 2.634685e-26 1.075154e-24 2.958964e-26 3.929294e-24 2.751992e-26 1.708139e-23 1.414135e+07 2.441863e-26 1.012739e-24 2.677888e-26 3.585810e-24 2.534754e-26 1.494132e-23 1.519894e+07 2.204263e-26 9.540066e-25 2.407533e-26 3.272462e-24 2.284240e-26 1.306989e-23 1.633562e+07 2.001107e-26 8.924792e-25 2.177655e-26 2.964437e-24 2.071764e-26 1.134879e-23 1.755731e+07 1.822094e-26 8.324015e-25 1.974902e-26 2.675888e-24 1.884261e-26 9.819507e-24 1.887036e+07 1.659735e-26 7.767915e-25 1.791604e-26 2.415493e-24 1.714352e-26 8.498431e-24 2.028162e+07 1.512409e-26 7.255871e-25 1.625828e-26 2.180498e-24 1.560315e-26 7.360690e-24 2.179842e+07 1.377065e-26 6.722866e-25 1.474354e-26 1.952450e-24 1.418809e-26 6.344366e-24 2.342865e+07 1.253323e-26 6.205961e-25 1.336512e-26 1.741748e-24 1.289539e-26 5.456171e-24 2.518080e+07 1.140795e-26 5.729105e-25 1.211640e-26 1.553824e-24 1.172139e-26 4.692387e-24 2.706400e+07 1.038455e-26 5.289164e-25 1.098508e-26 1.386650e-24 1.065509e-26 4.035577e-24 2.908803e+07 9.413909e-27 4.834766e-25 9.922628e-27 1.227337e-24 9.646154e-27 3.458482e-24 3.126343e+07 8.518605e-27 4.400195e-25 8.948485e-27 1.082215e-24 8.717146e-27 2.959325e-24 3.360152e+07 7.708852e-27 4.004871e-25 8.070322e-27 9.542791e-25 7.877995e-27 2.532244e-24 3.611447e+07 6.952103e-27 3.645230e-25 7.228311e-27 8.414896e-25 7.085285e-27 2.166827e-24 3.881535e+07 6.204345e-27 3.280525e-25 6.433386e-27 7.350546e-25 6.315904e-27 1.847198e-24 4.171823e+07 5.524368e-27 2.939239e-25 5.713981e-27 6.395367e-25 5.617470e-27 1.572241e-24 4.483821e+07 4.919151e-27 2.633586e-25 5.075232e-27 5.564473e-25 4.996500e-27 1.338234e-24 4.819151e+07 4.380449e-27 2.359832e-25 4.508070e-27 4.841670e-25 4.444373e-27 1.139074e-24 5.179560e+07 3.876946e-27 2.086367e-25 3.981784e-27 4.169889e-25 3.929758e-27 9.642955e-25 5.566923e+07 3.422967e-27 1.834695e-25 3.509049e-27 3.576591e-25 3.466486e-27 8.145586e-25 5.983255e+07 3.022309e-27 1.613471e-25 3.092587e-27 3.067813e-25 3.057985e-27 6.880904e-25 6.430724e+07 2.668690e-27 1.419001e-25 2.725680e-27 2.631500e-25 2.697759e-27 5.812723e-25 6.911657e+07 2.340364e-27 1.229728e-25 2.386915e-27 2.232551e-25 2.364135e-27 4.870803e-25 7.428558e+07 2.047094e-27 1.059711e-25 2.085150e-27 1.886116e-25 2.066516e-27 4.068928e-25 7.984116e+07 1.790679e-27 9.132610e-26 1.821634e-27 1.593508e-25 1.806466e-27 3.399218e-25 8.581223e+07 1.566473e-27 7.871032e-26 1.591506e-27 1.346351e-25 1.579230e-27 2.839864e-25 9.222985e+07 1.359791e-27 6.679898e-26 1.380199e-27 1.123983e-25 1.370169e-27 2.345957e-25 9.912743e+07 1.177077e-27 5.637198e-26 1.193738e-27 9.342467e-26 1.185526e-27 1.930034e-25 1.065409e+08 1.018981e-27 4.757635e-26 1.032533e-27 7.765847e-26 1.025831e-27 1.587979e-25 1.145087e+08 8.821765e-28 4.015625e-26 8.931527e-28 6.455667e-26 8.877044e-28 1.306651e-25 1.230724e+08 7.570706e-28 3.335866e-26 7.660101e-28 5.294692e-26 7.615615e-28 1.059390e-25 1.322766e+08 6.477424e-28 2.755917e-26 6.550302e-28 4.322260e-26 6.513957e-28 8.545584e-26 1.421692e+08 5.542448e-28 2.277008e-26 5.601707e-28 3.528726e-26 5.572084e-28 6.894247e-26 1.528016e+08 4.742790e-28 1.881499e-26 4.790838e-28 2.881122e-26 4.766755e-28 5.562765e-26 1.642291e+08 4.018049e-28 1.528849e-26 4.057013e-28 2.315718e-26 4.037481e-28 4.406055e-26 1.765113e+08 3.358510e-28 1.235457e-26 3.384562e-28 1.851694e-26 3.371387e-28 3.468856e-26 1.897120e+08 2.799965e-28 9.984904e-27 2.820587e-28 1.480842e-26 2.810170e-28 2.731587e-26 2.039000e+08 2.281895e-28 8.070738e-27 2.290601e-28 1.184415e-26 2.286684e-28 2.151469e-26 2.191490e+08 1.814022e-28 6.404076e-27 1.820466e-28 9.297451e-27 1.817605e-28 1.656986e-26 2.355384e+08 1.433461e-28 5.052420e-27 1.438222e-28 7.256005e-27 1.436141e-28 1.267361e-26 2.531536e+08 1.132869e-28 3.986726e-27 1.136370e-28 5.663900e-27 1.134869e-28 9.696411e-27 2.720862e+08 8.954152e-29 3.146348e-27 8.979738e-29 4.421982e-27 8.969013e-29 7.420765e-27 2.924346e+08 6.930239e-29 2.430489e-27 6.948815e-29 3.375399e-27 6.941215e-29 5.531161e-27 3.143049e+08 5.330514e-29 1.865726e-27 5.343948e-29 2.559554e-27 5.338601e-29 4.091030e-27 3.378107e+08 4.100759e-29 1.432548e-27 4.110435e-29 1.941445e-27 4.106709e-29 3.026958e-27 3.630745e+08 3.155245e-29 1.100211e-27 3.162183e-29 1.473009e-27 3.159616e-29 2.240441e-27 3.902277e+08 2.371510e-29 8.236020e-28 2.376417e-29 1.087738e-27 2.374667e-29 1.608604e-27 4.194116e+08 1.770836e-29 6.121887e-28 1.774285e-29 7.972451e-28 1.773105e-29 1.145219e-27 4.507780e+08 1.322630e-29 4.560138e-28 1.325046e-29 5.845481e-28 1.324259e-29 8.156136e-28 4.844903e+08 9.881075e-30 3.399482e-28 9.897916e-30 4.294664e-28 9.892754e-30 5.810755e-28 5.207238e+08 7.187611e-30 2.480352e-28 7.199127e-30 3.090418e-28 7.195774e-30 4.004984e-28 5.596671e+08 5.191953e-30 1.800196e-28 5.199765e-30 2.206166e-28 5.197612e-30 2.782424e-28 6.015228e+08 3.751669e-30 1.308075e-28 3.756945e-30 1.575591e-28 3.755587e-30 1.933648e-28 6.465087e+08 2.711837e-30 9.508981e-29 2.715382e-30 1.125713e-28 2.714545e-30 1.344187e-28 6.948591e+08 1.900669e-30 6.672885e-29 1.902996e-30 7.776368e-29 1.902481e-30 9.016873e-29 7.468254e+08 1.322051e-30 4.642225e-29 1.323564e-30 5.327599e-29 1.323251e-30 5.994026e-29 8.026781e+08 9.199652e-31 3.231143e-29 9.209436e-31 3.651430e-29 9.207575e-31 3.986170e-29 8.627078e+08 6.404316e-31 2.258550e-29 6.410595e-31 2.522324e-29 6.409526e-31 2.703556e-29 9.272270e+08 4.299607e-31 1.530379e-29 4.303534e-31 1.685319e-29 4.302907e-31 1.775846e-29 9.965713e+08 2.862260e-31 1.027299e-29 2.848047e-31 1.115508e-29 2.864322e-31 1.156322e-29 1.071102e+09 1.906232e-31 6.899163e-30 1.871816e-31 7.385942e-30 1.907511e-31 7.530283e-30 1.151206e+09 1.270060e-31 4.635429e-30 1.230669e-31 4.891897e-30 1.270847e-31 4.904577e-30 1.237301e+09 8.102824e-32 2.967521e-30 7.728325e-32 3.091834e-30 8.107446e-32 3.069875e-30 1.329835e+09 5.119803e-32 1.879221e-30 4.803574e-32 1.933524e-30 5.122465e-32 1.904209e-30 1.429289e+09 3.236060e-32 1.190350e-30 2.986534e-32 1.209343e-30 3.237572e-32 1.181253e-30 1.536181e+09 1.899522e-32 7.541912e-31 1.754415e-32 7.565114e-31 1.888660e-32 7.328337e-31 1.651067e+09 1.003625e-32 4.503739e-31 9.337332e-33 4.478327e-31 1.000708e-32 4.348630e-31 1.774545e+09 5.211925e-33 2.655614e-31 4.887159e-33 2.619912e-31 5.214228e-33 2.556191e-31 1.907258e+09 2.577295e-33 1.566026e-31 2.558311e-33 1.532809e-31 2.714698e-33 1.502747e-31 2.049895e+09 1.260542e-33 9.235802e-32 1.329738e-33 8.978984e-32 1.357342e-33 8.971573e-32 2.203200e+09 5.322293e-34 5.957747e-32 5.772596e-34 5.965029e-32 5.894591e-34 5.960433e-32 2.367971e+09 2.182142e-34 3.927712e-32 2.440761e-34 3.931956e-32 2.520671e-34 3.929096e-32 2.545064e+09 8.950002e-35 2.590486e-32 1.032892e-34 2.592913e-32 1.089640e-34 2.591140e-32 2.735401e+09 3.672210e-35 1.709227e-32 4.374654e-35 1.710579e-32 4.748111e-35 1.709485e-32 2.939973e+09 1.854935e-35 1.076229e-32 1.761614e-35 1.077022e-32 2.491504e-36 1.076333e-32 3.159844e+09 9.797553e-36 6.718764e-33 7.572689e-36 6.723462e-33 1.746070e-36 6.719107e-33 3.396159e+09 4.115715e-36 4.195666e-33 3.527452e-36 4.198440e-33 1.539293e-36 4.195686e-33 3.650147e+09 1.674777e-36 2.620806e-33 1.448233e-36 2.622439e-33 1.376001e-36 2.620697e-33 3.923129e+09 0.000000e+00 1.550741e-33 0.000000e+00 1.551733e-33 0.000000e+00 1.550663e-33 4.216528e+09 0.000000e+00 9.090690e-34 0.000000e+00 9.096739e-34 0.000000e+00 9.090215e-34 4.531868e+09 0.000000e+00 5.330261e-34 0.000000e+00 5.333944e-34 0.000000e+00 5.329970e-34 4.870792e+09 0.000000e+00 3.126018e-34 0.000000e+00 3.128257e-34 0.000000e+00 3.125839e-34 5.235064e+09 0.000000e+00 1.717225e-34 0.000000e+00 1.718534e-34 0.000000e+00 1.717175e-34 5.626577e+09 0.000000e+00 9.334324e-35 0.000000e+00 9.341894e-35 0.000000e+00 9.334353e-35 6.047371e+09 0.000000e+00 5.074468e-35 0.000000e+00 5.078833e-35 0.000000e+00 5.074650e-35 6.499635e+09 0.000000e+00 2.769437e-35 0.000000e+00 2.767922e-35 0.000000e+00 2.769705e-35 6.985722e+09 0.000000e+00 1.381689e-35 0.000000e+00 1.380962e-35 0.000000e+00 1.381865e-35 7.508161e+09 0.000000e+00 6.800621e-36 0.000000e+00 6.797201e-36 0.000000e+00 6.801714e-36 8.069673e+09 0.000000e+00 3.347623e-36 0.000000e+00 3.346015e-36 0.000000e+00 3.348272e-36 8.673178e+09 0.000000e+00 1.648063e-36 0.000000e+00 1.647308e-36 0.000000e+00 1.648436e-36 9.321817e+09 0.000000e+00 7.039735e-37 0.000000e+00 7.035702e-37 0.000000e+00 7.041241e-37 1.001897e+10 0.000000e+00 2.949435e-37 0.000000e+00 2.947361e-37 0.000000e+00 2.950022e-37 1.076825e+10 0.000000e+00 1.236106e-37 0.000000e+00 1.235080e-37 0.000000e+00 1.236338e-37 1.157358e+10 0.000000e+00 5.182120e-38 0.000000e+00 5.177180e-38 0.000000e+00 5.183063e-38 1.243913e+10 0.000000e+00 1.804544e-38 0.000000e+00 2.448305e-38 0.000000e+00 7.400001e-38 1.336941e+10 0.000000e+00 9.211948e-39 0.000000e+00 1.389976e-38 0.000000e+00 3.893495e-38 1.436927e+10 0.000000e+00 5.290916e-39 0.000000e+00 8.066757e-39 0.000000e+00 2.179836e-38 1.544390e+10 0.000000e+00 3.084842e-39 0.000000e+00 4.764928e-39 0.000000e+00 1.261635e-38 1.659890e+10 0.000000e+00 5.989303e-41 0.000000e+00 7.020513e-41 0.000000e+00 3.898402e-40 1.784028e+10 0.000000e+00 3.505485e-41 0.000000e+00 4.045286e-41 0.000000e+00 6.380157e-40 1.917449e+10 0.000000e+00 2.951278e-41 0.000000e+00 3.300719e-41 0.000000e+00 1.189034e-39 2.060849e+10 0.000000e+00 3.180152e-41 0.000000e+00 3.005403e-41 0.000000e+00 2.256376e-39 2.214974e+10 0.000000e+00 1.286540e-41 0.000000e+00 2.433355e-42 0.000000e+00 1.657954e-42 2.380624e+10 0.000000e+00 6.544361e-42 0.000000e+00 1.059538e-42 0.000000e+00 8.354956e-43 2.558664e+10 0.000000e+00 3.944440e-42 0.000000e+00 5.493195e-43 0.000000e+00 5.765433e-43 2.750018e+10 0.000000e+00 3.134670e-42 0.000000e+00 3.649685e-43 0.000000e+00 5.901602e-43 2.955683e+10 0.000000e+00 1.667920e-41 0.000000e+00 3.126543e-42 0.000000e+00 3.075005e-42 3.176729e+10 0.000000e+00 6.332851e-42 0.000000e+00 1.150234e-42 0.000000e+00 1.101482e-42 3.414307e+10 0.000000e+00 2.839474e-42 0.000000e+00 4.693308e-43 0.000000e+00 4.916551e-43 3.669652e+10 0.000000e+00 2.342977e-42 0.000000e+00 2.506231e-43 0.000000e+00 2.424136e-43 3.944093e+10 0.000000e+00 2.087318e-42 0.000000e+00 8.224116e-42 0.000000e+00 1.055255e-42 4.239059e+10 0.000000e+00 1.856002e-42 0.000000e+00 3.374781e-42 0.000000e+00 3.736704e-43 4.556085e+10 0.000000e+00 1.650893e-42 0.000000e+00 1.426516e-42 0.000000e+00 1.487901e-43 4.896820e+10 0.000000e+00 1.468958e-42 0.000000e+00 6.494099e-43 0.000000e+00 1.251373e-43 5.263038e+10 0.000000e+00 1.319087e-42 0.000000e+00 6.296860e-43 0.000000e+00 1.814426e-42 5.656644e+10 0.000000e+00 1.185270e-42 0.000000e+00 4.274409e-43 0.000000e+00 8.269683e-43 6.079686e+10 0.000000e+00 1.065040e-42 0.000000e+00 3.731908e-43 0.000000e+00 4.218320e-43 6.534366e+10 0.000000e+00 9.570171e-43 0.000000e+00 3.835905e-43 0.000000e+00 2.239574e-43 7.023051e+10 0.000000e+00 8.487897e-43 0.000000e+00 3.616339e-43 0.000000e+00 4.562006e-43 7.548282e+10 0.000000e+00 7.522138e-43 0.000000e+00 3.007928e-43 0.000000e+00 2.956733e-43 8.112794e+10 0.000000e+00 6.666303e-43 0.000000e+00 2.715549e-43 0.000000e+00 2.130303e-43 8.719524e+10 0.000000e+00 5.907876e-43 0.000000e+00 2.704810e-43 0.000000e+00 1.797880e-43 9.371630e+10 0.000000e+00 5.168153e-43 0.000000e+00 2.253126e-43 0.000000e+00 1.369998e-43 1.007250e+11 0.000000e+00 4.518143e-43 0.000000e+00 1.858518e-43 0.000000e+00 1.073674e-43 1.082579e+11 0.000000e+00 3.949906e-43 0.000000e+00 1.534569e-43 0.000000e+00 8.492475e-44 1.163542e+11 0.000000e+00 3.453154e-43 0.000000e+00 1.268345e-43 0.000000e+00 6.778348e-44 1.250560e+11 0.000000e+00 2.971538e-43 0.000000e+00 1.055267e-43 0.000000e+00 5.580338e-44 1.344085e+11 0.000000e+00 2.555499e-43 0.000000e+00 8.782592e-44 0.000000e+00 4.602560e-44 1.444605e+11 0.000000e+00 2.197721e-43 0.000000e+00 7.309921e-44 0.000000e+00 3.799255e-44 1.552642e+11 0.000000e+00 1.890043e-43 0.000000e+00 6.086254e-44 0.000000e+00 3.138803e-44 1.668760e+11 0.000000e+00 1.594156e-43 0.000000e+00 5.032272e-44 0.000000e+00 2.543767e-44 1.793561e+11 0.000000e+00 1.343817e-43 0.000000e+00 4.159013e-44 0.000000e+00 2.060450e-44 1.927695e+11 0.000000e+00 1.132799e-43 0.000000e+00 3.437330e-44 0.000000e+00 1.669069e-44 2.071862e+11 0.000000e+00 9.549232e-44 0.000000e+00 2.840907e-44 0.000000e+00 1.352117e-44 2.226810e+11 0.000000e+00 7.848799e-44 0.000000e+00 2.375781e-44 0.000000e+00 1.139304e-44 2.393346e+11 0.000000e+00 6.447937e-44 0.000000e+00 1.987304e-44 0.000000e+00 9.607778e-45 2.572336e+11 0.000000e+00 5.297164e-44 0.000000e+00 1.662368e-44 0.000000e+00 8.152741e-45 2.764713e+11 0.000000e+00 4.351822e-44 0.000000e+00 1.390578e-44 0.000000e+00 6.957943e-45 2.971477e+11 0.000000e+00 3.458397e-44 0.000000e+00 1.196887e-44 0.000000e+00 6.146233e-45 3.193704e+11 0.000000e+00 2.747483e-44 0.000000e+00 1.030519e-44 0.000000e+00 5.534262e-45 3.432551e+11 0.000000e+00 2.182760e-44 0.000000e+00 8.873012e-45 0.000000e+00 5.007606e-45 3.689261e+11 0.000000e+00 1.734156e-44 0.000000e+00 7.640094e-45 0.000000e+00 4.531116e-45 3.965169e+11 0.000000e+00 1.318921e-44 0.000000e+00 6.756995e-45 0.000000e+00 4.070968e-45 4.261711e+11 0.000000e+00 1.003103e-44 0.000000e+00 5.976277e-45 0.000000e+00 3.657546e-45 4.580431e+11 0.000000e+00 7.629474e-45 0.000000e+00 5.285843e-45 0.000000e+00 3.286136e-45 4.922987e+11 0.000000e+00 5.800726e-45 0.000000e+00 4.675619e-45 0.000000e+00 2.952063e-45 5.291162e+11 0.000000e+00 4.182629e-45 0.000000e+00 4.177916e-45 0.000000e+00 2.606732e-45 5.686871e+11 0.000000e+00 3.016134e-45 0.000000e+00 3.733197e-45 0.000000e+00 2.301817e-45 6.112174e+11 0.000000e+00 2.175135e-45 0.000000e+00 3.335821e-45 0.000000e+00 2.032586e-45 6.569284e+11 0.000000e+00 1.566745e-45 0.000000e+00 2.980539e-45 0.000000e+00 1.794317e-45 7.060579e+11 0.000000e+00 1.048494e-45 0.000000e+00 2.652384e-45 0.000000e+00 1.556719e-45 7.588618e+11 0.000000e+00 7.017665e-46 0.000000e+00 2.360361e-45 0.000000e+00 1.350591e-45 8.156146e+11 0.000000e+00 4.697614e-46 0.000000e+00 2.100491e-45 0.000000e+00 1.171765e-45 8.766118e+11 0.000000e+00 3.136835e-46 0.000000e+00 1.868718e-45 0.000000e+00 1.028774e-45 9.421709e+11 0.000000e+00 1.903243e-46 0.000000e+00 1.645632e-45 0.000000e+00 8.960514e-46 1.012633e+12 0.000000e+00 1.154935e-46 0.000000e+00 1.449182e-45 0.000000e+00 7.804539e-46 1.088364e+12 0.000000e+00 7.009402e-47 0.000000e+00 1.276187e-45 0.000000e+00 6.797716e-46 1.169760e+12 0.000000e+00 4.210018e-47 0.000000e+00 1.123353e-45 0.000000e+00 5.918067e-46 1.257242e+12 0.000000e+00 1.903699e-47 0.000000e+00 9.771287e-46 0.000000e+00 5.088263e-46 1.351267e+12 0.000000e+00 8.643643e-48 0.000000e+00 8.499409e-46 0.000000e+00 4.376775e-46 1.452324e+12 0.000000e+00 4.044277e-48 0.000000e+00 7.393110e-46 0.000000e+00 3.768816e-46 1.560939e+12 0.000000e+00 1.234184e-47 0.000000e+00 6.427154e-46 0.000000e+00 3.243095e-46 1.677677e+12 0.000000e+00 1.060976e-47 0.000000e+00 5.519780e-46 0.000000e+00 2.750252e-46 1.803145e+12 0.000000e+00 9.136210e-48 0.000000e+00 4.740521e-46 0.000000e+00 2.332311e-46 1.937996e+12 0.000000e+00 8.109941e-48 0.000000e+00 4.071288e-46 0.000000e+00 1.977888e-46 2.082933e+12 0.000000e+00 7.224995e-48 0.000000e+00 3.493883e-46 0.000000e+00 1.675585e-46 2.238709e+12 0.000000e+00 6.176423e-48 0.000000e+00 2.958719e-46 0.000000e+00 1.393892e-46 2.406135e+12 0.000000e+00 5.378783e-48 0.000000e+00 2.505533e-46 0.000000e+00 1.159559e-46 2.586082e+12 0.000000e+00 4.684468e-48 0.000000e+00 2.121766e-46 0.000000e+00 9.646214e-47 2.779487e+12 0.000000e+00 4.069238e-48 0.000000e+00 1.794681e-46 0.000000e+00 8.010978e-47 2.987356e+12 0.000000e+00 3.398877e-48 0.000000e+00 1.491933e-46 0.000000e+00 6.488160e-47 3.210770e+12 0.000000e+00 2.839105e-48 0.000000e+00 1.240258e-46 0.000000e+00 5.254841e-47 3.450894e+12 0.000000e+00 2.371651e-48 0.000000e+00 1.031040e-46 0.000000e+00 4.255980e-47 3.708975e+12 0.000000e+00 1.974051e-48 0.000000e+00 8.555129e-47 0.000000e+00 3.437333e-47 3.986358e+12 0.000000e+00 1.568267e-48 0.000000e+00 6.930814e-47 0.000000e+00 2.692460e-47 4.284485e+12 0.000000e+00 1.245964e-48 0.000000e+00 5.614927e-47 0.000000e+00 2.255385e-47 4.604907e+12 0.000000e+00 9.899537e-49 0.000000e+00 4.548896e-47 0.000000e+00 1.910230e-47 4.949294e+12 0.000000e+00 7.839088e-49 0.000000e+00 3.674469e-47 0.000000e+00 2.021100e-47 5.319436e+12 0.000000e+00 5.974306e-49 0.000000e+00 2.871886e-47 0.000000e+00 1.853423e-47 5.717259e+12 0.000000e+00 4.553222e-49 0.000000e+00 2.256401e-47 0.000000e+00 1.699770e-47 6.144835e+12 0.000000e+00 3.470242e-49 0.000000e+00 1.774391e-47 0.000000e+00 1.558959e-47 6.604388e+12 0.000000e+00 2.635485e-49 0.000000e+00 1.390421e-47 0.000000e+00 1.419821e-47 7.098309e+12 0.000000e+00 1.931520e-49 0.000000e+00 1.049624e-47 0.000000e+00 1.204886e-47 7.629169e+12 0.000000e+00 1.415657e-49 0.000000e+00 7.923859e-48 0.000000e+00 1.022533e-47 8.199730e+12 0.000000e+00 1.037618e-49 0.000000e+00 5.982121e-48 0.000000e+00 8.678177e-48 8.812962e+12 0.000000e+00 7.584240e-50 0.000000e+00 4.488821e-48 0.000000e+00 7.319061e-48 9.472055e+12 0.000000e+00 5.405500e-50 0.000000e+00 3.188470e-48 0.000000e+00 5.832753e-48 1.018044e+13 0.000000e+00 3.853210e-50 0.000000e+00 2.264927e-48 0.000000e+00 4.648415e-48 1.094180e+13 0.000000e+00 2.747086e-50 0.000000e+00 1.608968e-48 0.000000e+00 3.704669e-48 1.176010e+13 0.000000e+00 1.953679e-50 0.000000e+00 1.131928e-48 0.000000e+00 2.932720e-48 1.263961e+13 0.000000e+00 1.360498e-50 0.000000e+00 7.355205e-49 0.000000e+00 2.197442e-48 1.358488e+13 0.000000e+00 9.475734e-51 0.000000e+00 4.779535e-49 0.000000e+00 1.646542e-48 1.460085e+13 0.000000e+00 6.600829e-51 0.000000e+00 3.402728e-49 0.000000e+00 1.233777e-48 1.569280e+13 0.000000e+00 4.585841e-51 0.000000e+00 2.465385e-49 0.000000e+00 9.158978e-49 1.686642e+13 0.000000e+00 3.119641e-51 0.000000e+00 1.696273e-49 0.000000e+00 6.343223e-49 1.812780e+13 0.000000e+00 2.122273e-51 0.000000e+00 1.167113e-49 0.000000e+00 4.393210e-49 1.948352e+13 0.000000e+00 1.443806e-51 0.000000e+00 8.030383e-50 0.000000e+00 3.048157e-49 2.094063e+13 0.000000e+00 9.792070e-52 0.000000e+00 5.474786e-50 0.000000e+00 2.078830e-49 2.250672e+13 0.000000e+00 6.501813e-52 0.000000e+00 3.505551e-50 0.000000e+00 1.245111e-49 2.418992e+13 0.000000e+00 4.317270e-52 0.000000e+00 2.244688e-50 0.000000e+00 7.458313e-50 2.599901e+13 0.000000e+00 2.866808e-52 0.000000e+00 1.437362e-50 0.000000e+00 4.468037e-50 2.794339e+13 0.000000e+00 1.906522e-52 0.000000e+00 9.101715e-51 0.000000e+00 2.263760e-50 3.003319e+13 0.000000e+00 1.279707e-52 0.000000e+00 5.371920e-51 0.000000e+00 1.126574e-50 3.227928e+13 0.000000e+00 8.589771e-53 0.000000e+00 3.170974e-51 0.000000e+00 5.611912e-51 3.469334e+13 0.000000e+00 5.765735e-53 0.000000e+00 1.972333e-51 0.000000e+00 2.798167e-51 3.728795e+13 0.000000e+00 2.988333e-53 0.000000e+00 1.523327e-51 0.000000e+00 6.329513e-51 4.007659e+13 0.000000e+00 2.017053e-53 0.000000e+00 1.325367e-51 0.000000e+00 6.403712e-51 4.307379e+13 0.000000e+00 1.361858e-53 0.000000e+00 1.197730e-51 0.000000e+00 6.479066e-51 4.629514e+13 0.000000e+00 9.197565e-54 0.000000e+00 1.221292e-51 0.000000e+00 6.555594e-51 4.975741e+13 0.000000e+00 7.479482e-54 0.000000e+00 3.659022e-52 0.000000e+00 8.180108e-51 5.347861e+13 0.000000e+00 1.102366e-53 0.000000e+00 1.931227e-52 0.000000e+00 9.711352e-51 5.747810e+13 0.000000e+00 1.642960e-53 0.000000e+00 1.078533e-52 0.000000e+00 1.152977e-50 6.177671e+13 0.000000e+00 2.477612e-53 0.000000e+00 7.026505e-53 0.000000e+00 1.368931e-50 6.639679e+13 0.000000e+00 3.820784e-53 0.000000e+00 8.183282e-52 0.000000e+00 1.584425e-50 7.136240e+13 0.000000e+00 3.920910e-53 0.000000e+00 9.033861e-52 0.000000e+00 1.611403e-50 7.669936e+13 0.000000e+00 4.023668e-53 0.000000e+00 9.972918e-52 0.000000e+00 1.638842e-50 8.243546e+13 0.000000e+00 4.129127e-53 0.000000e+00 1.100966e-51 0.000000e+00 1.666747e-50 8.860055e+13 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 9.522670e+13 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.023484e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.100027e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.182295e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.270715e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.365747e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.467887e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.577666e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.695655e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.822467e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.958764e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.105253e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.262699e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.431919e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.613794e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.809271e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.019368e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.245177e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.487873e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.748720e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.029075e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.330396e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.654253e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.002330e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.376438e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.778525e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.210682e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 6.675159e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 7.174373e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 7.710922e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.287597e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 8.907400e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 9.573556e+14 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.028953e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.105905e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.188612e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.277505e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.373045e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.475731e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.586096e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.704716e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.832206e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.969231e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.116503e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.274790e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.444914e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.627761e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 2.824283e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.035502e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.262518e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.506511e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 3.768752e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.050605e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.353537e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 4.679124e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.029060e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 5.405168e+15 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 PKmN7Ic~c~BNuRadioMC/examples/Sensitivities/RNO_Proposal/Diffuse_proposal.pdf%PDF-1.4 % 1 0 obj << /Pages 2 0 R /Type /Catalog >> endobj 8 0 obj << /ExtGState 4 0 R /Font 3 0 R /Pattern 5 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /Shading 6 0 R /XObject 7 0 R >> endobj 10 0 obj << /Annots [ ] /Contents 9 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 504 432 ] /Parent 2 0 R /Resources 8 0 R /Type /Page >> endobj 9 0 obj << /Filter /FlateDecode /Length 11 0 R >> stream x]Yő~?_&p/68by ,F$|_furXXRvUwUVnߜfo߷?lŸdgh|*71%F|t:I$d._^rb)\l.fK&|mSy^L5||tyB^l={a'sعsB?tS ƭԋ+XlSlƋ 'K.a#\Dn\|Lz)ʱ%] w> hP~s`۱&­ԈxKrYY.1Րdk({w:K+lr6\u1G|D[-5'a|YRt+k bze v>'$c=g¥jxŠb]/2es.b^gwx?X5fYc.M1r&-| w[W+"(+wyd'K 2p VY{W NCte,q8e'z؋M.b<Аy1¹. Z|pe,+T-R`ɉp p6 Pp, ,bn֛b,?` mS20|(KEpDpP˄VpWPA"q+΃0x[=;JcmF)!mqd32]fXOvI8 B@"<֖.TP ˩z|@80;FޏoAdI I Vi  q=E 8ſfE[p f,r{VLJ+`z"ɑ&k' pC"TC#`3@9\yG J- d`M7Br!bR B9 J 19*s,p?Ak k;! aEǀ|Hxx`9BJ'^84CSAzFHbNPuEaD+NQ S Y,!%)d"R&SPXJh pp&P2el% +y hTLD̬.e0B;Cc@.,nA* €Ϭ{$B"(*V!.[qV //,a؁<f=tEjHb Q j$Dy{~$3Q4R#B"@&eYa!\Gq!81!݌eA$!Vp̉#@+sc9 Ȱ+ QϾZ"Z6A=p(ˈY``sRʵɴ* :[yr .T2: O( |r$B,+:?(p ɫ0@^ݏ|CA e?Zty2|N6Fxm~1eZou}ݢ96aBv—M*@r[)K'j) (э3gI .0An!}NExSb=QbnQP$4x@ @u" Sn%ݿ(HA `'א`,JHFQwb}^{T 2&9K"F'\f?Oo6iTaC9[6 xj #$q^C $Zt-=Jq!7`.񋿜Of/:c} >5w<WwDfAKW ֬𽶇}Ap< p/ݱ? i3ok.xR_k{` =,{+w3rdɴ|AQ`"z0B jwW9 l;`{Cwܲn {m[ݤg;7nox5Y[F='аfظtr Na0 |5LiL8@sv_M #Z&uB}mE- 4A2G6qVx@ &s Z;j 1iuthЌe8KufW`Iö]y_M(j˄N+YriѶx@I~tr3Y ui:xaڋ:jʠ22Qtpb2_M`d364O8OՄ: ^bu ?eB^ Oox1gyB_MH[Ny_MtY_p@7S^'`,g6 O46ayKoG3Ә˜C[Ώ4=-.Bɽmϲڞajhc>O+ )Q C@qG_~G_=yWx.a%3Rz"=cMdq!Zi >ߐqYܳ"ֳP,XrQ ̀i$L -tZl ߠ@e{I> +ՁL iBµC@.t.+ R!Qax^Hb1U$JսH)a[~jCAP!HYdZ䬅M)XByGRΠ$cZOt UGTV + LmN>d]\F#>MVncXylKɻϴ$kEG"CW cǕ Q;%%% ^KC"Oeawbځ6f؝{>Ewb4DStc, cH$tT{6.9Qf;C yO JRunMj䳼HVK&);q޵qSmh,3, ʕ>FM'*m bM_V3nVJ8Qԝi:~V1Wt|٪p"Dm~XaJffAg"b4Dr) "ЅTs*x+@1v,#mOIY Kp0p\0^Q$!hU{$` VjpLy r"ǁ N A(6bڭwx=&2EXky]~sKi&}RK.km`rBbHSOV_kK$m28 j@he#QZ0.cFd<VC԰$*((Dgf!hnnyTUERmFzTQ;X/iUb1IP,^r ¢֍Gj`@Z[C$X% ]$rnbARE^Tw O&AdJ_@ *`6-]P(~JNQ^hPiXx oD#W3K~ҙVd{љ@)8$ \TpNyy 힉:4l-e ۂ#F+m 6 diA jMâYS1,J (Q/Z&'q^!RLIv jTE7k;yKWR R+gG!+gg)aՠY{]9kc&11T3(oNhW| VR>[W+m4o+m.0o@b= [(4(s&ecj ZnG4L4Py*` rVתAk5[km}ڐT(akwx1@ljBjAs5-St<%1鮺.g=Hiֵl@0%ղt-;Rp8ZVOZX^1[HȢ߽57I{,3f#yݓn&,fLh߾k0HE̖\rЎ*p;S>gJ= +3 m$M\‘Ԇ R%7H &x}Rul&7J[jXjea+njc&VxnQ }"*/hTz5F $:51-+ gJݟ ZۡCd+7J 'K*}T芵NËlb3kh-clfu˳P<+WLhQfڂ,C2]XQVΖTQeۣʴ& ʥ-6Wz@o/DkW- wr$!CGW{4ۛ vze6E~ wܙfq>d/)g( QMJE ܚJҩ7za; 8I=^Ou(Vw,%b^dϐ &_@J^O8$Ƒ0 J'0FC\/2)-ר [W{kiWpb TwK5gX쪴tkA`K~mSWo- D/x. Cc R" }(B۬`pfM[6k,+ z z5E6kgͨHL >k;/'{Я)d . EhSHމ ;%5}OsB+rD'^EpTCث楎=Z̥0C50*yweQCvwo6"X Ge}AQ7 p X7PGr=f )۩DcP-x=QFhk/%۠4; &vk~5 ^8V}Mkfz~^kT$/fbhNwm_[QwSmyU$ 6"H`bYNViNy$4V;+n1 9wavV`OM:k5AfқiN8(臘P9hAƲc j.+h,N|@y5M&ƺqX1d@WmDeՉ0dI;& $b1b:4{&j[*^%+DRaC[ 䟘EMqnx\UV+% zv%@h3 W#q QN v?U:ї-޽' %njGWnvA#Z*ڲ@/'e3S*'eDܣ AKX Qw6aJI )ҵwfFc= bTV*D7Mdq" )4E_t\.I҂+BARBJzrcn - WtUZUxă=x+@b3^2vүq6wl(5K,iP֬@$N}nTYk35vʹ`FMngԻFWrtNz{349,͖4~fr-ϒ vp6pxT^v#Z#e?X^ aͶ%N )@ k6RlcE}*{0kOmHLNBiHM`.)@9=ŴPّg$#η$}CG"v&Cڇ\dv&Q^CZIb=g 㿖g'hĐ"-=bQ{%$)h!F2$y%$E:=r19tmrS ފ ]-~; y/@ĖC gX҄3Wg92M.ZE.S<wR<3V[ͫ^9ji~?&Vwcxr=g OGݑZOlH0BOn̝4VF=@e6i hsg)J< ({9`]sp~,{ s8Nh-@u{ׄxMKa'DḬ!%>`3d,>k;rиX*),fI2MzBsb+M *: zFAKxm $髓y;ص=KԬhݰūb2;+7٘ 1]!Mԋ ՛Kr&$'f mķe"N9A90` O|F>6xc?#Yl*+_ɜPZ&"#uЀ>&q,;蓸2p}g`yE}rZA }V-׊H7ZzME:ݣo:~g? ?L-lh4jWxN;Qf7T 3"ɤ|q3-Ѣ5`(4_FG@Fa r%a,)#WVxőLxLA C`6G_@3v9- WXH1 lN%?v_9)N7Iʛ ų+пayR̴Y>][ /~~];vwoo},Lpl115i6YO{ [޲}L~LjK?_m( N)`2X΄$&Y'o~o]hr~-/-Qcu _~Oxd;o|ɀ@Ggnպޝzr|͋aYkjRV >jb҅}b,<]-L{|W.' @΅Wg{eXӺYVЪ?G^-L&.w6>MUglvkF_N;oM?يWBBo\Gi_ugh&/0KecѸBfg>8pC2v8chV5#"#ejlT!Ь V8S4n͚e zi<ևu$݊ZstUx^815Ŧ~`EMVeTWWO^m_~͓n^m^oqZthS{˵OeaZsD7zXTO|哯=ZSl:ȈFyhCZoշ_nOP|GϷ/>T@0":f^2E?GJmGO~l_@;C!FtF54-*0{`63LdVŒ`cciO<>?6`V,[DpPOltxYJ}R:ڽ|dj7ypؒ^z -nybMx#)ǽu}l/K1N!X endstream endobj 11 0 obj 10336 endobj 17 0 obj << /Filter /FlateDecode /Length 88 >> stream x5ͻ 0О)n1}Tmp,xĹ $$n&R9ܼ$[#auhhC-J2{z`#i& endstream endobj 18 0 obj << /BBox [ -1016 -351 1660 1068 ] /Filter /FlateDecode /Length 218 /Subtype /Form /Type /XObject >> stream x5P;! 9/i}o o f/J|4 ym, !ebqe7!{ư'Th*0F-#]x^\t%|9EieMf\[nFkBoq-./J*D,Z@}USb2;4JWe`iv_Xga~hog?O endstream endobj 15 0 obj << /BaseFont /DejaVuSans-Oblique /CharProcs 16 0 R /Encoding << /Differences [ 69 /E ] /Type /Encoding >> /FirstChar 0 /FontBBox [ -1016 -351 1660 1068 ] /FontDescriptor 14 0 R /FontMatrix [ 0.001 0 0 0.001 0 0 ] /LastChar 255 /Name /DejaVuSans-Oblique /Subtype /Type3 /Type /Font /Widths 13 0 R >> endobj 14 0 obj << /Ascent 929 /CapHeight 0 /Descent -236 /Flags 96 /FontBBox [ -1016 -351 1660 1068 ] /FontName /DejaVuSans-Oblique /ItalicAngle 0 /MaxWidth 1350 /StemV 0 /Type /FontDescriptor /XHeight 0 >> endobj 13 0 obj [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 318 401 460 838 636 950 780 275 390 390 500 838 318 361 318 337 636 636 636 636 636 636 636 636 636 636 337 337 838 838 838 531 1000 684 686 698 770 632 575 775 752 295 295 656 557 863 748 787 603 787 695 635 611 732 684 989 685 611 685 390 337 390 838 500 500 613 635 550 635 615 352 635 634 278 278 579 278 974 634 612 635 635 411 521 392 634 592 818 592 592 525 636 337 636 838 600 636 600 318 352 518 1000 500 500 500 1350 635 400 1070 600 685 600 600 318 318 518 518 590 500 1000 500 1000 521 400 1028 600 525 611 318 401 636 636 636 636 337 500 500 1000 471 617 838 361 1000 500 500 838 401 401 500 636 636 318 500 401 471 617 969 969 969 531 684 684 684 684 684 684 974 698 632 632 632 632 295 295 295 295 775 748 787 787 787 787 787 838 787 732 732 732 732 611 608 630 613 613 613 613 613 613 995 550 615 615 615 615 278 278 278 278 612 634 612 612 612 612 612 838 612 634 634 634 634 592 635 592 ] endobj 16 0 obj << /E 17 0 R >> endobj 23 0 obj << /Filter /FlateDecode /Length 88 >> stream x5 0D{8R[.{9>G-dCxI9>Q4Zo:Hsd33}d4I!rY)z>~ endstream endobj 24 0 obj << /Filter /FlateDecode /Length 259 >> stream x=RIr0 |wII'ԗcwi+Y~.;K"|mn%%WYJXX5UOLL$KI=~^~[dc[LذT4ݔVve,7d&uK0/Ağr, )v@xW S+;DR93KF#`m֘ UEkN+">97t0MUȰRX{h pzq+fd endstream endobj 25 0 obj << /Filter /FlateDecode /Length 232 >> stream x5Q;r1} ] 3og3JFfa =؈ėoYf~'Y)QTEX!Yjs#Sr&>'b8Ύf01h9f=!#n4U i[ZSEȺ)Z[=- c _ĜE'~3尒4#15όO}>hw/̈́LHœƘ1T$?г>0TG endstream endobj 26 0 obj << /Filter /FlateDecode /Length 160 >> stream x=K CBGtJ l}b"'ć$l{0rM$q ¦cɦuJ~w4ft-Ev!"ܣ<`1J0Ze=DG7(*KDw4e8$ endstream endobj 27 0 obj << /Filter /FlateDecode /Length 79 >> stream xMͻ О)<>Q"Bc?N:hwZQ}Ps=DX3%:_0ØȶV endstream endobj 28 0 obj << /Filter /FlateDecode /Length 244 >> stream xMQIn0 yO_K:LYw'&𲅺:_6J ψ6"|PmLDEh#*D ^cGܭ4oӚG csd#i]Ez )܄9z׵̞'jhN!X(ܨ2*Si=8Nh=ٱS\B^L XM,l~T7oBx?X[ endstream endobj 29 0 obj << /Filter /FlateDecode /Length 77 >> stream x375R0Pf& F )\@>ehifY&@) " a`9 $6f[W endstream endobj 30 0 obj << /Filter /FlateDecode /Length 49 >> stream x34U0P F )\@> 4XiLEWD endstream endobj 31 0 obj << /Filter /FlateDecode /Length 75 >> stream x50{`ɥ htMMBQ0tf}qhV^hJA endstream endobj 32 0 obj << /Filter /FlateDecode /Length 212 >> stream x5P91@$m0(]߆X1Z~_ߊfXl.x\ 67dHDid[n6EMsK7ImZzrvC` jMX=S:}+tӓ=g>KىD/ȐӚK M4ѯ<6 AR\ke闣01,@vW%i3S endstream endobj 33 0 obj << /BBox [ -1021 -463 1794 1233 ] /Filter /FlateDecode /Length 238 /Subtype /Form /Type /XObject >> stream xEM0>G0> stream xEK!CGp;.:l%(3{Lnd;0sJlLN\#T޼頉{DΣY jg.7ɭFiwyHT9λi Yմlk?*MlVWw'K~0%?Q|]7g'W&kyI_ʣq)$_SS{ginV9 endstream endobj 35 0 obj << /Filter /FlateDecode /Length 64 >> stream x334T0P5f& F )\@>L̀,cSS$625pD)ON endstream endobj 36 0 obj << /Filter /FlateDecode /Length 153 >> stream x5 0DbX!dS낝HF<3c2a4Gȁ/i ι^$UQV" 9'R$ZUVޯN]yճMwMGbJ)uG$*`h60J};Z+w{\x6 endstream endobj 37 0 obj << /Filter /FlateDecode /Length 70 >> stream x30Q0Pb3s3s#KC.# 3@.X 261R044L͍b0@YKA9P9\iOT/ endstream endobj 38 0 obj << /Filter /FlateDecode /Length 304 >> stream x=;0 C{Ȍd'>2VI(/u< i& b;w؞D/)ϡ+E:Ū0[M*K õ}74uK hY pu;Gw5<TQ!OJ|<(!\{0FS@\^BAjI'> stream xEQIr! ++Nͩk,3IN`k1i-x!́/|M4|72:pO.ܗ˂g–WTw/]H}w~fd{H͐:B4&!=#2V,s)R([.ꕶN;#o#JvMl:˶.:$vaqj!"uc5N"v0Q$gq&M]9yV*9>^Ƅtc׶i_>}?\" endstream endobj 40 0 obj << /Filter /FlateDecode /Length 71 >> stream x34P0P0S546T04V073PH1 X\00247CbBeX r`J# endstream endobj 41 0 obj << /Filter /FlateDecode /Length 67 >> stream x34P0P4W546T060Q073PH11s,lLeb ̀Ɓ% 9pr΃ endstream endobj 42 0 obj << /Filter /FlateDecode /Length 230 >> stream x5QIn0 .AO ``hKxA[֌]< 'Q^{ .o8|^Z9O2 D`@ai'ώH5YN_KK(O~ J.kO8'O [WLcD.A|!]'@;綟Wuu)O645I"%Ҹ[{TS endstream endobj 43 0 obj << /Filter /FlateDecode /Length 68 >> stream x366W0P04FF @V!HD! $bY@8i -D6 G endstream endobj 44 0 obj << /Filter /FlateDecode /Length 66 >> stream x36P0P07W544U022P042QH12443s`9`a$r`Zs: P9\iM8 endstream endobj 45 0 obj << /Filter /FlateDecode /Length 227 >> stream x5O;! 9.m`ϳT/od HDG&^S=Ä=Ba$5븛ſ]3 b0řvX'qNcDlc]L(!0%)}9:Nb.a}1WOdP=&ՍI4^2`a$YNkGQ"1'2Ҝb :; *s>h][M endstream endobj 46 0 obj << /Filter /FlateDecode /Length 245 >> stream xEPC1 =`,{wHۿ=JFp!Z?ZK oGFA= 3A΄@xFnvpμ39Zpә\'mBITqTqLύׁlӑ!KI%&~S*)[*EH䁓M4,?Cb̠Q0qGuٜ9-L|X&Q)2>'\N}䢥Uޑ"ۡW%Qէ<Y> endstream endobj 47 0 obj << /Filter /FlateDecode /Length 392 >> stream x=RKn1)@Mr[T /1 %?ꒈ3L~r]Qljg!.6Xr_rњbO/ȴTXVݣC(-װr{d`Jn@CHYAaPl( WԬtb ) ٠[]aP[[xfޑ3qYk?=Q2QMg|2RCgB'`$Ip#A 1qOl)V;ޒ{,\L'ib?lK\+E(~Aq|XdDw#h% 0xyDhDԎ=(ͱ&{ǫvzcw. endstream endobj 48 0 obj << /Filter /FlateDecode /Length 133 >> stream xMA0~tzJ-6팀03 endstream endobj 49 0 obj << /Filter /FlateDecode /Length 247 >> stream xMQmD1 \ky R]oC /)%K [UC?13,=?TPbht/"+ߏe s`&4`oI&ռ3d‰ATwM,3V7: lx%D`r Z`Q+ tĺv7C/਺x} K{,|BL;wI#fR:=b}@e+ (\* endstream endobj 50 0 obj << /Filter /FlateDecode /Length 338 >> stream xERKr0\ 3gNWp:<  2=eH6dWdՐFD)򹼖\nJ?72ͮЪG6F5+# CzVQdv!:Sp,Cu)mA#o<rLn[ :[m@ s` )(UI­\';PЪt79`Òho>F, f1H'N=q:őpI8@/ u:eMžBRq"n]ElO ?*3b Ԓ枾?9 endstream endobj 51 0 obj << /Filter /FlateDecode /Length 52 >> stream x363T0P0T026Q064bC.@rs`r endstream endobj 52 0 obj << /Filter /FlateDecode /Length 68 >> stream x32P0P4& f )\@B.H  %[B4AXf&fI8"ɴ endstream endobj 53 0 obj << /Filter /FlateDecode /Length 81 >> stream x=̻0>SB|[D|! nKw}zȀSj\Ni}}jKՉ?k endstream endobj 54 0 obj << /Filter /FlateDecode /Length 45 >> stream x32P0P4& f )\V.L,іp "} endstream endobj 55 0 obj << /Filter /FlateDecode /Length 255 >> stream xEK D#> stream x240S065U276r,#s# $`Ad_ endstream endobj 57 0 obj << /Filter /FlateDecode /Length 161 >> stream xEK CBGG|tJ■!M@w'/mK >[ x6n5uVhR}ith6s+ fz:rGp_Gdf)|Q]dcnk]3s: endstream endobj 58 0 obj << /Filter /FlateDecode /Length 320 >> stream x5Qq0 54sۿ @;a@dJ\UGM>`!S֖{&UF!}W2j]* UYFp&I8d Rӿccz endstream endobj 59 0 obj << /Filter /FlateDecode /Length 214 >> stream x=PC1= |7˥m$B6BLɔ:ʒ)O>Kbnd6%*E/% }ՖC4h9~ 3*K6p*3 mtV[ Ф`׶ r " JMrR=ot-N=Dkq: DpFjtaŲC5=kz7hGt4CָR endstream endobj 60 0 obj << /Filter /FlateDecode /Length 80 >> stream xE 0D{`~&f( JpO{:2Sa ,S`5FR죰n_uzS*Ovvq= endstream endobj 61 0 obj << /Filter /FlateDecode /Length 236 >> stream xMPKnD! s\I$!CU۱T*HUSbuM2yOQ nAb$<4#',;Ofč.`5[́9m:7@dP "B.ї9`Jw&\>աqZ coYaLq_֨ɲY I!}{ y+ՠ0u J*}$]S endstream endobj 62 0 obj << /Filter /FlateDecode /Length 147 >> stream x=O 1 =8z,[\FR"@eG \b9/i?iX5GaXn,JW-^ B]HޭLd<;p'>TYz@;DYIXV]ju=̪'k)PTBt{ o/ endstream endobj 63 0 obj << /Filter /FlateDecode /Length 149 >> stream x5K! C9/0R~p6aZ /KL`c%TO>$#I9P7OhL 3l%t2[VNH6f^S $jeF2T`<3\脇ʰN1fF~{20c endstream endobj 64 0 obj << /Filter /FlateDecode /Length 401 >> stream x5RK1)@Sorm$^̠= SK)+Llʿ'n+ǖ!VS'#O13j3DbjI@Q&`bvm?Յvx2@f)KP$mgrV5*h9ь#n. yۑȐA:@ #'=;Mws)IZcY : x]R9Ǡ50-Ml2XGʬ<1رq9q8P r8+lڱ4*l'Vz떪t̓3V1hp@.~{AoDf y}zB9 }0rKH}tr"}p+4c4JAFy endstream endobj 65 0 obj << /Filter /FlateDecode /Length 49 >> stream x36P0P040F@B!H Y@8&+ & endstream endobj 66 0 obj << /Filter /FlateDecode /Length 79 >> stream xE 0{` 10Pl4'H8H3M ̉8lecj,mf endstream endobj 67 0 obj << /Filter /FlateDecode /Length 157 >> stream xEC1DsUA wJo-%S'"h0yM%V,&rAJ1xN1븨ufihW3=5'M<[ }@8IP1}bv">G)#qbn fW7y endstream endobj 68 0 obj << /Filter /FlateDecode /Length 332 >> stream x-R9$1 ~`LtIUls#h/#xE=f۴[iGiK,W ;BjW0wy.2meDkag؏]e8*Jl !2J'Qw\I2[E™w2;yNE{ kF9+%|6vzrYɩHHӺ NKؖߗ3| endstream endobj 69 0 obj << /Filter /FlateDecode /Length 68 >> stream x336S0P0 F )\@>,́,# .C c0mbl`fbdY 1 r endstream endobj 70 0 obj << /Filter /FlateDecode /Length 317 >> stream x5RKrC1ۿSpΘ}tj'+-@B./YK~%ۥW%B>R-G- Q=2'":xa>N)x_xN;2$KMH=I+4t~&+s{rj X+)$=Hr7VސWg%&&MܕBXtLX㰄*aՃM5fcdxLP} #GMv²[6!D3,($Nc$ Ұ9 9e, mh%zМaמE[{ endstream endobj 71 0 obj << /Filter /FlateDecode /Length 17 >> stream x36P0C. endstream endobj 72 0 obj << /Filter /FlateDecode /Length 131 >> stream xE ! CT>՞0ABA";06Ѣ76իc,zRV鐇Pi0QąYLCaΘȖ2MlTv<e~ma, U^ ?KwUBS0 endstream endobj 73 0 obj << /Filter /FlateDecode /Length 338 >> stream x5R9@ } ] v͜~߆_ CVie!U-.Im W%ڥ Pt,6˯JH+kLwIi"Eo7o}=@.^ AS(i|Ъc(ew 4<3}(~_K&(? _osџa`Ś}@*z`yT endstream endobj 74 0 obj << /Filter /FlateDecode /Length 248 >> stream x-Q9AzBsˑ C :-qPO+Uwu9HTM]vf5,?c 7zqxLu5{kOfP2+qSușO \ ȹeƌ#M!RH&3AQ~#aU#j \Ks4;<9GW +ET<pC7ҹ^s0XM7/=[ endstream endobj 75 0 obj << /Filter /FlateDecode /Length 171 >> stream xMMB!0h\vK!CGFGx1 2&^$ m;,1',#`kܛG ADko5u~~]ԥu# ȎP p=&T)8T bSUhV=^; endstream endobj 76 0 obj << /Filter /FlateDecode /Length 72 >> stream x50{6X`KEoC|N/Z #pu#])Ec΂q_H1F=#O_p} endstream endobj 77 0 obj << /Filter /FlateDecode /Length 88 >> stream x50C{OɥJoЀw:A).nWz&LC`EՋZ-_ncb*?$ u^8{ endstream endobj 78 0 obj << /Filter /FlateDecode /Length 138 >> stream x=A1y?)vBX޳UO_K^1BCoj NjK)Jș`gzb8V}F%hGSiܖq5)\W4ݴk8߽U__. endstream endobj 79 0 obj << /Filter /FlateDecode /Length 74 >> stream x= 0 "#4M2i >d(]iBIO[_mվ*K{ j26|w wN endstream endobj 80 0 obj << /Filter /FlateDecode /Length 210 >> stream x5P C1g dVukm;aBXȔy)K>:L." u%ʚ +`p&^7`i5tႦ.B%|u{OxjrvC` jMX> /FirstChar 0 /FontBBox [ -1021 -463 1794 1233 ] /FontDescriptor 20 0 R /FontMatrix [ 0.001 0 0 0.001 0 0 ] /LastChar 255 /Name /DejaVuSans /Subtype /Type3 /Type /Font /Widths 19 0 R >> endobj 20 0 obj << /Ascent 929 /CapHeight 0 /Descent -236 /Flags 32 /FontBBox [ -1021 -463 1794 1233 ] /FontName /DejaVuSans /ItalicAngle 0 /MaxWidth 1342 /StemV 0 /Type /FontDescriptor /XHeight 0 >> endobj 19 0 obj [ 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 318 401 460 838 636 950 780 275 390 390 500 838 318 361 318 337 636 636 636 636 636 636 636 636 636 636 337 337 838 838 838 531 1000 684 686 698 770 632 575 775 752 295 295 656 557 863 748 787 603 787 695 635 611 732 684 989 685 611 685 390 337 390 838 500 500 613 635 550 635 615 352 635 634 278 278 579 278 974 634 612 635 635 411 521 392 634 592 818 592 592 525 636 337 636 838 600 636 600 318 352 518 1000 500 500 500 1342 635 400 1070 600 685 600 600 318 318 518 518 590 500 1000 500 1000 521 400 1023 600 525 611 318 401 636 636 636 636 337 500 500 1000 471 612 838 361 1000 500 500 838 401 401 500 636 636 318 500 401 471 612 969 969 969 531 684 684 684 684 684 684 974 698 632 632 632 632 295 295 295 295 775 748 787 787 787 787 787 838 787 732 732 732 732 611 605 630 613 613 613 613 613 613 982 550 615 615 615 615 278 278 278 278 612 634 612 612 612 612 612 838 612 634 634 634 634 592 635 592 ] endobj 22 0 obj << /A 23 0 R /B 24 0 R /C 25 0 R /D 26 0 R /E 27 0 R /G 28 0 R /H 29 0 R /I 30 0 R /N 31 0 R /O 32 0 R /R 34 0 R /T 35 0 R /U 36 0 R /V 37 0 R /a 38 0 R /b 39 0 R /bracketleft 40 0 R /bracketright 41 0 R /c 42 0 R /colon 43 0 R /comma 44 0 R /d 45 0 R /e 46 0 R /eight 47 0 R /f 48 0 R /five 49 0 R /g 50 0 R /hyphen 51 0 R /i 52 0 R /k 53 0 R /l 54 0 R /m 55 0 R /n 57 0 R /nine 58 0 R /o 59 0 R /one 60 0 R /p 61 0 R /parenleft 62 0 R /parenright 63 0 R /percent 64 0 R /period 65 0 R /plus 66 0 R /r 67 0 R /s 68 0 R /seven 69 0 R /six 70 0 R /space 71 0 R /t 72 0 R /three 73 0 R /two 74 0 R /u 75 0 R /v 76 0 R /w 77 0 R /y 78 0 R /z 79 0 R /zero 80 0 R >> endobj 3 0 obj << /F1 21 0 R /F2 15 0 R >> endobj 4 0 obj << /A1 << /CA 0 /Type /ExtGState /ca 1 >> /A2 << /CA 1 /Type /ExtGState /ca 1 >> /A3 << /CA 0.8 /Type /ExtGState /ca 0.8 >> >> endobj 81 0 obj << /BBox [ 0 0 72 72 ] /Filter /FlateDecode /Length 123 /Matrix [ 1 0 0 1 0 432 ] /PaintType 1 /PatternType 1 /Resources << /Procsets [ /PDF /Text /ImageB /ImageC /ImageI ] >> /TilingType 1 /Type /Pattern /XStep 72 /YStep 72 >> stream x-10 w!]md2 h+Eu ZYoY+[z;Grr!sB0MFhVG[F ^n?!$ endstream endobj 5 0 obj << /H1 81 0 R >> endobj 6 0 obj << >> endobj 7 0 obj << /DejaVuSans-Oblique-sigma 18 0 R /DejaVuSans-Phi 33 0 R /DejaVuSans-minus 56 0 R /M0 12 0 R >> endobj 12 0 obj << /BBox [ -3.5 -3.5 3.5 3.5 ] /Filter /FlateDecode /Length 131 /Subtype /Form /Type /XObject >> stream xmA E=E/IKEekLq@L4о<~QN$ KNzӐҺLղ(ǠQ-u8pctx6ޓ?Y!F?{C&\)1 /^~cZC endstream endobj 2 0 obj << /Count 1 /Kids [ 10 0 R ] /Type /Pages >> endobj 82 0 obj << /CreationDate (D:20190114093953+02'00') /Creator (matplotlib 2.1.0, http://matplotlib.org) /Producer (matplotlib pdf backend 2.1.0) >> endobj xref 0 83 0000000000 65535 f 0000000016 00000 n 0000030401 00000 n 0000029403 00000 n 0000029446 00000 n 0000029973 00000 n 0000030005 00000 n 0000030026 00000 n 0000000065 00000 n 0000000385 00000 n 0000000208 00000 n 0000010796 00000 n 0000030139 00000 n 0000011853 00000 n 0000011645 00000 n 0000011330 00000 n 0000012906 00000 n 0000010818 00000 n 0000010978 00000 n 0000027672 00000 n 0000027472 00000 n 0000026857 00000 n 0000028725 00000 n 0000012938 00000 n 0000013098 00000 n 0000013430 00000 n 0000013735 00000 n 0000013968 00000 n 0000014119 00000 n 0000014436 00000 n 0000014585 00000 n 0000014706 00000 n 0000014853 00000 n 0000015138 00000 n 0000015510 00000 n 0000015810 00000 n 0000015946 00000 n 0000016172 00000 n 0000016314 00000 n 0000016691 00000 n 0000017001 00000 n 0000017144 00000 n 0000017283 00000 n 0000017586 00000 n 0000017726 00000 n 0000017864 00000 n 0000018164 00000 n 0000018482 00000 n 0000018947 00000 n 0000019153 00000 n 0000019473 00000 n 0000019884 00000 n 0000020008 00000 n 0000020148 00000 n 0000020301 00000 n 0000020418 00000 n 0000020746 00000 n 0000020916 00000 n 0000021150 00000 n 0000021543 00000 n 0000021830 00000 n 0000021982 00000 n 0000022291 00000 n 0000022511 00000 n 0000022733 00000 n 0000023207 00000 n 0000023328 00000 n 0000023479 00000 n 0000023709 00000 n 0000024114 00000 n 0000024254 00000 n 0000024644 00000 n 0000024733 00000 n 0000024937 00000 n 0000025348 00000 n 0000025669 00000 n 0000025913 00000 n 0000026057 00000 n 0000026217 00000 n 0000026428 00000 n 0000026574 00000 n 0000029588 00000 n 0000030461 00000 n trailer << /Info 82 0 R /Root 1 0 R /Size 83 >> startxref 30615 %%EOF PKmNtyZb b FNuRadioMC/examples/Sensitivities/RNO_Proposal/make_RNO_limit_figure.pyimport numpy as np from matplotlib import pyplot as plt from NuRadioMC.utilities import fluxes from NuRadioMC.examples.Sensitivities import E2_fluxes3 as limit from NuRadioMC.utilities import units import json legendfontsize = 11 # PyREx 1.5 sigma 60 m (trigger level, km3sr) # En Veff Error pyrex_60 = np.array(( #[15.5, 8.031E-3, 3.583E-3], [16.0, 6.989E-2, 9.930E-3], [16.5, 3.711E-1, 2.965E-2], [17.0, 1.290E+0, 5.528E-2], [17.5, 3.250E+0, 1.396E-1], [18.0, 7.013E+0, 2.509E-1], [18.5, 1.249E+1, 4.185E-1], [19.0, 2.290E+1, 5.823E-1], [19.5, 4.273E+1, 9.290E-1], #[20.0, 6.479E+1, 1.144E+0] )) pyrex_60[:,0] = 10**pyrex_60[:,0] *units.eV pyrex_60[:,1] *= units.km**3 pyrex_60[:,2] *= units.km**3 # PyREx 1.5 sigma 100 m (trigger level, km3sr) # En Veff Error pyrex_100 = np.array(( #[15.5, 9.033E-3, 4.249E-3], [16.0, 6.816E-2, 9.530E-3], [16.5, 5.060E-1, 3.370E-2], [17.0, 1.717E+0, 6.563E-2], [17.5, 4.931E+0, 1.719E-1], [18.0, 1.056E+1, 3.163E-1], [18.5, 1.971E+1, 5.258E-1], [19.0, 3.530E+1, 7.036E-1], [19.5, 6.863E+1, 1.177E+0], #[20.0, 1.083E+2, 1.519E+0] )) pyrex_100[:,0] = 10**pyrex_100[:,0] *units.eV pyrex_100[:,1] *= units.km**3 pyrex_100[:,2] *= units.km**3 # fig, ax = limit.get_E2_limit_figure(diffuse = True, show_ice_cube_EHE_limit=True, show_ice_cube_HESE_fit=False, show_ice_cube_HESE_data=True, show_ice_cube_mu=True, show_anita_I_III_limit=True, show_auger_limit=True, show_neutrino_best_fit=True, show_neutrino_best_case=True, show_neutrino_worst_case=True, show_ara=True, show_grand_10k=True, show_grand_200k=False, show_radar=False) labels = [] labels = limit.add_limit(ax, labels, pyrex_60[:,0],pyrex_60[:,1] , 61, 'RNO (trigger)', livetime=5*units.year, linestyle='-', color='r',linewidth=3) labels = limit.add_limit(ax, labels, pyrex_100[:,0],pyrex_100[:,1] , 61, 'RNO 100m (trigger)', livetime=5*units.year, linestyle='--', color='r',linewidth=3) plt.legend(handles=labels, loc=2,fontsize= legendfontsize) ax.set_aspect('equal') fig.tight_layout() fig.savefig("Diffuse_proposal.pdf") plt.show() PKmNXjA  2NuRadioMC/examples/cluster/A02generate_jobfiles.pyimport glob import os # define the base directory of this job base_dir ="/pub/arianna/NuRadioMC/station_designs" # specify the NuRadioMC python steering file (needs to be in base_dir) detector_sim = 'T02RunSimulation.py' # specify detector description (needs to be in base_dir) detector_filename = 'surface_station_1GHz.json' # specify directory that contains the detector descriptions det_dir = os.path.join(base_dir, "detectors") # specify the NuRadioMC config file that should be used for this simulation config_file = os.path.join(base_dir, "config_5.yaml") # specify a working directory for this specific simulation run working_dir = os.path.join(base_dir, "suface_station_1GHz/05") # specify the directory containing the input event files, this directory needs to contain separate folders input_dir = "/pub/arianna/NuRadioMC/input_8km_1e7_1e5/" # specify the path to the software directory (where NuRadioMC, NuRadioReco and radiotools are installed in) software = '/data/users/jcglaser/software' # run and output directories are created automatically if not yet present if not os.path.exists(os.path.join(working_dir, "output")): os.makedirs(os.path.join(working_dir, "output")) if not os.path.exists(os.path.join(working_dir, "run")): os.makedirs(os.path.join(working_dir, "run")) # loop over all input event files and create a job script for each input file. for iF, filename in enumerate(sorted(glob.glob(os.path.join(input_dir, '*/*.hdf5.*')))): current_folder = os.path.split(os.path.dirname(filename))[-1] detector_file = os.path.join(det_dir, detector_filename) # check if subfolder for energies exist t1 = os.path.join(working_dir, "output", current_folder) if(not os.path.exists(t1)): os.makedirs(t1) t1 = os.path.join(working_dir, 'run', current_folder) if(not os.path.exists(t1)): os.makedirs(t1) output_filename = os.path.join(working_dir, "output", current_folder, os.path.basename(filename)) cmd = "python {} {} {} {} {}\n".format(os.path.join(base_dir, detector_sim), filename, detector_file, config_file, output_filename) # here we add specific settings for the grid engine job scheduler, this part need to be adjusted to the specifics # of your cluster header = '#!/bin/bash\n' header += '#$ -N C_{}\n'.format(iF) header += '#$ -j y\n' header += '#$ -V\n' header += '#$ -q grb,grb64\n' header += '#$ -ckpt restart\n' # restart jobs in case of a node crash header += '#$ -o {}\n'.format(os.path.join(working_dir, 'run')) # add the software to the PYTHONPATH header += 'export PYTHONPATH={}/NuRadioMC:$PYTHONPATH\n'.format(software) header += 'export PYTHONPATH={}/NuRadioReco:$PYTHONPATH \n'.format(software) header += 'export PYTHONPATH={}/radiotools:$PYTHONPATH \n'.format(software) header += 'cd {} \n'.format(working_dir) with open(os.path.join(working_dir, 'run', current_folder, os.path.basename(filename) + ".sh"), 'w') as fout: fout.write(header) fout.write(cmd) PKmN=Jss!NuRadioMC/examples/cluster/READMEThis folder contains example script to use NuRadioMC on a cluster using a large number of cores at the same time. PKmN&&*NuRadioMC/simulation/E04RunStrawmenSim2.pyfrom __future__ import absolute_import, division, print_function import argparse # import detector simulation modules import NuRadioReco.modules.efieldToVoltageConverterPerChannel import NuRadioReco.modules.ARIANNA.triggerSimulator2 import NuRadioReco.modules.triggerSimulator import NuRadioReco.modules.channelResampler import NuRadioReco.modules.channelBandPassFilter from NuRadioReco.utilities import units from NuRadioMC.simulation import simulation2 as simulation import logging logging.basicConfig(level=logging.WARNING) logger = logging.getLogger("runstrawman") # initialize detector sim modules efieldToVoltageConverterPerChannel = NuRadioReco.modules.efieldToVoltageConverterPerChannel.efieldToVoltageConverterPerChannel() efieldToVoltageConverterPerChannel.begin(debug=False, time_resolution=1*units.ns) triggerSimulator = NuRadioReco.modules.triggerSimulator.triggerSimulator() triggerSimulatorARIANNA = NuRadioReco.modules.ARIANNA.triggerSimulator2.triggerSimulator() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() channelBandPassFilter = NuRadioReco.modules.channelBandPassFilter.channelBandPassFilter() class mySimulation(simulation.simulation): def _detector_simulation(self): # start detector simulation efieldToVoltageConverterPerChannel.run(self._evt, self._station, self._det) # convolve efield with antenna pattern # downsample trace back to detector sampling rate channelResampler.run(self._evt, self._station, self._det, sampling_rate=1. / self._dt) # bandpass filter trace, the upper bound is higher then the sampling rate which makes it just a highpass filter channelBandPassFilter.run(self._evt, self._station, self._det, passband=[80 * units.MHz, 1000 * units.MHz], filter_type='butter10') triggerSimulator.run(self._evt, self._station, self._det, threshold=3 * self._Vrms, # triggered_channels=None, triggered_channels=[0, 1, 2, 3, 4, 5, 6, 7], # triggered_channels=[0, 1, 2, 3], number_concidences=1, trigger_name='simple_threshold') triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[0, 1, 2, 3, 4, 5, 6, 7], number_concidences=3, cut_trace=False, trigger_name='high_low_3of8', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[0, 1, 2, 3, 4, 5, 6, 7], number_concidences=2, cut_trace=False, trigger_name='high_low_2of8', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[0, 1, 2, 3, 12, 13, 14, 15], number_concidences=3, cut_trace=False, trigger_name='high_low_2of8_LPDAs', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[0, 1, 2, 3], number_concidences=2, cut_trace=False, trigger_name='high_low_2of4_LPDA', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[4, 5, 6, 7], number_concidences=4, cut_trace=False, trigger_name='high_low_4of4_dipoles', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[8, 9, 10, 11], number_concidences=2, cut_trace=False, trigger_name='high_low_2of4_deep_dipoles') triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[0, 1, 2, 3, 4, 5, 6, 7], number_concidences=6, cut_trace=False, trigger_name='high_low_6of8_3sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=4 * self._Vrms, threshold_low=-4 * self._Vrms, triggered_channels=[0, 1, 2, 3], number_concidences=2, cut_trace=False, trigger_name='high_low_2of4_LPDA_4sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3.3 * self._Vrms, threshold_low=-3.3 * self._Vrms, triggered_channels=[0, 1, 2, 3], number_concidences=4, cut_trace=False, trigger_name='high_low_4of4_LPDA_3.3sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger triggerSimulatorARIANNA.run(self._evt, self._station, self._det, threshold_high=3.3 * self._Vrms, threshold_low=-3.3 * self._Vrms, triggered_channels=[4, 5, 6, 7], number_concidences=4, cut_trace=False, trigger_name='high_low_4of4_3.3sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC input event list') parser.add_argument('detectordescription', type=str, help='path to file containing the detector description') parser.add_argument('config', type=str, help='NuRadioMC yaml config file') parser.add_argument('outputfilename', type=str, help='hdf5 output filename') parser.add_argument('outputfilenameNuRadioReco', type=str, nargs='?', default=None, help='outputfilename of NuRadioReco detector sim file') args = parser.parse_args() sim = mySimulation(eventlist=args.inputfilename, outputfilename=args.outputfilename, detectorfile=args.detectordescription, station_id=101, outputfilenameNuRadioReco=args.outputfilenameNuRadioReco, config_file=args.config) sim.run() PKmN.lbEENuRadioMC/simulation/README# NuRadioMC examples ## ARA effective volume calculation ### 1st step: generate input events `python E01generate_event_list.py` this script will create a hdf5 file containing the neutrino vertices/directions/energies etc. in the folder _event_input_ In this example the neutrino energy is set to 1e19eV and 10,000 events are generated, so that the simulation runs relatively fast ### 2nd step: end-to-end simulation the second step involves the ray tracing, Askaryan signal generation and detector simulation. Execute `python E03RunARAsimulation.py event_input/1e19_n1e4.hdf5 detectors/ARA/50m_1GHz.json output/ARA/50m_1e19eV.hdf5` make sure that you created the folder _ouput/ARA_ so that the output file can be written The simulation takes about 30min on my 3 year old laptop. ### 3rd step: plot results the script `T05visualize_sim_output.py` produces the standard output/debug plots from the hdf5 output file. Just execute `python T05visualize_sim_output.py output/ARA/50m_1e19eV.hdf5` This script will also save the plots to _output/ARA/50m_1e19eV.hdf5/plot/_ for later inspection. PKmN.OO.NuRadioMC/simulation/T04visualize_sim_input.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.utilities import units import h5py import argparse import json import time import os parser = argparse.ArgumentParser(description='Plot NuRadioMC event list input') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC hdf5 simulation input') # parser.add_argument('outputfilename', type=str, # help='name of output file storing the electric field traces at detector positions') args = parser.parse_args() fin = h5py.File(args.inputfilename, 'r') # plot vertex distribution fig, ax = plt.subplots(1, 1) xx = np.array(fin['xx']) yy = np.array(fin['yy']) rr = (xx ** 2 + yy ** 2) ** 0.5 zz = np.array(fin['zz']) h = ax.hist2d(rr / units.m, zz / units.m, bins=[np.arange(0, 4000, 100), np.arange(-3000, 0, 100)], cmap=plt.get_cmap('Blues')) cb = plt.colorbar(h[3], ax=ax) cb.set_label("number of events") ax.set_aspect('equal') ax.set_xlabel("r [m]") ax.set_ylabel("z [m]") fig.tight_layout() plt.title('vertex distribution') plt.savefig("output/simInputVertex.pdf") # plot incoming direction zeniths = np.array(fin['zeniths']) azimuths = np.array(fin['azimuths']) fig, axs = php.get_histograms([zeniths / units.deg, azimuths / units.deg], bins=[np.arange(0, 181, 10), np.arange(0, 361, 45)], xlabels=['zenith [deg]', 'azimuth [deg]'], stats=False) fig.suptitle('neutrino direction') plt.title('incoming direction') plt.savefig("output/simInputIncoming.pdf") # plot inelasticity inelasticity = np.array(fin['inelasticity']) fig, axs = php.get_histogram(inelasticity, bins=np.logspace(np.log10(0.0001), np.log10(1.0), 50), xlabel='inelasticity', figsize=(6, 6), stats=True) axs.semilogx(True) plt.title('inelasticity') plt.savefig("output/simInputInelasticity.pdf") PKmNF1Y Y 4NuRadioMC/simulation/T04visualize_sim_inputExtend.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.utilities import units import h5py import argparse import json import time import os parser = argparse.ArgumentParser(description='Plot NuRadioMC event list input') parser.add_argument('inputfilename', type=str, nargs = '+', help='path to NuRadioMC hdf5 simulation input') # parser.add_argument('outputfilename', type=str, # help='name of output file storing the electric field traces at detector positions') args = parser.parse_args() filename = os.path.splitext(os.path.basename(args.inputfilename[0]))[0] dirname = os.path.dirname(args.inputfilename[0]) plot_folder = os.path.join(dirname, 'plots', filename) if(not os.path.exists(plot_folder)): os.makedirs(plot_folder) fin = h5py.File(args.inputfilename[0], 'r') xx = np.array(fin['xx']) yy = np.array(fin['yy']) zz = np.array(fin['zz']) zeniths = np.array(fin['zeniths']) azimuths = np.array(fin['azimuths']) inelasticity = np.array(fin['inelasticity']) for i in range(len((args.inputfilename)) - 1): fin = h5py.File(args.inputfilename[i + 1], 'r') xx = np.append(xx, np.array(fin['xx'])) yy = np.append(yy, np.array(fin['yy'])) zz = np.append(zz, np.array(fin['zz'])) zeniths = np.append(zeniths, np.array(fin['zeniths'])) azimuths = np.append(azimuths, np.array(fin['azimuths'])) inelasticity = np.append(inelasticity, np.array(fin['inelasticity'])) # plot vertex distribution fig, ax = plt.subplots(1, 1) rr = (xx ** 2 + yy ** 2) ** 0.5 plt.hist2d(rr / units.m, zz / units.m, bins=[np.arange(0, 9001, 100), np.arange(-3501, 0, 100)], cmap=plt.get_cmap('Blues')) cb = plt.colorbar() cb.set_label("number of events") ax.set_aspect('equal') plt.xlabel("r [m]") plt.ylabel("z [m]") plt.grid(True) fig.tight_layout() plt.title('vertex distribution') plt.savefig(os.path.join(plot_folder, 'simInputVertex.pdf'), bbox_inches="tight") plt.clf() # plot incoming direction plt.subplot(1, 2, 1) #plt.hist(zeniths / units.deg, bins = np.arange(0, 181, 10)) plt.hist(np.cos(zeniths / units.radian), bins = np.arange(-1.0, 1.001, 0.2)) plt.xlabel('cos(zenith)') plt.subplot(1, 2, 2) plt.hist(azimuths / units.deg, bins = np.arange(0, 361, 45)) plt.xlabel('azimuth [deg]') plt.suptitle('neutrino direction') plt.savefig(os.path.join(plot_folder, 'simInputIncoming.pdf'), bbox_inches="tight") plt.clf() # plot direction distribution plt.hist2d(azimuths / units.deg, np.cos(zeniths / units.radian), bins=[np.arange(0, 361, 5), np.arange(-1.0, 1.001, 0.05)], cmap=plt.get_cmap('Blues')) cb = plt.colorbar() cb.set_label("number of events") ax.set_aspect('equal') plt.xlabel("azimuth [deg]") plt.ylabel("cos(zenith)") plt.grid(True) plt.title('direction distribution') plt.savefig(os.path.join(plot_folder, 'simInputDirection.pdf'), bbox_inches="tight") plt.clf() # plot inelasticity plt.hist(inelasticity, bins=np.logspace(np.log10(0.0001), np.log10(1.0), 50)) plt.xlabel('inelasticity') plt.semilogx(True) plt.title('inelasticity') plt.figtext(1.0, 0.5, "N: " + str(len(inelasticity)) + "\nmean: " + str(np.mean(inelasticity)) + "\nmedian: " + str(np.median(inelasticity)) + "\nstd: " + str(np.std(inelasticity))) plt.savefig(os.path.join(plot_folder, 'simInputInelasticity.pdf'), bbox_inches="tight") PKmNpΊb6b6/NuRadioMC/simulation/T05visualize_sim_output.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.utilities import units from NuRadioMC.utilities import medium from NuRadioMC.utilities import plotting from six import iteritems import h5py import argparse import json import time import os from matplotlib.ticker import MultipleLocator, FormatStrFormatter parser = argparse.ArgumentParser(description='Plot NuRadioMC event list output.') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC hdf5 simulation output') parser.add_argument('--trigger_name', type=str, default=None, nargs='+', help='the name of the trigger that should be used for the plots') parser.add_argument('--Veff', type=str, help='specify json file where effective volume is saved as a function of energy') args = parser.parse_args() filename = os.path.splitext(os.path.basename(args.inputfilename))[0] dirname = os.path.dirname(args.inputfilename) plot_folder = os.path.join(dirname, 'plots', filename) if(not os.path.exists(plot_folder)): os.makedirs(plot_folder) fin = h5py.File(args.inputfilename, 'r') print('the following triggeres where simulated: {}'.format(fin.attrs['trigger_names'])) if(args.trigger_name is None): triggered = np.array(fin['triggered']) print("you selected any trigger") trigger_name = 'all' else: if(len(args.trigger_name) > 1): print("trigger {} selected which is a combination of {}".format(args.trigger_name[0], args.trigger_name[1:])) trigger_name = args.trigger_name[0] plot_folder = os.path.join(dirname, 'plots', filename, args.trigger_name[0]) if(not os.path.exists(plot_folder)): os.makedirs(plot_folder) triggered = np.zeros(len(fin['multiple_triggers'][:, 0]), dtype=np.bool) for trigger in args.trigger_name[1:]: iTrigger = np.squeeze(np.argwhere(fin.attrs['trigger_names'] == trigger)) triggered = triggered | np.array(fin['multiple_triggers'][:, iTrigger], dtype=np.bool) else: trigger_name = args.trigger_name[0] iTrigger = np.argwhere(fin.attrs['trigger_names'] == trigger_name) triggered = np.array(fin['multiple_triggers'][:, iTrigger], dtype=np.bool) print("\tyou selected '{}'".format(trigger_name)) plot_folder = os.path.join(dirname, 'plots', filename, trigger_name) if(not os.path.exists(plot_folder)): os.makedirs(plot_folder) weights = np.array(fin['weights'])[triggered] n_events = fin.attrs['n_events'] ########################### # calculate effective volume ########################### density_ice = 0.9167 * units.g / units.cm ** 3 density_water = 997 * units.kg / units.m ** 3 n_triggered = np.sum(weights) print('fraction of triggered events = {:.0f}/{:.0f} = {:.3f}'.format(n_triggered, n_events, n_triggered / n_events)) V = None if('xmax' in fin.attrs): dX = fin.attrs['xmax'] - fin.attrs['xmin'] dY = fin.attrs['ymax'] - fin.attrs['ymin'] dZ = fin.attrs['zmax'] - fin.attrs['zmin'] V = dX * dY * dZ elif('rmin' in fin.attrs): rmin = fin.attrs['rmin'] rmax = fin.attrs['rmax'] dZ = fin.attrs['zmax'] - fin.attrs['zmin'] V = np.pi * (rmax**2 - rmin**2) * dZ Veff = V * density_ice / density_water * 4 * np.pi * np.sum(weights) / n_events print("Veff = {:.6g} km^3 sr".format(Veff / units.km ** 3)) ########################### # plot neutrino direction ########################### fig, ax = php.get_histogram(np.array(fin['zeniths'])[triggered] / units.deg, weights=weights, ylabel='weighted entries', xlabel='zenith angle [deg]', bins=np.arange(0, 181, 5), figsize=(6, 6)) ax.set_xticks(np.arange(0, 181, 45)) ax.set_title(trigger_name) fig.tight_layout() fig.savefig(os.path.join(plot_folder, 'neutrino_direction.png')) ########################### # calculate sky coverage of 90% quantile ########################### from radiotools import stats q2 =stats.quantile_1d(np.array(fin['zeniths'])[triggered], weights, 0.95) q1 =stats.quantile_1d(np.array(fin['zeniths'])[triggered], weights, 0.05) from scipy import integrate def a(theta): return np.sin(theta) b = integrate.quad(a, q1, q2) print("90% quantile sky coverage {:.2f} sr".format(b[0] * 2 * np.pi)) ########################### # plot vertex distribution ########################### xx = np.array(fin['xx'])[triggered] yy = np.array(fin['yy'])[triggered] zz = np.array(fin['zz'])[triggered] fig, ax = plotting.plot_vertex_distribution(xx, yy, zz, weights=weights, rmax=rmax, zmin=fin.attrs['zmin'], trigger_name=trigger_name) fig.savefig(os.path.join(plot_folder, 'vertex_distribution.png'), bbox='tight') ########################### # loop over all stations and produce station specific plots ########################### for key, station in iteritems(fin): if isinstance(station, h5py._hl.group.Group): ########################### # recalculate triggers per station ########################### if(args.trigger_name is None): triggered = np.array(station['triggered']) print("you selected any trigger") trigger_name = 'all' else: if(len(args.trigger_name) > 1): print("trigger {} selected which is a combination of {}".format(args.trigger_name[0], args.trigger_name[1:])) trigger_name = args.trigger_name[0] triggered = np.zeros(len(station['multiple_triggers'][:, 0]), dtype=np.bool) for trigger in args.trigger_name[1:]: iTrigger = np.squeeze(np.argwhere(fin.attrs['trigger_names'] == trigger)) triggered = triggered | np.array(station['multiple_triggers'][:, iTrigger], dtype=np.bool) else: trigger_name = args.trigger_name[0] iTrigger = np.argwhere(fin.attrs['trigger_names'] == trigger_name) triggered = np.array(station['multiple_triggers'][:, iTrigger], dtype=np.bool) print("\tyou selected '{}'".format(trigger_name)) ########################### # plot incoming direction ########################### receive_vectors = np.array(station['receive_vectors'])[triggered] # for all events, antennas and ray tracing solutions zeniths, azimuths = hp.cartesian_to_spherical(receive_vectors[:, :, :, 0].flatten(), receive_vectors[:, :, :, 1].flatten(), receive_vectors[:, :, :, 2].flatten()) for i in range(len(azimuths)): azimuths[i] = hp.get_normalized_angle(azimuths[i]) weights_matrix = np.outer(weights, np.ones(np.prod(receive_vectors.shape[1:-1]))).flatten() mask = ~np.isnan(azimuths) # exclude antennas with not ray tracing solution (or with just one ray tracing solution) fig, axs = php.get_histograms([zeniths[mask] / units.deg, azimuths[mask] / units.deg], bins=[np.arange(0, 181, 5), np.arange(0, 361, 45)], xlabels=['zenith [deg]', 'azimuth [deg]'], weights=weights_matrix[mask], stats=False) # axs[0].xaxis.set_ticks(np.arange(0, 181, 45)) majorLocator = MultipleLocator(45) majorFormatter = FormatStrFormatter('%d') minorLocator = MultipleLocator(5) axs[0].xaxis.set_major_locator(majorLocator) axs[0].xaxis.set_major_formatter(majorFormatter) axs[0].xaxis.set_minor_locator(minorLocator) fig.suptitle('incoming signal direction') fig.savefig(os.path.join(plot_folder, '{}_incoming_signal.png'.format(key))) ########################### # plot polarization ########################### p = np.array(station['polarization'])[triggered] p_H = (p[:,:,:,0]**2 + p[:,:,:,1]**2)**0.5 p_V = np.abs(p[:,:,:,2]) weights_matrix = np.outer(weights, np.ones(np.prod(p_V.shape[1:]))).flatten() p_ratio = (p_V/p_H).flatten() bins = np.linspace(0, 1, 50) # for all events, antennas and ray tracing solutions mask = zeniths > 90 * units.deg # select rays coming from below fig, ax = php.get_histogram(p_ratio, bins=bins, xlabel='vertical/horizonal polarization ratio', weights=weights_matrix, stats=False, kwargs={'facecolor':'0.7', 'alpha':1, 'edgecolor':"k", 'label': 'all'}, figsize=(6, 6)) maxy = ax.get_ylim() php.get_histogram(p_ratio[mask], bins=bins, weights=weights_matrix[mask], stats=False, xlabel='vertical/horizonal polarization ratio', ax=ax, kwargs={'facecolor': 'C0', 'alpha': 1, 'edgecolor': "k", 'label': 'direct rays'}) # ax.set_xticks(bins) ax.legend() ax.set_ylim(maxy) fig.tight_layout() fig.savefig(os.path.join(plot_folder, '{}_polarization.png'.format(key))) mask = zeniths > 90 * units.deg # select rays coming from below fig, ax = php.get_histogram(p_ratio, bins=bins, stats=False, xlabel='vertical/horizonal polarization ratio', kwargs={'facecolor':'0.7', 'alpha':1, 'edgecolor':"k", 'label': 'all'}, figsize=(6, 6)) maxy = ax.get_ylim() php.get_histogram(p_ratio[mask], bins=bins, xlabel='vertical/horizonal polarization ratio', stats=False, ax=ax, kwargs={'facecolor': 'C0', 'alpha': 1, 'edgecolor': "k", 'label': 'direct rays'}) # ax.set_xticks(bins) ax.legend() ax.set_ylim(maxy) fig.tight_layout() fig.savefig(os.path.join(plot_folder, '{}_polarization_unweighted.png'.format(key))) ########################### # plot viewing angle ########################### shower_axis = -1 * hp.spherical_to_cartesian(np.array(fin['zeniths'])[triggered], np.array(fin['azimuths'])[triggered]) launch_vectors = np.array(station['launch_vectors'])[triggered] viewing_angles = np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, 0, 0])]) # calculate correct chereknov angle for ice density at vertex position ice = medium.southpole_simple() n_indexs = np.array([ice.get_index_of_refraction(x) for x in np.array([np.array(fin['xx'])[triggered], np.array(fin['yy'])[triggered], np.array(fin['zz'])[triggered]]).T]) rho = np.arccos(1. / n_indexs) mask = ~np.isnan(viewing_angles) fig, ax = php.get_histogram((viewing_angles[mask] - rho[mask]) / units.deg, weights=weights[mask], bins=np.arange(-30, 30, 1), xlabel='viewing - cherenkov angle [deg]', figsize=(6, 6)) fig.savefig(os.path.join(plot_folder, '{}_dCherenkov.png'.format(key))) ########################### # plot flavor ratios ########################### flavor_labels = ['e cc', r'$\bar{e}$ cc', 'e nc', r'$\bar{e}$ nc', '$\mu$ cc', r'$\bar{\mu}$ cc', '$\mu$ nc', r'$\bar{\mu}$ nc', r'$\tau$ cc', r'$\bar{\tau}$ cc', r'$\tau$ nc', r'$\bar{\tau}$ nc'] yy = np.zeros(len(flavor_labels)) yy[0] = np.sum(weights[(fin['flavors'][triggered] == 12) & (fin['interaction_type'][triggered] == 'cc')]) yy[1] = np.sum(weights[(fin['flavors'][triggered] == -12) & (fin['interaction_type'][triggered] == 'cc')]) yy[2] = np.sum(weights[(fin['flavors'][triggered] == 12) & (fin['interaction_type'][triggered] == 'nc')]) yy[3] = np.sum(weights[(fin['flavors'][triggered] == -12) & (fin['interaction_type'][triggered] == 'nc')]) yy[4] = np.sum(weights[(fin['flavors'][triggered] == 14) & (fin['interaction_type'][triggered] == 'cc')]) yy[5] = np.sum(weights[(fin['flavors'][triggered] == -14) & (fin['interaction_type'][triggered] == 'cc')]) yy[6] = np.sum(weights[(fin['flavors'][triggered] == 14) & (fin['interaction_type'][triggered] == 'nc')]) yy[7] = np.sum(weights[(fin['flavors'][triggered] == -14) & (fin['interaction_type'][triggered] == 'nc')]) yy[8] = np.sum(weights[(fin['flavors'][triggered] == 16) & (fin['interaction_type'][triggered] == 'cc')]) yy[9] = np.sum(weights[(fin['flavors'][triggered] == -16) & (fin['interaction_type'][triggered] == 'cc')]) yy[10] = np.sum(weights[(fin['flavors'][triggered] == 16) & (fin['interaction_type'][triggered] == 'nc')]) yy[11] = np.sum(weights[(fin['flavors'][triggered] == -16) & (fin['interaction_type'][triggered] == 'nc')]) fig, ax = plt.subplots(1, 1, figsize=(8, 6)) ax.bar(range(len(flavor_labels)), yy) ax.set_xticks(range(len(flavor_labels))) ax.set_xticklabels(flavor_labels, fontsize='large', rotation=45) ax.set_title("trigger: {}".format(trigger_name)) ax.set_ylabel('weighted number of triggers', fontsize='large') fig.tight_layout() fig.savefig(os.path.join(plot_folder, '{}_flavor.png'.format(key))) plt.show() PKmN0"**5NuRadioMC/simulation/T05visualize_sim_outputExtend.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.utilities import units from NuRadioMC.utilities import medium import h5py import argparse import json import time import os parser = argparse.ArgumentParser(description='Plot NuRadioMC event list output.') parser.add_argument('inputfilename', type=str, nargs = '+', help='path to NuRadioMC hdf5 simulation output') # parser.add_argument('outputfilename', type=str, # help='name of output file storing the electric field traces at detector positions') args = parser.parse_args() filename = os.path.splitext(os.path.basename(args.inputfilename[0]))[0] dirname = os.path.dirname(args.inputfilename[0]) plot_folder = os.path.join(dirname, 'plots', filename) if(not os.path.exists(plot_folder)): os.makedirs(plot_folder) fin = h5py.File(args.inputfilename[0], 'r') #weights = np.array(fin['weights'])[np.array(fin['weights']) > 1e-10] weights = np.array(fin['weights']) triggered = np.array(fin['triggered']) xx = np.array(fin['xx']) yy = np.array(fin['yy']) zz = np.array(fin['zz']) receive_vectors = np.array(fin['receive_vectors']) theta = np.array(fin['zeniths']) phi = np.array(fin['azimuths']) polarization = np.array(fin['polarization']).flatten() launch_vectors = np.array(fin['launch_vectors']) n_events = fin.attrs['n_events'] for i in range(len(args.inputfilename) - 1): fin = h5py.File(args.inputfilename[i + 1], 'r') weights = np.append(weights, np.array(fin['weights'])) triggered = np.append(triggered, np.array(fin['triggered'])) xx = np.append(xx, np.array(fin['xx'])) yy = np.append(yy, np.array(fin['yy'])) zz = np.append(zz, np.array(fin['zz'])) receive_vectors = np.append(receive_vectors, np.array(fin['receive_vectors']), axis=0) theta = np.append(theta, np.array(fin['zeniths'])) phi = np.append(phi, np.array(fin['azimuths'])) polarization = np.append(polarization, np.array(fin['polarization']).flatten()) launch_vectors = np.append(launch_vectors, np.array(fin['launch_vectors']), axis=0) n_events += fin.attrs['n_events'] # calculate effective volume density_ice = 0.9167 * units.g / units.cm ** 3 density_water = 997 * units.kg / units.m ** 3 n_triggered = np.sum(weights[triggered]) print('total number of triggered events = ' + str(len(weights))) print('fraction of triggered events = {:.0f}/{:.0f} = {:.3f}'.format(n_triggered, n_events, n_triggered / n_events)) V = None if('xmax' in fin.attrs): dX = fin.attrs['xmax'] - fin.attrs['xmin'] dY = fin.attrs['ymax'] - fin.attrs['ymin'] dZ = fin.attrs['zmax'] - fin.attrs['zmin'] V = dX * dY * dZ elif('rmin' in fin.attrs): rmin = fin.attrs['rmin'] rmax = fin.attrs['rmax'] dZ = fin.attrs['zmax'] - fin.attrs['zmin'] V = np.pi * (rmax**2 - rmin**2) * dZ Veff = V * density_ice / density_water * 4 * np.pi * np.sum(weights[triggered]) / n_events print("Veff = {:.6g} km^3 sr".format(Veff / units.km ** 3)) # plot vertex distribution rz plt.subplot(2, 1, 1) rr = (xx ** 2 + yy ** 2) ** 0.5 #h = ax.hist2d(rr / units.m, zz / units.m, bins=[np.arange(0, 4000, 100), np.arange(-3000, 0, 100)], # cmap=plt.get_cmap('Blues'), weights=weights) plt.hist2d(rr / units.m, zz / units.m, bins=[np.arange(0, 9001, 100), np.arange(-3501, 0, 100)], cmap=plt.get_cmap('Blues'), weights=weights/n_events) cb = plt.colorbar() cb.set_label("weighted number of events") plt.xlabel("r [m]") plt.ylabel("z [m]") plt.grid(True) plt.subplot(2, 1, 2) plt.hist2d(rr / units.m, zz / units.m, bins=[np.arange(0, 9001, 100), np.arange(-3501, 0, 100)], cmap=plt.get_cmap('Blues'), weights = np.ones(len(rr))/n_events) cb = plt.colorbar() cb.set_label("number of events") plt.xlabel("r [m]") plt.ylabel("z [m]") plt.grid(True) plt.suptitle("vertex distribution") plt.savefig(os.path.join(plot_folder, 'vertex_distribution.pdf'), bbox_inches="tight") plt.clf() # plot incoming direction # for all events, antennas and ray tracing solutions zeniths, azimuths = hp.cartesian_to_spherical_vectorized(receive_vectors[:, :, :, 0].flatten(), receive_vectors[:, :, :, 1].flatten(), receive_vectors[:, :, :, 2].flatten()) for i in range(len(azimuths)): azimuths[i] = hp.get_normalized_angle(azimuths[i]) weights_matrix = np.outer(weights, np.ones(np.prod(receive_vectors.shape[1:-1]))).flatten() mask = ~np.isnan(azimuths) # exclude antennas with not ray tracing solution (or with just one ray tracing solution) plt.subplot(1, 2, 1) plt.hist(zeniths[mask] / units.deg, bins = np.arange(0, 181, 10), weights=weights_matrix[mask]) plt.xlabel('zenith [deg]') plt.subplot(1, 2, 2) plt.hist(azimuths[mask] / units.deg, bins = np.arange(0, 361, 45), weights=weights_matrix[mask]) plt.xlabel('azimuth [deg]') plt.suptitle('weighted incoming signal direction') plt.savefig(os.path.join(plot_folder, 'incoming_signal.pdf'), bbox_inches="tight") plt.clf() # plot direction distribution plt.subplot(2, 1, 1) plt.hist2d(phi / units.deg, theta / units.deg, bins=[np.arange(0, 361, 5), np.arange(0, 181, 5)], cmap=plt.get_cmap('Blues'), weights=weights/n_events) #plt.gca().invert_yaxis() cb = plt.colorbar() cb.set_label("weighted number of events") plt.xlabel("azimuth [deg]") plt.ylabel("zenith [deg]") plt.grid(True) plt.subplot(2, 1, 2) plt.hist2d(phi / units.deg, theta / units.deg, bins=[np.arange(0, 361, 5), np.arange(0, 181, 5)], cmap=plt.get_cmap('Blues'), weights = np.ones(len(phi))/n_events) #plt.gca().invert_yaxis() cb = plt.colorbar() cb.set_label("number of events") plt.xlabel("azimuth [deg]") plt.ylabel("zenith [deg]") plt.grid(True) plt.suptitle("direction distribution") plt.savefig(os.path.join(plot_folder, 'direction_distribution.pdf'), bbox_inches="tight") plt.clf() # plot polarization mask_pol = ~np.isnan(polarization) polarization = np.abs(polarization) polarization[polarization > 90 * units.deg] = 180 * units.deg - polarization[polarization > 90 * units.deg] bins = np.linspace(0, 90, 45) # for all events, antennas and ray tracing solutions mask = zeniths > 90 * units.deg # select rays coming from below plt.hist(polarization[mask_pol] / units.deg, bins=bins, weights=weights_matrix[mask_pol], color = 'b') plt.xlabel('weighted polarization [deg]') plt.hist(polarization[mask] / units.deg, bins=bins, weights=weights_matrix[mask], color = 'r') plt.figtext(1.0, 0.5, "red: rays coming from below; N: " + str(len(polarization[mask])) + "\nblue: all; N: " + str(len(polarization))) plt.savefig(os.path.join(plot_folder, 'polarization.pdf'), bbox_inches="tight") plt.clf() #plot neutrino direction zeniths = theta / units.deg plt.subplot(2, 1, 1) plt.hist(zeniths, weights=weights, bins=np.arange(0, 181, 5)) plt.xlabel('zenith angle [deg]') plt.ylabel('weighted entries') avgZen = np.average(zeniths, weights=weights) varZen = np.average((zeniths-avgZen)**2, weights=weights) plt.figtext(1.0, 0.6, "N: " + str(len(zeniths)) + "\nmean: " + str(np.average(zeniths, weights=weights)) + "\nstd: " + str(varZen**0.5)) plt.subplot(2, 1, 2) plt.hist(zeniths, bins=np.arange(0, 181, 5)) plt.xlabel('zenith angle [deg]') plt.ylabel('unweighted entries') plt.figtext(1.0, 0.2, "N: " + str(len(zeniths)) + "\nmean: " + str(np.average(zeniths)) + "\nstd: " + str(np.std(zeniths))) plt.suptitle("neutrino direction") plt.savefig(os.path.join(plot_folder, 'neutrino_direction.pdf'), bbox_inches="tight") plt.clf() #plot difference between cherenkov angle and viewing angle # i.e., opposite to the direction of propagation. We need the propagation direction here, so we multiply the shower axis with '-1' shower_axis = -1.0 * hp.spherical_to_cartesian(theta, phi) viewing_angles_d = np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, 0, 0])]) viewing_angles_r = np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, 0, 1])]) # calculate correct chereknov angle for ice density at vertex position ice = medium.southpole_simple() n_indexs = np.array([ice.get_index_of_refraction(x) for x in np.array([xx, yy, zz]).T]) rho = np.arccos(1. / n_indexs) weightsExt = weights for chan in range(1, len(launch_vectors[0])): viewing_angles_d = np.append(viewing_angles_d, np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, chan, 0])])) viewing_angles_r = np.append(viewing_angles_r, np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, chan, 1])])) rho = np.append(rho, np.arccos(1. / n_indexs)) weightsExt = np.append(weightsExt, weights) dCherenkov_d = (viewing_angles_d - rho) / units.deg dCherenkov_r = (viewing_angles_r - rho) / units.deg mask_d = ~np.isnan(viewing_angles_d) mask_r = ~np.isnan(viewing_angles_r) plt.subplot(2, 1, 1) plt.hist([dCherenkov_d[mask_d], dCherenkov_r[mask_r]], weights = [weightsExt[mask_d], weightsExt[mask_r]], bins = np.arange(-30, 30, 1)) plt.xlabel('weighted viewing - cherenkov angle [deg]') avgChe_d = np.average(dCherenkov_d[mask_d], weights = weightsExt[mask_d]) varChe_d = np.average((dCherenkov_d[mask_d] - avgChe_d)**2, weights = weightsExt[mask_d]) avgChe_r = np.average(dCherenkov_r[mask_r], weights = weightsExt[mask_r]) varChe_r = np.average((dCherenkov_r[mask_r] - avgChe_r)**2, weights = weightsExt[mask_r]) plt.figtext(1.0, 0.6, "N: " + str(len(dCherenkov_d[mask_d])) + "; Blue: direct ray\nmean: " + str(np.average(dCherenkov_d[mask_d], weights=weightsExt[mask_d])) + "\nstd: " + str(varChe_d**0.5) + "\nN: " + str(len(dCherenkov_r[mask_r])) + "; Red: refracted ray\nmean: " + str(np.average(dCherenkov_r[mask_r], weights=weightsExt[mask_r])) + "\nstd: " + str(varChe_r**0.5)) plt.subplot(2, 1, 2) plt.hist([dCherenkov_d[mask_d], dCherenkov_r[mask_r]], bins = np.arange(-30, 30, 1)) plt.xlabel('unweighted viewing - cherenkov angle [deg]') plt.figtext(1.0, 0.2, "N: " + str(len(dCherenkov_d[mask_d])) + "; Blue: direct ray\nmean: " + str(np.average(dCherenkov_d[mask_d])) + "\nstd: " + str(np.std(dCherenkov_d[mask_d])) + "\nN: " + str(len(dCherenkov_r[mask_r])) + "; Red: refracted ray\nmean: " + str(np.average(dCherenkov_r[mask_r])) + "\nstd: " + str(np.std(dCherenkov_r[mask_r]))) plt.savefig(os.path.join(plot_folder, 'dCherenkov.pdf'), bbox_inches="tight") plt.clf() #plot viewing_refracted vs viewing_direct plt.scatter(viewing_angles_d / units.deg, viewing_angles_r / units.deg, 10) plt.xlabel("direct viewing angle") plt.ylabel("refracted viewing angle") plt.axis([20, 110, 20, 110]) plt.grid(True) plt.savefig(os.path.join(plot_folder, 'viewDvsviewR.pdf'), bbox_inches="tight") # plot C0 parameter # C0s = np.array(fin['ray_tracing_C0']) # php.get_histogram(C0s.flatten()) # fig.suptitle('incoming signal direction') #plt.show() PKmN1[Ӣ..*NuRadioMC/simulation/T06read_sim_output.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units from radiotools import helper as hp from radiotools import plthelpers as php import argparse import h5py parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('ASCIIoutput', type=str, help='path to ASCII output file') parser.add_argument('hdf5input', type=str, nargs = '+', help='path to NuRadioMC hdf5 input event list') args = parser.parse_args() fin = h5py.File(args.hdf5input[0], 'r') event_ids = np.array(fin['event_ids']) flavors = np.array(fin['flavors']) energies = np.array(fin['energies']) ccncs = np.array(fin['interaction_type']) xx = np.array(fin['xx']) yy = np.array(fin['yy']) zz = np.array(fin['zz']) zeniths = np.array(fin['zeniths']) azimuths = np.array(fin['azimuths']) inelasticity = np.array(fin['inelasticity']) weight = np.array(fin['weights']) st = np.array(fin['ray_tracing_solution_type']) launch_vectors = np.array(fin['launch_vectors']) receive_vectors = np.array(fin['receive_vectors']) for i in range(len(args.hdf5input) - 2): fin = h5py.File(args.hdf5input[i + 1], 'r') event_ids = np.append(event_ids, 10000 * (i + 1) + np.array(fin['event_ids'])) flavors = np.append(flavors, np.array(fin['flavors'])) energies = np.append(energies, np.array(fin['energies'])) ccncs = np.append(ccncs, np.array(fin['ccncs'])) xx = np.append(xx, np.array(fin['xx'])) yy = np.append(yy, np.array(fin['yy'])) zz = np.append(zz, np.array(fin['zz'])) zeniths = np.append(zeniths, np.array(fin['zeniths'])) azimuths = np.append(azimuths, np.array(fin['azimuths'])) inelasticity = np.append(inelasticity, np.array(fin['inelasticity'])) weight = np.append(weight, np.array(fin['weights'])) st = np.append(st, np.array(fin['ray_tracing_solution_type']), axis = 0) launch_vectors = np.append(launch_vectors, np.array(fin['launch_vectors']), axis = 0) receive_vectors = np.append(receive_vectors, np.array(fin['receive_vectors']), axis = 0) shower_axis = -1.0 * hp.spherical_to_cartesian(zeniths, azimuths) viewing_angles_d = np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, 5, 0])]) viewing_angles_r = np.array([hp.get_angle(x, y) for x, y in zip(shower_axis, launch_vectors[:, 5, 1])]) launch_angles_d, launch_azimuths_d = hp.cartesian_to_spherical_vectorized(launch_vectors[:, 5, 0, 0].flatten(), launch_vectors[:, 5, 0, 1].flatten(), launch_vectors[:, 5, 0, 2].flatten()) launch_angles_r, launch_azimuths_r = hp.cartesian_to_spherical_vectorized(launch_vectors[:, 5, 1, 0].flatten(), launch_vectors[:, 5, 1, 1].flatten(), launch_vectors[:, 5, 1, 2].flatten()) rec_angles_d, rec_azimuths_d = hp.cartesian_to_spherical_vectorized(receive_vectors[:, 5, 0, 0].flatten(), receive_vectors[:, 5, 0, 1].flatten(), receive_vectors[:, 5, 0, 2].flatten()) rec_angles_r, rec_azimuths_r = hp.cartesian_to_spherical_vectorized(receive_vectors[:, 5, 1, 0].flatten(), receive_vectors[:, 5, 1, 1].flatten(), receive_vectors[:, 5, 1, 2].flatten()) n_events = len(event_ids) with open(args.ASCIIoutput, 'w') as fout: fout.write(fin.attrs['header']) fout.write("event_ids flavors energies ccnc xx yy zz zeniths azimuths inelasticity weight\n") fout.write("viewing_angles_0 viewing_angles_1 launch_angles_0 launch_angles_1 rec_angles_0 rec_angles_1 solution_type_0 solution_type_1\n") for i in range(n_events): print(str(event_ids[i]) + ", ", end = '') fout.write("{:08d} {:>+5d} {:.5e} {:s} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f}\n{:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:>10.3f} {:02f} {:02f}\n".format(int(event_ids[i]), int(flavors[i]), energies[i], ccncs[i], xx[i], yy[i], zz[i], zeniths[i] / units.deg, azimuths[i] / units.deg, inelasticity[i], weight[i], viewing_angles_d[i] / units.deg, viewing_angles_r[i] / units.deg, launch_angles_d[i] / units.deg, launch_angles_r[i] / units.deg, 180.0 - rec_angles_d[i] / units.deg, 180.0 - rec_angles_r[i] / units.deg, st[i][5][0], st[i][5][1])) fout.close() PKmNBr=T T 5NuRadioMC/simulation/T07plot_ray_tracing_solutions.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import plthelpers as php from matplotlib import pyplot as plt from NuRadioMC.utilities import units from NuRadioMC.utilities import medium from NuRadioMC.SignalProp import analyticraytraycing as ray import h5py import argparse import json import time import os parser = argparse.ArgumentParser(description='Plot NuRadioMC event list output.') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC hdf5 simulation output') # parser.add_argument('outputfilename', type=str, # help='name of output file storing the electric field traces at detector positions') args = parser.parse_args() fin = h5py.File(args.inputfilename, 'r') weights = np.array(fin['weights']) triggered = np.array(fin['triggered']) n_events = fin.attrs['n_events'] # plot vertex distribution fig, ax = plt.subplots(1, 1) xx = np.array(fin['xx']) yy = np.array(fin['yy']) rr = (xx ** 2 + yy ** 2) ** 0.5 zz = np.array(fin['zz']) h = ax.hist2d(rr / units.m, zz / units.m, bins=[np.arange(0, 4000, 100), np.arange(-3000, 0, 100)], cmap=plt.get_cmap('Blues'), weights=weights) cb = plt.colorbar(h[3], ax=ax) cb.set_label("weighted number of events") ax.set_aspect('equal') ax.set_xlabel("r [m]") ax.set_ylabel("z [m]") fig.tight_layout() mask = (zz < -2000 * units.m) & (rr < 5000 * units.m) for i in np.array(range(len(xx)))[mask]: # C0 = fin['ray_tracing_C0'][i][0][0] # C1 = fin['ray_tracing_C1'][i][0][0] print('weight = {:.2f}'.format(weights[i])) x1 = np.array([xx[i], yy[i], zz[i]]) x2 = np.array([0, 0, -5]) r = ray.ray_tracing(x1, x2, medium.southpole_simple()) r.find_solutions() C0 = r.get_results()[0]['C0'] x1 = np.array([-rr[i], zz[i]]) x2 = np.array([0, -5]) r2 = ray.ray_tracing_2D(medium.southpole_simple()) yyy, zzz = r2.get_path(x1, x2, C0) launch_vector = fin['launch_vectors'][i][0][0] print(launch_vector) zenith_nu = fin['zeniths'][i] print(zenith_nu / units.deg) fig, ax = plt.subplots(1, 1) ax.plot(-rr[i], zz[i], 'o') ax.plot([-rr[i], -rr[i] + 100 * np.cos(zenith_nu)], [zz[i], zz[i] + 100 * np.sin(zenith_nu)], '-C0') ax.plot(0, -5, 'd') ax.plot(yyy, zzz) ax.set_aspect('equal') plt.show() PKmN NuRadioMC/simulation/__init__.pyPKmN[ (NuRadioMC/simulation/config_default.yamlweights: weight_mode: core_mantle_crust # core_mantle_crust: use the three layer earth model, which considers the different densities of the core, mantle and crust. simple: use the simple earth model, which apply a constant earth density cross_section_type: ctw # neutrino cross section: ghandi : according to Ghandi et al. Phys.Rev.D58:093009,1998, ctw : A. Connolly, R. S. Thorne, and D. Waters, Phys. Rev.D 83, 113009 (2011)., csms: A. Cooper-Sarkar, P. Mertsch, S. Sarkar, JHEP 08 (2011) 042 noise: False # specify if simulation should be run with or without noise sampling_rate: 5. # sampling rate in GHz used internally in the simulation. At the end the waveforms will be downsampled to the sampling rate specified in the detector description speedup: minimum_weight_cut: 1.e-5 delta_C_cut: 0.698 # 40 degree redo_raytracing: False # redo ray tracing even if previous calculated ray tracing solutions are present min_efield_amplitude: 2 # the minimum signal amplitude of the efield as a factor of the noise RMS. If the value is smaller, no detector simulation is performed. As the vector effecive length of antennas is typically less than 1, this cut does not introduce any bias as long as the value is smaller than the trigger threshold. propagation: module: analytic ice_model: southpole_2015 attenuation_model: SP1 attenuate_ice: True # if True apply the frequency dependent attenuation due to propagating through ice. (Note: The 1/R amplitude scaling will be applied in either case.) n_freq: 25 # the number of frequencies where the attenuation length is calculated for. The remaining frequencies will be determined from a linear interpolation between the reference frequencies. The reference frequencies are equally spaced over the complet frequency range. signal: model: Alvarez2009 zerosignal: False # if True, the signal is set to zero. This is useful to study 'noise' only simulations polarization: auto # can be either 'auto' or 'custom' ePhi: 0. # only used if 'polarization = custom', fraction of ePhi component, the eTheta component is eTheta = (1 - ePhi**2)**0.5 trigger: noise_temperature: 300 # in Kelvin bandwidth: null # null or float in GHz (the effective bandwidth. It is used to calculate the Vrms from the noise temperature. If None, the bandwidth is calculated from the sampling rate assuming that the bandwidth is 0Hz to the Nyquist frequency save_all: False # if True, save all events PKmN¯#NuRadioMC/simulation/simulation2.pyfrom __future__ import absolute_import, division, print_function import numpy as np from radiotools import helper as hp from radiotools import coordinatesystems as cstrans from NuRadioMC.SignalGen import askaryan as signalgen from NuRadioMC.utilities import units from NuRadioMC.utilities import medium from NuRadioMC.utilities import fft from NuRadioMC.utilities.earth_attenuation import get_weight from NuRadioMC.SignalProp import propagation from matplotlib import pyplot as plt import h5py import time import six from scipy import constants # import detector simulation modules import NuRadioReco.modules.io.eventWriter import NuRadioReco.modules.channelSignalReconstructor import NuRadioReco.detector.detector as detector import NuRadioReco.framework.sim_station import NuRadioReco.framework.electric_field from NuRadioReco.framework.parameters import stationParameters as stnp from NuRadioReco.framework.parameters import channelParameters as chp from NuRadioReco.framework.parameters import electricFieldParameters as efp import datetime import logging from six import iteritems import yaml import os # import confuse logger = logging.getLogger("sim") VERSION = 0.1 def merge_config(user, default): if isinstance(user, dict) and isinstance(default, dict): for k, v in iteritems(default): if k not in user: user[k] = v else: user[k] = merge_config(user[k], v) return user class simulation(): def __init__(self, eventlist, outputfilename, detectorfile, outputfilenameNuRadioReco=None, debug=False, evt_time=datetime.datetime(2018, 1, 1), config_file=None, log_level=logging.WARNING): """ initialize the NuRadioMC end-to-end simulation Parameters ---------- eventlist: string the path to the hdf5 file containing the list of neutrino events outputfilename: string specify hdf5 output filename. detectorfile: string path to the json file containing the detector description station_id: int the station id for which the simulation is performed. Must match a station deself._fined in the detector description outputfilenameNuRadioReco: string or None outputfilename of NuRadioReco detector sim file, this file contains all waveforms of the triggered events default: None, i.e., no output file will be written which is useful for effective volume calculations debug: bool True activates debug mode, default False evt_time: datetime object the time of the events, default 1/1/2018 """ logger.setLevel(log_level) config_file_default = os.path.join(os.path.dirname(__file__), 'config_default.yaml') logger.warning('reading default config from {}'.format(config_file_default)) with open(config_file_default, 'r') as ymlfile: self._cfg = yaml.load(ymlfile) if(config_file is not None): logger.warning('reading local config overrides from {}'.format(config_file)) with open(config_file, 'r') as ymlfile: local_config = yaml.load(ymlfile) new_cfg = merge_config(local_config, self._cfg) self._cfg = new_cfg self._eventlist = eventlist self._outputfilename = outputfilename self._detectorfile = detectorfile self._Tnoise = float(self._cfg['trigger']['noise_temperature']) self._outputfilenameNuRadioReco = outputfilenameNuRadioReco self._debug = debug self._evt_time = evt_time logger.warning("setting event time to {}".format(evt_time)) # initialize propagation module self._prop = propagation.get_propagation_module(self._cfg['propagation']['module']) self._ice = medium.get_ice_model(self._cfg['propagation']['ice_model']) self._mout = {} self._mout_groups = {} self._mout_attrs = {} # read in detector positions logger.warning("Detectorfile {}".format(os.path.abspath(self._detectorfile))) self._det = detector.Detector(json_filename=self._detectorfile) self._det.update(evt_time) self._station_ids = self._det.get_station_ids() # print noise information logger.warning("running with noise {}".format(bool(self._cfg['noise']))) logger.warning("setting signal to zero {}".format(bool(self._cfg['signal']['zerosignal']))) # read sampling rate from config (this sampling rate will be used internally) self._dt = 1. / (self._cfg['sampling_rate'] * units.GHz) bandwidth = self._cfg['trigger']['bandwidth'] if(bandwidth is None): self._bandwidth = 0.5 / self._dt else: self._bandwidth = bandwidth self._Vrms = (self._Tnoise * 50 * constants.k * self._bandwidth / units.Hz) ** 0.5 logger.warning('noise temperature = {}, bandwidth = {:.0f} MHz, Vrms = {:.2f} muV'.format(self._Tnoise, self._bandwidth / units.MHz, self._Vrms / units.V / units.micro)) def run(self): """ run the NuRadioMC simulation """ self._channelSignalReconstructor = NuRadioReco.modules.channelSignalReconstructor.channelSignalReconstructor() self._eventWriter = NuRadioReco.modules.io.eventWriter.eventWriter() if(self._outputfilenameNuRadioReco is not None): self._eventWriter.begin(self._outputfilenameNuRadioReco) self._read_input_hdf5() # we read in the full input file into memory at the beginning to limit io to the beginning and end of the run self._n_events = len(self._fin['event_ids']) self._create_meta_output_datastructures() # check if the same detector was simulated before (then we can save the ray tracing part) pre_simulated = self._check_if_was_pre_simulated() inputTime = 0.0 askaryan_time = 0. rayTracingTime = 0.0 detSimTime = 0.0 outputTime = 0.0 time_attenuation_length = 0. t_start = time.time() for self._iE in range(self._n_events): t1 = time.time() if(self._iE > 0 and self._iE % max(1, int(self._n_events / 100.)) == 0): eta = datetime.timedelta(seconds=(time.time() - t_start) * (self._n_events - self._iE) / self._iE) total_time = inputTime + rayTracingTime + detSimTime + outputTime logger.warning("processing event {}/{} = {:.1f}%, ETA {}, time consumption: ray tracing = {:.0f}% (att. length {:.0f}%), askaryan = {:.0f}%, detector simulation = {:.0f}% reading input = {:.0f}%".format( self._iE, self._n_events, 100. * self._iE / self._n_events, eta, 100. * (rayTracingTime - askaryan_time) / total_time, 100. * time_attenuation_length / (rayTracingTime - askaryan_time), 100.* askaryan_time / total_time, 100. * detSimTime / total_time, 100.*inputTime / total_time)) # if(self._iE > 0 and self._iE % max(1, int(self._n_events / 10000.)) == 0): # print("*", end='') # read all quantities from hdf5 file and store them in local variables self._read_input_neutrino_properties() # skip vertices not in fiducial volume. This is required because 'mother' events are added to the event list # if daugthers (e.g. tau decay) have their vertex in the fiducial volume if not self._is_in_fiducial_volume(): logger.debug("event is not in fiducial volume, skipping simulation") continue # calculate weight # if we have a second interaction, the weight needs to be calculated from the initial neutrino if(self._n_interaction > 1): iE_mother = np.argwhere(self._fin['event_ids'] == self._iE).min() # get index of mother neutrino self._mout['weights'][self._iE] = get_weight(self._fin['zenith'][iE_mother], self._fin['energy'][iE_mother], self._fin['flavor'][iE_mother], mode=self._cfg['weights']['weight_mode'], cross_section_type = self._cfg['weights']['cross_section_type']) else: self._mout['weights'][self._iE] = get_weight(self._zenith_nu, self._energy, self._flavor, mode=self._cfg['weights']['weight_mode'],cross_section_type = self._cfg['weights']['cross_section_type']) # skip all events where neutrino weights is zero, i.e., do not # simulate neutrino that propagate through the Earth if(self._mout['weights'][self._iE] < self._cfg['speedup']['minimum_weight_cut']): logger.debug("neutrino weight is smaller than {}, skipping event".format(self._cfg['speedup']['minimum_weight_cut'])) continue # be careful, zenith/azimuth angle always refer to where the neutrino came from, # i.e., opposite to the direction of propagation. We need the propagation directio nhere, # so we multiply the shower axis with '-1' self._shower_axis = -1 * hp.spherical_to_cartesian(self._zenith_nu, self._azimuth_nu) x1 = np.array([self._x, self._y, self._z]) # calculate correct chereknov angle for ice density at vertex position n_index = self._ice.get_index_of_refraction(x1) cherenkov_angle = np.arccos(1. / n_index) self._evt = NuRadioReco.framework.event.Event(0, self._event_id) candidate_event = False # first step: peorform raytracing to see if solution exists # print("start raytracing. time: " + str(time.time())) t2 = time.time() inputTime += (time.time() - t1) for iSt, self._station_id in enumerate(self._station_ids): self._sampling_rate_detector = self._det.get_sampling_frequency(self._station_id, 0) # logger.warning('internal sampling rate is {:.3g}GHz, final detector sampling rate is {:.3g}GHz'.format(self.get_sampling_rate(), self._sampling_rate_detector)) self._n_samples = self._det.get_number_of_samples(self._station_id, 0) / self._sampling_rate_detector / self._dt self._n_samples = int(np.ceil(self._n_samples / 2.) * 2) # round to nearest even integer self._ff = np.fft.rfftfreq(self._n_samples, self._dt) self._tt = np.arange(0, self._n_samples * self._dt, self._dt) sg = self._mout_groups[self._station_id] ray_tracing_performed = ('ray_tracing_C0' in sg) and (self._was_pre_simulated) self._create_sim_station() for channel_id in range(self._det.get_number_of_channels(self._station_id)): x2 = self._det.get_relative_position(self._station_id, channel_id) + self._det.get_absolute_position(self._station_id) r = self._prop(x1, x2, self._ice, self._cfg['propagation']['attenuation_model'], log_level=logging.WARNING, n_frequencies_integration=int(self._cfg['propagation']['n_freq'])) if(pre_simulated and ray_tracing_performed and not self._cfg['speedup']['redo_raytracing']): # check if raytracing was already performed sg_pre = self._fin_stations["station_{:d}".format(self._station_id)] r.set_solution(sg_pre['ray_tracing_C0'][self._iE][channel_id], sg_pre['ray_tracing_C1'][self._iE][channel_id], sg_pre['ray_tracing_solution_type'][self._iE][channel_id]) else: r.find_solutions() if(not r.has_solution()): logger.debug("event {} and station {}, channel {} does not have any ray tracing solution ({} to {})".format( self._event_id, self._station_id, channel_id, x1, x2)) self._add_empty_electric_field(channel_id) continue delta_Cs = [] viewing_angles = [] # loop through all ray tracing solution for iS in range(r.get_number_of_solutions()): sg['ray_tracing_C0'][self._iE, channel_id, iS] = r.get_results()[iS]['C0'] sg['ray_tracing_C1'][self._iE, channel_id, iS] = r.get_results()[iS]['C1'] sg['ray_tracing_solution_type'][self._iE, channel_id, iS] = r.get_solution_type(iS) self._launch_vector = r.get_launch_vector(iS) sg['launch_vectors'][self._iE, channel_id, iS] = self._launch_vector # calculates angle between shower axis and launch vector viewing_angle = hp.get_angle(self._shower_axis, self._launch_vector) viewing_angles.append(viewing_angle) delta_C = (viewing_angle - cherenkov_angle) logger.debug('solution {} {}: viewing angle {:.1f} = delta_C = {:.1f}'.format( iS, self._prop.solution_types[r.get_solution_type(iS)], viewing_angle / units.deg, (viewing_angle - cherenkov_angle) / units.deg)) delta_Cs.append(delta_C) # discard event if delta_C (angle off cherenkov cone) is too large if(min(np.abs(delta_Cs)) > self._cfg['speedup']['delta_C_cut']): logger.debug('delta_C too large, event unlikely to be observed, skipping event') self._add_empty_electric_field(channel_id) continue n = r.get_number_of_solutions() Rs = np.zeros(n) Ts = np.zeros(n) for iS in range(n): # loop through all ray tracing solution if(pre_simulated and ray_tracing_performed and not self._cfg['speedup']['redo_raytracing']): sg_pre = self._fin_stations["station_{:d}".format(self._station_id)] R = sg_pre['travel_distances'][self._iE, channel_id, iS] T = sg_pre['travel_times'][self._iE, channel_id, iS] else: R = r.get_path_length(iS) # calculate path length T = r.get_travel_time(iS) # calculate travel time sg['travel_distances'][self._iE, channel_id, iS] = R sg['travel_times'][self._iE, channel_id, iS] = T Rs[iS] = R Ts[iS] = T self._launch_vector = r.get_launch_vector(iS) receive_vector = r.get_receive_vector(iS) # save receive vector sg['receive_vectors'][self._iE, channel_id, iS] = receive_vector zenith, azimuth = hp.cartesian_to_spherical(*receive_vector) logger.debug("st {}, ch {}, s {} R = {:.1f} m, t = {:.1f}ns, receive angles {:.0f} {:.0f}".format(self._station_id, channel_id, iS, R / units.m, T / units.ns, zenith / units.deg, azimuth / units.deg)) fem, fhad = self._get_em_had_fraction(self._inelasticity, self._inttype, self._flavor) # get neutrino pulse from Askaryan module t_ask = time.time() spectrum = signalgen.get_frequency_spectrum( self._energy * fhad, viewing_angles[iS], self._n_samples, self._dt, "HAD", n_index, R, self._cfg['signal']['model'], same_shower=(iS > 0)) askaryan_time += (time.time() - t_ask) # apply frequency dependent attenuation t_att = time.time() if self._cfg['propagation']['attenuate_ice']: attn = r.get_attenuation(iS, self._ff, 0.5 * self._sampling_rate_detector) spectrum *= attn time_attenuation_length += (time.time() - t_att) if(fem > 0): t_ask = time.time() spectrum_em = signalgen.get_frequency_spectrum( self._energy * fem, viewing_angles[iS], self._n_samples, self._dt, "EM", n_index, R, self._cfg['signal']['model'], same_shower=(iS > 0)) askaryan_time += (time.time() - t_ask) if self._cfg['propagation']['attenuate_ice']: spectrum_em *= attn # add EM signal to had signal in the time domain spectrum = fft.time2freq(fft.freq2time(spectrum) + fft.freq2time(spectrum_em)) polarization_direction_onsky = self._calculate_polarization_vector() cs_at_antenna = cstrans.cstrafo(*hp.cartesian_to_spherical(*receive_vector)) polarization_direction_at_antenna = cs_at_antenna.transform_from_onsky_to_ground(polarization_direction_onsky) logger.debug('receive zenith {:.0f} azimuth {:.0f} polarization on sky {:.2f} {:.2f} {:.2f}, on ground @ antenna {:.2f} {:.2f} {:.2f}'.format( zenith / units.deg, azimuth / units.deg, polarization_direction_onsky[0], polarization_direction_onsky[1], polarization_direction_onsky[2], *polarization_direction_at_antenna)) sg['polarization'][self._iE, channel_id, iS] = polarization_direction_at_antenna eR, eTheta, ePhi = np.outer(polarization_direction_onsky, spectrum) # print("{} {:.2f} {:.0f}".format(polarization_direction_onsky, np.linalg.norm(polarization_direction_onsky), np.arctan2(np.abs(polarization_direction_onsky[1]), np.abs(polarization_direction_onsky[2])) / units.deg)) # in case of a reflected ray we need to account for fresnel # reflection at the surface r_theta = None r_phi = None if(self._prop.solution_types[r.get_solution_type(iS)] == 'reflected'): from NuRadioReco.utilities import geometryUtilities as geo_utl zenith_reflection = r.get_reflection_angle(iS) r_theta = geo_utl.get_fresnel_r_p( zenith_reflection, n_2=1., n_1=self._ice.get_index_of_refraction([x2[0], x2[1], -1 * units.cm])) r_phi = geo_utl.get_fresnel_r_s( zenith_reflection, n_2=1., n_1=self._ice.get_index_of_refraction([x2[0], x2[1], -1 * units.cm])) eTheta *= r_theta ePhi *= r_phi logger.debug("ray hits the surface at an angle {:.2f}deg -> reflection coefficient is r_theta = {:.2f}, r_phi = {:.2f}".format(zenith_reflection/units.deg, r_theta, r_phi)) if(self._debug): fig, (ax, ax2) = plt.subplots(1, 2) ax.plot(self._ff, np.abs(eTheta) / units.micro / units.V * units.m) ax2.plot(self._tt, fft.freq2time(eTheta) / units.micro / units.V * units.m) ax2.set_ylabel("amplitude [$\mu$V/m]") fig.tight_layout() fig.suptitle("$E_C$ = {:.1g}eV $\Delta \Omega$ = {:.1f}deg, R = {:.0f}m".format( self._energy * fhad, viewing_angles[iS], R)) fig.subplots_adjust(top=0.9) plt.show() electric_field = NuRadioReco.framework.electric_field.ElectricField([channel_id], self._det.get_relative_position(self._sim_station.get_id(), channel_id)) electric_field.set_frequency_spectrum(np.array([eR, eTheta, ePhi]), 1. / self._dt) electric_field.set_trace_start_time(T) electric_field[efp.azimuth] = azimuth electric_field[efp.zenith] = zenith electric_field[efp.ray_path_type] = self._prop.solution_types[r.get_solution_type(iS)] electric_field[efp.nu_vertex_distance] = Rs[iS] electric_field[efp.nu_viewing_angle] = viewing_angles[iS] electric_field[efp.reflection_coefficient_theta] = r_theta electric_field[efp.reflection_coefficient_phi] = r_phi self._sim_station.add_electric_field(electric_field) # apply a simple threshold cut to speed up the simulation, # application of antenna response will just decrease the # signal amplitude if(np.max(np.abs(electric_field.get_trace())) > float(self._cfg['speedup']['min_efield_amplitude']) * self._Vrms): candidate_event = True #print("start detector simulation. time: " + str(time.time())) t3 = time.time() rayTracingTime += t3 - t2 # perform only a detector simulation if event had at least one # candidate channel if(not candidate_event): logger.debug("electric field amplitude too small in all channels, skipping to next event") continue logger.debug("performing detector simulation") # self._finalize NuRadioReco event structure self._station = NuRadioReco.framework.station.Station(self._station_id) self._station.set_sim_station(self._sim_station) self._station.set_station_time(self._evt_time) self._evt.set_station(self._station) self._detector_simulation() self._calculate_signal_properties() self._save_triggers_to_hdf5() t4 = time.time() detSimTime += (t4 - t3) if(self._outputfilenameNuRadioReco is not None and self._mout['triggered'][self._iE]): self._eventWriter.run(self._evt) # Create trigger structures if there are no triggering events. # This is done to ensure that files with no triggering n_events # merge properly. self._create_empty_multiple_triggers() # save simulation run in hdf5 format (only triggered events) t5 = time.time() self._write_ouput_file() try: self.calculate_Veff() except: logger.error("error in calculating effective volume") t_total = time.time() - t_start logger.warning("{:d} events processed in {:.0f} seconds = {:.2f}ms/event".format(self._n_events, t_total, 1.e3 * t_total / self._n_events)) outputTime = time.time() - t5 print("inputTime = " + str(inputTime) + "\nrayTracingTime = " + str(rayTracingTime) + "\ndetSimTime = " + str(detSimTime) + "\noutputTime = " + str(outputTime)) def _is_in_fiducial_volume(self): """ checks wether a vertex is in the fiducial volume if the fiducial volume is not specified in the input file, True is returned (this is required for the simulation of pulser calibration measuremens) """ tt = ['fiducial_rmin', 'fiducial_rmax', 'fiducial_zmin', 'fiducial_zmax'] has_fiducial = True for t in tt: if(not t in self._fin_attrs): has_fiducial = False if(not has_fiducial): return True r = (self._x**2 + self._y**2)**0.5 if(r >= self._fin_attrs['fiducial_rmin'] and r <= self._fin_attrs['fiducial_rmax']): if(self._z >= self._fin_attrs['fiducial_zmin'] and self._z <= self._fin_attrs['fiducial_zmax']): return True return False def _increase_signal(self, channel_id, factor): """ increase the signal of a simulated station by a factor of x this is e.g. used to approximate a phased array concept with a single antenna Parameters ---------- channel_id: int or None if None, all available channels will be modified """ if(channel_id is None): for electric_field in self._station.get_sim_station().get_electric_fields(): electric_field.set_trace(electric_field.get_trace() * factor, sampling_rate=electric_field.get_sampling_rate()) else: sim_channels = self._station.get_sim_station().get_electric_fields_for_channels([channel_id]) for sim_channel in sim_channels: sim_channel.set_trace(sim_channel.get_trace() * factor, sampling_rate=sim_channel.get_sampling_rate()) def _read_input_hdf5(self): """ reads input file into memory """ fin = h5py.File(self._eventlist, 'r') self._fin = {} self._fin_stations = {} self._fin_attrs = {} for key, value in iteritems(fin): if isinstance(value, h5py._hl.group.Group): self._fin_stations[key] = {} for key2, value2 in iteritems(value): self._fin_stations[key][key2] = np.array(value2) self._fin[key] = np.array(value) for key, value in iteritems(fin.attrs): self._fin_attrs[key] = value fin.close() def _calculate_signal_properties(self): if(self._station.has_triggered()): sg = self._mout_groups[self._station_id] self._channelSignalReconstructor.run(self._evt, self._station, self._det) for channel in self._station.iter_channels(): sg['maximum_amplitudes'][self._iE, channel.get_id()] = channel.get_parameter(chp.maximum_amplitude) sg['maximum_amplitudes_envelope'][self._iE, channel.get_id()] = channel.get_parameter(chp.maximum_amplitude_envelope) sg['SNRs'][self._iE] = self._station.get_parameter(stnp.channels_max_amplitude) / self._Vrms def _create_empty_multiple_triggers(self): if ('trigger_names' not in self._mout_attrs): self._mout_attrs['trigger_names'] = np.array([]) self._mout['multiple_triggers'] = np.zeros((self._n_events, 1), dtype=np.bool) for station_id in self._station_ids: sg = self._mout_groups[station_id] sg['multiple_triggers'] = np.zeros((self._n_events, 1), dtype=np.bool) def _create_trigger_structures(self): if('trigger_names' not in self._mout_attrs): self._mout_attrs['trigger_names'] = [] for trigger in six.itervalues(self._station.get_triggers()): self._mout_attrs['trigger_names'].append(np.string_(trigger.get_name())) # the 'multiple_triggers' output array is not initialized in the constructor because the number of # simulated triggers is unknown at the beginning. So we check if the key already exists and if not, # we first create this data structure if('multiple_triggers' not in self._mout): self._mout['multiple_triggers'] = np.zeros((self._n_events, len(self._mout_attrs['trigger_names'])), dtype=np.bool) sg = self._mout_groups[self._station_id] sg['multiple_triggers'] = np.zeros((self._n_events, len(self._mout_attrs['trigger_names'])), dtype=np.bool) def _save_triggers_to_hdf5(self): self._create_trigger_structures() sg = self._mout_groups[self._station_id] for iT, trigger_name in enumerate(self._mout_attrs['trigger_names']): self._mout['multiple_triggers'][self._iE, iT] |= self._station.get_trigger(trigger_name).has_triggered() sg['multiple_triggers'][self._iE, iT] = self._station.get_trigger(trigger_name).has_triggered() self._mout['triggered'][self._iE] = np.any(self._mout['multiple_triggers'][self._iE]) sg['triggered'][self._iE] = np.any(sg['multiple_triggers'][self._iE]) if(self._mout['triggered'][self._iE]): logger.debug("event triggered") def get_Vrms(self): return self._Vrms def get_sampling_rate(self): return 1. / self._dt def get_bandwidth(self): return self._bandwidth def _check_if_was_pre_simulated(self): """ checks if the same detector was simulated before (then we can save the ray tracing part) """ self._was_pre_simulated = False if('detector' in self._fin_attrs): with open(self._detectorfile) as fdet: if(fdet.read() == self._fin_attrs['detector']): self._was_pre_simulated = True print("the simulation was already performed with the same detector") return self._was_pre_simulated def _create_meta_output_datastructures(self): """ creates the data structures of the parameters that will be saved into the hdf5 output file """ self._mout = {} self._mout_attributes = {} self._mout['weights'] = np.zeros(self._n_events) self._mout['triggered'] = np.zeros(self._n_events, dtype=np.bool) # self._mout['multiple_triggers'] = np.zeros((self._n_events, self._number_of_triggers), dtype=np.bool) self._mout_attributes['trigger_names'] = None for station_id in self._station_ids: n_antennas = self._det.get_number_of_channels(station_id) self._mout_groups[station_id] = {} sg = self._mout_groups[station_id] sg['triggered'] = np.zeros(self._n_events, dtype=np.bool) sg['launch_vectors'] = np.zeros((self._n_events, n_antennas, 2, 3)) * np.nan sg['receive_vectors'] = np.zeros((self._n_events, n_antennas, 2, 3)) * np.nan sg['ray_tracing_C0'] = np.zeros((self._n_events, n_antennas, 2)) * np.nan sg['ray_tracing_C1'] = np.zeros((self._n_events, n_antennas, 2)) * np.nan sg['ray_tracing_solution_type'] = np.zeros((self._n_events, n_antennas, 2), dtype=np.int) * np.nan sg['polarization'] = np.zeros((self._n_events, n_antennas, 2, 3)) * np.nan sg['travel_times'] = np.zeros((self._n_events, n_antennas, 2)) * np.nan sg['travel_distances'] = np.zeros((self._n_events, n_antennas, 2)) * np.nan sg['SNRs'] = np.zeros(self._n_events) * np.nan sg['maximum_amplitudes'] = np.zeros((self._n_events, n_antennas)) * np.nan sg['maximum_amplitudes_envelope'] = np.zeros((self._n_events, n_antennas)) * np.nan def _read_input_neutrino_properties(self): self._event_id = self._fin['event_ids'][self._iE] self._flavor = self._fin['flavors'][self._iE] self._energy = self._fin['energies'][self._iE] self._inttype = self._fin['interaction_type'][self._iE] self._x = self._fin['xx'][self._iE] self._y = self._fin['yy'][self._iE] self._z = self._fin['zz'][self._iE] self._zenith_nu = self._fin['zeniths'][self._iE] self._azimuth_nu = self._fin['azimuths'][self._iE] self._inelasticity = self._fin['inelasticity'][self._iE] self._n_interaction = self._fin['n_interaction'][self._iE] def _create_sim_station(self): """ created an empyt sim_station object and saves the meta arguments such as neutrino direction, self._energy and self._flavor """ # create NuRadioReco event structure self._sim_station = NuRadioReco.framework.sim_station.SimStation(self._station_id) self._sim_station.set_is_neutrino() # save relevant neutrino properties self._sim_station[stnp.nu_zenith] = self._zenith_nu self._sim_station[stnp.nu_azimuth] = self._azimuth_nu self._sim_station[stnp.nu_energy] = self._energy self._sim_station[stnp.nu_flavor] = self._flavor self._sim_station[stnp.nu_inttype] = self._inttype self._sim_station[stnp.nu_vertex] = np.array([self._x, self._y, self._z]) self._sim_station[stnp.inelasticity] = self._inelasticity def _add_empty_electric_field(self, channel_id): electric_field = NuRadioReco.framework.electric_field.ElectricField([channel_id]) electric_field.set_frequency_spectrum(np.zeros((3, len(self._ff)), dtype=np.complex), 1. / self._dt) electric_field[efp.azimuth] = 0 electric_field[efp.zenith] = 180 * units.deg electric_field[efp.ray_path_type] = 'none' electric_field.set_trace_start_time(np.nan) self._sim_station.add_electric_field(electric_field) def _write_ouput_file(self): fout = h5py.File(self._outputfilename, 'w') triggered = np.ones(len(self._mout['triggered']), dtype=np.bool) if (self._cfg['save_all'] == False): logger.info("saving only triggered events") triggered = self._mout['triggered'] else: logger.info("saving all events") # save data sets for (key, value) in iteritems(self._mout): fout[key] = value[triggered] # save all data sets of the station groups for (key, value) in iteritems(self._mout_groups): sg = fout.create_group("station_{:d}".format(key)) for (key2, value2) in iteritems(value): sg[key2] = value2[triggered] # save meta arguments for (key, value) in iteritems(self._mout_attrs): fout.attrs[key] = value with open(self._detectorfile) as fdet: fout.attrs['detector'] = fdet.read() # save antenna position separately to hdf5 output for station_id in self._mout_groups: n_channels = self._det.get_number_of_channels(station_id) positions = np.zeros((n_channels, 3)) for channel_id in range(n_channels): positions[channel_id] = self._det.get_relative_position(station_id, channel_id) + self._det.get_absolute_position(station_id) fout["station_{:d}".format(station_id)].attrs['antenna_positions'] = positions fout.attrs['Tnoise'] = self._Tnoise fout.attrs['Vrms'] = self._Vrms fout.attrs['dt'] = self._dt fout.attrs['bandwidth'] = self._bandwidth fout.attrs['n_samples'] = self._n_samples fout.attrs['config'] = yaml.dump(self._cfg) # save NuRadioMC and NuRadioReco versions from NuRadioMC.utilities import version fout.attrs['NuRadioMC_version_hash'] = version.get_NuRadioMC_commit_hash() fout.attrs['NuRadioReco_version_hash'] = version.get_NuRadioReco_commit_hash() # now we also save all input parameters back into the out file for key in self._fin.keys(): if(not key in fout.keys()): # only save data sets that havn't been recomputed and saved already fout[key] = np.array(self._fin[key])[triggered] for key in self._fin_attrs.keys(): if(not key in fout.attrs.keys()): # only save atrributes sets that havn't been recomputed and saved already fout.attrs[key] = self._fin_attrs[key] fout.close() def calculate_Veff(self): # calculate effective density_ice = 0.9167 * units.g / units.cm ** 3 density_water = 1000 * units.kg / units.m ** 3 n_triggered = np.sum(self._mout['triggered']) n_triggered_weighted = np.sum(self._mout['weights'][self._mout['triggered']]) logger.warning('fraction of triggered events = {:.0f}/{:.0f} = {:.3f}'.format( n_triggered, self._n_events, n_triggered / self._n_events)) V = None if('xmax' in self._fin_attrs): dX = self._fin_attrs['xmax'] - self._fin_attrs['xmin'] dY = self._fin_attrs['ymax'] - self._fin_attrs['ymin'] dZ = self._fin_attrs['zmax'] - self._fin_attrs['zmin'] V = dX * dY * dZ elif('rmin' in self._fin_attrs): rmin = self._fin_attrs['rmin'] rmax = self._fin_attrs['rmax'] dZ = self._fin_attrs['zmax'] - self._fin_attrs['zmin'] V = np.pi * (rmax ** 2 - rmin ** 2) * dZ Veff = V * density_ice / density_water * 4 * np.pi * n_triggered_weighted / self._n_events logger.warning("Veff = {:.2g} km^3 sr".format(Veff / units.km ** 3)) def _get_em_had_fraction(self, inelasticity, inttype, flavor): """ calculates the fraction of the neutrino energy that goes into the electromagnetic cascade (em) and the hadronic cascade (had) Parameters ---------- inelasticity: float the inelasticity (fraction of energy that goes into had. cascade) inttype: string ['nc', 'cc', 'tau_had', 'tau_e'] neutral current (nc) or carged currend (cc) interaction flavor: int flavor id returns -------- fem: float electrogmatnetic fraction fhad: float hadroninc fraction """ fem = 0 # electrogmatnetic fraction fhad = 0 # hadronic fraction if(inttype == 'nc'): fhad = inelasticity elif(inttype == 'cc'): if(np.abs(flavor) == 12): fem = (1 - inelasticity) fhad = inelasticity elif(np.abs(flavor) == 14): fhad = inelasticity elif(np.abs(flavor) == 16): fhad = inelasticity elif(inttype == 'had'): fem = 0 fhad = 1 elif(inttype == 'em'): fem = 1 fhad = 0 elif(np.abs(flavor) == 15): if (inttype == 'tau_e'): fem = inelasticity elif (inttype == 'tau_had'): fhad = inelasticity else: raise AttributeError("interaction type {} with flavor {} is not implemented".format(inttype, flavor)) return fem, fhad # TODO verify that calculation of polarization vector is correct! def _calculate_polarization_vector(self): """ calculates the polarization vector in spherical coordinates (eR, eTheta, ePhi) """ if(self._cfg['signal']['polarization'] == 'auto'): polarization_direction = np.cross(self._launch_vector, np.cross(self._shower_axis, self._launch_vector)) polarization_direction /= np.linalg.norm(polarization_direction) cs = cstrans.cstrafo(*hp.cartesian_to_spherical(*self._launch_vector)) return cs.transform_from_ground_to_onsky(polarization_direction) elif(self._cfg['signal']['polarization'] == 'custom'): ePhi = float(self._cfg['signal']['ePhi']) eTheta = (1 - ePhi ** 2) ** 0.5 v = np.array([0, eTheta, ePhi]) return v / np.linalg.norm(v) else: msg = "{} for config.signal.polarization is not a valid option".format(self._cfg['signal']['polarization']) logger.error(msg) raise ValueError(msg) PKmN-9NuRadioMC/simulation/detectors/SPsurfacestation_1GHz.json{ "_default": {}, "comment": { "1": "a surface station with 4 downward facing LPDAs and 4 dipoles with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "ARA_bicone", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "ARA_bicone", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "ARA_bicone", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "ARA_bicone", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNrro""9NuRadioMC/simulation/detectors/SPsurfacestation_2GHz.json{ "_default": {}, "comment": { "1": "a surface station with 4 downward facing LPDAs and 4 dipoles with 2GHz sampling, i.e., the bandwidth is 0-1000 MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 2, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } } PKmNPjBB3NuRadioMC/simulation/detectors/stawmen_1GHz_v1.json{ "_default": {}, "comment": { "1": "first version of the strawmen design: a surface station with 4 downward and 4 upward facing LPDAs and 4 dipoles + a string of 4 deep dipoles at 10, 20, 30, 40 meters. With 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "9": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0, "ant_position_y": 0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 45.0, "cab_type": "LMR_400", "channel_id": 8, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "10": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0, "ant_position_y": 0, "ant_position_z": -20.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 95.0, "cab_type": "LMR_400", "channel_id": 9, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "11": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0, "ant_position_y": 0, "ant_position_z": -30.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 145.0, "cab_type": "LMR_400", "channel_id": 10, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "12": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0, "ant_position_y": 0, "ant_position_z": -40.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 195.0, "cab_type": "LMR_400", "channel_id": 11, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "13": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -4.0, "ant_position_y": 4.0, "ant_position_z": -1.0, "ant_rotation_phi": 315.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 12, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "14": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 4.0, "ant_position_y": 4.0, "ant_position_z": -1.0, "ant_rotation_phi": 225.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 13, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "15": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 4.0, "ant_position_y": -4.0, "ant_position_z": -1.0, "ant_rotation_phi": 135.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 14, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "16": { "adc_id": null, "adc_n_samples": 512, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -4.0, "ant_position_y": -4.0, "ant_position_z": -1.0, "ant_rotation_phi": 45.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 15, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNe!!1NuRadioMC/simulation/detectors/ARA/100m_1GHz.json{ "_default": {}, "comment": { "1": "a 20m deep ARA detector (antennas at -10 and -30 meters) with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -90.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -90.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -90.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -90.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -110.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -110.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -110.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -110.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNI!!1NuRadioMC/simulation/detectors/ARA/200m_1GHz.json{ "_default": {}, "comment": { "1": "a 20m deep ARA detector (antennas at -10 and -30 meters) with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -190.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -190.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -190.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -190.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -210.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -210.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -210.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -210.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmN݋!!0NuRadioMC/simulation/detectors/ARA/20m_1GHz.json{ "_default": {}, "comment": { "1": "a 20m deep ARA detector (antennas at -10 and -30 meters) with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -30.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -30.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -30.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -30.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNB!!0NuRadioMC/simulation/detectors/ARA/50m_1GHz.json{ "_default": {}, "comment": { "1": "a 20m deep ARA detector (antennas at -10 and -30 meters) with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -40.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -40.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -40.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -40.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": 10.0, "ant_position_z": -60.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 10.0, "ant_position_y": -10.0, "ant_position_z": -60.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": -10.0, "ant_position_z": -60.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -10.0, "ant_position_y": 10.0, "ant_position_z": -60.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNw&AA3NuRadioMC/simulation/detectors/depth/100m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -100.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNެ@@2NuRadioMC/simulation/detectors/depth/10m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -10.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNP)AA3NuRadioMC/simulation/detectors/depth/200m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -200.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNM@@2NuRadioMC/simulation/detectors/depth/20m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -20.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNrb%AA3NuRadioMC/simulation/detectors/depth/300m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -300.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmN J{AA3NuRadioMC/simulation/detectors/depth/400m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -400.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmN/Y@@2NuRadioMC/simulation/detectors/depth/50m_1GHz.json{ "_default": {}, "comment": { "1": "a 10m deep dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -50.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNRbʅ 6NuRadioMC/simulation/detectors/depth/surface_1GHz.json{ "_default": {}, "comment": { "1": "a surface station with 2 downward facing LPDAs and 1 dipole with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 0.0, "ant_position_y": 0.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 2800.0, "pos_easting": null, "pos_measurement_time": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNNuRadioMC/studies/__init__.pyPKmN'NuRadioMC/test/.gitignore1e18_output.hdf5 PKmNL ``)NuRadioMC/test/1e18_output_reference.hdf5HDF  ``0X8TREE0`H`xHEAP   ?@4 4`Pw\xSNOD@(X(  (FALSETRUEw\X (FALSETRUE w\h`HEAP`pSxx 8Tnoise ?@4 4r@`"? ??bPxd??z??m0???Ord?mB?w8? \?X*,?0,?P)?~n \0?V_ ?vQ>K%9v ?H^> Bk? ?;oa?l?oX>7`D>m_}v>듔>w( ?1ą ?w@(p?Nl ?r͒3g?7?R? ?^4d?eq?4 ?>q ?zo^?? ?t?X:6?}i3? +6?cϿ/?*Qc?A7 ?FQ?" q!?]??Kޜ:?xh?;.o>|@>o >['2>5j>_+sa>>7>@_rs?Cp ??:$7?Ӻl??b^7?6?(.?d?k2>-?t]u>o?ruזfV?}*?H@Z?~ w?-gjgi>ߓh[>>|>0Y?emȸ?k6u>xVZ?%:@Iд@ @ W @\o9@m - @)*:@}$@U)$@2M7 @kH=p? 4і?)҃?Iꂁ?1W2?(Q1?2?5AO3?reQ?gq>P\5n~?N= ? ?2Իf* ?k ?#kɞ>l>'>VG > ?` ?h. ?. ?V?W'6?$0?C#S??]A,G?h1X<?(?E?83,??VVO ?=>5?Ѣ6?J6?,d 6?ٵ6?OM?| 䄠#??86Ƚf$??~(?+| ?,ġ?sЫ>O2>)>pL->ѣMJ/>y!>C >hN>'(?㛘*W?c"?|zD?/0?>]cB?:p?y{?O)>ja f ? &@>* ?o>4!?S ?23@7X ?y^~7 ?H{S'Rk>Z6aM>>[^G>A Ǘ>4N^?A >5?@?`I?㹽?( Ax~?a?WӤu!?st?T?Ldnz?5k93?&/NZ?u=uE? w@{drP@9fo"@[lĉu6 積#[H:iϘ+n9|(ԕGqƔ,$S_ۘ\ځ[2gg(;jH   NgmCNgmCNgmCNgmCNgmCNgmCNgmCNgmCNgmCNgmCncccccccccncccccncccTREE@`( H`x(   ?@4 4w\hSNOD@&UTVh $@ (FALSETRUEX w\h8   ?@4 4`w\X8   ?@4 4`w\Xi@%©-۟@u@eT6۟@ٟ@eͣIʟ@0ٟ@Vs@ʟ@F@$n@L @RS:@M{@-]@tqt, @X@{Ɵ@jO@s.+ݐ@'=ؐ@@ϐ@Z@Hkې@_@˴b@-@ޜ\þ@+@_puؐ@]j@ٶ͡ڐ@@kѵ@Y񤷯ܘ@DИ@ۍט@&˘@ ; Ƙ@6R@t5˘@2"w@v@2@/֘@ ͝@"t@y_/@ޭ3F@ N@ݬ;d}@J}@͗FO}@G /5}@]3}@/X|~}@ۉ}@w.D}@sR:}@;}@=2}@)S&z}@u2|3}@i!]CG}@< g}@Ё|@lĔk@k+j@@9/Wk@;8j@0k@;7k@(Rk@o k@xH3l@0lNj@ljm@(}Ej@ȍw _l@,ʛi@01l@Px]i@{+r\@,p5/\@Kv]@ >\@(^@H^Nq]@4v]@Z1 ]@hB^@Ж\@\b_@{@-]@Q<`]@T C[@8\@h(f*[@p˛e@F> e5e@pf@+ϥq{e@}P+Hf@e@hid?f@He@0g@ŭid@ ׁg@ 2 3d@&Hg@s,d@'Zf@sd@VR/@r @.5x@tT@blr@r_dN@ SS)@X@{|@E(0@2"E䃐@SR~@fX?M@Nzx~@R䋜@v~@s @>'D@є@@~ %@^t;@5ɤ@@V @(̵@)E @|/@w!z"@/hqo@Ȉ .@@\c@Kt!@CE@N+@;Q_@ D@+F@@FKo,@ -@/z*@o%+@;d@zڔma@xו@j^&F`@I+v@?@ @2? ?x]ʻ?ƽ$??81!?? 7(?n? fq?i+2|?.ˏ*? o?~c?p{b?Ϛah?!?ʛ??X0?nX%? x?؍+?j `SN ?,o?S?P3?2:?vHl?$9h?D?\ 0?HZC2?,?NB&9?|$@6?,$_?3&?2UA?i(?WcQ? ?G?*\p?V Uj?eyo"?(g? #?p?Y?-r?iR?Eut?oL!?ao?\D֨?wj}?G2ֶ??Q-?TnM~?7v?jV(}o?Kx?<W?Y`?o?R4I?>BmQv?SS@?жZ#m?1Oh?CN?2s̨q?2X"z?Nb_?j?EǚZ?e?pGS?5g.^?5&YX?xc?Ng??>qks?YFC=?Cp?|I?mF}?̺ɴ`L?k?/?R?Xh:~x?N,~?sry?J!D!?/'?XMۊ?y!{ h?U?ų3t?+2?c;]?K&,t?r?]A?!\? ~?A1?dː?<) ?~ak?;*#?hh?$[?f=\ ?0DD? f1?:U?Q`|}?K?0&?"P? ?.u?5N/?`?$ܣl? ?0dr?`P?/?`?ǵ?Î+?OVT?;c,?~jpg=? ]P? 8Vrms ?@4 4R+ > 8dt ?@4 4?)8   ?@4 4`*w\XH   ?@4 4`/w\HH   ?@4 4`>w\H  ?@4 4b Pw\x8   ?@4 4`Mw\XSNOD0P'x0%P#`R  @ bandwidth ?@4 4zG? 8 n_samples@`c@[0@ 9@*@}F*@b @݇6 @[ng @JG @+҄ @X~@'g#w@o@/'x @N @'ke,@6vy@(䅡@;@DD"@Tݭ@:fë@bś@@Íc@]u^'@B@*"@68@=T#@AmZ@%G@CBL"@k{ϓ)@Nu @&ۈ&@k@s.@KA`@(h;@.M @.,@ @⒔%@.gJ9@&3@hb@dO:@c{@{N.@s]@gC@?d@ya@l{۩@E@f?@V @@t7˜@%Ø@t@^?@2^z@c9 C@~;J@bo I@zO@j#PT@PA[@Z< O@ӮU@-D@IKe@J@j9k@;R9@gEӎZ@ta3@]$HwT@6 q@9GT!@X|@_o`)%@ֽ#@6P+@' @?{'@Q#4@@8@ޤ@| ;@v(& @'1@tq0 @m .@R?E$@/+@rt6 +@9$1@D=e5@=z<@v*.@9]5@|F0&@4W|G@)@\&((Zg?]'t鿊^O?(JҿO= 1;n Ȉ ? n(?LYkҿ̤WK鿟x=Gυ?<C+)?f|ҿʬY24?*ě!֙?ڞ⿂RVٿXv?F 14"8{?_u5_I={-<9ٿݛ^?vUj!b ?=F>Icp!ٿ1i?TGS?$5=ٿ#ж?@)~⿗ ?~Q]>vcS C]ٿ!fBT?JZz>LY?VKBIbqaٿM.?/cYm<7?ȝK 翠L1 p1\3ٿ?oJ⿜ #C>?>dufS濊rkT0_z?!쿀.?i=wt$$q`ٿWX?0Q!x<?N)bȿai ῿W  ZM5?[솏῅6?ݟ3ǿci?պg]ni?%ǿc*ݵῳռmv*8?{FC?+Mɿ^#ῸiG/6?*ߡ2?0`bƿEuῌqd2꿢pt?ݵQ 8( ?| B%#ɿ"'}:2TdB :?KiX8?hlV3ɿ4\y;H꿝5VX 7?8P??/ˏ ǿ0I RULhGv$Yz?B.9c1&K? T>BQ|/K2׿[D6?4B ?@X첿>FzV׿Ɗ[?Ae?RӞgUDiC\ֿV?S>ߺ? (EzGYIs ׿wx?gP >? $- | qٿ`&?4{59k?JĵB,t=5)ٿD"c?l8.G?1d)Y /e&~bٿFEµ?:ba*侵Yb?^ο^$b ٿ[܂o?8R'TS?]Y(?H +D, ݿX濗S7?k?.W5V`ܿ7kOOG! ?c+?C=W`-ܿڳh῎o L"?#?X#2_zܿg\C$;tC?B9?L)֧byjݿm˟wZe8?w ?!t (hݿ1^qusSp+Ns\?1CX? Їq Lwݿ@1puVa;К?=,p?X{"#^|ݿtef~YZr6*d߿Ty2vɿn'[m&Kj u??]Ծ̛߿9dHɿ>"ק9?ف?-e ^R߿"ʿyvGoq_?XO|?g|@KN߿z<ʿ6 $?/?-:O뿿=UM?dʿ "㾶n~Փ?LSH?uG d/࿵Su0]˿Zz꿋z/"f?qiw?VG꿵 ࿭D)ʿrb9߳fu?cW?j9oZۛ^Eوɿ{ =/u? ڞ&G?"׿jz?8$?fچ ?ܰ99 3 ht?4v?gć툿9Ջ$"ҝG^,?!إ!?Fi뿽XW ,9꿓zh5?8?4꿛]Zv MZrF_+ b?O ?#LSڊDK}67}#d/nϒ?B>?6(꿬<Z& qvcttZ7y|?a 9D?#Vlꍿ{' {lb꿘߯,{?#o?&=%M䍿( 'b9K汢| '?(+bdݿ?f9,ĜH?llT?b)Gj<_3ݿZ( ?@+3俼{H?TЈV ?L12ĒLݿGM2?I){TIm~? 4(?՘ELݿ_M?uGׁN~?z1wo?~ (<Ո޿Y^? ̷7TPg?(P?Ā㿴{A޿E?oy/YΘ?c? ~ ޿]m?,6W`㿂!Bh?K; ?yG/&U޿Kk?DY㿪q7?yI?wwV ? oF~?C}۴?E?)?@=f?J͛&?.翷\7[?^~Q?–6?܍/?'mn( ?Z%" [&%?1?Rp*?|$ԘY?3R?~WN?Y9?t/F0*?8ᜢ4??FIsW/W?KJ K?hB?sը? ?~Bv[翯`?S,? !?ῦ.?N= ?޵q4Ybu?+c'?8MN?ퟭ7۬tYؿP5.㿘'!r=?~Vؿ0g'??(.7;ѿYQ?^>꿓)ѿ__#K? ?H͚ҿ{X>?0? ҧ\ҿCK8?]X0?;ҿH-@SO5Y?Īa3ؿ@7`jO?kxu?Na-?7V9_Rp@?fc"?J<?Y?Pd࿒e?tA 꿴E}]@\?F &?dB1~u\;1?̻y׿v ot&?$?b 1"ش?k\\׿yϵ``X.?17O?Kة1("5y"?BK2R/׿?p?tni?GBL׿#S^?Jtㆍ?N@Kck?>gDQݿCIF1e5d濧4]ݿ)z |?Fz#[ݿ̮dNP+ῒ~ 3)ݿk\LuAoq?m۳!ݿG DT0*QM(ܿwA$H?jaݿl1QKK$ܿ.;[?A"?:sK?GwG0?1;R}?7mݝ?(?nc Ji?tCv? `?u^??=` ?q~Vˑ?_i<{0#g?"4j?]?)*i? m?2m*,1 ?EQS? ?%?]>,? ῵Ws?9x:E?߰7?cVv?N9s)p?kZY1!? (JbH? \>^?2i?((Te? B|\uv?-=?,n?-T?& ?0T(΅|O??d7?2A ĥ<뿕-$ῈVhPlĦ:?}+:\D L;}4A^뿤ĭ%?1=Z 1=[뿒V#͎}Dωl9?;ˠl w ,9ΐNPyU֢N?ϭ :_sm꿺,^aLz37?w0/Lɯq\aῙq`q4aH? jԄnЄ?Ύ(GE&a꿜_"?3a)̓BΏ(K8Õq{꿯3F??@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@8   ?@4 4`Zw\Xmaximum_amplitudestriggeredray_tracing_C1ray_tracing_C0travel_distancespolarizationreceive_vectorsSNRsray_tracing_solution_typetravel_timesmaximum_amplitudes_envelopelaunch_vectorsmultiple_triggersX(   ?@4 4 w\hH   ?@4 4`_w\H(  (FALSETRUE2w\Xx trigger_namesLPDA_2of4_4.1sigmasurface_dipoles_4of4_3sigmasimple_threshold H detector"`n (antenna_positions ?@4 4@@@@@@D@0aF@@D@d[F@~% <@Huv)>@b;(<@I%>@*~"<@*F@/3@I(B>@mb<@ٺ"F@L{]D@+<>O@kh@\H5@.G @0 @N]i@@!]@E@`L@GG@Os`@P @7T@Xwc @@.gߣ@PP7@λ@x'4Ի@?c_ʻ@sϻ@?G S@@lV|@RblbŻ@$ @וJѻ@*݉@!ƻ@'?&־@DQٻ@MYɻ@ͧc@; @5 @@dO\ @pf@I@OQ@nC@h&-@}@R @e @H͠pE@Kí@8T@`@\ @ "@$@WI%@=!,@A-@\msd(@!*@hc&@kf@m/@:Ю*@gɹĮ3@_#G@!'@x3g@%X#@w@@!@fa᪬@c@ݍa%@^1α@m[@ΘG@R:'@栦@[PC@. FS@b@y@{@@>D@*_@)Yt@ڴ(R @; @T\`|@@!>@x7*@N9 @S@GJ@ц@&)@ et@4R@$y@)@wN@8@p@TLv@$+i@9@N@}@?m(~@W41@=@@3n@›@V$@7~@v@wz@Mp^}@Wex@ۄ@=wƝs@cL+3@)):x@`g@b5@Re@ ~@ʊ@z3@0@u?t2?T޿Dn?nk?amh޿̢?/?I|HgƲ࿲:n5?vKr2j9? N{˱h? JQ#?ylæοgA?o~0a#?Qοײ?rxe?.Bο\h?mC?aVο 甡?6ޏq?A͕`οPQ?`>?6 Ͽ۷, ?;?v6ѷ+x{?n:'JC?XXvRMߴ?/0B8? N?Hb"v?~!(?SӸP A ?v#?+sTɸ6 ?9iZ?d)귿?[ #?qីZ[y?_ϥW?kϖm:㸿A?g‚\!?{xmA ?#?%tQ={ ?JP۾?BF* ?o v&?Jf ? ??t/w·}W?Լ(?6N/ÿؤ{?G*A?I(~'ÿ9Ӟ?.DA0?*R X¿jb?0&?j 6¿a:z?n4?lv$ÿFc?5&+?"ı<ÿѵÓ?LP-?b4ZÿN˔N?jA#?sRzRÿuY?bFH?0Lÿ)1Wx?Kt1?h A¿0?L*yE?հdÿ#cu?ra?N3=ÿ5-\?jGh9?2nFpÿM;?X ? IÿMLn2E?@X7?CmI?Zv]?Y?3?q?ρr>?e?q0N?#YG?7 Gq?]c ?bҧ(K?O ?Ƅ|?D/>? rO?銏U?ER{WÍ?(5?\قx?q??R? ́?$ Z)?桳?h=S?Ӥ ?SF&?Z?C kڍ?Vڈ?-?2"Vˍ?l_R~?+Lc?!w3?a`?4-=7g?nNf ?Q+^}?\XT,}?N6QA?K1E?F3x?ҋi?j?l$ ?ۮ{n??e8hx?)g>/?8\_j?7o?#&UZ?:{?(15g?lC?.-P~?yPܒ?GCOL#"{ "_default": {}, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "comment": { "1": "a surface station with 4 downward facing LPDAs and 4 dipoles with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "positions": {}, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 0, "pos_easting": null, "pos_measurement_time": null, "pos_northing": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } } @config` PNuRadioMC_version_hash(` XNuRadioReco_version_hash(`8   ?@4 4`w\X @ thetamin ?@4 4h  ?@4 4PPw\x  ?@4 4Pw\x  ?@4 4Pw\x @@Pw\ 8zmax ?@4 4 8zmin ?@4 4 @ thetamax ?@4 4-DT! @GCOLnoise: false propagation: {attenuate_ice: true, attenuation_model: SP1, ice_model: ARAsim_southpole, module: analytic, n_freq: 25} sampling_rate: 5.0 save_all: false signal: {ePhi: 0.0, model: Alvarez2000, polarization: auto, zerosignal: false} speedup: {delta_C_cut: 0.698, min_efield_amplitude: 2, minimum_weight_cut: 1.0e-05, redo_raytracing: true} trigger: {bandwidth: 0.42, noise_temperature: 300} weights: {cross_section_type: ctw, weight_mode: core_mantle_crust} (40224c694df2c2b31da400e1fad33134c02aa3a3(c6afd3a55421423d14e56bd98cddfdac860955cb8 # all quantities are in the default NuRadioMC units (i.e., meters, radians and eV) # all geometry quantities are in the NuRadioMC default local coordinate system: # coordinate origin is at the surface # x axis is towards Easting, y axis towards Northing, z axis upwards # zenith/theta angle is defined with respect to z axis, i.e. 0deg = upwards, 90deg = towards horizon, 180deg = downwards # azimuth/phi angle counting northwards from East # # the collumns are defined as follows # 1. event id (integer) # 2. neutrino flavor (integer) encoded as using PDG numbering scheme, particles have positive sign, anti-particles have negative sign, relevant for us are: # 12: electron neutrino # 14: muon neutrino # 16: tau neutrino # 3. energy of neutrino (double) # 4. charge or neutral current interaction (string, one of ['cc', 'nc'] # 5./6./7. position of neutrino interaction vertex in cartesian coordinates (x, y, z) (in default NuRadioMC local coordinate system) # 8. zenith/theta angle of neutrino direction (pointing to where it came from, i.e. opposite to the direction of propagation) # 9. azimuth/phi angle of neutrino direction (pointing to where it came from, i.e. opposite to the direction of propagation) # 10. inelasticity (the fraction of neutrino energy that goes into the hadronic part) # Hc@[0@ 9@*@}F*@b @݇6 @[ng @JG @+҄ @X~@'g#w@o@/'x @N @'ke,@6vy@(䅡@;@DD"@Tݭ@:fë@bś@@Íc@]u^'@B@*"@68@=T#@AmZ@%G@CBL"@k{ϓ)@Nu @&ۈ&@k@s.@KA`@(h;@.M @.,@ @⒔%@.gJ9@&3@hb@dO:@c{@{N.@s]@gC@?d@ya@l{۩@E@f?@V @@t7˜@%Ø@t@^?@2^z@c9 C@~;J@bo I@zO@j#PT@PA[@Z< O@ӮU@-D@IKe@J@j9k@;R9@gEӎZ@ta3@]$HwT@6 q@9GT!@X|@_o`)%@ֽ#@6P+@' @?{'@Q#4@@8@ޤ@| ;@v(& @'1@tq0 @m .@R?E$@/+@rt6 +@9$1@D=e5@=z<@v*.@9]5@|F0&@4W|G@)@?R?x<C?'Jؿ@f wNՃm@ӏpIy@b! b@4Flr@a%"(z@2U)͓#<@wҝ@FCe@0 @h{.:@[!@!vH@w|$@6%Fl&@+ @SNOD( p88xH @Pw\  ?@4 4Pw\x 0w\  ?@4 4`Pw\xH   ?@4 4`w\H @Pw\W#Կ w?,G#?,-Կ]&t쿏U[aԿgru?~%3S? 65Կ{6.t aQdԿCԩ? c sDH?zgԿޱ%fKԿ/OΞ?@/sӨ?JԿR[f쿒bkBտw`V?rs쿱IL0G?}#ֿr~ yտTd?Pi)U}K?̈́ztcֿcpS~BBտ\&((Zg?]'t鿊^O?(JҿO= 1;n Ȉ ? n(?LYkҿ̤WK鿟x=Gυ?<C+)?f|ҿʬY24?*ě!֙?ڞ⿂RVٿXv?F 14"8{?_u5_I={-<9ٿݛ^?vUj!b ?=F>Icp!ٿ1i?TGS?$5=ٿ#ж?@)~⿗ ?~Q]>vcS C]ٿ!fBT?JZz>LY?VKBIbqaٿM.?/cYm<7?ȝK 翠L1 p1\3ٿ?oJ⿜ #C>?>dufS濊rkT0_z?!쿀.?i=wt$$q`ٿWX?0Q!x<?N)bȿai ῿W  ZM5?[솏῅6?ݟ3ǿci?պg]ni?%ǿc*ݵῳռmv*8?{FC?+Mɿ^#ῸiG/6?*ߡ2?0`bƿEuῌqd2꿢pt?ݵQ 8( ?| B%#ɿ"'}:2TdB :?KiX8?hlV3ɿ4\y;H꿝5VX 7?8P??/ˏ ǿ0I RULhGv$Yz?B.9c1&K? T>BQ|/K2׿[D6?4B ?@X첿>FzV׿Ɗ[?Ae?RӞgUDiC\ֿV?S>ߺ? (EzGYIs ׿wx?gP >? $- | qٿ`&?4{59k?JĵB,t=5)ٿD"c?l8.G?1d)Y /e&~bٿFEµ?:ba*侵Yb?^ο^$b ٿ[܂o?8R'TS?]Y(?H +D, ݿX濗S7?k?.W5V`ܿ7kOOG! ?c+?C=W`-ܿڳh῎o L"?#?X#2_zܿg\C$;tC?B9?L)֧byjݿm˟wZe8?w ?!t (hݿ1^qusSp+Ns\?1CX? Їq Lwݿ@1puVa;К?=,p?X{"#^|ݿtef~YZr6*d߿Ty2vɿn'[m&Kj u??]Ծ̛߿9dHɿ>"ק9?ف?-e ^R߿"ʿyvGoq_?XO|?g|@KN߿z<ʿ6 $?/?-:O뿿=UM?dʿ "㾶n~Փ?LSH?uG d/࿵Su0]˿Zz꿋z/"f?qiw?VG꿵 ࿭D)ʿrb9߳fu?cW?j9oZۛ^Eوɿ{ =/u? ڞ&G?"׿jz?8$?fچ ?ܰ99 3 ht?4v?gć툿9Ջ$"ҝG^,?!إ!?Fi뿽XW ,9꿓zh5?8?4꿛]Zv MZrF_+ b?O ?#LSڊDK}67}#d/nϒ?B>?6(꿬<Z& qvcttZ7y|?a 9D?#Vlꍿ{' {lb꿘߯,{?#o?&=%M䍿( 'b9K汢|SNOD`(hȴx8   ?@4 4`w\X  ?@4 4Pw\xH   ?@4 4`w\H(   ?@4 4`w\h8   ?@4 4w\XSNODH8(H8`HhD@0aF@@D@d[F@~% <@Huv)>@b;(<@I%>@*~"<@*F@/3@I(B>@mb<@ٺ"F@L{]D@+<>O@kh@\H5@.G @0 @N]i@@!]@E@`L@GG@Os`@P @7T@Xwc @@.gߣ@PP7@λ@x'4Ի@?c_ʻ@sϻ@?G S@@lV|@RblbŻ@$ @וJѻ@*݉@!ƻ@'?&־@DQٻ@MYɻ@ͧc@; @5 @@dO\ @pf@I@OQ@nC@h&-@}@R @e @H͠pE@Kí@8T@`@\ @ "@$@WI%@=!,@A-@\msd(@!*@hc&@kf@m/@:Ю*@gɹĮ3@_#G@!'@x3g@%X#@w@@!@fa᪬@c@ݍa%@^1α@m[@ΘG@R:'@栦@[PC@. FS@b@y@{@@>D@*_@)Yt@ڴ(R @; @T\`|@@!>@x7*@N9 @S@GJ@ц@&)@ et@4R@$y@)@wN@8@p@TLv@$+i@9@N@}@?m(~@W41@=@@3n@›@V$@7~@v@wz@Mp^}@Wex@ۄ@=wƝs@cL+3@)):x@`g@b5@Re@ ~@ʊ@z3@0@u?t2?T޿Dn?nk?amh޿̢?/?I|HgƲ࿲:n5?vKr2j9? N{˱h? JQ#?ylæοgA?o~0a#?Qοײ?rxe?.Bο\h?mC?aVο 甡?6ޏq?A͕`οPQ?`>?6 Ͽ۷, ?;?v6ѷ+x{?n:'JC?XXvRMߴ?/0B8? N?Hb"v?~!(?SӸP A ?v#?+sTɸ6 ?9iZ?d)귿?[ #?qីZ[y?_ϥW?kϖm:㸿A?g‚\!?{xmA ?#?%tQ={ ?JP۾?BF* ?o v&?Jf ? ??t/w·}W?Լ(?6N/ÿؤ{?G*A?I(~'ÿ9Ӟ?.DA0?*R X¿jb?0&?j 6¿a:z?n4?lv$ÿFc?5&+?"ı<ÿѵÓ?LP-?b4ZÿN˔N?jA#?sRzRÿuY?bFH?0Lÿ)1Wx?Kt1?h A¿0?L*yE?հdÿ#cu?ra?N3=ÿ5-\?jGh9?2nFpÿM;?X ? IÿMLn2E?@X7?CmI?Zv]?Y?3?q?ρr>?e?q0N?#YG?7 Gq?]c ?bҧ(K?O ?Ƅ|?D/>? rO?銏U?ER{WÍ?(5?\قx?q??R? ́?$ Z)?桳?h=S?Ӥ ?SF&?Z?C kڍ?Vڈ?-?2"Vˍ?l_R~?+Lc?!w3?a`?4-=7g?nNf ?Q+^}?\XT,}?N6QA?K1E?F3x?ҋi?j?l$ ?ۮ{n??e8hx?)g>/?8\_j?7o?#&UZ?:{?(15g?lC?.-P~?yPܒ?m}? pH?,@L?)sH?m.CG.?mOɀ-?+0O*?q21?$aT ?O/>o\|?vJ> i| ?Z ?Ʌ;c^?3?fm>>Z2#> "Q{> w^?`Xd ? ?*g$a ?6Wg? ?4??كC?bad?:‘? ;?7pɔ?'# 짟?Z?ߤ?H{?1:H6?xґ3?>Yn~7?:}N 0??щ+'!?a?k6"???,ˏE.?,-' ^y?|T>)>[9>A\>'>z[>U>k 2>$?u)'?EYm??p.?X dX?9M?窱?8wp)[,>;?gQ9?Z?b\?_w~՝ ?Z!B ??ty.S>Mg>e+ p>+!a>Φ|?!r@B?xOXj?>Mˡ?i@%©-۟@u@eT6۟@ٟ@eͣIʟ@0ٟ@Vs@ʟ@F@$n@L @RS:@M{@-]@tqt, @X@{Ɵ@jO@s.+ݐ@'=ؐ@@ϐ@Z@Hkې@_@˴b@-@ޜ\þ@+@_puؐ@]j@ٶ͡ڐ@@kѵ@Y񤷯ܘ@DИ@ۍט@&˘@ ; Ƙ@6R@t5˘@2"w@v@2@/֘@ ͝@"t@y_/@ޭ3F@ N@ݬ;d}@J}@͗FO}@G /5}@]3}@/X|~}@ۉ}@w.D}@sR:}@;}@=2}@)S&z}@u2|3}@i!]CG}@< g}@Ё|@lĔk@k+j@@9/Wk@;8j@0k@;7k@(Rk@o k@xH3l@0lNj@ljm@(}Ej@ȍw _l@,ʛi@01l@Px]i@{+r\@,p5/\@Kv]@ >\@(^@H^Nq]@4v]@Z1 ]@hB^@Ж\@\b_@{@-]@Q<`]@T C[@8\@h(f*[@p˛e@F> e5e@pf@+ϥq{e@}P+Hf@e@hid?f@He@0g@ŭid@ ׁg@ 2 3d@&Hg@s,d@'Zf@sd@VR/@r @.5x@tT@blr@r_dN@ SS)@X@{|@E(0@2"E䃐@SR~@fX?M@Nzx~@R䋜@v~@s @>'D@є@@~ %@^t;@5ɤ@@V @(̵@)E @|/@w!z"@/hqo@Ȉ .@@\c@Kt!@CE@N+@;Q_@ D@+F@@FKo,@ -@/z*@o%+@;d@zڔma@xו@j^&F`@I+v@?@ @8   ?@4 4w\X  ?@4 4PPw\x  ?@4 4Pw\x8   ?@4 4w\Xweightsmultiple_triggerstriggeredstation_101travel_distancesinelasticityxxzzevent_idsflavorsenergiesazimuthspolarizationn_interactiontravel_timeszenithslaunch_vectorsmaximum_amplitudesray_tracing_C1ray_tracing_C0yySNRsray_tracing_solution_typeinteraction_typereceive_vectorsmaximum_amplitudes_envelope @header8` @fiducial_zmax ?@4 4 8 VERSION_MINOR@@2? ?x]ʻ?ƽ$??81!?? 7(?n? fq?i+2|?.ˏ*? o?~c?p{b?Ϛah?!?ʛ??X0?nX%? x?؍+?j `SN ?,o?S?P3?2:?vHl?$9h?D?\ 0?HZC2?,?NB&9?|$@6?,$_?3&?2UA?i(?WcQ? ?G?*\p?V Uj?eyo"?(g? #?p?Y?-r?iR?Eut?oL!?ao?\D֨?wj}?G2ֶ??Q-?TnM~?7v?jV(}o?Kx?<W?Y`?o?R4I?>BmQv?SS@?жZ#m?1Oh?CN?2s̨q?2X"z?Nb_?j?EǚZ?e?pGS?5g.^?5&YX?xc?Ng??>qks?YFC=?Cp?|I?mF}?̺ɴ`L?k?/?R?Xh:~x?N,~?sry?J!D!?/'?XMۊ?y!{ h?U?ų3t?+2?c;]?K&,t?r?]A?!\? ~?A1?dː?<) ?~ak?;*#?hh?$[?f=\ ?0DD? f1?:U?Q`|}?K?0&?"P? ?.u?5N/?`?$ܣl? ?0dr?`P?/?`?ǵ?Î+?OVT?;c,?~jpg=? ]P??@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@H   ?@4 4w\H(   ?@4 4w\h h flavors@  8rmin ?@4 4 @fiducial_zmin ?@4 4 @ total_number_of_events@' 8 start_event_id@ P &depositedFALSETRUE 8phimax ?@4 4-DT!@ 8phimin ?@4 4 8Emin ?@4 4NgmC 8rmax ?@4 4@@ @fiducial_rmax ?@4 4@@ 8 VERSION_MAJOR@ 8Emax ?@4 4NgmC @fiducial_rmin ?@4 4 8 n_events@' '?(+bdݿ?f9,ĜH?llT?b)Gj<_3ݿZ( ?@+3俼{H?TЈV ?L12ĒLݿGM2?I){TIm~? 4(?՘ELݿ_M?uGׁN~?z1wo?~ (<Ո޿Y^? ̷7TPg?(P?Ā㿴{A޿E?oy/YΘ?c? ~ ޿]m?,6W`㿂!Bh?K; ?yG/&U޿Kk?DY㿪q7?yI?wwV ? oF~?C}۴?E?)?@=f?J͛&?.翷\7[?^~Q?–6?܍/?'mn( ?Z%" [&%?1?Rp*?|$ԘY?3R?~WN?Y9?t/F0*?8ᜢ4??FIsW/W?KJ K?hB?sը? ?~Bv[翯`?S,? !?ῦ.?N= ?޵q4Ybu?+c'?8MN?ퟭ7۬tYؿP5.㿘'!r=?~Vؿ0g'??(.7;ѿYQ?^>꿓)ѿ__#K? ?H͚ҿ{X>?0? ҧ\ҿCK8?]X0?;ҿH-@SO5Y?Īa3ؿ@7`jO?kxu?Na-?7V9_Rp@?fc"?J<?Y?Pd࿒e?tA 꿴E}]@\?F &?dB1~u\;1?̻y׿v ot&?$?b 1"ش?k\\׿yϵ``X.?17O?Kة1("5y"?BK2R/׿?p?tni?GBL׿#S^?Jtㆍ?N@Kck?>gDQݿCIF1e5d濧4]ݿ)z |?Fz#[ݿ̮dNP+ῒ~ 3)ݿk\LuAoq?m۳!ݿG DT0*QM(ܿwA$H?jaݿl1QKK$ܿ.;[?A"?:sK?GwG0?1;R}?7mݝ?(?nc Ji?tCv? `?u^??=` ?q~Vˑ?_i<{0#g?"4j?]?)*i? m?2m*,1 ?EQS? ?%?]>,? ῵Ws?9x:E?߰7?cVv?N9s)p?kZY1!? (JbH? \>^?2i?((Te? B|\uv?-=?,n?-T?& ?0T(΅|O??d7?2A ĥ<뿕-$ῈVhPlĦ:?}+:\D L;}4A^뿤ĭ%?1=Z 1=[뿒V#͎}Dωl9?;ˠl w ,9ΐNPyU֢N?ϭ :_sm꿺,^aLz37?w0/Lɯq\aῙq`q4aH? jԄnЄ?Ύ(GE&a꿜_"?3a)̓BΏ(K8Õq{꿯3F?Ұ/Ӊ?X2?Q$?Ƿ7[?3J3?2?m|3?]L4?o?vg.>aN?uS#EP>*#Y= ?Adt ?،e ?&a ?m>il>'&tk*>lJ_ft>2A?Eg7>>7>v>j}:鮬?v$;d?|-?({s_?,?6 ?Qyȉ?{ʆ?ӓE?&?_?&QN>ww ?Q?}No ?wg º!?D)%!?B2!?"~f!?u$> >>>SG&>rs?|Ģ?t y?c-?PKmNÈ__(NuRadioMC/test/T01generate_event_list.py#!/usr/bin/env python from __future__ import absolute_import, division, print_function from NuRadioMC.utilities import units from NuRadioMC.EvtGen.generator import generate_eventlist_cylinder # define simulation volume zmin = -2.7 * units.km # the ice sheet at South Pole is 2.7km deep zmax = 0 * units.km rmin = 0 * units.km rmax = 2 * units.km # generate one event list at 1e18 eV with 10000 neutrinos generate_eventlist_cylinder('1e18_full.hdf5', 1e4, 1e18 * units.eV, 1e18 * units.eV, rmin, rmax, zmin, zmax, full_rmin=rmin, full_rmax=rmax, full_zmin=zmin, full_zmax=zmax)PKmN1"NuRadioMC/test/T02RunSimulation.py#!/usr/bin/env python from __future__ import absolute_import, division, print_function import argparse # import detector simulation modules import NuRadioReco.modules.efieldToVoltageConverter import NuRadioReco.modules.trigger.highLowThreshold import NuRadioReco.modules.trigger.simpleThreshold import NuRadioReco.modules.channelResampler import NuRadioReco.modules.channelBandPassFilter import NuRadioReco.modules.channelGenericNoiseAdder from NuRadioReco.utilities import units from NuRadioMC.simulation import simulation2 as simulation import logging logging.basicConfig(level=logging.WARNING) logger = logging.getLogger("runstrawman") # initialize detector sim modules efieldToVoltageConverter = NuRadioReco.modules.efieldToVoltageConverter.efieldToVoltageConverter() efieldToVoltageConverter.begin() triggerSimulatorHighLow = NuRadioReco.modules.trigger.highLowThreshold.triggerSimulator() triggerSimulatorSimple = NuRadioReco.modules.trigger.simpleThreshold.triggerSimulator() channelResampler = NuRadioReco.modules.channelResampler.channelResampler() channelBandPassFilter = NuRadioReco.modules.channelBandPassFilter.channelBandPassFilter() channelGenericNoiseAdder = NuRadioReco.modules.channelGenericNoiseAdder.channelGenericNoiseAdder() class mySimulation(simulation.simulation): def _detector_simulation(self): # start detector simulation if(bool(self._cfg['signal']['zerosignal'])): self._increase_signal(None, 0) efieldToVoltageConverter.run(self._evt, self._station, self._det) # convolve efield with antenna pattern # downsample trace to internal simulation sampling rate (the efieldToVoltageConverter upsamples the trace to # 20 GHz by default to achive a good time resolution when the two signals from the two signal paths are added) channelResampler.run(self._evt, self._station, self._det, sampling_rate=1. / self._dt) if bool(self._cfg['noise']): Vrms = self._Vrms / (self._bandwidth /( 2.5 * units.GHz))** 0.5 # normalize noise level to the bandwidth its generated for channelGenericNoiseAdder.run(self._evt, self._station, self._det, amplitude=Vrms, min_freq=0 * units.MHz, max_freq=2.5 * units.GHz, type='rayleigh') # bandpass filter trace, the upper bound is higher then the sampling rate which makes it just a highpass filter channelBandPassFilter.run(self._evt, self._station, self._det, passband=[80 * units.MHz, 1000 * units.GHz], filter_type='butter', order=2) channelBandPassFilter.run(self._evt, self._station, self._det, passband=[0, 500 * units.MHz], filter_type='butter', order=10) # first run a simple threshold trigger triggerSimulatorSimple.run(self._evt, self._station, self._det, threshold=3 * self._Vrms, triggered_channels=None, # run trigger on all channels number_concidences=1, trigger_name='simple_threshold') # the name of the trigger # run a high/low trigger on the 4 downward pointing LPDAs triggerSimulatorHighLow.run(self._evt, self._station, self._det, threshold_high=4 * self._Vrms, threshold_low=-4 * self._Vrms, triggered_channels=[0, 1, 2, 3], # select the LPDA channels number_concidences=2, # 2/4 majority logic trigger_name='LPDA_2of4_4.1sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger # run a high/low trigger on the 4 surface dipoles triggerSimulatorHighLow.run(self._evt, self._station, self._det, threshold_high=3 * self._Vrms, threshold_low=-3 * self._Vrms, triggered_channels=[4, 5, 6, 7], # select the bicone channels number_concidences=4, # 4/4 majority logic trigger_name='surface_dipoles_4of4_3sigma', set_not_triggered=(not self._station.has_triggered("simple_threshold"))) # calculate more time consuming ARIANNA trigger only if station passes simple trigger # downsample trace back to detector sampling rate channelResampler.run(self._evt, self._station, self._det, sampling_rate=self._sampling_rate_detector) parser = argparse.ArgumentParser(description='Run NuRadioMC simulation') parser.add_argument('inputfilename', type=str, help='path to NuRadioMC input event list') parser.add_argument('detectordescription', type=str, help='path to file containing the detector description') parser.add_argument('config', type=str, help='NuRadioMC yaml config file') parser.add_argument('outputfilename', type=str, help='hdf5 output filename') parser.add_argument('outputfilenameNuRadioReco', type=str, nargs='?', default=None, help='outputfilename of NuRadioReco detector sim file') args = parser.parse_args() sim = mySimulation(eventlist=args.inputfilename, outputfilename=args.outputfilename, detectorfile=args.detectordescription, outputfilenameNuRadioReco=args.outputfilenameNuRadioReco, config_file=args.config) sim.run() PKmN|xԫNuRadioMC/test/T03validate.py#!/usr/bin/env python from __future__ import absolute_import, division, print_function import sys import h5py import numpy as np from numpy import testing import argparse from NuRadioReco.utilities import units import logging file1 = sys.argv[1] file2 = sys.argv[2] fin1 = h5py.File(file1, 'r') fin2 = h5py.File(file2, 'r') # Test all attributes in file attributes = [u'trigger_names', u'antenna_positions', u'Tnoise', u'Vrms', u'dt', u'bandwidth', u'n_samples', u'thetamin', u'zmax', u'zmin', u'thetamax', u'header', u'fiducial_zmax', u'fiducial_zmin', u'flavors', u'rmin', u'total_number_of_events', u'deposited', u'phimax', u'phimin', u'Emin', u'rmax', u'fiducial_rmax', u'Emax', u'fiducial_rmin', u'n_events'] for key in attributes: testing.assert_equal(fin1.attrs[key], fin2.attrs[key]) #Test all keys in file keys = [u'SNRs', u'azimuths', u'energies', u'event_ids', u'flavors', u'inelasticity', u'interaction_type', u'launch_vectors', u'maximum_amplitudes', u'maximum_amplitudes_envelope', u'multiple_triggers', u'n_interaction', u'polarization', u'ray_tracing_C0', u'ray_tracing_C1', u'ray_tracing_solution_type', u'receive_vectors', u'travel_distances', u'travel_times', u'triggered', u'weights', u'xx', u'yy', u'zeniths', u'zz'] for key in keys: testing.assert_equal(np.array(fin1[key]), np.array(fin2[key])) # keys2 = [u'SNRs', # u'launch_vectors', # u'maximum_amplitudes', # u'maximum_amplitudes_envelope', # u'multiple_triggers', # u'polarization', # u'ray_tracing_C0', # u'ray_tracing_C1', # u'ray_tracing_solution_type', # u'receive_vectors', # u'travel_distances', # u'travel_times', # u'triggered'] # # for key in keys2: # testing.assert_equal(np.array(fin1['station_101'][key]), np.array(fin2['station_101'][key])) print("if no error occured, previous results are exactly reproduced.") PKmNmNuRadioMC/test/config.yamlnoise: False # specify if simulation should be run with or without noise sampling_rate: 5. # sampling rate in GHz used internally in the simulation. speedup: minimum_weight_cut: 1.e-5 delta_C_cut: 0.698 # 40 degree redo_raytracing: True # redo ray tracing even if previous calculated ray tracing solutions are present propagation: ice_model: ARAsim_southpole signal: model: Alvarez2000 trigger: noise_temperature: 300 # in Kelvin bandwidth: 0.42 # effective bandwidth in GHz weights: weight_mode: core_mantle_crust # core_mantle_crust: use the three #layer earth model, which considers the different densities of the #core, mantle and crust. simple: use the simple earth model, which #apply a constant earth densityPKmN[pQNuRadioMC/test/requirements.txt# ###### Requirements without Version Specifiers ###### pyyaml numpy astropy tinydb tinydb-serialization h5py matplotlib scipy aenum ###### Requirements with Version Specifiers ###### PKmNJ""(NuRadioMC/test/surface_station_1GHz.json{ "_default": {}, "channels": { "1": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel0", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": -3.0, "ant_position_y": -0.0, "ant_position_z": -1.0, "ant_rotation_phi": 0.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 0, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "2": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": 3.0, "ant_position_z": -1.0, "ant_rotation_phi": 270.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 1, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "3": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 3.0, "ant_position_y": 0.0, "ant_position_z": -1.0, "ant_rotation_phi": 180.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 2, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "4": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 180.0, "ant_position_x": 0.0, "ant_position_y": -3.0, "ant_position_z": -1.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "createLPDA_100MHz", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 3, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "5": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 4, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "6": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": 3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 5, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "7": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": -3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 6, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 }, "8": { "adc_id": null, "adc_n_samples": 256, "adc_nbits": null, "adc_sampling_frequency": 1.0, "adc_time_delay": null, "amp_reference_measurement": null, "amp_type": "300", "ant_comment": "South Pole Station channel1", "ant_orientation_phi": 0.0, "ant_orientation_theta": 0.0, "ant_position_x": -3.0, "ant_position_y": 3.0, "ant_position_z": -5.0, "ant_rotation_phi": 90.0, "ant_rotation_theta": 90.0, "ant_type": "bicone_v8", "cab_id": "17-09", "cab_length": 5.0, "cab_reference_measurement": null, "cab_time_delay": 19.8, "cab_type": "LMR_400", "channel_id": 7, "commission_time": "{TinyDate}:2017-11-01T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "station_id": 101 } }, "comment": { "1": "a surface station with 4 downward facing LPDAs and 4 dipoles with 1GHz sampling, i.e., the bandwidth is 0-500MHz" }, "positions": {}, "stations": { "1": { "MAC_address": "0002F7F2E7B9", "MBED_type": "v1", "board_number": 203, "commission_time": "{TinyDate}:2017-11-04T00:00:00", "decommission_time": "{TinyDate}:2038-01-01T00:00:00", "pos_altitude": 0, "pos_easting": null, "pos_measurement_time": null, "pos_northing": null, "pos_position": "SP1", "pos_site": "southpole", "position": "SP1", "station_id": 101, "station_type": null } } }PKmNh+ͼNuRadioMC/test/validate.sh#!/bin/bash python T02RunSimulation.py 1e18_output_reference.hdf5 surface_station_1GHz.json config.yaml 1e18_output.hdf5 python T03validate.py 1e18_output.hdf5 1e18_output_reference.hdf5PKmNMv8v8NuRadioMC/utilities/Veff.pyimport numpy as np import h5py from scipy import interpolate import glob from NuRadioMC.utilities import units import json import os # collection of utility function regarding the calculation of the effective volume of a neutrino detector def get_triggered(fin): """ Computes an array indicating the triggered events. If a double bang is seen, removes the second bang from the actual triggered array so as not to count twice the same event for the effective volume. Parameters ---------- fin: dictionary Dictionary containing the output data sets from the simulation Returns ------- triggered: numpy array with bools The bools indicate if the events have triggered """ triggered = fin['triggered'][:] if (len(triggered) == 0): return triggered second_bang_indexes = np.argwhere(np.array(fin['n_interaction']) >= 2) if(second_bang_indexes.shape[0] > 1): second_bang_indexes = np.squeeze(second_bang_indexes) elif(second_bang_indexes.shape[0] == 1): second_bang_indexes = second_bang_indexes[0] else: return triggered for second_bang_index in second_bang_indexes: # Second interactions if (fin['event_ids'][second_bang_index-1] == fin['event_ids'][second_bang_index] and fin['triggered'][second_bang_index-1] == True and fin['triggered'][second_bang_index] == True): triggered[second_bang_index] = False # Third interactions elif (fin['event_ids'][second_bang_index-2] == fin['event_ids'][second_bang_index] and fin['triggered'][second_bang_index-2] == True and fin['triggered'][second_bang_index] == True): triggered[second_bang_index] = False return triggered def get_Veff(folder, trigger_combinations={}, zenithbins=False): """ calculates the effective volume from NuRadioMC hdf5 files Parameters ---------- folder: string folder conaining the hdf5 files, one per energy trigger_combinations: dict, optional keys are the names of triggers to calculate. Values are dicts again: * 'triggers': list of strings name of individual triggers that are combines with an OR * 'efficiency': string the signal efficiency vs. SNR (=Vmax/Vrms) to use. E.g. 'Chris' * 'efficiency_scale': float rescaling of the efficiency curve by SNR' = SNR * scale zenithbins: bool If true, returns the minimum and maximum zenith angles Returns ---------- np.array(Es): numpy floats array Smallest energy for each bin Veffs: floats list Effective volumes Veffs_error: floats list Effective volume uncertainties SNR: floats list Signal to noise ratios trigger_names: string list Trigger names [thetamin, thetamax]: [float, float] Mimimum and maximum zenith angles deposited: bool True if the energies are deposited energies False if the energies are primary neutrino energies """ trigger_names = None trigger_names_dict = {} Veffs = {} SNR = {} Veffs_error = {} Es = [] prev_deposited = None deposited = False for iF, filename in enumerate(sorted(glob.glob(os.path.join(folder, '*.hdf5')))): fin = h5py.File(filename, 'r') if 'deposited' in fin.attrs: deposited = fin.attrs['deposited'] if prev_deposited is None: prev_deposited = deposited elif prev_deposited != deposited: print("Warning! The deposited parameter is not consistent!") if('trigger_names' in fin.attrs): trigger_names = fin.attrs['trigger_names'] if(len(trigger_names) > 0): for iT, trigger_name in enumerate(trigger_names): Veffs[trigger_name] = [] Veffs_error[trigger_name] = [] trigger_names_dict[trigger_name] = iT break trigger_combinations['all_triggers'] = {'triggers': trigger_names} print("Trigger names:", trigger_names) for iF, filename in enumerate(sorted(glob.glob(os.path.join(folder, '*.hdf5')))): print(filename) fin = h5py.File(filename, 'r') E = fin.attrs['Emin'] Es.append(E) weights = np.array(fin['weights']) #triggered = np.array(fin['triggered']) triggered = get_triggered(fin) n_events = fin.attrs['n_events'] if(trigger_names is None): trigger_names = fin.attrs['trigger_names'] for iT, trigger_name in enumerate(trigger_names): Veffs[trigger_name] = [] Veffs_error[trigger_name] = [] trigger_names_dict[trigger_name] = iT print(trigger_names) else: if(np.any(trigger_names != fin.attrs['trigger_names'])): if( triggered.size == 0 and fin.attrs['trigger_names'].size == 0 ): print("file {} has not triggering events. Using trigger names from another file".format(filename)) else: print("file {} has inconsistent trigger names: {}".format(filename, fin.attrs['trigger_names'])) raise # calculate effective density_ice = 0.9167 * units.g / units.cm ** 3 density_water = 997 * units.kg / units.m ** 3 rmin = fin.attrs['rmin'] rmax = fin.attrs['rmax'] thetamin = 0 thetamax = np.pi phimin = 0 phimax = 2 * np.pi if('thetamin' in fin.attrs): thetamin = fin.attrs['thetamin'] if('thetamax' in fin.attrs): thetamax = fin.attrs['thetamax'] if('phimin' in fin.attrs): fin.attrs['phimin'] if('phimax' in fin.attrs): fin.attrs['phimax'] dZ = fin.attrs['zmax'] - fin.attrs['zmin'] V = np.pi * (rmax**2 - rmin**2) * dZ Vrms = fin.attrs['Vrms'] # Solid angle needed for the effective volume calculations omega = np.abs(phimax - phimin) * np.abs( np.cos(thetamin)-np.cos(thetamax) ) for iT, trigger_name in enumerate(trigger_names): triggered = np.array(fin['multiple_triggers'][:, iT], dtype=np.bool) Veff = V * density_ice / density_water * omega * np.sum(weights[triggered]) / n_events Veffs[trigger_name].append(Veff) try: Veffs_error[trigger_name].append(Veff / np.sum(weights[triggered])**0.5) except: Veffs_error[trigger_name].append(np.nan) # print("{}: log(E) = {:.3g}, Veff = {:.3f}km^3 st".format(trigger_name, np.log10(E), Veff / units.km**3)) for trigger_name, values in trigger_combinations.iteritems(): indiv_triggers = values['triggers'] if(trigger_name not in Veffs): Veffs[trigger_name] = [] Veffs_error[trigger_name] = [] triggered = np.zeros_like(fin['multiple_triggers'][:, 0], dtype=np.bool) if(isinstance(indiv_triggers, str)): triggered = triggered | np.array(fin['multiple_triggers'][:, trigger_names_dict[indiv_triggers]], dtype=np.bool) else: for indiv_trigger in indiv_triggers: triggered = triggered | np.array(fin['multiple_triggers'][:, trigger_names_dict[indiv_trigger]], dtype=np.bool) if 'triggerAND' in values: triggered = triggered & np.array(fin['multiple_triggers'][:, trigger_names_dict[values['triggerAND']]], dtype=np.bool) if 'notriggers' in values: indiv_triggers = values['notriggers'] if(isinstance(indiv_triggers, str)): triggered = triggered & ~np.array(fin['multiple_triggers'][:, trigger_names_dict[indiv_triggers]], dtype=np.bool) else: for indiv_trigger in indiv_triggers: triggered = triggered & ~np.array(fin['multiple_triggers'][:, trigger_names_dict[indiv_trigger]], dtype=np.bool) if('min_sigma' in values.keys()): if(isinstance(values['min_sigma'], list)): if(trigger_name not in SNR): SNR[trigger_name] = {} masks = np.zeros_like(triggered) for iS in range(len(values['min_sigma'])): # As = np.array(fin['maximum_amplitudes']) As = np.max(np.nan_to_num(fin['max_amp_ray_solution']), axis=-1) # we use the this quantity because it is always computed before noise is added! As_sorted = np.sort(As[:, values['channels'][iS]], axis=1) # the smallest of the three largest amplitudes max_amplitude = As_sorted[:, -values['n_channels'][iS]] mask = np.sum(As[:, values['channels'][iS]] >= (values['min_sigma'][iS] * Vrms), axis=1) >= values['n_channels'][iS] masks = masks | mask if(iS not in SNR[trigger_name]): SNR[trigger_name][iS] = [] SNR[trigger_name][iS].append([max_amplitude[mask] / Vrms]) triggered = triggered & masks else: if(trigger_name not in SNR): SNR[trigger_name] = [] # As = np.array(fin['maximum_amplitudes']) As = np.max(np.nan_to_num(fin['max_amp_ray_solution']), axis=-1) # we use the this quantity because it is always computed before noise is added! # print(As.shape) # print(trigger_name, values['channels']) As_sorted = np.sort(As[:, values['channels']], axis=1) max_amplitude = As_sorted[:, -values['n_channels']] # the smallest of the three largest amplitudes # print(np.sum(As_sorted[:, -values['n_channels']] > (values['min_sigma'] * Vrms))) mask = np.sum(As[:, values['channels']] >= (values['min_sigma'] * Vrms), axis=1) >= values['n_channels'] # max_amplitude[~mask] = 0 SNR[trigger_name].append(As_sorted[mask] / Vrms) # print(Vrms, mask.shape, np.sum(mask)) triggered = triggered & mask if('ray_solution' in values.keys()): As = np.array(fin['max_amp_ray_solution']) max_amps = np.argmax(As[:, values['ray_channel']], axis=-1) sol = np.array(fin['ray_tracing_solution_type']) # print(sol[:,values['ray_channel']][max_amps].shape) # print(max_amps.shape) # a = 1/0 mask = np.array([sol[i,values['ray_channel'], max_amps[i]] == values['ray_solution'] for i in range(len(max_amps))], dtype=np.bool) triggered = triggered & mask Veff = V * density_ice / density_water * omega * np.sum(weights[triggered]) / n_events if('efficiency' in values.keys()): SNReff, eff = np.loadtxt("analysis_efficiency_{}.csv".format(values['efficiency']), delimiter=",", unpack=True) get_eff = interpolate.interp1d(SNReff, eff, bounds_error=False, fill_value=(0, eff[-1])) As = np.max(np.max(np.nan_to_num(fin['max_amp_ray_solution']), axis=-1)[:,np.append(range(0, 8), range(12, 20))], axis=-1) # we use the this quantity because it is always computed before noise is added! if('efficiency_scale' in values.keys()): As *= values['efficiency_scale'] e = get_eff(As/Vrms) Veff = V * density_ice / density_water * omega * np.sum((weights*e)[triggered]) / n_events Veffs[trigger_name].append(Veff) Veffs_error[trigger_name].append(Veff / np.sum(weights[triggered])**0.5) for trigger_name in Veffs.keys(): Veffs[trigger_name] = np.array(Veffs[trigger_name]) Veffs_error[trigger_name] = np.array(Veffs_error[trigger_name]) if zenithbins: return np.array(Es), Veffs, Veffs_error, SNR, trigger_names, [thetamin, thetamax], deposited else: return np.array(Es), Veffs, Veffs_error, SNR, trigger_names, deposited def exportVeff(filename, trigger_names, Es, Veffs, Veffs_error): """ export effective volumes into a human readable JSON file Parameters ---------- filename: string the output filename of the JSON file trigger_names: list of strings the triggers for which the effective volume is exported Es: list or array of floats the energies Veffs: dictionary dictionary containing Veffs for each trigger Veffs_error: dictionary dictionary containing Veff_errors for each trigger """ output = {} for trigger_name in trigger_names: output[trigger_name] = {} output[trigger_name]['energies'] = list(Es) output[trigger_name]['Veff'] = list(Veffs[trigger_name]) output[trigger_name]['Veff_error'] = list(Veffs_error[trigger_name]) with open(filename, 'w') as fout: json.dump(output, fout, sort_keys=True, indent=4) def exportVeffPerZenith(folderlist, outputfile): """ export effective volumes into a human readable JSON file We assume a binning in zenithal angles Parameters ---------- folderlist: strings list list containing the input folders outputfile: string name for the output file """ output = {} for folder in folderlist: Es, Veffs, Veffs_error, SNR, trigger_names, thetas, deposited = get_Veff(folder, zenithbins=True) output[thetas[0]] = {} for trigger_name in trigger_names: output[thetas[0]][trigger_name] = {} if deposited: output[thetas[0]][trigger_name]['deposited_energies'] = list(Es) else: output[thetas[0]][trigger_name]['energies'] = list(Es) output[thetas[0]][trigger_name]['Veff'] = list(Veffs[trigger_name]) output[thetas[0]][trigger_name]['Veff_error'] = list(Veffs_error[trigger_name]) with open(outputfile, 'w+') as fout: json.dump(output, fout, sort_keys=True, indent=4) PKmNNuRadioMC/utilities/__init__.pyPKmN 4GFF!NuRadioMC/utilities/attenuation.h#include #include using namespace std; double get_temperature(double z){ //return temperature as a function of depth // from https://icecube.wisc.edu/~araproject/radio/#icetemperature double z2 = abs(z/utl::m); return 1.83415e-09*z2*z2*z2 + (-1.59061e-08*z2*z2) + 0.00267687*z2 + (-51.0696 ); } double get_attenuation_length(double z, double frequency, int model){ if(model == 1) { double t = get_temperature(z); double f0 = 0.0001; double f2 = 3.16; double w0 = log(f0); double w1 = 0.0; double w2 = log(f2); double w = log(frequency / utl::GHz); double b0 = -6.74890 + t * (0.026709 - t * 0.000884); double b1 = -6.22121 - t * (0.070927 + t * 0.001773); double b2 = -4.09468 - t * (0.002213 + t * 0.000332); double a, bb; if(frequency<1. * utl::GHz){ a = (b1 * w0 - b0 * w1) / (w0 - w1); bb = (b1 - b0) / (w1 - w0); } else{ a = (b2 * w1 - b1 * w2) / (w1 - w2); bb = (b2 - b1) / (w2 - w1); } return 1./exp(a +bb*w); } else { std::cout << "attenuation length model " << model << " unknown" << std::endl; throw 0; } } PKmNc3XX"NuRadioMC/utilities/attenuation.pyimport numpy as np from NuRadioMC.utilities import units model_to_int = {"SP1" : 1} # def get_temperature(self, z): # return (-51.5 + z * (-4.5319e-3 + 5.822e-6 * z)) def get_temperature(z): """ returns the temperature in Celsius as a function of depth """ # from https://icecube.wisc.edu/~araproject/radio/#icetabsorption z2 = np.abs(z / units.m) return 1.83415e-09 * z2**3 + (-1.59061e-08 * z2**2) + 0.00267687 * z2 + (-51.0696) def get_attenuation_length(z, frequency, model): if(model == "SP1"): t = get_temperature(z) f0 = 0.0001 f2 = 3.16 w0 = np.log(f0) w1 = 0.0 w2 = np.log(f2) w = np.log(frequency / units.GHz) b0 = -6.74890 + t * (0.026709 - t * 0.000884) b1 = -6.22121 - t * (0.070927 + t * 0.001773) b2 = -4.09468 - t * (0.002213 + t * 0.000332) if(not hasattr(frequency, '__len__')): if (frequency < 1. * units.GHz): a = (b1 * w0 - b0 * w1) / (w0 - w1) bb = (b1 - b0) / (w1 - w0) else: a = (b2 * w1 - b1 * w2) / (w1 - w2) bb = (b2 - b1) / (w2 - w1) else: a = np.ones_like(frequency) * (b2 * w1 - b1 * w2) / (w1 - w2) bb = np.ones_like(frequency) * (b2 - b1) / (w2 - w1) a[frequency < 1. * units.GHz] = (b1 * w0 - b0 * w1) / (w0 - w1) bb[frequency < 1. * units.GHz] = (b1 - b0) / (w1 - w0) return 1. / np.exp(a + bb * w) else: raise NotImplementedError("attenuation model {} is not implemented.".format(model))PKmNy""%NuRadioMC/utilities/cross_sections.pyimport numpy as np from NuRadioMC.utilities import units from scipy.interpolate import interp1d def param(energy, inttype='cc'): """ Parameterization and constants as used in get_nu_cross_section() See documentation there for details """ if inttype == 'cc': c = (-1.826, -17.31, -6.406, 1.431, -17.91) # nu, CC elif inttype == 'nc': c = (-1.826, -17.31, -6.448, 1.431, -18.61) # nu, NC elif inttype == 'cc_bar': c = (-1.033, -15.95, -7.247, 1.569, -17.72) # nu_bar, CC elif inttype == 'nc_bar': c = (-1.033, -15.95, -7.296, 1.569, -18.30) # nu_bar, NC else: logger.error("Type {0} of interaction not defined".format(inttype)) raise NotImplementedError epsilon = np.log10(energy/units.GeV) l_eps = np.log(epsilon - c[0]) crscn = c[1] + c[2] * l_eps + c[3] * l_eps**2 + c[4]/l_eps crscn = np.power(10,crscn) * units.cm**2 return crscn def csms(energy, inttype, flavors): """ Neutrino cross sections according to Amanda Cooper-Sarkar, Philipp Mertsch, Subir Sarkar JHEP 08 (2011) 042 """ if type(inttype) == str: inttype = np.array([inttype]*energy.shape[0]) if ( type(flavors) == int or type(flavors) == np.int64 ): flavors = np.array([flavors]*energy.shape[0]) neutrino = np.array(( [50,0.32,0.10], [100,0.65,0.20], [200,1.3,0.41], [500,3.2,1.0], [1000,6.2,2.0], [2000,12.,3.8], [5000,27.,8.6], [10000,47.,15.], [20000,77.,26.], [50000,140.,49.], [100000,210.,75.], [200000,310.,110.], [500000,490.,180.], [1e6,690.,260.], [2e6,950.,360.], [5e6,1400.,540.], [1e7,1900.,730.], [2e7,2600.,980.], [5e7,3700.,1400.], [1e8,4800.,1900.], [2e8,6200.,2400.], [5e8,8700.,3400.], [1e9,11000.,4400.], [2e9,14000.,5600.], [5e9,19000.,7600.], [1e10,24000.,9600.], [2e10,30000.,12000.], [5e10,39000.,16000.], [1e11,48000.,20000.], [2e11,59000.,24000.], [5e11,75000.,31000.] )) neutrino[:,0] *= units.GeV neutrino[:,1] *= units.picobarn #CC neutrino[:,2] *= units.picobarn #NC neutrino_cc = interp1d(neutrino[:,0], neutrino[:,1],bounds_error=True) neutrino_nc = interp1d(neutrino[:,0], neutrino[:,2],bounds_error=True) antineutrino = np.array(( [50,0.15,0.05], [100,0.33,0.12], [200,0.69,0.24], [500,1.8,0.61], [1000,3.6,1.20], [2000,7.,2.4], [5000,17.,5.8], [10000,31.,11.], [20000,55.,19.], [50000,110.,39.], [100000,180.,64.], [200000,270.,99.], [500000,460.,170.], [1e6,660.,240.], [2e6,920.,350.], [5e6,1400.,530.], [1e7,1900.,730.], [2e7,2500.,980.], [5e7,3700.,1400.], [1e8,4800.,1900.], [2e8,6200.,2400.], [5e8,8700.,3400.], [1e9,11000.,4400.], [2e9,14000.,5600.], [5e9,19000.,7600.], [1e10,24000.,9600.], [2e10,30000.,12000.], [5e10,39000.,16000.], [1e11,48000.,20000.], [2e11,59000.,24000.], [5e11,75000.,31000.] )) antineutrino[:,0] *= units.GeV antineutrino[:,1] *= units.picobarn #CC antineutrino[:,2] *= units.picobarn #NC antineutrino_cc = interp1d(antineutrino[:,0], antineutrino[:,1],bounds_error=True) antineutrino_nc = interp1d(antineutrino[:,0], antineutrino[:,2],bounds_error=True) crscn = np.zeros_like(energy) particles_cc = np.where((flavors >= 0) & (inttype == 'cc')) particles_nc = np.where((flavors >= 0) & (inttype == 'nc')) antiparticles_cc = np.where((flavors < 0) & (inttype == 'cc')) antiparticles_nc = np.where((flavors < 0) & (inttype == 'nc')) # crscn[particles_cc] = neutrino_cc(energy[particles_cc]) crscn[particles_nc] = neutrino_nc(energy[particles_nc]) crscn[antiparticles_cc] = antineutrino_cc(energy[antiparticles_cc]) crscn[antiparticles_nc] = antineutrino_nc(energy[antiparticles_nc]) return crscn def get_nu_cross_section(energy, flavors, inttype='total', cross_section_type = 'ctw'): """ return neutrino cross-section Parameters ---------- energy: float/ array of floats neutrino energies/momenta in standard units flavors: float / array of floats neutrino flavor (integer) encoded as using PDG numbering scheme, particles have positive sign, anti-particles have negative sign, relevant are: 12: electron neutrino 14: muon neutrino 16: tau neutrino inttype: str, array of str interaction type nc : neutral current cc : charged current total: total (for non-array type) cross_section_type: str defines model of cross-section ghandi : according to Ghandi et al. Phys.Rev.D58:093009,1998 only one cross-section for all interactions and flavors ctw : A. Connolly, R. S. Thorne, and D. Waters, Phys. Rev.D 83, 113009 (2011). cross-sections for all interaction types and flavors csms : A. Cooper-Sarkar, P. Mertsch, S. Sarkar, JHEP 08 (2011) 042 """ if cross_section_type == 'ghandi': crscn = 7.84e-36 * units.cm**2 * np.power(energy/units.GeV,0.363) elif cross_section_type == 'ctw': crscn = np.zeros_like(energy) if type(inttype) == str: if inttype == 'total': if ( type(flavors) == int or type(flavors) == np.int64 ): if flavors >= 0: crscn = param(energy,'nc') + param(energy,'cc') else: crscn = param(energy,'nc_bar') + param(energy,'cc_bar') else: antiparticles = np.where(flavors < 0) particles = np.where(flavors >= 0) crscn[particles] = param(energy[particles],'nc') + param(energy[particles],'cc') crscn[antiparticles] = param(energy[antiparticles],'nc_bar') + param(energy[antiparticles],'cc_bar') if (inttype == 'cc') or (inttype =='nc'): if ( type(flavors) == int or type(flavors) == np.int64 ): crscn = param(energy,inttype) else: antiparticles = np.where(flavors < 0) particles = np.where(flavors >= 0) crscn[particles] = param(energy[particles],inttype) crscn[antiparticles] = param(energy[antiparticles],inttype) else: if ( type(flavors) == int or type(flavors) == np.int64 ): particles_cc = np.where(inttype == 'cc') particles_nc = np.where(inttype == 'nc') if flavors >= 0: crscn[particles_cc] = param(energy[particles_cc],'cc') crscn[particles_nc] = param(energy[particles_nc],'nc') else: crscn[particles_cc] = param(energy[particles_cc],'cc_bar') crscn[particles_nc] = param(energy[particles_nc],'nc_bar') else: particles_cc = np.where((flavors >= 0) & (inttype == 'cc')) particles_nc = np.where((flavors >= 0) & (inttype == 'nc')) antiparticles_cc = np.where((flavors < 0) & (inttype == 'cc')) antiparticles_nc = np.where((flavors < 0) & (inttype == 'nc')) crscn[particles_cc] = param(energy[particles_cc],'cc') crscn[particles_nc] = param(energy[particles_nc],'nc') crscn[antiparticles_cc] = param(energy[antiparticles_cc],'cc_bar') crscn[antiparticles_nc] = param(energy[antiparticles_nc],'nc_bar') elif cross_section_type == 'csms': crscn = csms(energy, inttype, flavors) else: logger.error("Cross-section {} not defined".format(cross_section_type)) raise NotImplementedError return crscn if __name__=="__main__": # this part of the code gets only executed it the script is directly called inttype = np.array(['cc']*10) # inttype = 'cc' flavors = np.array([14]*10) # flavors = 14 energy = np.array([1e12,1e14,1e16,2e17,6e17,1e18,5e18,9e18,1e19,1e20])*units.eV cc = get_nu_cross_section(energy, flavors,inttype=inttype)/units.picobarn cc_new = get_nu_cross_section(energy, flavors, inttype=inttype, cross_section_type = 'csms')/units.picobarn import matplotlib.pyplot as plt plt.figure() plt.loglog(energy/units.GeV,cc,label='CTW') plt.loglog(energy/units.GeV,cc_new,label='CSMS') plt.xlabel("Energy [GeV]") plt.ylabel("CC [pb]") plt.legend() plt.show() PKmNrii(NuRadioMC/utilities/earth_attenuation.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units from NuRadioMC.utilities import cross_sections import logging logger = logging.getLogger("utilities.earth_attenuation") R_earth = 6357390 * units.m DensityCRUST = 2900 * units.kg / units.m ** 3 AMU = 1.66e-27 * units.kg R_EARTH = 6.378140e6 * units.m densities = np.array([14000.0, 3400.0, 2900.0]) * units.kg / units.m ** 3 # inner layer, middle layer, outer layer radii = np.array([3.46e6 * units.m, R_EARTH - 4.0e4 * units.m, R_EARTH]) # average radii of boundaries between earth layers def get_weight(theta_nu, pnu, flavors, mode='simple',cross_section_type = 'ghandi'): """ calculates neutrino weight due to Earth absorption for different models Parameters ---------- theta_nu: float or array of floats the zenith angle of the neutrino direction (where it came from, i.e., opposite to the direction of propagation) pnu: float or array of floats the momentum of the neutrino """ if(mode == 'simple'): return get_simple_weight(theta_nu, pnu,cross_section_type = cross_section_type) elif (mode == "core_mantle_crust"): return get_core_mantle_crust_weight(theta_nu, pnu, flavors,cross_section_type = cross_section_type) elif (mode == "None"): return 1. else: logger.error('mode {} not supported'.format(mode)) raise NotImplementedError def get_simple_weight(theta_nu, pnu, cross_section_type = 'ghandi'): """ calculates neutrino weight due to Earth absorption, i.e. probability of the neutrino to reach the detector simple parametrization using only momentum and zenith angle information of the neutrino, adapted from ShelfMC Parameters ---------- theta_nu: float or array of floats the zenith angle of the neutrino direction (where it came from, i.e., opposite to the direction of propagation) pnu: float or array of floats the momentum of the neutrino """ if(theta_nu <= 0.5 * np.pi): # coming from above return np.ones_like(theta_nu) else: # coming from below sigma = cross_sections.get_nu_cross_section(pnu, flavors = 0, cross_section_type = cross_section_type) d = - 2 * R_earth * np.cos(theta_nu) return np.exp(-d * sigma * DensityCRUST / AMU) def get_core_mantle_crust_weight(theta_nu, pnu, flavors, cross_section_type='ctw'): """ calculates neutrino weight due to Earth absorption with a three layers earth model, i.e. probability of the neutrino to reach the detector simple parametrization using momentum, zenith angle, flavor and current type information of the neutrino as implemented in ARAsim (2018) Parameters ---------- theta_nu: float or array of floats the zenith angle of the neutrino direction (where it came from, i.e., opposite to the direction of propagation) pnu: float or array of floats the momentum of the neutrino flavors: float or array of floats the flavor of the neutrino """ sigma = cross_sections.get_nu_cross_section(pnu, flavors, cross_section_type = cross_section_type) if(theta_nu <= 0.5 * np.pi): # coming from above return np.ones_like(theta_nu) elif (theta_nu <= np.pi - np.arcsin(radii[1] / radii[2])): # only go through the outer layer d_outer = - 2 * R_EARTH * np.cos(theta_nu) weight = np.exp(-d_outer * sigma * densities[2] / AMU) elif (theta_nu <= np.pi - np.arcsin(radii[0] / radii[2])): # only go through the outer and middle layer d_middle = 2 * np.sqrt(radii[1] * radii[1] - radii[2] * radii[2] * np.sin(np.pi - theta_nu) * np.sin(np.pi - theta_nu)) d_outer = - 2 * R_EARTH * np.cos(theta_nu) - d_middle weight = np.exp(-d_outer * sigma * densities[2] / AMU - d_middle * sigma * densities[1] / AMU) else: # go through all three layers d_inner = 2 * np.sqrt(radii[0] * radii[0] - radii[2] * radii[2] * np.sin(np.pi - theta_nu) * np.sin(np.pi - theta_nu)) d_middle = 2 * np.sqrt(radii[1] * radii[1] - radii[2] * radii[2] * np.sin(np.pi - theta_nu) * np.sin(np.pi - theta_nu)) - d_inner d_outer = - 2 * R_EARTH * np.cos(theta_nu) - d_middle - d_inner weight = np.exp(-d_outer * sigma * densities[2] / AMU - d_middle * sigma * densities[1] / AMU - d_inner * sigma * densities[0] / AMU) return weight PKmNS̻NuRadioMC/utilities/fft.pyimport numpy as np """ A wrapper around the numpy fft routines to achive a coherent normalization of the fft As we have real valued data in the time domain, we use the 'real ffts' that omit the negative frequencies in Fourier space. To account for the missing power in the frequency domain, we multiply the frequency spectrum by sqrt(2), and divide the iFFT with 1/sqrt(2) accordingly. Then, a calculation of the power leads the same result in the time and frequency domain, i.e. np.sum(trace**2) * dt = np.sum(spectrum**2) * df """ def time2freq(trace): """ performs forward FFT with correct normalization that conserves the power """ return np.fft.rfft(trace, axis=-1) * 2 ** 0.5 # an additional sqrt(2) is added because negative frequencies are omitted. def freq2time(spectrum): """ performs backward FFT with correct normalization that conserves the power """ return np.fft.irfft(spectrum, axis=-1) / 2 ** 0.5 PKmNER""NuRadioMC/utilities/fluxes.pyimport numpy as np import scipy.constants from NuRadioMC.utilities import units from NuRadioMC.utilities import cross_sections import logging logger = logging.getLogger('fluxes') def get_interaction_length(energy,flavors=12, inttype='total', cross_section_type = 'ctw'): """ return interaction length at given energy, assuming a constant ice density """ ice_density = 0.917 # units.g/units.cm**3 water equivalent is 1, so unitless N_A = scipy.constants.Avogadro * units.cm**-3 L = 1./(N_A * ice_density * cross_sections.get_nu_cross_section(energy, flavors=flavors,inttype=inttype,cross_section_type=cross_section_type)) return L def get_limit_from_aeff(energy, aeff, livetime, signalEff = 1.00, energyBinsPerDecade=1.000, upperLimOnEvents=2.44): """ Limit from effective volume Parameters: -------------- energy: array of floats neutrino energy veff: array of floats effective volumes livetime: float time used signalEff: float efficiency of signal reconstruction energyBinsPerDecade: float 1 for decade bins, 2 for half-decade bins, etc. upperLimOnEvents: float 2.3 for Neyman UL w/ 0 background, 2.44 for F-C UL w/ 0 background, etc """ evtsPerFluxPerEnergy = aeff * signalEff evtsPerFluxPerEnergy *= livetime ul = upperLimOnEvents / evtsPerFluxPerEnergy ul *= energyBinsPerDecade / np.log(10) ul /= energy return ul def get_limit_flux(energy, veff, livetime, signalEff = 1.00, energyBinsPerDecade=1.000, upperLimOnEvents=2.44, nuCrsScn='ctw'): """ Limit from effective volume Parameters: -------------- energy: array of floats neutrino energy veff: array of floats effective volumes livetime: float time used signalEff: float efficiency of signal reconstruction energyBinsPerDecade: float 1 for decade bins, 2 for half-decade bins, etc. upperLimOnEvents: float 2.3 for Neyman UL w/ 0 background, 2.44 for F-C UL w/ 0 background, etc nuCrsScn: str type of neutrino cross-section """ evtsPerFluxPerEnergy = veff * signalEff evtsPerFluxPerEnergy *= livetime evtsPerFluxPerEnergy /= get_interaction_length(energy, cross_section_type = nuCrsScn) ul = upperLimOnEvents / evtsPerFluxPerEnergy ul *= energyBinsPerDecade / np.log(10) ul /= energy return ul # def get_integrated_limit_flux(energy, veff, # livetime, # signalEff = 1.00, # upperLimOnEvents=2.44, # nuCrsScn='ctw'): # # """ # Limit from effective volume on E^2 flux plot # # Parameters: # -------------- # energy: array of floats # energies (the bin centers), the binning in log10(E) must be equidistant! # veff: array of floats # effective volumes # livetime: float # time used # signalEff: float # efficiency of signal reconstruction # energyBinsPerDecade: float # 1 for decade bins, 2 for half-decade bins, etc. # upperLimOnEvents: float # 2.3 for Neyman UL w/ 0 background, # 2.44 for F-C UL w/ 0 background, etc # nuCrsScn: str # type of neutrino cross-section # # # """ # energy = np.array(energy) # veff = np.array(veff) # logE = np.log10(energy) # dlogE = logE[1] - logE[0] # # L = get_interaction_length(energy, cross_section_type = nuCrsScn) # # N = np.sum(veff/L/E) * np.log(10) * livetime * signalEff * dlogE # ul = upperLimOnEvents * dlogE/ (livetime * signalEff * np.log(10)) * np.sum(L/veff * energy) / len(energy) # # return ul def get_limit_e1_flux(energy, veff, livetime, signalEff = 1.00, energyBinsPerDecade=1.000, upperLimOnEvents=2.44, nuCrsScn='ctw'): """ Limit from effective volume on E^1 flux plot Parameters: -------------- energy: array of floats neutrino energy veff: array of floats effective volumes livetime: float time used signalEff: float efficiency of signal reconstruction energyBinsPerDecade: float 1 for decade bins, 2 for half-decade bins, etc. upperLimOnEvents: float 2.3 for Neyman UL w/ 0 background, 2.44 for F-C UL w/ 0 background, etc nuCrsScn: str type of neutrino cross-section """ evtsPerFluxPerEnergy = veff * signalEff evtsPerFluxPerEnergy *= livetime evtsPerFluxPerEnergy /= get_interaction_length(energy, cross_section_type = nuCrsScn) ul = upperLimOnEvents / evtsPerFluxPerEnergy ul *= energyBinsPerDecade / np.log(10) return ul def get_limit_e2_flux(energy, veff, livetime, signalEff = 1.00, energyBinsPerDecade=1.000, upperLimOnEvents=2.44, nuCrsScn='ctw'): """ Limit from effective volume on E^2 flux plot Parameters: -------------- energy: array of floats neutrino energy veff: array of floats effective volumes livetime: float time used signalEff: float efficiency of signal reconstruction energyBinsPerDecade: float 1 for decade bins, 2 for half-decade bins, etc. upperLimOnEvents: float 2.3 for Neyman UL w/ 0 background, 2.44 for F-C UL w/ 0 background, etc nuCrsScn: str type of neutrino cross-section """ return energy**2 * get_limit_flux(energy, veff, livetime, signalEff, energyBinsPerDecade, upperLimOnEvents,nuCrsScn) def get_number_of_events_for_flux(energies, flux, Veff, livetime, nuCrsScn='ctw'): """ calculates the number of expected neutrinos for a certain flux assumption Parameters ----------- energies: array of floats energies (the bin centers), the binning in log10(E) must be equidistant! flux: array of floats the flux at energy logE Veff: array of floats the effective volume per energy logE livetime: float the livetime of the detector (including signal efficiency) Returns ------- array of floats: number of events per energy bin """ energies = np.array(energies) Veff = np.array(Veff) logE = np.log10(energies) dlogE = logE[1] - logE[0] return np.log(10) * livetime * flux * energies * Veff / get_interaction_length(energies, cross_section_type = nuCrsScn) * dlogE def get_exposure(energy, Veff, field_of_view=2*np.pi): """ calculate exposure from effective volume Parameters ---------- energy: float neutrino energy (needed to calculate interaction length) Veff: float effective volume field_of_view: float the field of view of the detector Returns float: exposure """ return Veff / field_of_view / get_interaction_length(energy) def get_integrated_exposure(exp_func, E_low, E_high): """ calculates the integral int(E^-2 * exposure(E) dE) integration is performed in log space """ def f(logE): E = 10 ** logE return exp_func(E) * np.log(E) / E from scipy import integrate i = integrate.quad(f, np.log10(E_low), np.log10(E_high)) return i[0] def get_fluence_limit(int_exp): """ calculates the fluence limit for a integrated exposure """ return 2.39/int_exp if __name__=="__main__": # this part of the code gets only executed it the script is directly called energy = 10**18 * units.eV veff = 2150 * units.km**3 * units.sr livetime = 5 *units.year print "Cross section: {} cm^2".format(cross_sections.get_nu_cross_section(energy, cross_section_type = 'ctw')) print "interaction length: {} km".format(get_interaction_length(energy, cross_section_type = 'ctw')/units.km) print "calculating flux limit for {time} years and Veff of {veff} km^3 sr".format(time=livetime/units.year, veff = veff/ (units.km**3 * units.sr)) print "Flux limit: {} GeV/(cm^2 s sr)".format(get_limit_e2_flux(energy,veff, livetime) / (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1)) aeff = np.array([0.0032,0.033,0.43,3.1,21,68,167])* units.km**2 * units.sr energies = 10**np.array([18,18.5,19,19.5,20,20.5,21])* units.eV print "Flux limit: {} GeV/(cm^2 s sr)".format(energies**2*get_limit_from_aeff(energies,aeff,livetime) / (units.GeV * units.cm**-2 * units.second**-1 * units.sr**-1)) PKmNjUU%NuRadioMC/utilities/inelasticities.pyimport numpy as np from NuRadioMC.utilities import units from scipy import constants e_mass = constants.physical_constants['electron mass energy equivalent in MeV'][0] * units.MeV mu_mass = constants.physical_constants['muon mass energy equivalent in MeV'][0] * units.MeV # Mass energy equivalent of the tau lepton tau_mass = constants.physical_constants['tau mass energy equivalent in MeV'][0] * units.MeV pi_mass = 139.57061 * units.MeV rho770_mass = 775.49 * units.MeV rho1450_mass = 1465 * units.MeV a1_mass = 1230 * units.MeV cspeed = constants.c * units.m / units.s G_F = constants.physical_constants['Fermi coupling constant'][0] * units.GeV**(-2) def get_neutrino_inelasticity(n_events): """ Standard inelasticity for deep inelastic scattering used so far. Ported from ShelfMC Parameters: ----------- n_events: int Number of events to be returned Returns: -------- inelasticies: array Array with the inelasticities """ R1 = 0.36787944 R2 = 0.63212056 inelasticities = (-np.log(R1 + np.random.uniform(0., 1., n_events) * R2)) ** 2.5 return inelasticities def get_ccnc(n_events): """ Get the nature of the interaction current: cc or nc Ported from Shelf MC Parameters: ----------- n_events: int Number of events to be returned Returns: -------- ccnc: array Array with 'cc' or 'nc' """ rnd = np.random.uniform(0., 1., n_events) ccnc = [] for i, r in enumerate(rnd): # if (r <= 0.6865254):#from AraSim if(r <= 0.7064): ccnc.append('cc') else: ccnc.append('nc') return np.array(ccnc) def random_tau_branch(): """ Calculates a random tau branch decay See http://dx.doi.org/10.1016/j.cpc.2013.04.001 Returns ------- branch: string The corresponding decay branch """ branching_ratios = np.array([0.18, 0.18]) branching = np.random.uniform(0,1) if (branching < np.sum(branching_ratios[0:1])): # tau -> nu_tau + mu + nu_tau branch = 'tau_mu' elif (branching < np.sum(branching_ratios[0:2])): # tau -> nu_tau + e + nu_e branch = 'tau_e' else: # tau -> nu_tau + hadrons branch = 'tau_had' return branch def inelasticity_tau_decay(tau_energy, branch): """ Returns the hadronic or electromagnetic inelasticity for the tau decay See http://dx.doi.org/10.1016/j.cpc.2013.04.001 and https://arxiv.org/pdf/1607.00193.pdf Parameters ---------- tau_energy: float Tau energy at the moment of decay branch: string Type of tau decay: 'tau_mu', 'tau_e', 'tau_had' Returns ------- inelasticity: float The fraction of energy carried by the leptonic or hadronic products """ if ( branch == 'tau_had' ): branching = np.array([0.12, 0.26, 0.13, 0.13]) rs = np.array([pi_mass, rho770_mass, a1_mass, rho1450_mass])/tau_mass def g_pi(y,r): if ( y < 0 or y > 1-r**2 ): return 0. else: return -(2*y-1+r)/(1-r**2)**2 def g_1(y,r): if ( y < 0 or y > 1-r**2 ): return 0. else: return -(2*y-1+r)*(1-2*r)/(1-r)**2/(1+2*r) def g_0(y,r): if ( y < 0 or y > 1-r**2 ): return 0. else: return 1/(1-r) def y_distribution(y): pi_term = branching[0]*(g_pi(y,rs[0])+g_0(y,rs[0])) #rest_terms = branching[1:]*(g_1(y,rs)+g_0(y,rs)) rest_terms = [ branch*(g_1(y,r)+g_0(y,r)) for branch,r in zip(branching[1:],rs[1:]) ] return pi_term + np.sum(rest_terms) chosen_y = rejection_sampling(y_distribution, 0, 1, 3) return 1-chosen_y elif ( branch == 'tau_e' or branch == 'tau_mu' ): mu = tau_mass if ( branch == 'tau_e' ): m_l = e_mass elif ( branch == 'tau_mu' ): m_l = mu_mass nu_min = m_l nu_max = (mu**2 + m_l**2)/2/mu # Fraction energy distibution in the decaying particle rest frame def x_distribution(x): if ( x < m_l/nu_max or x > 1 ): return 0. else: factor = G_F**2 * mu**5/192/np.pi**3 return factor * (3-2*x)*x**2 chosen_x = rejection_sampling(x_distribution, 0, 1, x_distribution(1)) chosen_cos = np.random.uniform(-1,1) y_rest = chosen_x * nu_max/tau_mass # Transforming the rest inelasticity to the lab inelasticity y_lab = y_rest - np.sqrt(y_rest**2 - (m_l/mu)**2)*chosen_cos return y_lab def rejection_sampling(f, xmin, xmax, ymax): """ Draws a random number following a given distribution using a rejection sampling algorithm. Parameters ---------- f: function Random distribution xmin: float Minimum value of the argument xmax: float Maximum value of the argument ymax: float Maximum function value to use for the rejection sample (e.g., the maximum of the function) Returns ------- x: float Random value from the distribution """ reject = True while( reject ): x = np.random.uniform(xmin, xmax) y = np.random.uniform(0, ymax) reject = f(x) < y return x PKmN'O  NuRadioMC/utilities/medium.pyfrom __future__ import absolute_import, division, print_function import numpy as np from NuRadioMC.utilities import units def get_ice_model(name): if(name == "ARAsim_southpole"): return ARAsim_southpole() elif(name == "southpole_simple"): return southpole_simple() elif(name == "southpole_2015"): return southpole_2015() elif(name == "mooresbay_simple"): return mooresbay_simple() elif(name == "greenland_simple"): return greenland_simple() class medium(): def get_index_of_refraction(self, x): """ returns the index of refraction at position x Parameters --------- x: 3dim np.array point Returns: -------- n: float index of refraction """ return self.n_ice - self.delta_n * np.exp(x[2] / self.z_0) class southpole_simple(medium): def __init__(self): # from https://doi.org/10.1088/1475-7516/2018/07/055 RICE2014/SP model # define model parameters (RICE 2014/southpole) self.n_ice = 1.78 self.z_0 = 71. * units.m self.delta_n = 0.426 class southpole_2015(medium): def __init__(self): # from https://doi.org/10.1088/1475-7516/2018/07/055 SPICE2015/SP model self.n_ice = 1.78 self.z_0 = 77. * units.m self.delta_n = 0.423 class ARAsim_southpole(medium): def __init__(self): # define model parameters (SPICE 2015/southpole) self.n_ice = 1.78 self.z_0 = 75.75757575757576 * units.m self.delta_n = 0.43 class mooresbay_simple(medium): # from https://doi.org/10.1088/1475-7516/2018/07/055 MB1 model def __init__(self): self.n_ice = 1.78 self.z_0 = 34.5 * units.m self.delta_n = 0.46 class mooresbay_simple_2(medium): # from https://doi.org/10.1088/1475-7516/2018/07/055 MB2 model def __init__(self): self.n_ice = 1.78 self.z_0 = 37 * units.m self.delta_n = 0.481 class greenland_simple(medium): # from C. Deaconu, fit to data from Hawley '08, Alley '88 # rho(z) = 917 - 602 * exp (-z/37.25), using n = 1 + 0.78 rho(z)/rho_0 def __init__(self): self.n_ice = 1.78 self.z_0 = 37.25 * units.m self.delta_n = 0.51PKmNw22!NuRadioMC/utilities/merge_hdf5.pyimport glob import os import sys import numpy as np from NuRadioMC.utilities.hdf5_manipulator import merge """ merges multiple hdf5 output files into one single files. The merger module automatically keeps track of the total number of simulated events (which are needed to correctly calculate the effective volume). The script expects that the folder structure is ../output/energy/*.hdf5.part???? """ if(len(sys.argv) != 2): print("usage: python merge_hdf5.py /path/to/simulation/output/folder") else: filenames = glob.glob("{}/*/*.hdf5.part????".format(sys.argv[1])) filenames2 = [] for i, filename in enumerate(filenames): filename, ext = os.path.splitext(filename) if(ext != '.hdf5'): if(filename not in filenames2): d = os.path.split(filename) a, b = os.path.split(d[0]) filenames2.append(filename) for filename in filenames2: if(os.path.splitext(filename)[1] == '.hdf5'): d = os.path.split(filename) a, b = os.path.split(d[0]) output_filename = os.path.join(a, d[1]) #remove subfolder from filename if(os.path.exists(output_filename)): print('file {} already exists, skipping'.format(output_filename)) else: # try: input_files = np.array(sorted(glob.glob(filename + '.part????'))) mask = np.array([os.path.getsize(x) > 1000 for x in input_files], dtype=np.bool) if(np.sum(~mask)): print("{:d} files were deselected because their filesize was to small".format(np.sum(~mask))) merge.merge_data_filenames(input_files[mask], output_filename) # except: # print("failed to merge {}".format(filename)) PKmN/NuRadioMC/utilities/plotting.pyfrom __future__ import absolute_import, division, print_function import numpy as np from matplotlib import pyplot as plt from NuRadioMC.utilities import units def plot_vertex_distribution(xx, yy, zz, weights=None, rmax=None, zmin=None, trigger_name=""): """ produces beautiful plot of the vertex distribution Parameters: xx: array the x positions of the vertices yy: array the y positions of the vertices zz: array the z positions of the vertices Returns ------- fig, ax """ if(weights is None): weights = np.ones_like(xx) fig, ax = plt.subplots(1, 1) rr = (xx ** 2 + yy ** 2) ** 0.5 mask_weight = weights > 1e-2 max_r = rr[mask_weight].max() max_z = np.abs(zz[mask_weight]).max() if(rmax is None): rmax = max_r if(zmin is None): zmin = zz.min() h = ax.hist2d(rr / units.m, zz / units.m, bins=[np.linspace(0, max_r, 50), np.linspace(-max_z, 0, 50)], cmap=plt.get_cmap('Blues'), weights=weights) cb = plt.colorbar(h[3], ax=ax) cb.set_label("weighted number of events") ax.set_aspect('equal') ax.set_xlabel("r [m]") ax.set_ylabel("z [m]") ax.set_xlim(0, rmax) ax.set_ylim(zmin, 0) if(trigger_name != ""): ax.set_title("trigger: {}".format(trigger_name)) fig.tight_layout() return fig, axPKmNwM"M"NuRadioMC/utilities/units.h#ifndef _utl_Units_h_ #define _utl_Units_h_ namespace utl { /** \brief default system of units You should use the units defined in this file whenever you have a dimensional quantity in your code. For example, write: \code double s = 1.5*km; \endcode instead of: \code double s = 1.5; // don't forget this is in km! \endcode The conversion factors defined in this file convert your data into NuRadioMC base units, so that all dimensional quantities in the code are in a single system of units! You can also use the conversions defined here to, for example, display data with the unit of your choice. For example: \code cout << "s = " << s/mm << " mm"; \endcode The base units are : - meter (meter) - nanosecond (nanosecond) - electron Volt (eV) - positron charge (eplus) - degree Kelvin (kelvin) - the amount of substance (mole) - luminous intensity (candela) - radian (radian) - steradian (steradian) The SI numerical value of the positron charge is defined here, as it is needed for conversion factor : positron charge = eSI (coulomb) Adapted from Offline, the reconstruction Framework of the Pierre Auger Collaboration. This is a slightly modified version of the units definitions written by the Geant4 collaboration */ // Prefixes const double yocto = 1e-24; const double zepto = 1e-21; const double atto = 1e-18; const double femto = 1e-15; const double pico = 1e-12; const double nano = 1e-9; const double micro = 1e-6; const double milli = 1e-3; const double centi = 1e-2; const double deci = 1e-1; const double deka = 1e+1; const double hecto = 1e+2; const double kilo = 1e+3; const double mega = 1e+6; const double giga = 1e+9; const double tera = 1e+12; const double peta = 1e+15; const double exa = 1e+18; const double zetta = 1e+21; const double yotta = 1e+24; // Length [L] const double meter = 1; const double meter2 = meter*meter; const double meter3 = meter*meter*meter; const double millimeter = milli*meter; const double millimeter2 = millimeter*millimeter; const double millimeter3 = millimeter*millimeter*millimeter; const double centimeter = centi*meter; const double centimeter2 = centimeter*centimeter; const double centimeter3 = centimeter*centimeter*centimeter; const double kilometer = kilo*meter; const double kilometer2 = kilometer*kilometer; const double kilometer3 = kilometer*kilometer*kilometer; const double parsec = 3.0856775807e+16 * meter; const double kiloParsec = kilo * parsec; const double megaParsec = mega * parsec; const double micrometer = micro*meter; const double nanometer = nano*meter; const double angstrom = 1e-10*meter; const double fermi = femto*meter; const double barn = 1e-28*meter2; const double millibarn = milli*barn; const double microbarn = micro*barn; const double nanobarn = nano*barn; const double picobarn = pico*barn; // symbols const double mm = millimeter; const double mm2 = millimeter2; const double mm3 = millimeter3; const double cm = centimeter; const double cm2 = centimeter2; const double cm3 = centimeter3; const double m = meter; const double m2 = meter2; const double m3 = meter3; const double km = kilometer; const double km2 = kilometer2; const double km3 = kilometer3; // Angle const double radian = 1; const double milliradian = milli*radian; const double degree = (3.14159265358979323846/180)*radian; const double steradian = 1; // symbols const double rad = radian; const double mrad = milliradian; const double sr = steradian; const double deg = degree; // Time [T] const double nanosecond = 1; const double nanosecond2 = nanosecond*nanosecond; const double second = giga*nanosecond; const double millisecond = milli*second; const double microsecond = micro*second; const double picosecond = pico*second; const double minute = 60*second; const double hour = 60*minute; const double day = 24*hour; const double hertz = 1/second; const double kilohertz = kilo*hertz; const double megahertz = mega*hertz; const double gigahertz = giga*hertz; const double Hz = hertz; const double kHz = kilohertz; const double MHz = megahertz; const double GHz = gigahertz; // symbols const double ns = nanosecond; const double s = second; const double ms = millisecond; // Electric charge [Q] const double eplus = 1; // positron charge const double eSI = 1.602176462e-19; // positron charge in coulomb const double coulomb = eplus/eSI; // coulomb = 6.24150 e+18*eplus // Energy [E] const double electronvolt = 1; const double megaelectronvolt = mega*electronvolt; const double kiloelectronvolt = kilo*electronvolt; const double gigaelectronvolt = giga*electronvolt; const double teraelectronvolt = tera*electronvolt; const double petaelectronvolt = peta*electronvolt; const double exaelectronvolt = exa*electronvolt; const double zettaelectronvolt = zetta*electronvolt; const double joule = electronvolt/eSI; // joule = 6.24150 e+12 * MeV // symbols const double MeV = megaelectronvolt; const double eV = electronvolt; const double keV = kiloelectronvolt; const double GeV = gigaelectronvolt; const double TeV = teraelectronvolt; const double PeV = petaelectronvolt; const double EeV = exaelectronvolt; const double ZeV = zettaelectronvolt; // Mass [E][T^2][L^-2] const double kilogram = joule*second*second/(meter*meter); const double gram = milli*kilogram; const double milligram = milli*gram; // symbols const double kg = kilogram; const double g = gram; const double mg = milligram; // Power [E][T^-1] const double watt = joule/second; // watt = 6.24150 e+3 * MeV/ns // Force [E][L^-1] const double newton = joule/meter; // newton = 6.24150 e+9 * MeV/mm // Pressure [E][L^-3] //const double hep_pascal = newton/m2; // pascal = 6.24150 e+3 * MeV/mm3 //const double pascal = hep_pascal; // pascal = 6.24150 e+3 * MeV/mm3 const double pascal = newton/m2; // pascal = 6.24150 e+3 * MeV/mm3 const double bar = 100000*pascal; // bar = 6.24150 e+8 * MeV/mm3 const double atmosphere = 101325*pascal; // atm = 6.32420 e+8 * MeV/mm3 // symbols const double hPa = hecto*pascal; // Electric current [Q][T^-1] const double ampere = coulomb/second; // ampere = 6.24150 e+9 * eplus/ns const double milliampere = milli*ampere; const double microampere = micro*ampere; const double nanoampere = nano*ampere; // Electric potential [E][Q^-1] const double megavolt = megaelectronvolt/eplus; const double kilovolt = milli*megavolt; const double volt = micro*megavolt; const double millivolt = milli*volt; const double microvolt = micro*volt; const double V = volt; // Electric resistance [E][T][Q^-2] const double ohm = volt/ampere; // ohm = 1.60217e-16*(MeV/eplus)/(eplus/ns) // Electric capacitance [Q^2][E^-1] const double farad = coulomb/volt; // farad = 6.24150e+24 * eplus/Megavolt const double millifarad = milli*farad; const double microfarad = micro*farad; const double nanofarad = nano*farad; const double picofarad = pico*farad; // Magnetic Flux [T][E][Q^-1] const double weber = volt*second; // weber = 1000*megavolt*ns // Magnetic Field [T][E][Q^-1][L^-2] const double tesla = volt*second/meter2; // tesla =0.001*megavolt*ns/mm2 const double microtesla = micro*tesla; const double gauss = 1e-4*tesla; const double kilogauss = deci*tesla; // Inductance [T^2][E][Q^-2] const double henry = weber/ampere; // henry = 1.60217e-7*MeV*(ns/eplus)**2 // Temperature const double kelvin = 1; // Amount of substance const double mole = 1; // Activity [T^-1] const double becquerel = 1/second; const double curie = 3.7e+10 * becquerel; // Absorbed dose [L^2][T^-2] const double gray = joule/kilogram; // Luminous intensity [I] const double candela = 1; // Luminous flux [I] const double lumen = candela*steradian; // Illuminance [I][L^-2] const double lux = lumen/meter2; // Miscellaneous const double fraction = 1; const double perCent = 0.01; const double percent = perCent; const double perThousand = 0.001; const double permil = perThousand; const double perMillion = 0.000001; } #endif PKmNvDMMNuRadioMC/utilities/units.py""" standard system of units =================================== You should use the units defined in this file whenever you have a dimensional quantity in your code. For example, write: ``s = 1.5 * units.km`` instead of: ``s = 1.5 # don't forget this is in km!`` The conversion factors defined in this file convert your data into Auger base units, so that all dimensional quantities in the code are in a single system of units! You can also use the conversions defined here to, for example, display data with the unit of your choice. For example: ``print "s = " , s / units.mm, " mm"`` The base units are: ------------------- * meter (meter) * nanosecond (nanosecond) * electron Volt (eV) * positron charge (eplus) * degree Kelvin (kelvin) * the amount of substance (mole) * luminous intensity (candela) * radian (radian) * steradian (steradian) The SI numerical value of the positron charge is defined here, as it is needed for conversion factor : positron charge = eSI (coulomb) Adapted from Offline, the reconstruction Framework of the Pierre Auger Collaboration. This is a slightly modified version of the units definitions written by the Geant4 collaboration """ # Prefixes yocto = 1e-24 zepto = 1e-21 atto = 1e-18 femto = 1e-15 pico = 1e-12 nano = 1e-9 micro = 1e-6 milli = 1e-3 centi = 1e-2 deci = 1e-1 deka = 1e+1 hecto = 1e+2 kilo = 1e+3 mega = 1e+6 giga = 1e+9 tera = 1e+12 peta = 1e+15 exa = 1e+18 zetta = 1e+21 yotta = 1e+24 # Length [L] meter = 1 meter2 = meter * meter meter3 = meter * meter * meter millimeter = milli * meter millimeter2 = millimeter * millimeter millimeter3 = millimeter * millimeter * millimeter centimeter = centi * meter centimeter2 = centimeter * centimeter centimeter3 = centimeter * centimeter * centimeter kilometer = kilo * meter kilometer2 = kilometer * kilometer kilometer3 = kilometer * kilometer * kilometer parsec = 3.0856775807e+16 * meter kiloParsec = kilo * parsec megaParsec = mega * parsec micrometer = micro * meter nanometer = nano * meter angstrom = 1e-10 * meter fermi = femto * meter feet = 0.3048 * meter barn = 1e-28 * meter2 millibarn = milli * barn microbarn = micro * barn nanobarn = nano * barn picobarn = pico * barn # symbols mm = millimeter mm2 = millimeter2 mm3 = millimeter3 cm = centimeter cm2 = centimeter2 cm3 = centimeter3 m = meter m2 = meter2 m3 = meter3 km = kilometer km2 = kilometer2 km3 = kilometer3 # Angle radian = 1 milliradian = milli * radian degree = (3.14159265358979323846 / 180) * radian steradian = 1 # symbols rad = radian mrad = milliradian sr = steradian deg = degree # Time [T] nanosecond = 1 nanosecond2 = nanosecond * nanosecond second = giga * nanosecond millisecond = milli * second microsecond = micro * second picosecond = pico * second femtosecond = femto * second minute = 60 * second hour = 60 * minute day = 24 * hour year = 356 * day hertz = 1 / second kilohertz = kilo * hertz megahertz = mega * hertz gigahertz = giga * hertz Hz = hertz kHz = kilohertz MHz = megahertz GHz = gigahertz # symbols ns = nanosecond ps = picosecond fs = femtosecond s = second ms = millisecond # Electric charge [Q] eplus = 1 # positron charge eSI = 1.602176462e-19 # positron charge in coulomb coulomb = eplus / eSI # coulomb = 6.24150 e+18*eplus # Energy [E] electronvolt = 1 megaelectronvolt = mega * electronvolt kiloelectronvolt = kilo * electronvolt gigaelectronvolt = giga * electronvolt teraelectronvolt = tera * electronvolt petaelectronvolt = peta * electronvolt exaelectronvolt = exa * electronvolt zettaelectronvolt = zetta * electronvolt joule = electronvolt / eSI # joule = 6.24150 e+12 * MeV # symbols eV = electronvolt keV = kiloelectronvolt MeV = megaelectronvolt GeV = gigaelectronvolt TeV = teraelectronvolt PeV = petaelectronvolt EeV = exaelectronvolt ZeV = zettaelectronvolt # Mass [E][T^2][L^-2] kilogram = joule * second * second / (meter * meter) gram = milli * kilogram milligram = milli * gram # symbols kg = kilogram g = gram mg = milligram # Power [E][T^-1] watt = joule / second # watt = 6.24150 e+3 * MeV/ns # Force [E][L^-1] newton = joule / meter # newton = 6.24150 e+9 * MeV/mm # Pressure [E][L^-3] pascal = newton / m2 # pascal = 6.24150 e+3 * MeV/mm3 bar = 100000 * pascal # bar = 6.24150 e+8 * MeV/mm3 atmosphere = 101325 * pascal # atm = 6.32420 e+8 * MeV/mm3 # symbols hPa = hecto * pascal # Electric current [Q][T^-1] ampere = coulomb / second # ampere = 6.24150 e+9 * eplus/ns milliampere = milli * ampere microampere = micro * ampere nanoampere = nano * ampere # Electric potential [E][Q^-1] megavolt = megaelectronvolt / eplus kilovolt = milli * megavolt volt = micro * megavolt millivolt = milli * volt microvolt = micro * volt V = volt mV = millivolt # Electric resistance [E][T][Q^-2] ohm = volt / ampere # ohm = 1.60217e-16*(MeV/eplus)/(eplus/ns) # Electric capacitance [Q^2][E^-1] farad = coulomb / volt # farad = 6.24150e+24 * eplus/Megavolt millifarad = milli * farad microfarad = micro * farad nanofarad = nano * farad picofarad = pico * farad # Magnetic Flux [T][E][Q^-1] weber = volt * second # weber = 1000*megavolt*ns # Magnetic Field [T][E][Q^-1][L^-2] tesla = volt * second / meter2 # tesla =0.001*megavolt*ns/mm2 microtesla = micro * tesla gauss = 1e-4 * tesla kilogauss = deci * tesla # Inductance [T^2][E][Q^-2] henry = weber / ampere # henry = 1.60217e-7*MeV*(ns/eplus)**2 # Temperature kelvin = 1 # Amount of substance mole = 1 # Activity [T^-1] becquerel = 1 / second curie = 3.7e+10 * becquerel # Absorbed dose [L^2][T^-2] gray = joule / kilogram # Luminous intensity [I] candela = 1 # Luminous flux [I] lumen = candela * steradian # Illuminance [I][L^-2] lux = lumen / meter2 # Miscellaneous fraction = 1 perCent = 0.01 percent = perCent perThousand = 0.001 permil = perThousand perMillion = 0.000001 PKmNnYeNuRadioMC/utilities/version.pyfrom subprocess import Popen, PIPE import os import re import logging logger = logging.getLogger("utilities.version") logging.basicConfig() def get_git_commit_hash(path): gitproc = Popen(['git', 'show'], stdout = PIPE, cwd=path) (stdout, stderr) = gitproc.communicate() h = stdout.split('\n')[0].split()[1] check = re.compile(r"^[a-f0-9]{40}(:.+)?$", re.IGNORECASE) if(not check.match(h)): logging.error("NuRadioMC version could not be determined, returning None") return None return h def get_NuRadioMC_commit_hash(): """ returns the hash of the current commit of the NuRadioMC git repository """ import NuRadioMC path = os.path.dirname(NuRadioMC.__file__) return get_git_commit_hash(path) def get_NuRadioReco_commit_hash(): """ returns the hash of the current commit of the NuRadioReco git repository """ import NuRadioReco path = os.path.dirname(NuRadioReco.__file__) return get_git_commit_hash(path)PKmN0NuRadioMC/utilities/hdf5_manipulator/__init__.pyPKmN/Bn n -NuRadioMC/utilities/hdf5_manipulator/check.py""" Basic checks for data dictionaries. """ import sys from NuRadioMC.utilities.hdf5_manipulator import msg def get_size(data): """Check if #entries is the same for all keys and return it Keyword arguments: data -- data dictionary """ sizes = [d.shape[0] for d in data.itervalues()] # shape[0] = #entries if max(sizes) != min(sizes): msg.error("Each dataset within a file must have the " "same number of entries!") sys.exit(1) return sizes[0] def same_sizes(data1, data2): """Check if files have the same #entries per dataset. Keyword arguments: data1 -- first file data2 -- second file """ if get_size(data1) != get_size(data2): msg.error("Files must have the same number of entries to be combined.") sys.exit(1) def check_keys(data1, data2): """Check it both files have the same datasets. Keyword arguments: data1 -- current data dictionary data2 -- data dictionary to be added """ if data1.keys() != data2.keys(): msg.error("Files have different datasets.") sys.exit(1) def check_shapes(data1, data2): """Check if shapes of datasets are the same. Keyword arguments: data1 -- current data dictionary data2 -- data dictionary to be added """ for key in data1.keys(): if data1[key].shape[1:] != data2[key].shape[1:]: msg.error("Different shapes for dataset: %s. " % key) sys.exit(1) def key_exists(key, data, filename): """Check if given dataset is included in the file. Keyword arguments: key -- key to look for data -- data dictionary to check """ if key not in data.keys(): msg.error("'%(key)s' key is missing in %(file)s." % {"key": key, "file": filename}) sys.exit(1) def different_keys(data1, data2, skip): """Check if given files have different (except skip) datasets. Keyword arguments: data1 -- data dictionary data2 -- data dictionary skip -- common key """ for key in data1.keys(): if key == skip: continue if key in data2.keys(): msg.error("Duplicated dataset: %s in input files." % key) sys.exit(1) def check_duplicates(keys1, keys2): """Check if given files have different (except skip) datasets. Keyword arguments: keys1 -- the list of keys to be copied from file1 keys2 -- the list of keys to be copied from file2 """ for key in keys1: if key in keys2: msg.error("Duplicated dataset: %s in input files." % key) sys.exit(1) PKmN;zw ,NuRadioMC/utilities/hdf5_manipulator/hdf5.py""" HDF5 files tools for HDF5 Manipulator """ import h5py def load(filename): """Load hdf5 file to data dictionary and return it. Keyword arguments: filename -- the full path to hdf5 file """ f = h5py.File(filename, 'r') data = {} attrs = {} groups = {} group_attrs = {} for key in f: if isinstance(f[key], h5py._hl.group.Group): groups[key] = {} group_attrs[key] = {} for key2 in f[key]: groups[key][key2] = f[key][key2][...] for key2 in f[key].attrs: group_attrs[key][key2] = f[key].attrs[key2] else: data[key] = f[key][...] for key in f.attrs: attrs[key] = f.attrs[key] f.close() return data, attrs, groups, group_attrs def save(filename, data, attrs, groups, group_attrs): """Create hdf5 file with given data. Keyword arguments: filename -- the full path to hdf5 file data -- dictionary with data """ f = h5py.File(filename, 'w') for key in data: f.create_dataset(key, data[key].shape, dtype=data[key].dtype, compression='gzip')[...] = data[key] for key in groups: g = f.create_group(key) for key2 in groups[key]: g[key2] = groups[key][key2] for key2 in group_attrs[key]: g.attrs[key2] = group_attrs[key][key2] for key in attrs: f.attrs[key] = attrs[key] f.close() def save_subset(filename, data, begin, end): """Create hdf5 file with subset [begin, end) of given data. Keyword arguments: filename -- the full path to hdf5 file data -- dictionary with data begin -- start saving from index=i end -- finish savin at index=end """ subset = {} for key in data: subset[key] = data[key][begin:end] save(filename, subset) def save_subset_big(filename, data, begin, end): """Create hdf5 file with subset [begin, end) of given data. Keyword arguments: filename -- the full path to hdf5 file data -- input file begin -- start saving from index=i end -- finish savin at index=end """ o = h5py.File(filename, 'w') for key in data: shape = list(data[key].shape) shape[0] = end - begin o.create_dataset(key, shape, dtype=data[key].dtype, compression='gzip')[...] = data[key][begin:end] o.close() PKmNԊ=& & -NuRadioMC/utilities/hdf5_manipulator/merge.py#!/usr/bin/env python from __future__ import print_function """ Merge hdf5 files """ import os from NuRadioMC.utilities.hdf5_manipulator import hdf5 import numpy as np from collections import OrderedDict from NuRadioMC.utilities.hdf5_manipulator import msg from NuRadioMC.utilities.hdf5_manipulator import check def get_filelist(bases): """look for files which match given bases and return them as list Keyword arguments: bases -- list of 'path/basename' """ filelist = [] for base in bases: path, fname = os.path.dirname(base) or '.', os.path.basename(base) filelist.extend([path + '/' + f for f in os.listdir(path) if f.startswith(fname) and f.endswith(".hdf5")]) return sorted(filelist) def merge_data(data_list, attrs_list, groups_list, attrs_group_list): """Merge dictionaries with data. Keyword arguments: data_list -- the dictionary with data dictionaries """ data = None attrs = None groups = None attrs_group = None for f in data_list: size = check.get_size(data_list[f]) if not data: print("\nThe following datasets were found in %s:\n" % f) msg.list_dataset(data_list[f]) data = data_list[f] attrs = attrs_list[f] groups = groups_list[f] attrs_group = attrs_group_list[f] else: print("\nAdding %(n)d entries from %(f)s" % {"n": size, "f": f}) if len(attrs['trigger_names']) == 0 and 'trigger_names' in attrs_list[f]: attrs['trigger_names'] = attrs_list[f]['trigger_names'] if len(data_list[f]['triggered']) == 0: attrs['n_events'] += attrs_list[f]['n_events'] continue check.check_keys(data, data_list[f]) check.check_shapes(data, data_list[f]) for key in data_list[f]: data[key] = np.append(data[key], data_list[f][key], axis=0) for key in groups_list[f]: for key2 in groups_list[f][key]: groups[key][key2] = np.append(groups[key][key2], groups_list[f][key][key2], axis=0) attrs['n_events'] += attrs_list[f]['n_events'] if 'trigger_names' not in attrs: attrs['trigger_names'] = [] return data, attrs, groups, attrs_group def merge_data_filenames(filelist, outputfile): print("The following input files were found:\n") for f in filelist: print("\t - %s" % f) data = OrderedDict() attrs = OrderedDict() groups = OrderedDict() group_attrs = OrderedDict() for f in filelist: print(f) data[f], attrs[f], groups[f], group_attrs[f] = hdf5.load(f) hdf5.save(outputfile, *merge_data(data, attrs, groups, group_attrs)) msg.info("Done") PKmN*rr+NuRadioMC/utilities/hdf5_manipulator/msg.py""" Messenger for HDF5 Manipulator """ VIOLET = '\033[95m' BLUE = '\033[94m' GREEN = '\033[92m' YELLOW = '\033[93m' RED = '\033[91m' BOLD = '\033[1m' UNDERLINE = '\033[4m' END = '\033[0m' def _print(text, indent, color): """Print text in given color, preceded by given #tabs. Keyword arguments: text -- text to print indent -- no. of tabs color -- text color defined by global variables """ if indent: print '\t' * indent, print color + text + END def info(text, indent=None): """Precede text with 'INFO' and call _print with GREEN color.""" _print("\nINFO: " + text, indent, GREEN) def warning(text, indent=None): """Precede text with 'WARNING' and call _print with YELLOW color.""" _print("\nWARNING: " + text, indent, YELLOW) def error(text, indent=None): """Precede text with 'ERROR' and call _print with RED color.""" _print("\nERROR: " + text, indent, RED) def box(text, width=80): """'Draw box' and print text in the center (using BOLD font).""" print BLUE pad = (width - len(text)) / 2 print '+' + '-' * width + '+' print '|' + ' ' * width + '|' print '|' + ' ' * pad + text + ' ' * (width - pad - len(text)) + '|' print '|' + ' ' * width + '|' print '+' + '-' * width + '+' print END def list_dataset(data, indent=1): """Print the list of datasets. Keyword arguments: data -- dictionary with data """ adjust = len(max(data.keys(), key=len)) + 1 # length of left text column for key in data: print '\t' * indent + " - %(key)s %(type)s %(size)s" \ % {"key": (key+':').ljust(adjust), "size": '-> ' + str(data[key].shape), "type": ('[' + str(data[key].dtype) + ']').ljust(9), } def list_fileinfo(filename, range): """Print information about file to be saved. Keyword arguments: filename -- path to output hdf5 file range -- subset to be saved """ print "\t - %(file)s: %(n)d entries from %(b)d to %(e)d" \ % {"file": filename, "n": range[1] - range[0], "b": range[0], "e": range[1] - 1} PKmN|wfKK!NuRadioMC-0.2.0.dist-info/LICENSE GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . PK!HMuSaNuRadioMC-0.2.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,szd&Y)r$[)T&UD"PK!HL ("NuRadioMC-0.2.0.dist-info/METADATAePMO0 WBm!.@LC*6 YM\gtL{~~KdU)V+:JcQ(Q\\Q:IGbQŐ&7;mm*y@Bƒɉ'2t,57ad2Bh}bVYyg,@FV'2OXZƨ=/)a}Y9:b5ym4:[]^):׋Zl#h>ynw0LzFsgw7XI6/^V|PK!H4a |I NuRadioMC-0.2.0.dist-info/RECORD|YwVWa fb< /R[,Nv:ju8AZ)_i8y%.b [kA}d7/22P+G0Ǝ=}xqP.!µBwX=0We㲂A lRaO9n!zܴħT8\`0G !кvbaQ -<\ TUjɴy8XX߆n:;,_ރ]+a|s6v(4s"TQO-Sf$V 0;;yn;Ka; E)^G%>amː'[Z4leb an_kLA<0~qP6|ΤvI _#q~c֡tFc=g4P= ̺ޠiod$- LmZ`$;%þ*S# Z jⲁ65a'20cm߶n(-,bkH'I~XYRDP ŎaoӮ0^VA# 5w+PBX-[NGua iH+W$6wu-D9˄7K oJAzao7>J7_B_ÿ= ߂$Z(1/Z͡=t|K _@W8@y.|EݑN^[œqr L]˝ŔG~ Y|V>г]]=]~Txs g83S[,C.XR5VB~4r6~D%qޜ`:֕aȂxkjfZ!8'~7UmPBQ؆~[r2<~Z{p}\ͱHR݅k3h1dS? _`!\;<9 NC Z3G8{ _X/1ocՐnzB7g6lo,vq/G}UQa1g)qOc&ΘI~"uK:)Z{{BJ yxlAmF$kWaB>xb I7#b!cHuG09L&JzϹmr0<(>6. |>%Xئݧ;CI`$MJPqĮoXOY.HQ6ÒFfg!Ϳ{÷K^Vp.{[vALJ7z 6\q B |_ ~b  U8oekreKfΈ7d md(GDNNݩ09]4H,q:p=vx%)X u,=w 87ibˁ/D l\0OkpS\1&n2UVq,z߭&a߀ޗQx՛GKEv&.|2 uWՒި'Ryb. 0ju-ܩVƾtnD凣r|?Ar2-]d=I{OLawORJ%eiH0W'@o'(fXlyTI$׃1O~se ?;rv;C(ס%b`p`CY)~;ܷUf(Wb1ܰu5>CJWSj&!$\}Ǘu.H: w: :ui(atQA LśUwfSu7%ISa:lըgV-_,"Kߺc=vL8ffd:ԭ@K=ofvsVңѫnޒf(-0,a}&_M;0o~<c#aKSpr} .d5 1!.̪ {e`~w> `(RInnYlJ}Љ6KbKFi$rxPx&=W6VNMt˽'P!~`x"f4ZbZ&:VO\(}!o5֏rbȯBu'`;h9F^Y6$ " :HB:jP4P)MH:Jf N|N9適ˊ ? n]ikh3&T2J`),V}Aluv{ߦ=Vԁzl:5`AUab!SWAH@.JR q&yYo*2Ob>WBx)s,D2vB9G:ݴ8voT0Cp$l/~89>0%އ{BCRZ|WxT,c>YÎ,/xOPp5NoΟՊ(#ǠrTiIFYoaY! 1$xK?IZ(\`%O`P6Hm z M{2žzo?~4:;\g2oz cC3rG)jODlq)L \' PT$/M[^b4̃ɾQ|TxI2k3NMɢZ3zR;?vxwNN\GGrE)8K+$s!ps vv<?ls hXޮGYjpR1m3F:t6**R".?~(úKs)w =]G=+9"V9R=]膛`SvJAf F?F:/>#oYa/q皲=q_gl!M\Peo +>͂ nYlէ/+t,]ϛ.?3#%ƒל, `Iq13@jƾ `0'ye:8N_! G/8&/J{XV(I=]#T>)Wub&VGhTK5QW'BBi NAW#4me@m2ت>d^fww<* Sj#Na%؎*0w `"9O5 0zMu|mj"t Yޱ?}cǻ=4)cJ.;brTϜ6Z|) Loh#k$_!kݜ~%n 6\|mIV;$fn+sӺ6ږ\>ls 5 h!⒦/y-:B 3(ȥsg' iF̶A3̾%CmS?| 8H0A7O-N faYb,Wi|Y4= H;t[i@gu3{J uӑO:@5uZ׻u3Љazr7*Z)nQM"/i6 3sݹ#m`| T,0?f[#6b]",>X뵃#YzY8Z|?l+EYѷ2Է൷[, kQI j:7u"-WHJ#C7hi!BV df&OG)FԌ44u ;K[f$g# +82'M++]\V8Ϩ%Z7ukbgxJ7Z#04RfNޮp}?^yF(K۴H{ׁA"#YYoTs{+hBxh]T믓6eʯ/ Se}[`֓0\(7Gamʹu"VU>? xGcƀ!u&f*I\uθHJn\7sg`B;:7kFѰ_|# " {#x@VTiuv0|?':]Q$톜 75kG2dvmaiOE瀦/]/FʩV.tJ]Le[h6BEi+xM?~h/nF4|I:PYwxʈd qpw6d|GTa.ֽ.sME":&!.DS8?G8mEO W&K> +1u@LxY)\G.kG3ƽ9jѸQjYsLKxR8m } ;a8#Hch#o7|&%?wyQ4PB/gO $χAtPʫU p$hM-TdƢH ӶQXCں-QiyYQo5q /᰷喎1bɬ$pX;{fMeˉ4[h{ȗug>H'Οݵq8ljwQNt2B)ʹP/B?1+}:AbҰ;:&yb75޷n`ȯcǷ1~c]0*<: Ep4N, cTR  -7jӊPmrەƭPg[8 = T$3LNB]as1upfMAe@\MGeEw Н.߶v%6%}o4#*4:xv:UuCD,_׽ Qe8ERMѵДd}:,x.%D^"!gkG;6E)O#>jT8G]KnA¿_^kW<d.ˁ"$q;U:˖nZ Lk-M݁W@{u*CAlrXD $E%؞QZG@AX$$[]llzlp"a]p٘H:WPɭP+mGh%A$wL]pBK{{Ϡ^;`u\4;ۡB o , {m+a9=kn+:OzO7'Zk\S@&?X Uۂ_n ,KN+'rm,y8dFRm!/lxKs cw12 4+~N^a{Kw31 7MLjmK \,y=X}"BԡT_tN)wS\ZUI!CHlaT$QΗpit.rP8M^76~ ]<|q49k[MިT0ffO%Uvd(i;GVYdi <<]pN& 5eB\a-f@=t 6H9iOSγA{{2jOEb Hd#B] EC^;hY7 %v w ]1W/ZkBۨ_7UN˜&βXD f Goa-ͱjg;;+Z1E)M'Vȣ}5D7دfvZ -+:M{#2eh)$e>+TcE9QFa^˙-,-nѿ<veC7tl 7: 44u!Cy84/FOn+û~gd(9o y4^j#hwIU:n n|+\>Z~X|>8Xi6Tܕ,!v}V3r;צD4!p{"e?$"teTpQ˾/QDSz}^>mK <2SpX 9@E.n̤pZ. Ek:-%oy1Uj)N\uDڢF"8mj|J8lkAͺM/4ZgTֆ`Ȭ ^av}8beSĒCK9df4G2,8>BOEPٕ9#n8pi%$Imф+@t?ZmйM4K9C 3\vBs_XRe]d i[k%T:mqی%zݪ[Tn9mn =_~ƞ 6;K W!`~# G.wkeX8lm>0!3$bN1g&"1avJbl 9\w"ۋav䠿8ډJ)PyJx@oFi}OU'? c%.^mͷm%Aʎr<[o- *㷱?CN%SINN`)7ө7xީu3 !VBvO o>wM[rs>ed0}m-4+"|F]jDl'-?Cwj3ło<@ ?A߀o"iUmEUf`x ݄Y iӭC3Vc%aQCiLn?8P7gHIʝ+hip4s(N٭gno; {6ԑqA%A?41SMY+1>Y>YPKmN'ppNuRadioMC/__init__.pyPKmNla1X X %NuRadioMC/EvtGen/NuRadioMCtoAraSim.pyPKmNШ0AA> NuRadioMC/EvtGen/READMEPKmN NuRadioMC/EvtGen/__init__.pyPKmN+" NuRadioMC/EvtGen/create_tau_tab.pyPKmN|# NuRadioMC/EvtGen/decay_library.hdf5PKmNLL!NuRadioMC/EvtGen/generator.pyPKmN2#&NuRadioMC/EvtGen/generator_ASCII.pyPKmN'gg&4NuRadioMC/EvtGen/generator_skeleton.pyPKmN{=pp!=NuRadioMC/EvtGen/hdf5_to_ASCII.pyPKmNM/K K $QBNuRadioMC/EvtGen/readARAEventList.pyPKmN( 'LNuRadioMC/EvtGen/readEventList_ASCII.pyPKmN|q9SNuRadioMC/EvtGen/tests/T01test_additional_interactions.pyPKmNi0:VNuRadioMC/EvtGen/tests/T02_create_tau_dataset.pyPKmN (fYNuRadioMC/EvtGen/tests/T03_tau_length.pyPKmNmY+fNuRadioMC/EvtGen/tests/T04_tau_branching.pyPKmNlL&iNuRadioMC/EvtGen/tests/T07_read_tab.pyPKmNP//nNuRadioMC/SignalGen/HCRB2017.pyPKmNNuRadioMC/SignalGen/__init__.pyPKmNngg.NuRadioMC/SignalGen/askaryan.pyPKmNMc&&'һNuRadioMC/SignalGen/parametrizations.pyPKmN~_$o"NuRadioMC/SignalGen/ARZ/.gitignorePKmN;y4 7$NuRadioMC/SignalGen/ARZ/A01preprocess_shower_library.pyPKmN5f[ [ <NuRadioMC/SignalGen/ARZ/A01preprocess_shower_library_v1.2.pyPKmN[̲0NuRadioMC/SignalGen/ARZ/A02plot_library_stats.pyPKmNË>>NuRadioMC/SignalGen/ARZ/ARZ.pyPKmNO<++25NuRadioMC/SignalGen/ARZ/B01create_pulse_library.pyPKmNd&=NuRadioMC/SignalGen/ARZ/B02create_pulse_library_per_energy.pyPKmN#NuRadioMC/SignalGen/ARZ/__init__.pyPKmNE1-6NuRadioMC/SignalGen/ARZ/fortran_reference.datPKmN~_$o1kNuRadioMC/SignalGen/ARZ/shower_library/.gitignorePKmNMrvEHEH@skNuRadioMC/SignalGen/ARZ/shower_library/nue_1EeV_CC_1_s0001.t1005PKmN|-EHEH@NuRadioMC/SignalGen/ARZ/shower_library/nue_1EeV_CC_1_s0001.t1006PKmNsjj;NuRadioMC/SignalGen/ARZ/shower_library/shower_lib_hash.jsonPKmNh3$p3|NuRadioMC/SignalGen/ARZ/tests/T01CompareWithFast.pyPKmNhG'+NuRadioMC/SignalGen/ARZ/tests/T02TestARZ.pyPKmN'0 0 /NuRadioMC/SignalGen/ARZ/tests/T03TestSpeedup.pyPKmN`U8,NuRadioMC/SignalGen/ARZ/tests/T04InterpolationFactors.pyPKmNUPP.2NuRadioMC/SignalGen/ARZ/tests/T05PlotInterp.pyPKmNB}/7NuRadioMC/SignalGen/tests/T01parmetrizations.pyPKmN4 +GNuRadioMC/SignalGen/tests/T02plot_models.pyPKmNj63SNuRadioMC/SignalGen/tests/T03AskaryanModuleVsZHS.pyPKmN ~ ~ -maNuRadioMC/SignalGen/tests/T04CompareModels.pyPKmNN?v16nNuRadioMC/SignalGen/tests/T05parameterisations.pyPKmNUV[V[71tNuRadioMC/SignalGen/tests/frequency_normalization.ipynbPKmN277UNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_R1000m_EMFalse_LPMFalse.pngPKmNsPPT NuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_R1000m_EMTrue_LPMFalse.pngPKmNkT--SH\ NuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_R1000m_EMTrue_LPMTrue.pngPKmN6ΒX'NuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_dOmega0.0_EMFalse_LPMFalse.pngPKmN hhXmNuRadioMC/SignalGen/tests/plots/AskaryanModule_E1.0e+16eV_dOmega2.5_EMFalse_LPMFalse.pngPKmN؂<</K'NuRadioMC/SignalGen/tests/plots/AskaryanZHS.pngPKmNw   6dNuRadioMC/SignalGen/tests/plots/AskaryanZHS_0.0deg.pngPKmN-Cβ+7+76qNuRadioMC/SignalGen/tests/plots/AskaryanZHS_1.0deg.pngPKmN݁N7N76zNuRadioMC/SignalGen/tests/plots/AskaryanZHS_2.5deg.pngPKmNpp-NuRadioMC/SignalGenProp/DummySignalGenProp.pyPKmN*:NuRadioMC/SignalGenProp/READMEPKmN NuRadioMC/SignalProp/__init__.pyPKmN*NuRadioMC/SignalProp/analyticraytracing.pyPKmN9[r;;NuRadioMC/SignalProp/install.shPKmNv7^22#9NuRadioMC/SignalProp/propagation.pyPKmNp_.NuRadioMC/SignalProp/propagation_base_class.pyPKmN 5NuRadioMC/SignalProp/CPPAnalyticRayTracing/.gitignorePKmN$ yy3NuRadioMC/SignalProp/CPPAnalyticRayTracing/MakefilePKmNnׄ4NuRadioMC/SignalProp/CPPAnalyticRayTracing/README.mdPKmN6NuRadioMC/SignalProp/CPPAnalyticRayTracing/__init__.pyPKmN~ssBNuRadioMC/SignalProp/CPPAnalyticRayTracing/analytic_raytracing.cppPKmN ~~3[pNuRadioMC/SignalProp/CPPAnalyticRayTracing/setup.pyPKmNEL 6*tNuRadioMC/SignalProp/CPPAnalyticRayTracing/wrapper.pyxPKmN++6#~NuRadioMC/SignalProp/examples/A01IceCubePulserToARA.pyPKmN89 9 +NuRadioMC/SignalProp/examples/example_3d.pyPKmNN# 3$NuRadioMC/SignalProp/tests/T01test_python_vs_cpp.pyPKmN?C 2sNuRadioMC/SignalProp/tests/T02test_analytic_D_T.pyPKmNQs 0qNuRadioMC/SignalProp/tests/T03overall_speedup.pyPKmNϟ'NuRadioMC/data/ARASimDummyEventList.txtPKmN *uNuRadioMC/data/NuRadioMCDummyEventList.txtPKmN(0;"ONuRadioMC/data/dummyEventList.hdf5PKmNPE3(('NuRadioMC/data/dummyStationEfields.hdf5PKmN4jrzz$#NuRadioMC/data/dummyStationList.jsonPKmNP#NuRadioMC/examples/__init__.pyPKmNDMM?#NuRadioMC/examples/01_Veff_simulation/T01generate_event_list.pyPKmN96#NuRadioMC/examples/01_Veff_simulation/T02RunSimulation.pyPKmNlo KRR9$NuRadioMC/examples/01_Veff_simulation/T03visualizeVeff.pyPKmN{*}}1$NuRadioMC/examples/01_Veff_simulation/config.yamlPKmNԱI""?$NuRadioMC/examples/01_Veff_simulation/surface_station_1GHz.jsonPKmNW 2<$NuRadioMC/examples/02_DnR/A01analyse_simulation.pyPKmN;`AA3G$NuRadioMC/examples/02_DnR/E01detector_simulation.pyPKmN%[]$NuRadioMC/examples/02_DnR/__init__.pyPKmN{*}}%]$NuRadioMC/examples/02_DnR/config.yamlPKmNq#,#,6^`$NuRadioMC/examples/02_DnR/detector/string_to_100m.jsonPKmNm PpPp?Ռ$NuRadioMC/examples/02_DnR/event_input/1e19_n1e3comparison1.hdf5PKmN665%NuRadioMC/examples/03_station_coincidences/.gitignorePKmNny@ %NuRadioMC/examples/03_station_coincidences/A01create_detector.pyPKmNb/  J&NuRadioMC/examples/03_station_coincidences/A02generate_job_files_presim.pyPKmNE C&NuRadioMC/examples/03_station_coincidences/A03generate_job_files.pyPKmN9K K ?n&NuRadioMC/examples/03_station_coincidences/A04analyze_output.pyPKmN,Bڄww>-&NuRadioMC/examples/03_station_coincidences/A05visualization.pyPKmNK?AC&NuRadioMC/examples/03_station_coincidences/E06RunSimPreprocess.pyPKmN]6MT&NuRadioMC/examples/03_station_coincidences/config.yamlPKmNu% ww?U&NuRadioMC/examples/03_station_coincidences/single_position.jsonPKmN@7>hh3zh&NuRadioMC/examples/04_read_ari_files/A01read_ari.pyPKmNaA A Q3o&NuRadioMC/examples/05_pulser_calibration_measurement/A01generate_pulser_events.pyPKmNg'Hy&NuRadioMC/examples/05_pulser_calibration_measurement/A02RunSimulation.pyPKmN,,J&NuRadioMC/examples/05_pulser_calibration_measurement/A03reconstruct_sim.pyPKmNe9k  GN&NuRadioMC/examples/05_pulser_calibration_measurement/A04plot_results.pyPKmN  F&NuRadioMC/examples/05_pulser_calibration_measurement/config_spice.yamlPKmNVES&NuRadioMC/examples/05_pulser_calibration_measurement/detector_db.jsonPKmNq["LL-'NuRadioMC/examples/Sensitivities/E1_fluxes.pyPKmN1JJ-(NuRadioMC/examples/Sensitivities/E2_fluxes.pyPKmNPDPD.R(NuRadioMC/examples/Sensitivities/E2_fluxes2.pyPKmNe6-MhMh.`(NuRadioMC/examples/Sensitivities/E2_fluxes3.pyPKmND""2(NuRadioMC/examples/Sensitivities/MaxNeutrinos1.txtPKmN0|""2J")NuRadioMC/examples/Sensitivities/MaxNeutrinos2.txtPKmN2=D)NuRadioMC/examples/Sensitivities/NuRadioMC_20181113_Veff.jsonPKmNS""9c)NuRadioMC/examples/Sensitivities/ReasonableNeutrinos1.txtPKmN,)NuRadioMC/examples/Sensitivities/__init__.pyPKmNŧ3g)NuRadioMC/examples/Sensitivities/makeMyLimitPlot.pyPKmN4Q)NuRadioMC/examples/Sensitivities/talys_neu_bands.outPKmN ϐ]9<*NuRadioMC/examples/Sensitivities/talys_neu_evolutions.outPKmN7Ic~c~B*NuRadioMC/examples/Sensitivities/RNO_Proposal/Diffuse_proposal.pdfPKmNtyZb b FYM+NuRadioMC/examples/Sensitivities/RNO_Proposal/make_RNO_limit_figure.pyPKmNXjA  2W+NuRadioMC/examples/cluster/A02generate_jobfiles.pyPKmN=Jss!c+NuRadioMC/examples/cluster/READMEPKmN&&*4d+NuRadioMC/simulation/E04RunStrawmenSim2.pyPKmN.lbEE+NuRadioMC/simulation/READMEPKmN.OO.+NuRadioMC/simulation/T04visualize_sim_input.pyPKmNF1Y Y 4+NuRadioMC/simulation/T04visualize_sim_inputExtend.pyPKmNpΊb6b6/X+NuRadioMC/simulation/T05visualize_sim_output.pyPKmN0"**5+NuRadioMC/simulation/T05visualize_sim_outputExtend.pyPKmN1[Ӣ..*,NuRadioMC/simulation/T06read_sim_output.pyPKmNBr=T T 5\,NuRadioMC/simulation/T07plot_ray_tracing_solutions.pyPKmN !,NuRadioMC/simulation/__init__.pyPKmN[ (A!,NuRadioMC/simulation/config_default.yamlPKmN¯#,+,NuRadioMC/simulation/simulation2.pyPKmN-9,NuRadioMC/simulation/detectors/SPsurfacestation_1GHz.jsonPKmNrro""9&,NuRadioMC/simulation/detectors/SPsurfacestation_2GHz.jsonPKmNPjBB3-NuRadioMC/simulation/detectors/stawmen_1GHz_v1.jsonPKmNe!!1/I-NuRadioMC/simulation/detectors/ARA/100m_1GHz.jsonPKmNI!!1j-NuRadioMC/simulation/detectors/ARA/200m_1GHz.jsonPKmN݋!!0-NuRadioMC/simulation/detectors/ARA/20m_1GHz.jsonPKmNB!!0W-NuRadioMC/simulation/detectors/ARA/50m_1GHz.jsonPKmNw&AA3-NuRadioMC/simulation/detectors/depth/100m_1GHz.jsonPKmNެ@@2G-NuRadioMC/simulation/detectors/depth/10m_1GHz.jsonPKmNP)AA3-NuRadioMC/simulation/detectors/depth/200m_1GHz.jsonPKmNM@@2i-NuRadioMC/simulation/detectors/depth/20m_1GHz.jsonPKmNrb%AA3-NuRadioMC/simulation/detectors/depth/300m_1GHz.jsonPKmN J{AA3-NuRadioMC/simulation/detectors/depth/400m_1GHz.jsonPKmN/Y@@2-NuRadioMC/simulation/detectors/depth/50m_1GHz.jsonPKmNRbʅ 6-NuRadioMC/simulation/detectors/depth/surface_1GHz.jsonPKmN.NuRadioMC/studies/__init__.pyPKmN'.NuRadioMC/test/.gitignorePKmNL ``) .NuRadioMC/test/1e18_output_reference.hdf5PKmNÈ__(/NuRadioMC/test/T01generate_event_list.pyPKmN1"U/NuRadioMC/test/T02RunSimulation.pyPKmN|xԫ+3/NuRadioMC/test/T03validate.pyPKmNm;/NuRadioMC/test/config.yamlPKmN[pQ1>/NuRadioMC/test/requirements.txtPKmNJ""((?/NuRadioMC/test/surface_station_1GHz.jsonPKmNh+ͼMb/NuRadioMC/test/validate.shPKmNMv8v8Ac/NuRadioMC/utilities/Veff.pyPKmN/NuRadioMC/utilities/__init__.pyPKmN 4GFF!-/NuRadioMC/utilities/attenuation.hPKmNc3XX"/NuRadioMC/utilities/attenuation.pyPKmNy""%J/NuRadioMC/utilities/cross_sections.pyPKmNrii(/NuRadioMC/utilities/earth_attenuation.pyPKmNS̻4/NuRadioMC/utilities/fft.pyPKmNER""'/NuRadioMC/utilities/fluxes.pyPKmNjUU%60NuRadioMC/utilities/inelasticities.pyPKmN'O  0NuRadioMC/utilities/medium.pyPKmNw22!""0NuRadioMC/utilities/merge_hdf5.pyPKmN/)0NuRadioMC/utilities/plotting.pyPKmNwM"M"r/0NuRadioMC/utilities/units.hPKmNvDMMQ0NuRadioMC/utilities/units.pyPKmNnYei0NuRadioMC/utilities/version.pyPKmN0m0NuRadioMC/utilities/hdf5_manipulator/__init__.pyPKmN/Bn n -m0NuRadioMC/utilities/hdf5_manipulator/check.pyPKmN;zw ,x0NuRadioMC/utilities/hdf5_manipulator/hdf5.pyPKmNԊ=& & -0NuRadioMC/utilities/hdf5_manipulator/merge.pyPKmN*rr+0NuRadioMC/utilities/hdf5_manipulator/msg.pyPKmN|wfKK!ٖ0NuRadioMC-0.2.0.dist-info/LICENSEPK!HMuSac 1NuRadioMC-0.2.0.dist-info/WHEELPK!HL (" 1NuRadioMC-0.2.0.dist-info/METADATAPK!H4a |I ["1NuRadioMC-0.2.0.dist-info/RECORDPKAC1